Source Code
Overview
MATIC Balance
0 MATIC
Token Holdings
More Info
ContractCreator:
Multichain Info
N/A
Latest 25 from a total of 3,495 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Confirm Pending ... | 38478356 | 241 days ago | IN | 0.82960921 MATIC | 0.0004662 | ||||
Add Liquidity | 38467355 | 241 days ago | IN | 0.55189891 MATIC | 0.00059052 | ||||
Confirm Pending ... | 38467200 | 241 days ago | IN | 0.82960921 MATIC | 0.00049185 | ||||
Add Liquidity | 38466512 | 241 days ago | IN | 0.55189891 MATIC | 0.0004526 | ||||
Confirm Pending ... | 38466487 | 241 days ago | IN | 0.82960921 MATIC | 0.0004662 | ||||
Swap | 38466203 | 241 days ago | IN | 0.59916286 MATIC | 0.00040553 | ||||
Confirm Pending ... | 38465950 | 241 days ago | IN | 0.82960921 MATIC | 0.0004662 | ||||
Confirm Pending ... | 38465937 | 241 days ago | IN | 0.82960921 MATIC | 0.00049907 | ||||
Add Liquidity | 38465716 | 241 days ago | IN | 0.55189891 MATIC | 0.00045259 | ||||
Confirm Pending ... | 38465682 | 241 days ago | IN | 0.82960921 MATIC | 0.00071565 | ||||
Add Liquidity | 38464812 | 242 days ago | IN | 0.55189891 MATIC | 0.0004526 | ||||
Confirm Pending ... | 38464762 | 242 days ago | IN | 0.82960921 MATIC | 0.00049185 | ||||
Add Liquidity | 38463959 | 242 days ago | IN | 0.55189891 MATIC | 0.00050531 | ||||
Swap | 38463488 | 242 days ago | IN | 0.59916286 MATIC | 0.00051647 | ||||
Add Liquidity | 38463417 | 242 days ago | IN | 0.55189891 MATIC | 0.0004526 | ||||
Confirm Pending ... | 38463365 | 242 days ago | IN | 0.82960921 MATIC | 0.00052758 | ||||
Confirm Pending ... | 38463346 | 242 days ago | IN | 0.82960921 MATIC | 0.0004662 | ||||
Add Liquidity | 38459271 | 242 days ago | IN | 0.55189891 MATIC | 0.00060918 | ||||
Add Liquidity | 38455149 | 242 days ago | IN | 0.55189891 MATIC | 0.00045977 | ||||
Confirm Pending ... | 38454827 | 242 days ago | IN | 0.82960921 MATIC | 0.0004662 | ||||
Revoke Pending T... | 38454394 | 242 days ago | IN | 0.50674797 MATIC | 0.00036868 | ||||
Confirm Pending ... | 38453103 | 242 days ago | IN | 0.82960921 MATIC | 0.0004662 | ||||
Swap | 38452322 | 242 days ago | IN | 0.59916286 MATIC | 0.00041273 | ||||
Confirm Pending ... | 38451589 | 242 days ago | IN | 0.82960921 MATIC | 0.0006216 | ||||
Swap | 38450916 | 242 days ago | IN | 0.59916286 MATIC | 0.00041275 |
Latest 25 internal transactions (View All)
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
38478356 | 241 days ago | 0.82960921 MATIC | ||||
38467355 | 241 days ago | 0.55189891 MATIC | ||||
38467200 | 241 days ago | 0.82960921 MATIC | ||||
38466512 | 241 days ago | 0.55189891 MATIC | ||||
38466487 | 241 days ago | 0.82960921 MATIC | ||||
38466203 | 241 days ago | 0.59916286 MATIC | ||||
38465950 | 241 days ago | 0.82960921 MATIC | ||||
38465937 | 241 days ago | 0.82960921 MATIC | ||||
38465716 | 241 days ago | 0.55189891 MATIC | ||||
38465682 | 241 days ago | 0.82960921 MATIC | ||||
38464812 | 242 days ago | 0.55189891 MATIC | ||||
38464762 | 242 days ago | 0.82960921 MATIC | ||||
38463959 | 242 days ago | 0.55189891 MATIC | ||||
38463488 | 242 days ago | 0.59916286 MATIC | ||||
38463417 | 242 days ago | 0.55189891 MATIC | ||||
38463365 | 242 days ago | 0.82960921 MATIC | ||||
38463346 | 242 days ago | 0.82960921 MATIC | ||||
38459271 | 242 days ago | 0.55189891 MATIC | ||||
38455149 | 242 days ago | 0.55189891 MATIC | ||||
38454827 | 242 days ago | 0.82960921 MATIC | ||||
38454394 | 242 days ago | 0.50674797 MATIC | ||||
38453103 | 242 days ago | 0.82960921 MATIC | ||||
38452322 | 242 days ago | 0.59916286 MATIC | ||||
38451589 | 242 days ago | 0.82960921 MATIC | ||||
38450916 | 242 days ago | 0.59916286 MATIC |
Loading...
Loading
Contract Name:
Altitude
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at mumbai.polygonscan.com on 2023-05-22 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.18; pragma abicoder v2; /******************************************/ /* ReentrancyGuard starts here */ /******************************************/ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } /******************************************/ /* IERC20 starts here */ /******************************************/ /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount ) external returns (bool); /** * @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); } /******************************************/ /* IERC20Permit starts here */ /******************************************/ /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } /******************************************/ /* Address starts here */ /******************************************/ /** * @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://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } /******************************************/ /* SafeERC20 starts here */ /******************************************/ /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { 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)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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"); } } } /******************************************/ /* Context starts here */ /******************************************/ // File: @openzeppelin/contracts/GSN/Context.sol /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /******************************************/ /* Ownable starts here */ /******************************************/ /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /***************************************************/ /* ILayerZeroUserApplicationConfig starts here */ /***************************************************/ interface ILayerZeroUserApplicationConfig { // @notice set the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external; // @notice set the send() LayerZero messaging library version to _version // @param _version - new messaging library version function setSendVersion(uint16 _version) external; // @notice set the lzReceive() LayerZero messaging library version to _version // @param _version - new messaging library version function setReceiveVersion(uint16 _version) external; // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload // @param _srcChainId - the chainId of the source chain // @param _srcAddress - the contract address of the source contract at the source chain function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; } /******************************************/ /* ILayerZeroEndpoint starts here */ /******************************************/ interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @notice send a LayerZero message to the specified address at a LayerZero endpoint. // @param _dstChainId - the destination chain identifier // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains // @param _payload - a custom bytes payload to send to the destination contract // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. ie: pay for a specified destination gasAmount, or receive airdropped native gas from the relayer on destination function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier // @param _srcAddress - the source contract (as bytes) at the source chain // @param _dstAddress - the address on destination chain // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external; // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); // @notice get the outboundNonce from this source chain which, consequently, is always an EVM // @param _srcAddress - the source chain contract address function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64); // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery // @param _dstChainId - the destination chain identifier // @param _userApplication - the user app address on this EVM chain // @param _payload - the custom message to send over LayerZero // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); // @notice the interface to retry failed message on this Endpoint destination // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); // @notice query if the _libraryAddress is valid for sending msgs. // @param _userApplication - the user app address on this EVM chain function getSendLibraryAddress(address _userApplication) external view returns (address); // @notice query if the _libraryAddress is valid for receiving msgs. // @param _userApplication - the user app address on this EVM chain function getReceiveLibraryAddress(address _userApplication) external view returns (address); // @notice query if the non-reentrancy guard for send() is on // @return true if the guard is on. false otherwise function isSendingPayload() external view returns (bool); // @notice query if the non-reentrancy guard for receive() is on // @return true if the guard is on. false otherwise function isReceivingPayload() external view returns (bool); // @notice get the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory); // @notice get the send() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getSendVersion(address _userApplication) external view returns (uint16); // @notice get the lzReceive() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getReceiveVersion(address _userApplication) external view returns (uint16); } /******************************************/ /* ILayerZeroReceiver starts here */ /******************************************/ interface ILayerZeroReceiver { // @notice LayerZero endpoint will invoke this function to deliver the message on the destination // @param _srcChainId - the source endpoint identifier // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external; } /******************************************/ /* IAltitudeFee starts here */ /******************************************/ interface IAltitudeFee { // @notice query the rebalance fee based on local liquidity. // @param idealBalance - the balance where local and remote liquidity pools are at equilibrium. // @param preBalance - balance of local liquidity pool before removal of liquidity. // @param amount - liquidity to be withdrawn from local liquidity pool. function getRebalanceFee(uint256 idealBalance, uint256 preBalance, uint256 amount) external view returns (uint256); // @notice query the parameters used to calculate the rebalance fee. function getFeeParameters() external view returns (uint256, uint256, uint256, uint256, uint256); } /******************************************/ /* ILpToken starts here */ /******************************************/ interface ILpToken { // @notice mint new LP tokens. // @param _to - address to mint new LP tokens to. // @param _amount - amount of LP tokens to mint. function mint(address _to, uint256 _amount) external; // @notice burn existing LP tokens. // @param _from - address to burn existing LP tokens from. // @param _amount - amount of LP tokens to burn. function burn(address _from, uint256 _amount) external; } /******************************************/ /* IFactory starts here */ /******************************************/ interface IFactory { // @notice deploy a LP token contract for a new chain path. // @param _name - name of the LP token. // @param _symbol - symbol of the LP token. function newLpToken(string memory _name, string memory _symbol) external returns (address); } /******************************************/ /* ALTITUDE starts here */ /******************************************/ contract Altitude is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig, ReentrancyGuard { using SafeERC20 for IERC20; // CONSTANTS bytes4 private constant SELECTOR = bytes4(keccak256(bytes("transfer(address,uint256)"))); uint8 internal constant TYPE_SWAP = 1; uint8 internal constant TYPE_SWAP_CONFIRM = 2; uint8 internal constant TYPE_SWAP_REVOKE = 3; uint8 internal constant TYPE_ADD_LIQUIDITY = 4; uint8 internal constant TYPE_REMOVE_LIQUIDITY_LOCAL = 5; uint8 internal constant TYPE_REMOVE_LIQUIDITY_REMOTE = 6; uint8 internal constant TYPE_REMOVE_LIQUIDITY_REMOTE_CONFIRM = 7; uint8 internal constant TYPE_REMOVE_LIQUIDITY_REMOTE_REVOKE = 8; // STRUCTS struct ChainPath { bool ready; address srcToken; uint16 dstChainId; address dstToken; uint256 remoteLiquidity; uint256 localLiquidity; uint256 rewardPoolSize; address lpToken; bool stopSwap; } struct PendingTx { uint8 txType; //ChainPath cp; uint16 dstChainId; address dstToken; uint256 amount; bytes from; } ILayerZeroEndpoint public layerZeroEndpoint; IAltitudeFee public altitudeFee; IFactory public altitudeFactory; ChainPath[] public chainPaths; address public feeTo; mapping(uint16 => mapping(address => uint256)) public chainPathIndexLookup; // lookup for chainPath by chainId => token => index mapping(uint16 => mapping(uint8 => uint256)) public gasLookup; // lookup for gas fee by chainId => function => gas mapping(uint16 => bytes) public trustedRemoteLookup; mapping(address => PendingTx[]) public pendingTransactions; // EVENTS event Swap(uint16 _dstChainId, address _dstToken, uint256 _amount, bytes _to); event Remote_Swap(uint16 _srcChainId, address _srcToken, uint256 _amount, address _to); event Swap_Confirm(uint16 _dstChainId, address _dstToken, uint256 _amount, address _to, uint256 _rebalanceReward, uint256 _rebalanceFee, uint256 _protocolFee); event Swap_Revoke(uint16 _dstChainId, address _dstToken, uint256 _amount, address _to); event Callback_Swap_Confirm(uint16 _srcChainId, address _srcToken, uint256 _amount, address _to, uint256 _rebalanceFee, uint256 _protocolFee); event Callback_Swap_Revoke(uint16 _srcChainId, address _srcToken, uint256 _amount, address _to); event AddLiquidity(uint16 _dstChainId, address _dstToken, uint256 _amount); event Remote_AddLiquidity(uint16 _srcChainId, address _srcToken, uint256 _amount); event RemoveLiquidityLocal(uint16 _dstChainId, address _dstToken, uint256 _amount); event Remote_RemoveLiquidityLocal(uint16 _srcChainId, address _srcToken, uint256 _amount); event RemoveLiquidityRemote(uint16 _dstChainId, address _dstToken, uint256 _amount, address _to); event Remote_RemoveLiquidityRemote(uint16 _srcChainId, address _srcToken, uint256 _amount, address _to); event RemoveLiquidityRemote_Confirm(uint16 _dstChainId, address _dstToken, uint256 _amount, address _to); event RemoveLiquidityRemote_Revoke(uint16 _dstChainId, address _dstToken, uint256 _amount, address _to); event Callback_RemoveLiquidityRemote_Confirm(uint16 _srcChainId, address _srcToken, uint256 _amount, address _to); event Callback_RemoveLiquidityRemote_Revoke(uint16 _srcChainId, address _srcToken, uint256 _amount, address _to); constructor(address _endpoint, address _altitudeFee, address _altitudeFactory) { layerZeroEndpoint = ILayerZeroEndpoint(_endpoint); altitudeFee = IAltitudeFee(_altitudeFee); altitudeFactory = IFactory(_altitudeFactory); } /******************************************/ /* ADMIN starts here */ /******************************************/ /** * @dev Add a new chain and token pair for swapping. * @param _srcToken Token on the local chain. * @param _dstChainId Destination chain ID. * @param _dstToken Token on the destination chain. * @param _name Name of the associated LP token. * @param _symbol Symbol of the associated LP token. */ function addChainPath(address _srcToken, uint16 _dstChainId, address _dstToken, string memory _name, string memory _symbol) external onlyOwner { for (uint256 i = 0; i < chainPaths.length; ++i) { ChainPath memory cp = chainPaths[i]; bool exists = cp.dstChainId == _dstChainId && cp.dstToken == _dstToken; require(!exists, "Altitude: cant createChainPath of existing _dstChainId and _dstToken"); } chainPathIndexLookup[_dstChainId][_dstToken] = chainPaths.length; address lpToken = altitudeFactory.newLpToken(_name, _symbol); chainPaths.push(ChainPath(false, _srcToken, _dstChainId, _dstToken, 0, 0, 0, lpToken, false)); } /** * @dev Enable swapping for a chain and token pair. * @param _dstChainId Destination chain ID. * @param _dstToken Token on the destination chain. */ function activateChainPath(uint16 _dstChainId, address _dstToken) external onlyOwner { ChainPath storage cp = getAndCheckCP(_dstChainId, _dstToken); require(cp.ready == false, "Altitude: chainPath is already active"); // this func will only be called once cp.ready = true; } /** * @dev Set the Alititude contract for a destination chain. * @param _dstChainId Destination chain ID. * @param _dstAltitudeAddress Address of the Altitude contract at the destination chain. */ function setTrustedRemoteLookup(uint16 _dstChainId, bytes calldata _dstAltitudeAddress) external onlyOwner { trustedRemoteLookup[_dstChainId] = abi.encodePacked(_dstAltitudeAddress, address(this)); } /** * @dev Set the gas limit for a function type at a destination chain. * @param _dstChainId Destination chain ID. * @param _functionType Target function (SWAP, ADD, REMOVE, REDEEM). * @param _gasAmount Gas limit used by the target function. */ function setGasAmount(uint16 _dstChainId, uint8 _functionType, uint256 _gasAmount) external onlyOwner { require(_functionType >= 1 && _functionType <= 8, "Altitude: invalid _functionType"); gasLookup[_dstChainId][_functionType] = _gasAmount; } /** * @dev Deposit into chain path's reward pool. * @param _dstChainId Destination chain ID. * @param _dstToken Token on the destination chain. * @param _amount Amount of reward tokens to deposit. */ function depositRewardPool(uint16 _dstChainId, address _dstToken, uint256 _amount) external onlyOwner { ChainPath storage cp = getAndCheckCP(_dstChainId, _dstToken); IERC20(cp.srcToken).transferFrom(msg.sender, address(this), _amount); cp.rewardPoolSize += _amount; } /** * @dev Withdraw from chain path's reward pool. * @param _dstChainId Destination chain ID. * @param _dstToken Token on the destination chain. * @param _amount Amount of reward tokens to withdraw. */ function withdrawRewardPool(uint16 _dstChainId, address _dstToken, uint256 _amount, address _to) external onlyOwner { ChainPath storage cp = getAndCheckCP(_dstChainId, _dstToken); require(cp.rewardPoolSize >= _amount, "Altitude: not enough funds in reward pool."); IERC20(cp.srcToken).transferFrom(address(this), _to, _amount); cp.rewardPoolSize -= _amount; } /** * @dev Set the protocol fee receiving address. */ function setFeeTo(address _feeTo) external onlyOwner { require(_feeTo != address(0), "Altitude: recipient can't be zero address."); feeTo = _feeTo; } /** * @dev Set the address of the fee calculation contract. */ function setFeeContract(address _newFeeContract) external onlyOwner { altitudeFee = IAltitudeFee(_newFeeContract); } /** * @dev Disable swaps for a specific chain path. */ function emergencyStopSwap(uint16 _dstChainId, address _dstToken, bool _enable) external onlyOwner { ChainPath storage cp = getAndCheckCP(_dstChainId, _dstToken); cp.stopSwap = _enable; } /******************************************/ /* LOCAL starts here */ /******************************************/ /** * @dev Swap local tokens for tokens on another chain. * @param _dstChainId ID of destination chain. * @param _dstToken Address of token on the destination chain (in). * @param _amount Amount of tokens to swap. * @param _addressOnDst Address of recipient on the destination chain. */ function swap(uint16 _dstChainId, address _dstToken, uint256 _amount, uint256 _nativeForDst, bytes memory _addressOnDst) external nonReentrant payable { // (1) LOCAL: (Tokens IN) // (2) REMOTE CONFIRM: remoteLiquidity ++ localLiquidity -- (Tokens OUT) // LOCAL CONFIRM: remoteLiquidity -- localLiquidity ++ // REMOTE REVOKE: // LOCAL REVOKE: (Tokens OUT) address dstNativeAddr; { bytes memory dstNativeAddrBytes = _addressOnDst; assembly { dstNativeAddr := mload(add(dstNativeAddrBytes, 20)) } } ChainPath storage cp = getAndCheckCP(_dstChainId, _dstToken); require(dstNativeAddr != address(0x0), "Altitude: swap to zero address."); require(cp.remoteLiquidity >= _amount, "Altitude: not enough liquidity"); require(cp.stopSwap == false, "Altitude: swaps disabled."); // Deposit tokens without increasing local liquidity to prevent loss of funds in unconfirmed swap. IERC20(cp.srcToken).safeTransferFrom(msg.sender, address(this), _amount); bytes memory payload = abi.encode(TYPE_SWAP, abi.encodePacked(cp.srcToken), _amount, _addressOnDst, abi.encodePacked(msg.sender)); executeLayerZero(TYPE_SWAP, cp, payload, _nativeForDst , _addressOnDst); emit Swap(_dstChainId, _dstToken, _amount, _addressOnDst); } /** * @dev Add liquidity for swaps. * @param _dstChainId ID of destination chain. * @param _dstToken Address of token on the destination chain. * @param _amount Amount of tokens to add as liquidity. */ function addLiquidity(uint16 _dstChainId, address _dstToken, uint256 _amount) external nonReentrant payable { // LOCAL: localLiquidity ++ (Tokens IN / LP Tokens OUT) // REMOTE: remoteLiquidity ++ ChainPath storage cp = getAndCheckCP(_dstChainId, _dstToken); require(cp.ready == true, "Altitude: chainPath is not active"); IERC20(cp.srcToken).safeTransferFrom(msg.sender, address(this), _amount); ILpToken(cp.lpToken).mint(msg.sender, _amount); cp.localLiquidity += _amount; bytes memory payload = abi.encode(TYPE_ADD_LIQUIDITY, abi.encodePacked(cp.srcToken), _amount); executeLayerZero(TYPE_ADD_LIQUIDITY, cp, payload, 0 , ""); emit AddLiquidity(_dstChainId, _dstToken, _amount); } /** * @dev Remove local liquidity for swaps. * @param _dstChainId ID of destination chain. * @param _dstToken Address of token on the destination chain. * @param _amount Amount of tokens to remove from liquidity. */ function removeLiquidityLocal(uint16 _dstChainId, address _dstToken, uint256 _amount) external nonReentrant payable { // LOCAL: localLiquidity -- (Tokens OUT / LP Tokens BURN) // REMOTE: remoteLiquidity -- ChainPath storage cp = getAndCheckCP(_dstChainId, _dstToken); require(cp.localLiquidity >= _amount, "Altitude: not enough liquidity"); ILpToken(cp.lpToken).burn(msg.sender, _amount); cp.localLiquidity -= _amount; IERC20(cp.srcToken).safeTransfer(msg.sender, _amount); bytes memory payload = abi.encode(TYPE_REMOVE_LIQUIDITY_LOCAL, abi.encodePacked(cp.srcToken), _amount); executeLayerZero(TYPE_REMOVE_LIQUIDITY_LOCAL, cp, payload, 0 , ""); emit RemoveLiquidityLocal(_dstChainId, _dstToken, _amount); } /** * @dev Remove remote liquidity for swaps. * @param _dstChainId ID of destination chain. * @param _dstToken Address of token on the destination chain (in). * @param _amount Amount of tokens to remove from liquidity. */ function removeLiquidityRemote(uint16 _dstChainId, address _dstToken, uint256 _amount, uint256 _nativeForDst, bytes memory _addressOnDst) external nonReentrant payable { // (1) LOCAL: (LP Tokens IN) // (2) REMOTE CONFIRM: localLiquidity -- (Tokens OUT) // LOCAL CONFIRM: remoteLiquidity -- // REMOTE REVOKE: (LP Tokens OUT) // LOCAL REVOKE: (LP Tokens BURN) address dstNativeAddr; { bytes memory dstNativeAddrBytes = _addressOnDst; assembly { dstNativeAddr := mload(add(dstNativeAddrBytes, 20)) } } ChainPath storage cp = getAndCheckCP(_dstChainId, _dstToken); require(dstNativeAddr != address(0x0), "Altitude: withdrawal to zero address."); require(cp.localLiquidity < _amount, "Altitude: sufficient local liquidity"); require(cp.remoteLiquidity >= _amount, "Altitude: not enough liquidity"); require(IERC20(cp.lpToken).balanceOf(msg.sender) >= _amount, "Altitude: not enough LP tokens"); // Burn LP Tokens only after confirmation to prevent loss of funds in unconfirmed withdrawal. IERC20(cp.lpToken).safeTransferFrom(msg.sender, address(this), _amount); bytes memory payload = abi.encode(TYPE_REMOVE_LIQUIDITY_REMOTE, abi.encodePacked(cp.srcToken), _amount, _addressOnDst, abi.encodePacked(msg.sender)); executeLayerZero(TYPE_REMOVE_LIQUIDITY_REMOTE, cp, payload, _nativeForDst, _addressOnDst); emit RemoveLiquidityRemote(_dstChainId, _dstToken, _amount, msg.sender); } /** * @dev Confirm swap or withdrawal. * @param _Id Id of pending swap or withdrawal. */ function confirmPendingTransaction(uint256 _Id) external nonReentrant payable { PendingTx storage pt = pendingTransactions[msg.sender][_Id]; ChainPath storage cp = getAndCheckCP(pt.dstChainId, pt.dstToken); // SWAP REMOTE CONFIRM if (pt.txType == TYPE_SWAP) { require(cp.localLiquidity >= pt.amount, "Altitude: not enough liquidity"); // rebalance fee applies when swap moves local liquidity away from liquidity equilibrium. Deposit into local reward pool. (uint256 rebalanceFee, uint256 protocolFee) = getFees(cp.dstChainId, cp.dstToken, pt.amount); uint256 swapAmount = pt.amount - (rebalanceFee + protocolFee); // rebalance reward applies when swap moves local liquidity to liquidity equilibrium. Disburse from local reward pool. uint256 rebalanceReward = getRebalanceReward(cp.dstChainId, cp.dstToken, pt.amount); cp.rewardPoolSize -= rebalanceReward; cp.localLiquidity -= swapAmount; cp.remoteLiquidity += swapAmount; IERC20(cp.srcToken).safeTransfer(msg.sender, swapAmount + rebalanceReward); bytes memory payload = abi.encode(TYPE_SWAP_CONFIRM, abi.encodePacked(cp.srcToken), pt.amount, rebalanceFee, protocolFee, abi.encodePacked(msg.sender)); executeLayerZero(TYPE_SWAP_CONFIRM, cp, payload, 0 , ""); emit Swap_Confirm(cp.dstChainId, cp.dstToken, swapAmount, msg.sender, rebalanceReward, rebalanceFee, protocolFee); // REMOVE LIQUIDITY REMOTE CONFIRM } else if (pt.txType == TYPE_REMOVE_LIQUIDITY_REMOTE) { require(cp.localLiquidity >= pt.amount, "Altitude: not enough liquidity"); cp.localLiquidity -= pt.amount; IERC20(cp.srcToken).safeTransfer(msg.sender, pt.amount); bytes memory payload = abi.encode(TYPE_REMOVE_LIQUIDITY_REMOTE_CONFIRM, abi.encodePacked(cp.srcToken), pt.amount, abi.encodePacked(msg.sender)); executeLayerZero(TYPE_REMOVE_LIQUIDITY_REMOTE_CONFIRM, cp, payload, 0 , ""); emit RemoveLiquidityRemote_Confirm(cp.dstChainId, cp.dstToken, pt.amount, msg.sender); } uint256 arrayLength = pendingTransactions[msg.sender].length; pendingTransactions[msg.sender][_Id] = pendingTransactions[msg.sender][arrayLength -1]; pendingTransactions[msg.sender].pop(); } /** * @dev Revoke swap or withdrawal. * @param _Id Id of pending swap or withdrawal. */ function revokePendingTransaction(uint256 _Id) external nonReentrant payable { PendingTx storage pt = pendingTransactions[msg.sender][_Id]; ChainPath storage cp = getAndCheckCP(pt.dstChainId, pt.dstToken); // SWAP REMOTE REVOKE if (pt.txType == TYPE_SWAP) { bytes memory payload = abi.encode(TYPE_SWAP_REVOKE, abi.encodePacked(cp.srcToken), pt.amount, pt.from); executeLayerZero(TYPE_SWAP_REVOKE, cp, payload, 0 , ""); emit Swap_Revoke(cp.dstChainId, cp.dstToken, pt.amount, msg.sender); // REMOVE LIQUIDITY REMOTE REVOKE } else if (pt.txType == TYPE_REMOVE_LIQUIDITY_REMOTE) { bytes memory payload = abi.encode(TYPE_REMOVE_LIQUIDITY_REMOTE_REVOKE, abi.encodePacked(cp.srcToken), pt.amount, pt.from); executeLayerZero(TYPE_REMOVE_LIQUIDITY_REMOTE_REVOKE, cp, payload, 0, ""); emit RemoveLiquidityRemote_Revoke(cp.dstChainId, cp.dstToken, pt.amount, msg.sender); } uint256 arrayLength = pendingTransactions[msg.sender].length; pendingTransactions[msg.sender][_Id] = pendingTransactions[msg.sender][arrayLength -1]; pendingTransactions[msg.sender].pop(); } /** * @dev Route messages containing a target to LayerZero. */ function executeLayerZero(uint8 functionType, ChainPath storage cp, bytes memory payload, uint256 nativeForDst, bytes memory addressOnDst) internal { bytes memory adapterParams = getAndCheckGasFee(functionType, cp.dstChainId, payload, nativeForDst, addressOnDst); layerZeroEndpoint.send{value: msg.value}(cp.dstChainId, trustedRemoteLookup[cp.dstChainId], payload, payable(msg.sender), address(this), adapterParams); } /******************************************/ /* REMOTE starts here */ /******************************************/ function lzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 /*_nonce*/, bytes memory _payload) external override { require(msg.sender == address(layerZeroEndpoint)); require( _srcAddress.length == trustedRemoteLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedRemoteLookup[_srcChainId]), "Altitude: Invalid source sender address. owner should call setTrustedSource() to enable source contract" ); uint8 functionType; assembly { functionType := mload(add(_payload, 32)) } // SWAP (DESTINATION) if (functionType == TYPE_SWAP) { (, bytes memory token, uint256 amount, bytes memory to, bytes memory from) = abi.decode(_payload, (uint8, bytes, uint256, bytes, bytes)); address toAddress; address srcTokenAddress; assembly { toAddress := mload(add(to, 20)) srcTokenAddress := mload(add(token, 20)) } pendingTransactions[toAddress].push(PendingTx(TYPE_SWAP, _srcChainId, srcTokenAddress, amount, from)); emit Remote_Swap(_srcChainId, srcTokenAddress, amount, toAddress); // SWAP CONFIRM (CALLBACK) } else if (functionType == TYPE_SWAP_CONFIRM) { (, bytes memory token, uint256 amount, uint256 rebalanceFee, uint256 protocolFee, bytes memory to) = abi.decode(_payload, (uint8, bytes, uint256, uint256, uint256, bytes)); address toAddress; address srcTokenAddress; assembly { toAddress := mload(add(to, 20)) srcTokenAddress := mload(add(token, 20)) } ChainPath storage cp = getAndCheckCP(_srcChainId, srcTokenAddress); uint256 swapAmount = amount - (rebalanceFee + protocolFee); cp.localLiquidity += swapAmount; cp.remoteLiquidity -= swapAmount; cp.rewardPoolSize += rebalanceFee; IERC20(cp.srcToken).safeTransfer(feeTo, protocolFee); emit Callback_Swap_Confirm(_srcChainId, srcTokenAddress, swapAmount, toAddress, rebalanceFee, protocolFee); // SWAP REVOKE (CALLBACK) } else if (functionType == TYPE_SWAP_REVOKE) { (, bytes memory token, uint256 amount, bytes memory to) = abi.decode(_payload, (uint8, bytes, uint256, bytes)); address toAddress; address srcTokenAddress; assembly { toAddress := mload(add(to, 20)) srcTokenAddress := mload(add(token, 20)) } ChainPath storage cp = getAndCheckCP(_srcChainId, srcTokenAddress); IERC20(cp.srcToken).safeTransfer(toAddress, amount); emit Callback_Swap_Revoke(_srcChainId, srcTokenAddress, amount, toAddress); // ADD LIQUIDITY (DESTINATION) } else if (functionType == TYPE_ADD_LIQUIDITY) { (, bytes memory token, uint256 amount) = abi.decode(_payload, (uint8, bytes, uint256)); address srcTokenAddress; assembly { srcTokenAddress := mload(add(token, 20)) } ChainPath storage cp = getAndCheckCP(_srcChainId, srcTokenAddress); cp.remoteLiquidity += amount; emit Remote_AddLiquidity(_srcChainId, srcTokenAddress, amount); // REMOVE LIQUIDITY LOCAL (DESTINATION) } else if (functionType == TYPE_REMOVE_LIQUIDITY_LOCAL) { (, bytes memory token, uint256 amount) = abi.decode(_payload, (uint8, bytes, uint256)); address srcTokenAddress; assembly { srcTokenAddress := mload(add(token, 20)) } ChainPath storage cp = getAndCheckCP(_srcChainId, srcTokenAddress); cp.remoteLiquidity -= amount; emit Remote_RemoveLiquidityLocal(_srcChainId, srcTokenAddress, amount); // REMOVE LIQUIDITY REMOTE (DESTINATION) } else if (functionType == TYPE_REMOVE_LIQUIDITY_REMOTE) { (, bytes memory token, uint256 amount, bytes memory to, bytes memory from) = abi.decode(_payload, (uint8, bytes, uint256, bytes, bytes)); address toAddress; address srcTokenAddress; assembly { toAddress := mload(add(to, 20)) srcTokenAddress := mload(add(token, 20)) } pendingTransactions[toAddress].push(PendingTx(TYPE_REMOVE_LIQUIDITY_REMOTE, _srcChainId, srcTokenAddress, amount, from)); emit Remote_RemoveLiquidityRemote(_srcChainId, srcTokenAddress, amount, toAddress); // REMOVE LIQUIDITY REMOTE CONFIRM (CALLBACK) } else if (functionType == TYPE_SWAP_CONFIRM) { (, bytes memory token, uint256 amount, bytes memory to) = abi.decode(_payload, (uint8, bytes, uint256, bytes)); address toAddress; address srcTokenAddress; assembly { toAddress := mload(add(to, 20)) srcTokenAddress := mload(add(token, 20)) } ChainPath storage cp = getAndCheckCP(_srcChainId, srcTokenAddress); cp.remoteLiquidity -= amount; ILpToken(cp.lpToken).burn(address(this), amount); emit Callback_RemoveLiquidityRemote_Confirm(_srcChainId, srcTokenAddress, amount, toAddress); // REMOVE LIQUIDITY REMOTE REVOKE (CALLBACK) } else if (functionType == TYPE_SWAP_REVOKE) { (, bytes memory token, uint256 amount, bytes memory to) = abi.decode(_payload, (uint8, bytes, uint256, bytes)); address toAddress; address srcTokenAddress; assembly { toAddress := mload(add(to, 20)) srcTokenAddress := mload(add(token, 20)) } ChainPath storage cp = getAndCheckCP(_srcChainId, srcTokenAddress); IERC20(cp.lpToken).transfer(toAddress, amount); emit Callback_RemoveLiquidityRemote_Revoke(_srcChainId, srcTokenAddress, amount, toAddress); } } /******************************************/ /* FEE starts here */ /******************************************/ function getFees(uint16 _dstChainId, address _dstToken, uint256 _amount) public view returns (uint256 rebalanceFee, uint256 protocolFee) { ChainPath memory cp = getAndCheckCP(_dstChainId, _dstToken); uint256 idealBalance = (cp.localLiquidity + cp.remoteLiquidity) / 2; rebalanceFee = altitudeFee.getRebalanceFee(idealBalance, cp.localLiquidity, _amount); (uint256 P,,,,) = altitudeFee.getFeeParameters(); protocolFee = _amount * P / 1e18; } function getRebalanceReward(uint16 _dstChainId, address _dstToken, uint256 _amount) public view returns (uint256 rebalanceReward) { ChainPath memory cp = getAndCheckCP(_dstChainId, _dstToken); uint256 idealBalance = (cp.localLiquidity + cp.remoteLiquidity) / 2; if (cp.remoteLiquidity < idealBalance) { uint256 remoteLiquidityDeficit = idealBalance - cp.remoteLiquidity; rebalanceReward = cp.rewardPoolSize * _amount / remoteLiquidityDeficit; if (rebalanceReward > cp.rewardPoolSize) { rebalanceReward = cp.rewardPoolSize; } } } /******************************************/ /* VIEW starts here */ /******************************************/ function getAndCheckCP(uint16 _dstChainId, address _dstToken) internal view returns (ChainPath storage) { require(chainPaths.length > 0, "Altitude: no chainpaths exist"); ChainPath storage cp = chainPaths[chainPathIndexLookup[_dstChainId][_dstToken]]; require(cp.dstChainId == _dstChainId && cp.dstToken == _dstToken, "Altitude: local chainPath does not exist"); return cp; } function getChainPath(uint16 _dstChainId, address _dstToken) external view returns (ChainPath memory) { ChainPath memory cp = chainPaths[chainPathIndexLookup[_dstChainId][_dstToken]]; require(cp.dstChainId == _dstChainId && cp.dstToken == _dstToken, "Altitude: local chainPath does not exist"); return cp; } function getAndCheckGasFee(uint8 _type, uint16 _dstChainId, bytes memory _payload, uint256 _nativeForDst, bytes memory _addressOnDst) internal view returns (bytes memory adapterParams) { adapterParams = txParamBuilder(_type, _dstChainId, _nativeForDst, _addressOnDst); // get the fees we need to pay to LayerZero for message delivery (uint256 nativeFee, ) = layerZeroEndpoint.estimateFees(_dstChainId, address(this), _payload, false, adapterParams); require(msg.value >= nativeFee, "Altitude: insufficient msg.value to pay to LayerZero for message delivery."); } function quoteLayerZeroFee(uint8 _type, uint16 _dstChainId, address _dstToken, bytes memory _from, uint256 _nativeForDst, bytes memory _addressOnDst) external view returns (uint256) { ChainPath memory cp = getAndCheckCP(_dstChainId, _dstToken); bytes memory payload; if(_type == 1 || _type == 6) { payload = abi.encode(TYPE_SWAP, abi.encodePacked(cp.srcToken), 0, _addressOnDst, _from); } else if (_type == 2) { payload = abi.encode(TYPE_SWAP_CONFIRM, abi.encodePacked(cp.srcToken), 0, 0, 0, _addressOnDst); } else if (_type == 3 || _type == 7 || _type == 8) { payload = abi.encode(TYPE_SWAP_CONFIRM, abi.encodePacked(cp.srcToken), 0, _addressOnDst); } else if (_type == 4 || _type == 5) { payload = abi.encode(TYPE_ADD_LIQUIDITY, abi.encodePacked(cp.srcToken), 0); } bytes memory adapterParams = txParamBuilder(_type, _dstChainId, _nativeForDst, _addressOnDst); // get the fees we need to pay to LayerZero for message delivery (uint256 nativeFee, ) = layerZeroEndpoint.estimateFees(_dstChainId, address(this), payload, false, adapterParams); return (nativeFee); } function txParamBuilder(uint8 _type, uint16 _dstChainId, uint256 _nativeForDst, bytes memory _addressOnDst) internal view returns (bytes memory) { bytes memory adapterParams; uint256 gasForDestinationLzReceive = gasLookup[_dstChainId][_type]; if (_nativeForDst > 0) { adapterParams = txParamBuilderType2(gasForDestinationLzReceive, _nativeForDst, _addressOnDst); } else { adapterParams = txParamBuilderType1(gasForDestinationLzReceive); } return adapterParams; } function txParamBuilderType1(uint256 _gasAmount) internal pure returns (bytes memory) { uint16 txType = 1; return abi.encodePacked(txType, _gasAmount); } function txParamBuilderType2(uint256 _gasAmount, uint256 _dstNativeAmount, bytes memory _addressOnDst) internal pure returns (bytes memory) { uint16 txType = 2; return abi.encodePacked(txType, _gasAmount, _dstNativeAmount, _addressOnDst); } function viewPendingTx(address _user) public view returns (PendingTx[] memory) { return (pendingTransactions[_user]); } /******************************************/ /* CONFIG starts here */ /******************************************/ function setConfig(uint16 _version, uint16 _chainId, uint256 _configType, bytes calldata _config) external override onlyOwner { layerZeroEndpoint.setConfig(_version, _chainId, _configType, _config); } function setSendVersion(uint16 version) external override onlyOwner { layerZeroEndpoint.setSendVersion(version); } function setReceiveVersion(uint16 version) external override onlyOwner { layerZeroEndpoint.setReceiveVersion(version); } function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner { layerZeroEndpoint.forceResumeReceive(_srcChainId, _srcAddress); } fallback() external payable {} receive() external payable {} }
[{"inputs":[{"internalType":"address","name":"_endpoint","type":"address"},{"internalType":"address","name":"_altitudeFee","type":"address"},{"internalType":"address","name":"_altitudeFactory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_dstToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_srcToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"Callback_RemoveLiquidityRemote_Confirm","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_srcToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"Callback_RemoveLiquidityRemote_Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_srcToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_rebalanceFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_protocolFee","type":"uint256"}],"name":"Callback_Swap_Confirm","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_srcToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"Callback_Swap_Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_srcToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Remote_AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_srcToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Remote_RemoveLiquidityLocal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_srcToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"Remote_RemoveLiquidityRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_srcToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"Remote_Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_dstToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"RemoveLiquidityLocal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_dstToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"RemoveLiquidityRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_dstToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"RemoveLiquidityRemote_Confirm","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_dstToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"RemoveLiquidityRemote_Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_dstToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_to","type":"bytes"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_dstToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_rebalanceReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_rebalanceFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_protocolFee","type":"uint256"}],"name":"Swap_Confirm","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_dstToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"Swap_Revoke","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"}],"name":"activateChainPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_srcToken","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"addChainPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"altitudeFactory","outputs":[{"internalType":"contract IFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"altitudeFee","outputs":[{"internalType":"contract IAltitudeFee","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"address","name":"","type":"address"}],"name":"chainPathIndexLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"chainPaths","outputs":[{"internalType":"bool","name":"ready","type":"bool"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"uint256","name":"remoteLiquidity","type":"uint256"},{"internalType":"uint256","name":"localLiquidity","type":"uint256"},{"internalType":"uint256","name":"rewardPoolSize","type":"uint256"},{"internalType":"address","name":"lpToken","type":"address"},{"internalType":"bool","name":"stopSwap","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_Id","type":"uint256"}],"name":"confirmPendingTransaction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"bool","name":"_enable","type":"bool"}],"name":"emergencyStopSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"gasLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"}],"name":"getChainPath","outputs":[{"components":[{"internalType":"bool","name":"ready","type":"bool"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"uint256","name":"remoteLiquidity","type":"uint256"},{"internalType":"uint256","name":"localLiquidity","type":"uint256"},{"internalType":"uint256","name":"rewardPoolSize","type":"uint256"},{"internalType":"address","name":"lpToken","type":"address"},{"internalType":"bool","name":"stopSwap","type":"bool"}],"internalType":"struct Altitude.ChainPath","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getFees","outputs":[{"internalType":"uint256","name":"rebalanceFee","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getRebalanceReward","outputs":[{"internalType":"uint256","name":"rebalanceReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"layerZeroEndpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingTransactions","outputs":[{"internalType":"uint8","name":"txType","type":"uint8"},{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"from","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_type","type":"uint8"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"bytes","name":"_from","type":"bytes"},{"internalType":"uint256","name":"_nativeForDst","type":"uint256"},{"internalType":"bytes","name":"_addressOnDst","type":"bytes"}],"name":"quoteLayerZeroFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"removeLiquidityLocal","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_nativeForDst","type":"uint256"},{"internalType":"bytes","name":"_addressOnDst","type":"bytes"}],"name":"removeLiquidityRemote","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_Id","type":"uint256"}],"name":"revokePendingTransaction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newFeeContract","type":"address"}],"name":"setFeeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTo","type":"address"}],"name":"setFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint8","name":"_functionType","type":"uint8"},{"internalType":"uint256","name":"_gasAmount","type":"uint256"}],"name":"setGasAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_dstAltitudeAddress","type":"bytes"}],"name":"setTrustedRemoteLookup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_nativeForDst","type":"uint256"},{"internalType":"bytes","name":"_addressOnDst","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"viewPendingTx","outputs":[{"components":[{"internalType":"uint8","name":"txType","type":"uint8"},{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"from","type":"bytes"}],"internalType":"struct Altitude.PendingTx[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"address","name":"_dstToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200533e3803806200533e8339810160408190526200003491620000d9565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018055600280546001600160a01b039485166001600160a01b03199182161790915560038054938516938216939093179092556004805491909316911617905562000123565b80516001600160a01b0381168114620000d457600080fd5b919050565b600080600060608486031215620000ef57600080fd5b620000fa84620000bc565b92506200010a60208501620000bc565b91506200011a60408501620000bc565b90509250925092565b61520b80620001336000396000f3fe6080604052600436106102055760003560e01c8063715018a611610117578063a3bfa0fb116100a5578063d43f8de71161006c578063d43f8de7146106b5578063e5f7b59d146106c8578063f2fde38b146106f5578063f46901ed14610715578063fc8691081461073557005b8063a3bfa0fb146105fd578063a7a175eb1461061d578063c04fb4c11461063d578063cbed8b9c14610675578063ce7db9f21461069557005b80638797e3af116100e95780638797e3af146105125780638da5cb5b146105325780639eb6c0ce146105505780639facef2b14610563578063a138ed6b1461058357005b8063715018a614610490578063715e8e6e146104a55780637533d788146104d25780637e432c2c146104ff57005b8063236284bd1161019457806342d65a8d1161016657806342d65a8d146103f057806342dbe168146104105780635f12a5ac14610430578063619f36d6146104505780636531a8b21461047057005b8063236284bd1461036c5780632f159fb51461038c57806337f81db21461039f578063389880bc146103bf57005b806307e0db17116101d857806307e0db17146102d15780630e26f30d146102f157806310ddb137146103045780631d27da7e146103245780631ef24f3f1461035957005b80621d35671461020e578063017e7e581461022e578063024220541461026b57806307968db1146102b157005b3661020c57005b005b34801561021a57600080fd5b5061020c610229366004613eba565b610755565b34801561023a57600080fd5b5060065461024e906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561027757600080fd5b506102a3610286366004613f56565b600860209081526000928352604080842090915290825290205481565b604051908152602001610262565b3480156102bd57600080fd5b5060025461024e906001600160a01b031681565b3480156102dd57600080fd5b5061020c6102ec366004613f8d565b6110ca565b61020c6102ff366004613fc4565b611152565b34801561031057600080fd5b5061020c61031f366004613f8d565b6112e6565b34801561033057600080fd5b5061034461033f366004613fc4565b611344565b60408051928352602083019190915201610262565b61020c610367366004614003565b61152c565b34801561037857600080fd5b5060045461024e906001600160a01b031681565b61020c61039a366004614003565b61170a565b3480156103ab57600080fd5b506102a36103ba366004613fc4565b61199f565b3480156103cb57600080fd5b506103df6103da366004614076565b611ab4565b6040516102629594939291906140f2565b3480156103fc57600080fd5b5061020c61040b366004614174565b611b9e565b34801561041c57600080fd5b5061020c61042b3660046141c6565b611c33565b34801561043c57600080fd5b5061020c61044b366004614174565b611c7f565b34801561045c57600080fd5b5061020c61046b3660046141f1565b611cef565b34801561047c57600080fd5b5061020c61048b36600461423a565b611d48565b34801561049c57600080fd5b5061020c611e8a565b3480156104b157600080fd5b506104c56104c036600461428b565b611efe565b60405161026291906142b7565b3480156104de57600080fd5b506104f26104ed366004613f8d565b61206b565b6040516102629190614351565b61020c61050d366004614364565b612105565b34801561051e57600080fd5b506102a361052d36600461437d565b6124a4565b34801561053e57600080fd5b506000546001600160a01b031661024e565b61020c61055e366004614364565b612757565b34801561056f57600080fd5b5061020c61057e36600461428b565b612b6c565b34801561058f57600080fd5b506105a361059e366004614364565b612c14565b604080519915158a526001600160a01b0398891660208b015261ffff909716968901969096529386166060880152608087019290925260a086015260c08501529190911660e0830152151561010082015261012001610262565b34801561060957600080fd5b5061020c61061836600461441e565b612c8a565b34801561062957600080fd5b5060035461024e906001600160a01b031681565b34801561064957600080fd5b506102a361065836600461428b565b600760209081526000928352604080842090915290825290205481565b34801561068157600080fd5b5061020c6106903660046144aa565b613077565b3480156106a157600080fd5b5061020c6106b0366004613fc4565b613112565b61020c6106c3366004613fc4565b6131e8565b3480156106d457600080fd5b506106e86106e33660046141c6565b6133a2565b6040516102629190614518565b34801561070157600080fd5b5061020c6107103660046141c6565b6134e9565b34801561072157600080fd5b5061020c6107303660046141c6565b6135d3565b34801561074157600080fd5b5061020c6107503660046145bd565b613688565b6002546001600160a01b0316331461076c57600080fd5b61ffff84166000908152600960205260409020805461078a906145eb565b905083511480156107c9575061ffff84166000908152600960205260409081902090516107b79190614625565b60405180910390208380519060200120145b6108765760405162461bcd60e51b815260206004820152606760248201527f416c7469747564653a20496e76616c696420736f757263652073656e6465722060448201527f616464726573732e206f776e65722073686f756c642063616c6c20736574547260648201527f7573746564536f75726365282920746f20656e61626c6520736f7572636520636084820152661bdb9d1c9858dd60ca1b60a482015260c4015b60405180910390fd5b602081015160001960ff821601610a1c57600080600080858060200190518101906108a191906146e0565b9450945094509450506000806014840151915060148601519050600a6000836001600160a01b03166001600160a01b031681526020019081526020016000206040518060a00160405280600160ff1681526020018d61ffff168152602001836001600160a01b0316815260200187815260200185815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816001015560808201518160020190816109d191906147c6565b5050507ffeda7eda137aad0c114534c9940fe3e7defd619dbf3d3349dc4a5f4930dec1618b828785604051610a099493929190614885565b60405180910390a15050505050506110c3565b60011960ff821601610b7857600080600080600086806020019051810190610a4491906148b2565b60148082015190860151959b509399509197509550935091506000610a698d8361373b565b90506000610a77868861494d565b610a819089614960565b905080826003016000828254610a97919061494d565b9250508190555080826002016000828254610ab29190614960565b9250508190555086826004016000828254610acd919061494d565b90915550506006548254610af3916001600160a01b036101009092048216911688613825565b7f4ec93ac81c33ff1c5d3d5476cf8eb5c9adfe0bba8966b9bda2fe2deeee1eb0d98e8483878b8b604051610b629695949392919061ffff9690961686526001600160a01b039485166020870152604086019390935292166060840152608083019190915260a082015260c00190565b60405180910390a15050505050505050506110c3565b60021960ff821601610c1057600080600084806020019051810190610b9d9190614973565b60148082015190840151939750919550935091506000610bbd8b8361373b565b8054909150610bdb9061010090046001600160a01b03168487613825565b7f15297d989e05a7bd30a49540d43af4d211f85ead0374834954035f4c6cb89b498b838786604051610a099493929190614885565b60031960ff821601610cab5760008083806020019051810190610c3391906149e7565b6014820151919450925090506000610c4b898361373b565b905082816002016000828254610c61919061494d565b90915550506040517f7705b3824f364923f8b736799a01f145312fb0bdb41db7907e83e756a12ff0d990610c9a908b9085908790614a40565b60405180910390a1505050506110c3565b60041960ff821601610d355760008083806020019051810190610cce91906149e7565b6014820151919450925090506000610ce6898361373b565b905082816002016000828254610cfc9190614960565b90915550506040517f6a09fa7f5b17fb0269df2d4254a1e779ea60ca16b23202ef5d8c10663a89253090610c9a908b9085908790614a40565b60051960ff821601610ec35760008060008085806020019051810190610d5b91906146e0565b9450945094509450506000806014840151915060148601519050600a6000836001600160a01b03166001600160a01b031681526020019081526020016000206040518060a00160405280600660ff1681526020018d61ffff168152602001836001600160a01b0316815260200187815260200185815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600101556080820151816002019081610e8b91906147c6565b5050507f625e414eb59af4cd7008514584def3eb126bd7dfa3c4fbd57a777094b25f189e8b828785604051610a099493929190614885565b60011960ff821601610fbe57600080600084806020019051810190610ee89190614973565b60148082015190840151939750919550935091506000610f088b8361373b565b905084816002016000828254610f1e9190614960565b90915550506005810154604051632770a7eb60e21b8152306004820152602481018790526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015610f7157600080fd5b505af1158015610f85573d6000803e3d6000fd5b505050507f78a69f71ee39abd80fbf72dc912c223a1dbb804954f147efad2b82d934ee162c8b838786604051610a099493929190614885565b60021960ff8216016110c357600080600084806020019051810190610fe39190614973565b601480820151908401519397509195509350915060006110038b8361373b565b600581015460405163a9059cbb60e01b81526001600160a01b0386811660048301526024820189905292935091169063a9059cbb906044016020604051808303816000875af115801561105a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107e9190614a65565b507f0202af0014658b1e2d1ab8d03a895efb7ec37da094878cecdf10e4e608d91e4c8b8387866040516110b49493929190614885565b60405180910390a15050505050505b5050505050565b6000546001600160a01b031633146110f45760405162461bcd60e51b815260040161086d90614a82565b6002546040516307e0db1760e01b815261ffff831660048201526001600160a01b03909116906307e0db17906024015b600060405180830381600087803b15801561113e57600080fd5b505af11580156110c3573d6000803e3d6000fd5b61115a613888565b6000611166848461373b565b9050818160030154101561118c5760405162461bcd60e51b815260040161086d90614ab7565b6005810154604051632770a7eb60e21b8152336004820152602481018490526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b1580156111da57600080fd5b505af11580156111ee573d6000803e3d6000fd5b50505050818160030160008282546112069190614960565b909155505080546112269061010090046001600160a01b03163384613825565b805460405160009160059161124c9161010090046001600160a01b031690602001614aee565b60408051601f198184030181529082905261126c92918690602001614b0b565b604051602081830303815290604052905061129b600583836000604051806020016040528060008152506138e1565b7fb048ed97e912f8cd58c0fa38e3251ed8bb09ff18d5888ad21a6f84096c5273378585856040516112ce93929190614a40565b60405180910390a150506112e160018055565b505050565b6000546001600160a01b031633146113105760405162461bcd60e51b815260040161086d90614a82565b6002546040516310ddb13760e01b815261ffff831660048201526001600160a01b03909116906310ddb13790602401611124565b6000806000611353868661373b565b6040805161012081018252825460ff808216151583526101008083046001600160a01b039081166020860152600160a81b90930461ffff169484019490945260018501548216606084015260028086015460808501819052600387015460a08601819052600488015460c087015260059097015493841660e0860152600160a01b9093049091161515938301939093529093506000926113f3919061494d565b6113fd9190614b37565b60035460a0840151604051634bcc856560e01b8152600481018490526024810191909152604481018890529192506001600160a01b031690634bcc856590606401602060405180830381865afa15801561145b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147f9190614b59565b93506000600360009054906101000a90046001600160a01b03166001600160a01b0316634722b4a56040518163ffffffff1660e01b815260040160a060405180830381865afa1580156114d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fa9190614b72565b505050509050670de0b6b3a764000081876115159190614bb2565b61151f9190614b37565b9350505050935093915050565b611534613888565b60148101516000611545878761373b565b90506001600160a01b03821661159d5760405162461bcd60e51b815260206004820152601f60248201527f416c7469747564653a207377617020746f207a65726f20616464726573732e00604482015260640161086d565b84816002015410156115c15760405162461bcd60e51b815260040161086d90614ab7565b6005810154600160a01b900460ff161561161d5760405162461bcd60e51b815260206004820152601960248201527f416c7469747564653a2073776170732064697361626c65642e00000000000000604482015260640161086d565b80546116399061010090046001600160a01b0316333088613992565b805460405160009160019161165f9161010090046001600160a01b031690602001614aee565b6040516020818303038152906040528786336040516020016116819190614aee565b60408051601f19818403018152908290526116a29594939291602001614bc9565b60405160208183030381529060405290506116c16001838388886138e1565b7fcb8ff592f9ad638556bf9cd980dbbfb25a4c4871a9bb03279bb324ec7f18e75b888888876040516116f69493929190614c1d565b60405180910390a15050506110c360018055565b611712613888565b60148101516000611723878761373b565b90506001600160a01b0382166117895760405162461bcd60e51b815260206004820152602560248201527f416c7469747564653a207769746864726177616c20746f207a65726f206164646044820152643932b9b99760d91b606482015260840161086d565b848160030154106117e85760405162461bcd60e51b8152602060048201526024808201527f416c7469747564653a2073756666696369656e74206c6f63616c206c697175696044820152636469747960e01b606482015260840161086d565b848160020154101561180c5760405162461bcd60e51b815260040161086d90614ab7565b60058101546040516370a0823160e01b815233600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa158015611856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187a9190614b59565b10156118c85760405162461bcd60e51b815260206004820152601e60248201527f416c7469747564653a206e6f7420656e6f756768204c5020746f6b656e730000604482015260640161086d565b60058101546118e2906001600160a01b0316333088613992565b80546040516000916006916119089161010090046001600160a01b031690602001614aee565b60405160208183030381529060405287863360405160200161192a9190614aee565b60408051601f198184030181529082905261194b9594939291602001614bc9565b604051602081830303815290604052905061196a6006838388886138e1565b7fec113fca99a607dc1ec5035d2709619c47df9f7a4b8c5994319cd0fb9c6b3559888888336040516116f69493929190614885565b6000806119ac858561373b565b6040805161012081018252825460ff808216151583526101008083046001600160a01b039081166020860152600160a81b90930461ffff169484019490945260018501548216606084015260028086015460808501819052600387015460a08601819052600488015460c087015260059097015493841660e0860152600160a01b909304909116151593830193909352909350600092611a4c919061494d565b611a569190614b37565b90508082608001511015611aab576000826080015182611a769190614960565b905080858460c00151611a899190614bb2565b611a939190614b37565b93508260c00151841115611aa9578260c0015193505b505b50509392505050565b600a6020528160005260406000208181548110611ad057600080fd5b600091825260209091206003909102018054600182015460028301805460ff84169650610100840461ffff16955063010000009093046001600160a01b0316939192611b1b906145eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611b47906145eb565b8015611b945780601f10611b6957610100808354040283529160200191611b94565b820191906000526020600020905b815481529060010190602001808311611b7757829003601f168201915b5050505050905085565b6000546001600160a01b03163314611bc85760405162461bcd60e51b815260040161086d90614a82565b6002546040516342d65a8d60e01b81526001600160a01b03909116906342d65a8d90611bfc90869086908690600401614c81565b600060405180830381600087803b158015611c1657600080fd5b505af1158015611c2a573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b03163314611c5d5760405162461bcd60e51b815260040161086d90614a82565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611ca95760405162461bcd60e51b815260040161086d90614a82565b818130604051602001611cbe93929190614ca8565b60408051601f1981840301815291815261ffff8516600090815260096020522090611ce990826147c6565b50505050565b6000546001600160a01b03163314611d195760405162461bcd60e51b815260040161086d90614a82565b6000611d25848461373b565b6005018054921515600160a01b0260ff60a01b1990931692909217909155505050565b6000546001600160a01b03163314611d725760405162461bcd60e51b815260040161086d90614a82565b6000611d7e858561373b565b90508281600401541015611de75760405162461bcd60e51b815260206004820152602a60248201527f416c7469747564653a206e6f7420656e6f7567682066756e647320696e2072656044820152693bb0b932103837b7b61760b11b606482015260840161086d565b80546040516323b872dd60e01b81523060048201526001600160a01b03848116602483015260448201869052610100909204909116906323b872dd906064016020604051808303816000875af1158015611e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e699190614a65565b5082816004016000828254611e7e9190614960565b90915550505050505050565b6000546001600160a01b03163314611eb45760405162461bcd60e51b815260040161086d90614a82565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b604080516101208101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905260c0830182905260e08301829052610100830182905261ffff86168252600781528382206001600160a01b0386168352905291822054600580549293929091908110611f7f57611f7f614cce565b600091825260209182902060408051610120810182526006909302909101805460ff808216151585526001600160a01b0361010080840482169787019790975261ffff600160a81b909304831694860185905260018401548116606087015260028401546080870152600384015460a0870152600484015460c087015260059093015492831660e0860152600160a01b9092049091161515938301939093529092509085161480156120465750826001600160a01b031681606001516001600160a01b0316145b6120625760405162461bcd60e51b815260040161086d90614ce4565b90505b92915050565b60096020526000908152604090208054612084906145eb565b80601f01602080910402602001604051908101604052809291908181526020018280546120b0906145eb565b80156120fd5780601f106120d2576101008083540402835291602001916120fd565b820191906000526020600020905b8154815290600101906020018083116120e057829003601f168201915b505050505081565b61210d613888565b336000908152600a6020526040812080548390811061212e5761212e614cce565b60009182526020822060039091020180549092506121669061ffff610100820416906001600160a01b0363010000009091041661373b565b825490915060ff166000190161225657805460405160009160039161219c9161010090046001600160a01b031690602001614aee565b60408051601f198184030181529082905260018601546121c493926002880190602001614da9565b60405160208183030381529060405290506121f3600383836000604051806020016040528060008152506138e1565b8154600180840154908501546040517f7174c8967828cbed2f4b2522ef60cfa36335be020fb48f61f5934adcf8b4ce809361224893600160a81b90910461ffff16926001600160a01b03909116913390614885565b60405180910390a15061233f565b815460ff166005190161233f5780546040516000916008916122899161010090046001600160a01b031690602001614aee565b60408051601f198184030181529082905260018601546122b193926002880190602001614da9565b60405160208183030381529060405290506122e0600883836000604051806020016040528060008152506138e1565b8154600180840154908501546040517fc5fc5361f0a29148280e13304c1c3932bf30bd6d50e46547d41d5e428fb4f06b9361233593600160a81b90910461ffff16926001600160a01b03909116913390614885565b60405180910390a1505b336000908152600a6020526040902080549061235c600183614960565b8154811061236c5761236c614cce565b9060005260206000209060030201600a6000336001600160a01b03166001600160a01b0316815260200190815260200160002085815481106123b0576123b0614cce565b600091825260209091208254600390920201805460ff19811660ff9093169283178255835461ffff61010091829004160262ffffff199091169092179190911780825582546001600160a01b0363010000009182900416026301000000600160b81b03199091161781556001808301549082015560028082019061243690840182614ddd565b5050336000908152600a6020526040902080549091508061245957612459614eaf565b60008281526020812060036000199093019283020180546001600160b81b031916815560018101829055906124916002830182613d92565b505090555050506124a160018055565b50565b6000806124b1878761373b565b6040805161012081018252825460ff808216151583526101008083046001600160a01b039081166020860152600160a81b90930461ffff1694840194909452600180860154831660608086019190915260028701546080860152600387015460a0860152600487015460c086015260059096015492831660e0850152600160a01b9092048116151593830193909352909350908a16148061255557508860ff166006145b156125ac57600182602001516040516020016125719190614aee565b60408051601f1981840301815290829052612596929160009088908b90602001614ec5565b60405160208183030381529060405290506126bb565b8860ff166002036125f557600282602001516040516020016125ce9190614aee565b60408051601f19818403018152908290526125969291600090819081908a90602001614efc565b8860ff166003148061260a57508860ff166007145b8061261857508860ff166008145b1561265757600282602001516040516020016126349190614aee565b60408051601f198184030181529082905261259692916000908890602001614f52565b8860ff166004148061266c57508860ff166005145b156126bb57600482602001516040516020016126889190614aee565b60408051601f19818403018152908290526126a99291600090602001614f89565b60405160208183030381529060405290505b60006126c98a8a88886139ca565b60025460405163040a7bb160e41b81529192506000916001600160a01b03909116906340a7bb1090612707908d903090889087908990600401614fb8565b6040805180830381865afa158015612723573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127479190615000565b509b9a5050505050505050505050565b61275f613888565b336000908152600a6020526040812080548390811061278057612780614cce565b60009182526020822060039091020180549092506127b89061ffff610100820416906001600160a01b0363010000009091041661373b565b825490915060ff1660001901612a09578160010154816003015410156127f05760405162461bcd60e51b815260040161086d90614ab7565b805460018083015490840154600092839261282392600160a81b90920461ffff16916001600160a01b0390911690611344565b90925090506000612834828461494d565b85600101546128439190614960565b84546001808701549088015492935060009261287492600160a81b900461ffff16916001600160a01b03169061199f565b90508085600401600082825461288a9190614960565b92505081905550818560030160008282546128a59190614960565b92505081905550818560020160008282546128c0919061494d565b909155506128eb9050336128d4838561494d565b875461010090046001600160a01b03169190613825565b84546040516000916002916129119161010090046001600160a01b031690602001614aee565b60405160208183030381529060405288600101548787336040516020016129389190614aee565b60408051601f198184030181529082905261295a969594939291602001615024565b6040516020818303038152906040529050612989600287836000604051806020016040528060008152506138e1565b8554600187015460408051600160a81b90930461ffff1683526001600160a01b03909116602083015281018490523360608201526080810183905260a0810186905260c081018590527fb76e1253ca2b5a7dabb38df18c83579ffdee45ae2898e934321dbdb838d454fe9060e00160405180910390a1505050505061233f565b815460ff166005190161233f57816001015481600301541015612a3e5760405162461bcd60e51b815260040161086d90614ab7565b8160010154816003016000828254612a569190614960565b909155505060018201548154612a7d916101009091046001600160a01b0316903390613825565b8054604051600091600791612aa39161010090046001600160a01b031690602001614aee565b604051602081830303815290604052846001015433604051602001612ac89190614aee565b60408051601f1981840301815290829052612ae894939291602001615064565b6040516020818303038152906040529050612b17600783836000604051806020016040528060008152506138e1565b8154600180840154908501546040517f07d3caa0e08fba164878823c79fbbe40fd0dcf5f2ab7d03ab3d4709d8b87324c9361233593600160a81b90910461ffff16926001600160a01b03909116913390614885565b6000546001600160a01b03163314612b965760405162461bcd60e51b815260040161086d90614a82565b6000612ba2838361373b565b805490915060ff1615612c055760405162461bcd60e51b815260206004820152602560248201527f416c7469747564653a20636861696e5061746820697320616c72656164792061604482015264637469766560d81b606482015260840161086d565b805460ff191660011790555050565b60058181548110612c2457600080fd5b600091825260209091206006909102018054600182015460028301546003840154600485015460059095015460ff808616975061010086046001600160a01b0390811697600160a81b90970461ffff1696958116959290811691600160a01b9091041689565b6000546001600160a01b03163314612cb45760405162461bcd60e51b815260040161086d90614a82565b60005b600554811015612e3257600060058281548110612cd657612cd6614cce565b6000918252602080832060408051610120810182526006909402909101805460ff808216151586526001600160a01b0361010080840482169688019690965261ffff600160a81b909304831694870185905260018401548116606088015260028401546080880152600384015460a0880152600484015460c088015260059093015492831660e0870152600160a01b9092049091161515928401929092529193508816148015612d9b5750856001600160a01b031682606001516001600160a01b0316145b90508015612e1f5760405162461bcd60e51b8152602060048201526044602482018190527f416c7469747564653a2063616e7420637265617465436861696e50617468206f908201527f66206578697374696e67205f647374436861696e496420616e64205f6473745460648201526337b5b2b760e11b608482015260a40161086d565b505080612e2b90615098565b9050612cb7565b5060055461ffff851660009081526007602090815260408083206001600160a01b038089168552925280832093909355600480549351635e867ae360e01b8152929390911691635e867ae391612e8c9187918791016150b1565b6020604051808303816000875af1158015612eab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ecf91906150d6565b90506005604051806101200160405280600015158152602001886001600160a01b031681526020018761ffff168152602001866001600160a01b03168152602001600081526020016000815260200160008152602001836001600160a01b0316815260200160001515815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160000160156101000a81548161ffff021916908361ffff16021790555060608201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816002015560a0820151816003015560c0820151816004015560e08201518160050160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160050160146101000a81548160ff0219169083151502179055505050505050505050565b6000546001600160a01b031633146130a15760405162461bcd60e51b815260040161086d90614a82565b6002546040516332fb62e760e21b81526001600160a01b039091169063cbed8b9c906130d990889088908890889088906004016150f3565b600060405180830381600087803b1580156130f357600080fd5b505af1158015613107573d6000803e3d6000fd5b505050505050505050565b6000546001600160a01b0316331461313c5760405162461bcd60e51b815260040161086d90614a82565b6000613148848461373b565b80546040516323b872dd60e01b81523360048201523060248201526044810185905291925061010090046001600160a01b0316906323b872dd906064016020604051808303816000875af11580156131a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131c89190614a65565b50818160040160008282546131dd919061494d565b909155505050505050565b6131f0613888565b60006131fc848461373b565b805490915060ff16151560011461325f5760405162461bcd60e51b815260206004820152602160248201527f416c7469747564653a20636861696e50617468206973206e6f742061637469766044820152606560f81b606482015260840161086d565b805461327b9061010090046001600160a01b0316333085613992565b60058101546040516340c10f1960e01b8152336004820152602481018490526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156132c957600080fd5b505af11580156132dd573d6000803e3d6000fd5b50505050818160030160008282546132f5919061494d565b909155505080546040516000916004916133209161010090046001600160a01b031690602001614aee565b60408051601f198184030181529082905261334092918690602001614b0b565b604051602081830303815290604052905061336f600483836000604051806020016040528060008152506138e1565b7f2e8d5f9395b4e4b2cbe364c1b86e90bdbd7fcbbeca7559ae43cc2a05f208dbb28585856040516112ce93929190614a40565b6001600160a01b0381166000908152600a60209081526040808320805482518185028101850190935280835260609492939192909184015b828210156134de5760008481526020908190206040805160a08101825260038602909201805460ff81168452610100810461ffff169484019490945263010000009093046001600160a01b0316908201526001820154606082015260028201805491929160808401919061344d906145eb565b80601f0160208091040260200160405190810160405280929190818152602001828054613479906145eb565b80156134c65780601f1061349b576101008083540402835291602001916134c6565b820191906000526020600020905b8154815290600101906020018083116134a957829003601f168201915b505050505081525050815260200190600101906133da565b505050509050919050565b6000546001600160a01b031633146135135760405162461bcd60e51b815260040161086d90614a82565b6001600160a01b0381166135785760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161086d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146135fd5760405162461bcd60e51b815260040161086d90614a82565b6001600160a01b0381166136665760405162461bcd60e51b815260206004820152602a60248201527f416c7469747564653a20726563697069656e742063616e2774206265207a6572604482015269379030b2323932b9b99760b11b606482015260840161086d565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146136b25760405162461bcd60e51b815260040161086d90614a82565b60018260ff16101580156136ca575060088260ff1611155b6137165760405162461bcd60e51b815260206004820152601f60248201527f416c7469747564653a20696e76616c6964205f66756e6374696f6e5479706500604482015260640161086d565b61ffff909216600090815260086020908152604080832060ff90941683529290522055565b60055460009061378d5760405162461bcd60e51b815260206004820152601d60248201527f416c7469747564653a206e6f20636861696e7061746873206578697374000000604482015260640161086d565b61ffff831660009081526007602090815260408083206001600160a01b03861684529091528120546005805490919081106137ca576137ca614cce565b60009182526020909120600690910201805490915061ffff858116600160a81b90920416148015612046575060018101546001600160a01b038481169116146120625760405162461bcd60e51b815260040161086d90614ce4565b6040516001600160a01b0383166024820152604481018290526112e190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613a45565b6002600154036138da5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161086d565b6002600155565b83546000906138ff908790600160a81b900461ffff16868686613b17565b6002548654600160a81b900461ffff1660008181526009602052604090819020905162c5803160e81b81529394506001600160a01b039092169263c5803100923492613958929091908a90339030908a90600401615121565b6000604051808303818588803b15801561397157600080fd5b505af1158015613985573d6000803e3d6000fd5b5050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611ce99085906323b872dd60e01b90608401613851565b61ffff8316600090815260086020908152604080832060ff8816845290915290205460609081908415613a0957613a02818686613c39565b9150613a39565b613a368160408051600160f01b602082015260228082019390935281518082039093018352604201905290565b91505b5090505b949350505050565b6000613a9a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613c6f9092919063ffffffff16565b8051909150156112e15780806020019051810190613ab89190614a65565b6112e15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161086d565b6060613b25868685856139ca565b60025460405163040a7bb160e41b81529192506000916001600160a01b03909116906340a7bb1090613b6390899030908a9087908990600401614fb8565b6040805180830381865afa158015613b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ba39190615000565b50905080341015613c2f5760405162461bcd60e51b815260206004820152604a60248201527f416c7469747564653a20696e73756666696369656e74206d73672e76616c756560448201527f20746f2070617920746f204c617965725a65726f20666f72206d657373616765606482015269103232b634bb32b93c9760b11b608482015260a40161086d565b5095945050505050565b604051606090600290613c5690829087908790879060200161517b565b6040516020818303038152906040529150509392505050565b6060613a3d848460008585600080866001600160a01b03168587604051613c9691906151b9565b60006040518083038185875af1925050503d8060008114613cd3576040519150601f19603f3d011682016040523d82523d6000602084013e613cd8565b606091505b5091509150613ce987838387613cf4565b979650505050505050565b60608315613d63578251600003613d5c576001600160a01b0385163b613d5c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161086d565b5081613a3d565b613a3d8383815115613d785781518083602001fd5b8060405162461bcd60e51b815260040161086d9190614351565b508054613d9e906145eb565b6000825580601f10613dae575050565b601f0160209004906000526020600020908101906124a191905b80821115613ddc5760008155600101613dc8565b5090565b803561ffff81168114613df257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613e3557613e35613df7565b604052919050565b60006001600160401b03821115613e5657613e56613df7565b50601f01601f191660200190565b600082601f830112613e7557600080fd5b8135613e88613e8382613e3d565b613e0d565b818152846020838601011115613e9d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215613ed057600080fd5b613ed985613de0565b935060208501356001600160401b0380821115613ef557600080fd5b613f0188838901613e64565b9450604087013591508082168214613f1857600080fd5b90925060608601359080821115613f2e57600080fd5b50613f3b87828801613e64565b91505092959194509250565b60ff811681146124a157600080fd5b60008060408385031215613f6957600080fd5b613f7283613de0565b91506020830135613f8281613f47565b809150509250929050565b600060208284031215613f9f57600080fd5b613fa882613de0565b9392505050565b6001600160a01b03811681146124a157600080fd5b600080600060608486031215613fd957600080fd5b613fe284613de0565b92506020840135613ff281613faf565b929592945050506040919091013590565b600080600080600060a0868803121561401b57600080fd5b61402486613de0565b9450602086013561403481613faf565b9350604086013592506060860135915060808601356001600160401b0381111561405d57600080fd5b61406988828901613e64565b9150509295509295909350565b6000806040838503121561408957600080fd5b823561409481613faf565b946020939093013593505050565b60005b838110156140bd5781810151838201526020016140a5565b50506000910152565b600081518084526140de8160208601602086016140a2565b601f01601f19169290920160200192915050565b60ff8616815261ffff8516602082015260018060a01b038416604082015282606082015260a060808201526000613ce960a08301846140c6565b60008083601f84011261413e57600080fd5b5081356001600160401b0381111561415557600080fd5b60208301915083602082850101111561416d57600080fd5b9250929050565b60008060006040848603121561418957600080fd5b61419284613de0565b925060208401356001600160401b038111156141ad57600080fd5b6141b98682870161412c565b9497909650939450505050565b6000602082840312156141d857600080fd5b813561206281613faf565b80151581146124a157600080fd5b60008060006060848603121561420657600080fd5b61420f84613de0565b9250602084013561421f81613faf565b9150604084013561422f816141e3565b809150509250925092565b6000806000806080858703121561425057600080fd5b61425985613de0565b9350602085013561426981613faf565b925060408501359150606085013561428081613faf565b939692955090935050565b6000806040838503121561429e57600080fd5b6142a783613de0565b91506020830135613f8281613faf565b8151151581526020808301516001600160a01b0316908201526040808301516101208301916142eb9084018261ffff169052565b50606083015161430660608401826001600160a01b03169052565b506080830151608083015260a083015160a083015260c083015160c083015260e083015161433f60e08401826001600160a01b03169052565b50610100928301511515919092015290565b602081526000613fa860208301846140c6565b60006020828403121561437657600080fd5b5035919050565b60008060008060008060c0878903121561439657600080fd5b86356143a181613f47565b95506143af60208801613de0565b945060408701356143bf81613faf565b935060608701356001600160401b03808211156143db57600080fd5b6143e78a838b01613e64565b94506080890135935060a089013591508082111561440457600080fd5b5061441189828a01613e64565b9150509295509295509295565b600080600080600060a0868803121561443657600080fd5b853561444181613faf565b945061444f60208701613de0565b9350604086013561445f81613faf565b925060608601356001600160401b038082111561447b57600080fd5b61448789838a01613e64565b9350608088013591508082111561449d57600080fd5b5061406988828901613e64565b6000806000806000608086880312156144c257600080fd5b6144cb86613de0565b94506144d960208701613de0565b93506040860135925060608601356001600160401b038111156144fb57600080fd5b6145078882890161412c565b969995985093965092949392505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156145af57888303603f190185528151805160ff1684528781015161ffff1688850152868101516001600160a01b0316878501526060808201519085015260809081015160a09185018290529061459b818601836140c6565b96890196945050509086019060010161453f565b509098975050505050505050565b6000806000606084860312156145d257600080fd5b6145db84613de0565b92506020840135613ff281613f47565b600181811c908216806145ff57607f821691505b60208210810361461f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000808354614633816145eb565b6001828116801561464b57600181146146605761468f565b60ff198416875282151583028701945061468f565b8760005260208060002060005b858110156146865781548a82015290840190820161466d565b50505082870194505b50929695505050505050565b600082601f8301126146ac57600080fd5b81516146ba613e8382613e3d565b8181528460208386010111156146cf57600080fd5b613a3d8260208301602087016140a2565b600080600080600060a086880312156146f857600080fd5b855161470381613f47565b60208701519095506001600160401b038082111561472057600080fd5b61472c89838a0161469b565b955060408801519450606088015191508082111561474957600080fd5b61475589838a0161469b565b9350608088015191508082111561476b57600080fd5b506140698882890161469b565b601f8211156112e157600081815260208120601f850160051c8101602086101561479f5750805b601f850160051c820191505b818110156147be578281556001016147ab565b505050505050565b81516001600160401b038111156147df576147df613df7565b6147f3816147ed84546145eb565b84614778565b602080601f83116001811461482857600084156148105750858301515b600019600386901b1c1916600185901b1785556147be565b600085815260208120601f198616915b8281101561485757888601518255948401946001909101908401614838565b50858210156148755787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff9490941684526001600160a01b039283166020850152604084019190915216606082015260800190565b60008060008060008060c087890312156148cb57600080fd5b86516148d681613f47565b60208801519096506001600160401b03808211156148f357600080fd5b6148ff8a838b0161469b565b965060408901519550606089015194506080890151935060a089015191508082111561492a57600080fd5b5061441189828a0161469b565b634e487b7160e01b600052601160045260246000fd5b8082018082111561206557612065614937565b8181038181111561206557612065614937565b6000806000806080858703121561498957600080fd5b845161499481613f47565b60208601519094506001600160401b03808211156149b157600080fd5b6149bd8883890161469b565b94506040870151935060608701519150808211156149da57600080fd5b50613f3b8782880161469b565b6000806000606084860312156149fc57600080fd5b8351614a0781613f47565b60208501519093506001600160401b03811115614a2357600080fd5b614a2f8682870161469b565b925050604084015190509250925092565b61ffff9390931683526001600160a01b03919091166020830152604082015260600190565b600060208284031215614a7757600080fd5b8151612062816141e3565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601e908201527f416c7469747564653a206e6f7420656e6f756768206c69717569646974790000604082015260600190565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60ff84168152606060208201526000614b2760608301856140c6565b9050826040830152949350505050565b600082614b5457634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215614b6b57600080fd5b5051919050565b600080600080600060a08688031215614b8a57600080fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b808202811582820484141761206557612065614937565b60ff8616815260a060208201526000614be560a08301876140c6565b8560408401528281036060840152614bfd81866140c6565b90508281036080840152614c1181856140c6565b98975050505050505050565b61ffff8516815260018060a01b0384166020820152826040820152608060608201526000614c4e60808301846140c6565b9695505050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201526000614c9f604083018486614c58565b95945050505050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b634e487b7160e01b600052603260045260246000fd5b60208082526028908201527f416c7469747564653a206c6f63616c20636861696e5061746820646f6573206e6040820152671bdd08195e1a5cdd60c21b606082015260800190565b60008154614d39816145eb565b808552602060018381168015614d565760018114614d7057614d9e565b60ff1985168884015283151560051b880183019550614d9e565b866000528260002060005b85811015614d965781548a8201860152908301908401614d7b565b890184019650505b505050505092915050565b60ff85168152608060208201526000614dc560808301866140c6565b8460408401528281036060840152613ce98185614d2c565b818103614de8575050565b614df282546145eb565b6001600160401b03811115614e0957614e09613df7565b614e17816147ed84546145eb565b6000601f821160018114614e4b5760008315614e335750848201545b600019600385901b1c1916600184901b1784556110c3565b600085815260209020601f19841690600086815260209020845b83811015614e855782860154825560019586019590910190602001614e65565b50858310156148755793015460001960f8600387901b161c19169092555050600190811b01905550565b634e487b7160e01b600052603160045260246000fd5b60ff8616815260a060208201526000614ee160a08301876140c6565b60ff861660408401528281036060840152614bfd81866140c6565b60ff8716815260c060208201526000614f1860c08301886140c6565b60ff8716604084015260ff8616606084015260ff8516608084015282810360a0840152614f4581856140c6565b9998505050505050505050565b60ff85168152608060208201526000614f6e60808301866140c6565b60ff851660408401528281036060840152613ce981856140c6565b60ff84168152606060208201526000614fa560608301856140c6565b905060ff83166040830152949350505050565b61ffff861681526001600160a01b038516602082015260a060408201819052600090614fe6908301866140c6565b84151560608401528281036080840152614c1181856140c6565b6000806040838503121561501357600080fd5b505080516020909101519092909150565b60ff8716815260c06020820152600061504060c08301886140c6565b86604084015285606084015284608084015282810360a0840152614f4581856140c6565b60ff8516815260806020820152600061508060808301866140c6565b8460408401528281036060840152613ce981856140c6565b6000600182016150aa576150aa614937565b5060010190565b6040815260006150c460408301856140c6565b8281036020840152614c9f81856140c6565b6000602082840312156150e857600080fd5b815161206281613faf565b600061ffff808816835280871660208401525084604083015260806060830152613ce9608083018486614c58565b61ffff8716815260c06020820152600061513e60c0830188614d2c565b828103604084015261515081886140c6565b6001600160a01b0387811660608601528616608085015283810360a08501529050614f4581856140c6565b61ffff60f01b8560f01b168152836002820152826022820152600082516151a98160428501602087016140a2565b9190910160420195945050505050565b600082516151cb8184602087016140a2565b919091019291505056fea2646970667358221220909c46167e483059649bce247af82d5705c63310d48aba9c741c702e3a474e7064736f6c63430008120033000000000000000000000000f69186dfba60ddb133e91e9a4b5673624293d8f80000000000000000000000008eeb0e9c984cf380856f5e23dc3379d81af77807000000000000000000000000f6d5a6352b7ebfe49048d29cfc3ea47c2a19af3a
Deployed Bytecode
0x6080604052600436106102055760003560e01c8063715018a611610117578063a3bfa0fb116100a5578063d43f8de71161006c578063d43f8de7146106b5578063e5f7b59d146106c8578063f2fde38b146106f5578063f46901ed14610715578063fc8691081461073557005b8063a3bfa0fb146105fd578063a7a175eb1461061d578063c04fb4c11461063d578063cbed8b9c14610675578063ce7db9f21461069557005b80638797e3af116100e95780638797e3af146105125780638da5cb5b146105325780639eb6c0ce146105505780639facef2b14610563578063a138ed6b1461058357005b8063715018a614610490578063715e8e6e146104a55780637533d788146104d25780637e432c2c146104ff57005b8063236284bd1161019457806342d65a8d1161016657806342d65a8d146103f057806342dbe168146104105780635f12a5ac14610430578063619f36d6146104505780636531a8b21461047057005b8063236284bd1461036c5780632f159fb51461038c57806337f81db21461039f578063389880bc146103bf57005b806307e0db17116101d857806307e0db17146102d15780630e26f30d146102f157806310ddb137146103045780631d27da7e146103245780631ef24f3f1461035957005b80621d35671461020e578063017e7e581461022e578063024220541461026b57806307968db1146102b157005b3661020c57005b005b34801561021a57600080fd5b5061020c610229366004613eba565b610755565b34801561023a57600080fd5b5060065461024e906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561027757600080fd5b506102a3610286366004613f56565b600860209081526000928352604080842090915290825290205481565b604051908152602001610262565b3480156102bd57600080fd5b5060025461024e906001600160a01b031681565b3480156102dd57600080fd5b5061020c6102ec366004613f8d565b6110ca565b61020c6102ff366004613fc4565b611152565b34801561031057600080fd5b5061020c61031f366004613f8d565b6112e6565b34801561033057600080fd5b5061034461033f366004613fc4565b611344565b60408051928352602083019190915201610262565b61020c610367366004614003565b61152c565b34801561037857600080fd5b5060045461024e906001600160a01b031681565b61020c61039a366004614003565b61170a565b3480156103ab57600080fd5b506102a36103ba366004613fc4565b61199f565b3480156103cb57600080fd5b506103df6103da366004614076565b611ab4565b6040516102629594939291906140f2565b3480156103fc57600080fd5b5061020c61040b366004614174565b611b9e565b34801561041c57600080fd5b5061020c61042b3660046141c6565b611c33565b34801561043c57600080fd5b5061020c61044b366004614174565b611c7f565b34801561045c57600080fd5b5061020c61046b3660046141f1565b611cef565b34801561047c57600080fd5b5061020c61048b36600461423a565b611d48565b34801561049c57600080fd5b5061020c611e8a565b3480156104b157600080fd5b506104c56104c036600461428b565b611efe565b60405161026291906142b7565b3480156104de57600080fd5b506104f26104ed366004613f8d565b61206b565b6040516102629190614351565b61020c61050d366004614364565b612105565b34801561051e57600080fd5b506102a361052d36600461437d565b6124a4565b34801561053e57600080fd5b506000546001600160a01b031661024e565b61020c61055e366004614364565b612757565b34801561056f57600080fd5b5061020c61057e36600461428b565b612b6c565b34801561058f57600080fd5b506105a361059e366004614364565b612c14565b604080519915158a526001600160a01b0398891660208b015261ffff909716968901969096529386166060880152608087019290925260a086015260c08501529190911660e0830152151561010082015261012001610262565b34801561060957600080fd5b5061020c61061836600461441e565b612c8a565b34801561062957600080fd5b5060035461024e906001600160a01b031681565b34801561064957600080fd5b506102a361065836600461428b565b600760209081526000928352604080842090915290825290205481565b34801561068157600080fd5b5061020c6106903660046144aa565b613077565b3480156106a157600080fd5b5061020c6106b0366004613fc4565b613112565b61020c6106c3366004613fc4565b6131e8565b3480156106d457600080fd5b506106e86106e33660046141c6565b6133a2565b6040516102629190614518565b34801561070157600080fd5b5061020c6107103660046141c6565b6134e9565b34801561072157600080fd5b5061020c6107303660046141c6565b6135d3565b34801561074157600080fd5b5061020c6107503660046145bd565b613688565b6002546001600160a01b0316331461076c57600080fd5b61ffff84166000908152600960205260409020805461078a906145eb565b905083511480156107c9575061ffff84166000908152600960205260409081902090516107b79190614625565b60405180910390208380519060200120145b6108765760405162461bcd60e51b815260206004820152606760248201527f416c7469747564653a20496e76616c696420736f757263652073656e6465722060448201527f616464726573732e206f776e65722073686f756c642063616c6c20736574547260648201527f7573746564536f75726365282920746f20656e61626c6520736f7572636520636084820152661bdb9d1c9858dd60ca1b60a482015260c4015b60405180910390fd5b602081015160001960ff821601610a1c57600080600080858060200190518101906108a191906146e0565b9450945094509450506000806014840151915060148601519050600a6000836001600160a01b03166001600160a01b031681526020019081526020016000206040518060a00160405280600160ff1681526020018d61ffff168152602001836001600160a01b0316815260200187815260200185815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816001015560808201518160020190816109d191906147c6565b5050507ffeda7eda137aad0c114534c9940fe3e7defd619dbf3d3349dc4a5f4930dec1618b828785604051610a099493929190614885565b60405180910390a15050505050506110c3565b60011960ff821601610b7857600080600080600086806020019051810190610a4491906148b2565b60148082015190860151959b509399509197509550935091506000610a698d8361373b565b90506000610a77868861494d565b610a819089614960565b905080826003016000828254610a97919061494d565b9250508190555080826002016000828254610ab29190614960565b9250508190555086826004016000828254610acd919061494d565b90915550506006548254610af3916001600160a01b036101009092048216911688613825565b7f4ec93ac81c33ff1c5d3d5476cf8eb5c9adfe0bba8966b9bda2fe2deeee1eb0d98e8483878b8b604051610b629695949392919061ffff9690961686526001600160a01b039485166020870152604086019390935292166060840152608083019190915260a082015260c00190565b60405180910390a15050505050505050506110c3565b60021960ff821601610c1057600080600084806020019051810190610b9d9190614973565b60148082015190840151939750919550935091506000610bbd8b8361373b565b8054909150610bdb9061010090046001600160a01b03168487613825565b7f15297d989e05a7bd30a49540d43af4d211f85ead0374834954035f4c6cb89b498b838786604051610a099493929190614885565b60031960ff821601610cab5760008083806020019051810190610c3391906149e7565b6014820151919450925090506000610c4b898361373b565b905082816002016000828254610c61919061494d565b90915550506040517f7705b3824f364923f8b736799a01f145312fb0bdb41db7907e83e756a12ff0d990610c9a908b9085908790614a40565b60405180910390a1505050506110c3565b60041960ff821601610d355760008083806020019051810190610cce91906149e7565b6014820151919450925090506000610ce6898361373b565b905082816002016000828254610cfc9190614960565b90915550506040517f6a09fa7f5b17fb0269df2d4254a1e779ea60ca16b23202ef5d8c10663a89253090610c9a908b9085908790614a40565b60051960ff821601610ec35760008060008085806020019051810190610d5b91906146e0565b9450945094509450506000806014840151915060148601519050600a6000836001600160a01b03166001600160a01b031681526020019081526020016000206040518060a00160405280600660ff1681526020018d61ffff168152602001836001600160a01b0316815260200187815260200185815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600101556080820151816002019081610e8b91906147c6565b5050507f625e414eb59af4cd7008514584def3eb126bd7dfa3c4fbd57a777094b25f189e8b828785604051610a099493929190614885565b60011960ff821601610fbe57600080600084806020019051810190610ee89190614973565b60148082015190840151939750919550935091506000610f088b8361373b565b905084816002016000828254610f1e9190614960565b90915550506005810154604051632770a7eb60e21b8152306004820152602481018790526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015610f7157600080fd5b505af1158015610f85573d6000803e3d6000fd5b505050507f78a69f71ee39abd80fbf72dc912c223a1dbb804954f147efad2b82d934ee162c8b838786604051610a099493929190614885565b60021960ff8216016110c357600080600084806020019051810190610fe39190614973565b601480820151908401519397509195509350915060006110038b8361373b565b600581015460405163a9059cbb60e01b81526001600160a01b0386811660048301526024820189905292935091169063a9059cbb906044016020604051808303816000875af115801561105a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107e9190614a65565b507f0202af0014658b1e2d1ab8d03a895efb7ec37da094878cecdf10e4e608d91e4c8b8387866040516110b49493929190614885565b60405180910390a15050505050505b5050505050565b6000546001600160a01b031633146110f45760405162461bcd60e51b815260040161086d90614a82565b6002546040516307e0db1760e01b815261ffff831660048201526001600160a01b03909116906307e0db17906024015b600060405180830381600087803b15801561113e57600080fd5b505af11580156110c3573d6000803e3d6000fd5b61115a613888565b6000611166848461373b565b9050818160030154101561118c5760405162461bcd60e51b815260040161086d90614ab7565b6005810154604051632770a7eb60e21b8152336004820152602481018490526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b1580156111da57600080fd5b505af11580156111ee573d6000803e3d6000fd5b50505050818160030160008282546112069190614960565b909155505080546112269061010090046001600160a01b03163384613825565b805460405160009160059161124c9161010090046001600160a01b031690602001614aee565b60408051601f198184030181529082905261126c92918690602001614b0b565b604051602081830303815290604052905061129b600583836000604051806020016040528060008152506138e1565b7fb048ed97e912f8cd58c0fa38e3251ed8bb09ff18d5888ad21a6f84096c5273378585856040516112ce93929190614a40565b60405180910390a150506112e160018055565b505050565b6000546001600160a01b031633146113105760405162461bcd60e51b815260040161086d90614a82565b6002546040516310ddb13760e01b815261ffff831660048201526001600160a01b03909116906310ddb13790602401611124565b6000806000611353868661373b565b6040805161012081018252825460ff808216151583526101008083046001600160a01b039081166020860152600160a81b90930461ffff169484019490945260018501548216606084015260028086015460808501819052600387015460a08601819052600488015460c087015260059097015493841660e0860152600160a01b9093049091161515938301939093529093506000926113f3919061494d565b6113fd9190614b37565b60035460a0840151604051634bcc856560e01b8152600481018490526024810191909152604481018890529192506001600160a01b031690634bcc856590606401602060405180830381865afa15801561145b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147f9190614b59565b93506000600360009054906101000a90046001600160a01b03166001600160a01b0316634722b4a56040518163ffffffff1660e01b815260040160a060405180830381865afa1580156114d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fa9190614b72565b505050509050670de0b6b3a764000081876115159190614bb2565b61151f9190614b37565b9350505050935093915050565b611534613888565b60148101516000611545878761373b565b90506001600160a01b03821661159d5760405162461bcd60e51b815260206004820152601f60248201527f416c7469747564653a207377617020746f207a65726f20616464726573732e00604482015260640161086d565b84816002015410156115c15760405162461bcd60e51b815260040161086d90614ab7565b6005810154600160a01b900460ff161561161d5760405162461bcd60e51b815260206004820152601960248201527f416c7469747564653a2073776170732064697361626c65642e00000000000000604482015260640161086d565b80546116399061010090046001600160a01b0316333088613992565b805460405160009160019161165f9161010090046001600160a01b031690602001614aee565b6040516020818303038152906040528786336040516020016116819190614aee565b60408051601f19818403018152908290526116a29594939291602001614bc9565b60405160208183030381529060405290506116c16001838388886138e1565b7fcb8ff592f9ad638556bf9cd980dbbfb25a4c4871a9bb03279bb324ec7f18e75b888888876040516116f69493929190614c1d565b60405180910390a15050506110c360018055565b611712613888565b60148101516000611723878761373b565b90506001600160a01b0382166117895760405162461bcd60e51b815260206004820152602560248201527f416c7469747564653a207769746864726177616c20746f207a65726f206164646044820152643932b9b99760d91b606482015260840161086d565b848160030154106117e85760405162461bcd60e51b8152602060048201526024808201527f416c7469747564653a2073756666696369656e74206c6f63616c206c697175696044820152636469747960e01b606482015260840161086d565b848160020154101561180c5760405162461bcd60e51b815260040161086d90614ab7565b60058101546040516370a0823160e01b815233600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa158015611856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187a9190614b59565b10156118c85760405162461bcd60e51b815260206004820152601e60248201527f416c7469747564653a206e6f7420656e6f756768204c5020746f6b656e730000604482015260640161086d565b60058101546118e2906001600160a01b0316333088613992565b80546040516000916006916119089161010090046001600160a01b031690602001614aee565b60405160208183030381529060405287863360405160200161192a9190614aee565b60408051601f198184030181529082905261194b9594939291602001614bc9565b604051602081830303815290604052905061196a6006838388886138e1565b7fec113fca99a607dc1ec5035d2709619c47df9f7a4b8c5994319cd0fb9c6b3559888888336040516116f69493929190614885565b6000806119ac858561373b565b6040805161012081018252825460ff808216151583526101008083046001600160a01b039081166020860152600160a81b90930461ffff169484019490945260018501548216606084015260028086015460808501819052600387015460a08601819052600488015460c087015260059097015493841660e0860152600160a01b909304909116151593830193909352909350600092611a4c919061494d565b611a569190614b37565b90508082608001511015611aab576000826080015182611a769190614960565b905080858460c00151611a899190614bb2565b611a939190614b37565b93508260c00151841115611aa9578260c0015193505b505b50509392505050565b600a6020528160005260406000208181548110611ad057600080fd5b600091825260209091206003909102018054600182015460028301805460ff84169650610100840461ffff16955063010000009093046001600160a01b0316939192611b1b906145eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611b47906145eb565b8015611b945780601f10611b6957610100808354040283529160200191611b94565b820191906000526020600020905b815481529060010190602001808311611b7757829003601f168201915b5050505050905085565b6000546001600160a01b03163314611bc85760405162461bcd60e51b815260040161086d90614a82565b6002546040516342d65a8d60e01b81526001600160a01b03909116906342d65a8d90611bfc90869086908690600401614c81565b600060405180830381600087803b158015611c1657600080fd5b505af1158015611c2a573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b03163314611c5d5760405162461bcd60e51b815260040161086d90614a82565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611ca95760405162461bcd60e51b815260040161086d90614a82565b818130604051602001611cbe93929190614ca8565b60408051601f1981840301815291815261ffff8516600090815260096020522090611ce990826147c6565b50505050565b6000546001600160a01b03163314611d195760405162461bcd60e51b815260040161086d90614a82565b6000611d25848461373b565b6005018054921515600160a01b0260ff60a01b1990931692909217909155505050565b6000546001600160a01b03163314611d725760405162461bcd60e51b815260040161086d90614a82565b6000611d7e858561373b565b90508281600401541015611de75760405162461bcd60e51b815260206004820152602a60248201527f416c7469747564653a206e6f7420656e6f7567682066756e647320696e2072656044820152693bb0b932103837b7b61760b11b606482015260840161086d565b80546040516323b872dd60e01b81523060048201526001600160a01b03848116602483015260448201869052610100909204909116906323b872dd906064016020604051808303816000875af1158015611e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e699190614a65565b5082816004016000828254611e7e9190614960565b90915550505050505050565b6000546001600160a01b03163314611eb45760405162461bcd60e51b815260040161086d90614a82565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b604080516101208101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905260c0830182905260e08301829052610100830182905261ffff86168252600781528382206001600160a01b0386168352905291822054600580549293929091908110611f7f57611f7f614cce565b600091825260209182902060408051610120810182526006909302909101805460ff808216151585526001600160a01b0361010080840482169787019790975261ffff600160a81b909304831694860185905260018401548116606087015260028401546080870152600384015460a0870152600484015460c087015260059093015492831660e0860152600160a01b9092049091161515938301939093529092509085161480156120465750826001600160a01b031681606001516001600160a01b0316145b6120625760405162461bcd60e51b815260040161086d90614ce4565b90505b92915050565b60096020526000908152604090208054612084906145eb565b80601f01602080910402602001604051908101604052809291908181526020018280546120b0906145eb565b80156120fd5780601f106120d2576101008083540402835291602001916120fd565b820191906000526020600020905b8154815290600101906020018083116120e057829003601f168201915b505050505081565b61210d613888565b336000908152600a6020526040812080548390811061212e5761212e614cce565b60009182526020822060039091020180549092506121669061ffff610100820416906001600160a01b0363010000009091041661373b565b825490915060ff166000190161225657805460405160009160039161219c9161010090046001600160a01b031690602001614aee565b60408051601f198184030181529082905260018601546121c493926002880190602001614da9565b60405160208183030381529060405290506121f3600383836000604051806020016040528060008152506138e1565b8154600180840154908501546040517f7174c8967828cbed2f4b2522ef60cfa36335be020fb48f61f5934adcf8b4ce809361224893600160a81b90910461ffff16926001600160a01b03909116913390614885565b60405180910390a15061233f565b815460ff166005190161233f5780546040516000916008916122899161010090046001600160a01b031690602001614aee565b60408051601f198184030181529082905260018601546122b193926002880190602001614da9565b60405160208183030381529060405290506122e0600883836000604051806020016040528060008152506138e1565b8154600180840154908501546040517fc5fc5361f0a29148280e13304c1c3932bf30bd6d50e46547d41d5e428fb4f06b9361233593600160a81b90910461ffff16926001600160a01b03909116913390614885565b60405180910390a1505b336000908152600a6020526040902080549061235c600183614960565b8154811061236c5761236c614cce565b9060005260206000209060030201600a6000336001600160a01b03166001600160a01b0316815260200190815260200160002085815481106123b0576123b0614cce565b600091825260209091208254600390920201805460ff19811660ff9093169283178255835461ffff61010091829004160262ffffff199091169092179190911780825582546001600160a01b0363010000009182900416026301000000600160b81b03199091161781556001808301549082015560028082019061243690840182614ddd565b5050336000908152600a6020526040902080549091508061245957612459614eaf565b60008281526020812060036000199093019283020180546001600160b81b031916815560018101829055906124916002830182613d92565b505090555050506124a160018055565b50565b6000806124b1878761373b565b6040805161012081018252825460ff808216151583526101008083046001600160a01b039081166020860152600160a81b90930461ffff1694840194909452600180860154831660608086019190915260028701546080860152600387015460a0860152600487015460c086015260059096015492831660e0850152600160a01b9092048116151593830193909352909350908a16148061255557508860ff166006145b156125ac57600182602001516040516020016125719190614aee565b60408051601f1981840301815290829052612596929160009088908b90602001614ec5565b60405160208183030381529060405290506126bb565b8860ff166002036125f557600282602001516040516020016125ce9190614aee565b60408051601f19818403018152908290526125969291600090819081908a90602001614efc565b8860ff166003148061260a57508860ff166007145b8061261857508860ff166008145b1561265757600282602001516040516020016126349190614aee565b60408051601f198184030181529082905261259692916000908890602001614f52565b8860ff166004148061266c57508860ff166005145b156126bb57600482602001516040516020016126889190614aee565b60408051601f19818403018152908290526126a99291600090602001614f89565b60405160208183030381529060405290505b60006126c98a8a88886139ca565b60025460405163040a7bb160e41b81529192506000916001600160a01b03909116906340a7bb1090612707908d903090889087908990600401614fb8565b6040805180830381865afa158015612723573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127479190615000565b509b9a5050505050505050505050565b61275f613888565b336000908152600a6020526040812080548390811061278057612780614cce565b60009182526020822060039091020180549092506127b89061ffff610100820416906001600160a01b0363010000009091041661373b565b825490915060ff1660001901612a09578160010154816003015410156127f05760405162461bcd60e51b815260040161086d90614ab7565b805460018083015490840154600092839261282392600160a81b90920461ffff16916001600160a01b0390911690611344565b90925090506000612834828461494d565b85600101546128439190614960565b84546001808701549088015492935060009261287492600160a81b900461ffff16916001600160a01b03169061199f565b90508085600401600082825461288a9190614960565b92505081905550818560030160008282546128a59190614960565b92505081905550818560020160008282546128c0919061494d565b909155506128eb9050336128d4838561494d565b875461010090046001600160a01b03169190613825565b84546040516000916002916129119161010090046001600160a01b031690602001614aee565b60405160208183030381529060405288600101548787336040516020016129389190614aee565b60408051601f198184030181529082905261295a969594939291602001615024565b6040516020818303038152906040529050612989600287836000604051806020016040528060008152506138e1565b8554600187015460408051600160a81b90930461ffff1683526001600160a01b03909116602083015281018490523360608201526080810183905260a0810186905260c081018590527fb76e1253ca2b5a7dabb38df18c83579ffdee45ae2898e934321dbdb838d454fe9060e00160405180910390a1505050505061233f565b815460ff166005190161233f57816001015481600301541015612a3e5760405162461bcd60e51b815260040161086d90614ab7565b8160010154816003016000828254612a569190614960565b909155505060018201548154612a7d916101009091046001600160a01b0316903390613825565b8054604051600091600791612aa39161010090046001600160a01b031690602001614aee565b604051602081830303815290604052846001015433604051602001612ac89190614aee565b60408051601f1981840301815290829052612ae894939291602001615064565b6040516020818303038152906040529050612b17600783836000604051806020016040528060008152506138e1565b8154600180840154908501546040517f07d3caa0e08fba164878823c79fbbe40fd0dcf5f2ab7d03ab3d4709d8b87324c9361233593600160a81b90910461ffff16926001600160a01b03909116913390614885565b6000546001600160a01b03163314612b965760405162461bcd60e51b815260040161086d90614a82565b6000612ba2838361373b565b805490915060ff1615612c055760405162461bcd60e51b815260206004820152602560248201527f416c7469747564653a20636861696e5061746820697320616c72656164792061604482015264637469766560d81b606482015260840161086d565b805460ff191660011790555050565b60058181548110612c2457600080fd5b600091825260209091206006909102018054600182015460028301546003840154600485015460059095015460ff808616975061010086046001600160a01b0390811697600160a81b90970461ffff1696958116959290811691600160a01b9091041689565b6000546001600160a01b03163314612cb45760405162461bcd60e51b815260040161086d90614a82565b60005b600554811015612e3257600060058281548110612cd657612cd6614cce565b6000918252602080832060408051610120810182526006909402909101805460ff808216151586526001600160a01b0361010080840482169688019690965261ffff600160a81b909304831694870185905260018401548116606088015260028401546080880152600384015460a0880152600484015460c088015260059093015492831660e0870152600160a01b9092049091161515928401929092529193508816148015612d9b5750856001600160a01b031682606001516001600160a01b0316145b90508015612e1f5760405162461bcd60e51b8152602060048201526044602482018190527f416c7469747564653a2063616e7420637265617465436861696e50617468206f908201527f66206578697374696e67205f647374436861696e496420616e64205f6473745460648201526337b5b2b760e11b608482015260a40161086d565b505080612e2b90615098565b9050612cb7565b5060055461ffff851660009081526007602090815260408083206001600160a01b038089168552925280832093909355600480549351635e867ae360e01b8152929390911691635e867ae391612e8c9187918791016150b1565b6020604051808303816000875af1158015612eab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ecf91906150d6565b90506005604051806101200160405280600015158152602001886001600160a01b031681526020018761ffff168152602001866001600160a01b03168152602001600081526020016000815260200160008152602001836001600160a01b0316815260200160001515815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160000160156101000a81548161ffff021916908361ffff16021790555060608201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506080820151816002015560a0820151816003015560c0820151816004015560e08201518160050160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160050160146101000a81548160ff0219169083151502179055505050505050505050565b6000546001600160a01b031633146130a15760405162461bcd60e51b815260040161086d90614a82565b6002546040516332fb62e760e21b81526001600160a01b039091169063cbed8b9c906130d990889088908890889088906004016150f3565b600060405180830381600087803b1580156130f357600080fd5b505af1158015613107573d6000803e3d6000fd5b505050505050505050565b6000546001600160a01b0316331461313c5760405162461bcd60e51b815260040161086d90614a82565b6000613148848461373b565b80546040516323b872dd60e01b81523360048201523060248201526044810185905291925061010090046001600160a01b0316906323b872dd906064016020604051808303816000875af11580156131a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131c89190614a65565b50818160040160008282546131dd919061494d565b909155505050505050565b6131f0613888565b60006131fc848461373b565b805490915060ff16151560011461325f5760405162461bcd60e51b815260206004820152602160248201527f416c7469747564653a20636861696e50617468206973206e6f742061637469766044820152606560f81b606482015260840161086d565b805461327b9061010090046001600160a01b0316333085613992565b60058101546040516340c10f1960e01b8152336004820152602481018490526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156132c957600080fd5b505af11580156132dd573d6000803e3d6000fd5b50505050818160030160008282546132f5919061494d565b909155505080546040516000916004916133209161010090046001600160a01b031690602001614aee565b60408051601f198184030181529082905261334092918690602001614b0b565b604051602081830303815290604052905061336f600483836000604051806020016040528060008152506138e1565b7f2e8d5f9395b4e4b2cbe364c1b86e90bdbd7fcbbeca7559ae43cc2a05f208dbb28585856040516112ce93929190614a40565b6001600160a01b0381166000908152600a60209081526040808320805482518185028101850190935280835260609492939192909184015b828210156134de5760008481526020908190206040805160a08101825260038602909201805460ff81168452610100810461ffff169484019490945263010000009093046001600160a01b0316908201526001820154606082015260028201805491929160808401919061344d906145eb565b80601f0160208091040260200160405190810160405280929190818152602001828054613479906145eb565b80156134c65780601f1061349b576101008083540402835291602001916134c6565b820191906000526020600020905b8154815290600101906020018083116134a957829003601f168201915b505050505081525050815260200190600101906133da565b505050509050919050565b6000546001600160a01b031633146135135760405162461bcd60e51b815260040161086d90614a82565b6001600160a01b0381166135785760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161086d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146135fd5760405162461bcd60e51b815260040161086d90614a82565b6001600160a01b0381166136665760405162461bcd60e51b815260206004820152602a60248201527f416c7469747564653a20726563697069656e742063616e2774206265207a6572604482015269379030b2323932b9b99760b11b606482015260840161086d565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146136b25760405162461bcd60e51b815260040161086d90614a82565b60018260ff16101580156136ca575060088260ff1611155b6137165760405162461bcd60e51b815260206004820152601f60248201527f416c7469747564653a20696e76616c6964205f66756e6374696f6e5479706500604482015260640161086d565b61ffff909216600090815260086020908152604080832060ff90941683529290522055565b60055460009061378d5760405162461bcd60e51b815260206004820152601d60248201527f416c7469747564653a206e6f20636861696e7061746873206578697374000000604482015260640161086d565b61ffff831660009081526007602090815260408083206001600160a01b03861684529091528120546005805490919081106137ca576137ca614cce565b60009182526020909120600690910201805490915061ffff858116600160a81b90920416148015612046575060018101546001600160a01b038481169116146120625760405162461bcd60e51b815260040161086d90614ce4565b6040516001600160a01b0383166024820152604481018290526112e190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613a45565b6002600154036138da5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161086d565b6002600155565b83546000906138ff908790600160a81b900461ffff16868686613b17565b6002548654600160a81b900461ffff1660008181526009602052604090819020905162c5803160e81b81529394506001600160a01b039092169263c5803100923492613958929091908a90339030908a90600401615121565b6000604051808303818588803b15801561397157600080fd5b505af1158015613985573d6000803e3d6000fd5b5050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611ce99085906323b872dd60e01b90608401613851565b61ffff8316600090815260086020908152604080832060ff8816845290915290205460609081908415613a0957613a02818686613c39565b9150613a39565b613a368160408051600160f01b602082015260228082019390935281518082039093018352604201905290565b91505b5090505b949350505050565b6000613a9a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613c6f9092919063ffffffff16565b8051909150156112e15780806020019051810190613ab89190614a65565b6112e15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161086d565b6060613b25868685856139ca565b60025460405163040a7bb160e41b81529192506000916001600160a01b03909116906340a7bb1090613b6390899030908a9087908990600401614fb8565b6040805180830381865afa158015613b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ba39190615000565b50905080341015613c2f5760405162461bcd60e51b815260206004820152604a60248201527f416c7469747564653a20696e73756666696369656e74206d73672e76616c756560448201527f20746f2070617920746f204c617965725a65726f20666f72206d657373616765606482015269103232b634bb32b93c9760b11b608482015260a40161086d565b5095945050505050565b604051606090600290613c5690829087908790879060200161517b565b6040516020818303038152906040529150509392505050565b6060613a3d848460008585600080866001600160a01b03168587604051613c9691906151b9565b60006040518083038185875af1925050503d8060008114613cd3576040519150601f19603f3d011682016040523d82523d6000602084013e613cd8565b606091505b5091509150613ce987838387613cf4565b979650505050505050565b60608315613d63578251600003613d5c576001600160a01b0385163b613d5c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161086d565b5081613a3d565b613a3d8383815115613d785781518083602001fd5b8060405162461bcd60e51b815260040161086d9190614351565b508054613d9e906145eb565b6000825580601f10613dae575050565b601f0160209004906000526020600020908101906124a191905b80821115613ddc5760008155600101613dc8565b5090565b803561ffff81168114613df257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613e3557613e35613df7565b604052919050565b60006001600160401b03821115613e5657613e56613df7565b50601f01601f191660200190565b600082601f830112613e7557600080fd5b8135613e88613e8382613e3d565b613e0d565b818152846020838601011115613e9d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215613ed057600080fd5b613ed985613de0565b935060208501356001600160401b0380821115613ef557600080fd5b613f0188838901613e64565b9450604087013591508082168214613f1857600080fd5b90925060608601359080821115613f2e57600080fd5b50613f3b87828801613e64565b91505092959194509250565b60ff811681146124a157600080fd5b60008060408385031215613f6957600080fd5b613f7283613de0565b91506020830135613f8281613f47565b809150509250929050565b600060208284031215613f9f57600080fd5b613fa882613de0565b9392505050565b6001600160a01b03811681146124a157600080fd5b600080600060608486031215613fd957600080fd5b613fe284613de0565b92506020840135613ff281613faf565b929592945050506040919091013590565b600080600080600060a0868803121561401b57600080fd5b61402486613de0565b9450602086013561403481613faf565b9350604086013592506060860135915060808601356001600160401b0381111561405d57600080fd5b61406988828901613e64565b9150509295509295909350565b6000806040838503121561408957600080fd5b823561409481613faf565b946020939093013593505050565b60005b838110156140bd5781810151838201526020016140a5565b50506000910152565b600081518084526140de8160208601602086016140a2565b601f01601f19169290920160200192915050565b60ff8616815261ffff8516602082015260018060a01b038416604082015282606082015260a060808201526000613ce960a08301846140c6565b60008083601f84011261413e57600080fd5b5081356001600160401b0381111561415557600080fd5b60208301915083602082850101111561416d57600080fd5b9250929050565b60008060006040848603121561418957600080fd5b61419284613de0565b925060208401356001600160401b038111156141ad57600080fd5b6141b98682870161412c565b9497909650939450505050565b6000602082840312156141d857600080fd5b813561206281613faf565b80151581146124a157600080fd5b60008060006060848603121561420657600080fd5b61420f84613de0565b9250602084013561421f81613faf565b9150604084013561422f816141e3565b809150509250925092565b6000806000806080858703121561425057600080fd5b61425985613de0565b9350602085013561426981613faf565b925060408501359150606085013561428081613faf565b939692955090935050565b6000806040838503121561429e57600080fd5b6142a783613de0565b91506020830135613f8281613faf565b8151151581526020808301516001600160a01b0316908201526040808301516101208301916142eb9084018261ffff169052565b50606083015161430660608401826001600160a01b03169052565b506080830151608083015260a083015160a083015260c083015160c083015260e083015161433f60e08401826001600160a01b03169052565b50610100928301511515919092015290565b602081526000613fa860208301846140c6565b60006020828403121561437657600080fd5b5035919050565b60008060008060008060c0878903121561439657600080fd5b86356143a181613f47565b95506143af60208801613de0565b945060408701356143bf81613faf565b935060608701356001600160401b03808211156143db57600080fd5b6143e78a838b01613e64565b94506080890135935060a089013591508082111561440457600080fd5b5061441189828a01613e64565b9150509295509295509295565b600080600080600060a0868803121561443657600080fd5b853561444181613faf565b945061444f60208701613de0565b9350604086013561445f81613faf565b925060608601356001600160401b038082111561447b57600080fd5b61448789838a01613e64565b9350608088013591508082111561449d57600080fd5b5061406988828901613e64565b6000806000806000608086880312156144c257600080fd5b6144cb86613de0565b94506144d960208701613de0565b93506040860135925060608601356001600160401b038111156144fb57600080fd5b6145078882890161412c565b969995985093965092949392505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156145af57888303603f190185528151805160ff1684528781015161ffff1688850152868101516001600160a01b0316878501526060808201519085015260809081015160a09185018290529061459b818601836140c6565b96890196945050509086019060010161453f565b509098975050505050505050565b6000806000606084860312156145d257600080fd5b6145db84613de0565b92506020840135613ff281613f47565b600181811c908216806145ff57607f821691505b60208210810361461f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000808354614633816145eb565b6001828116801561464b57600181146146605761468f565b60ff198416875282151583028701945061468f565b8760005260208060002060005b858110156146865781548a82015290840190820161466d565b50505082870194505b50929695505050505050565b600082601f8301126146ac57600080fd5b81516146ba613e8382613e3d565b8181528460208386010111156146cf57600080fd5b613a3d8260208301602087016140a2565b600080600080600060a086880312156146f857600080fd5b855161470381613f47565b60208701519095506001600160401b038082111561472057600080fd5b61472c89838a0161469b565b955060408801519450606088015191508082111561474957600080fd5b61475589838a0161469b565b9350608088015191508082111561476b57600080fd5b506140698882890161469b565b601f8211156112e157600081815260208120601f850160051c8101602086101561479f5750805b601f850160051c820191505b818110156147be578281556001016147ab565b505050505050565b81516001600160401b038111156147df576147df613df7565b6147f3816147ed84546145eb565b84614778565b602080601f83116001811461482857600084156148105750858301515b600019600386901b1c1916600185901b1785556147be565b600085815260208120601f198616915b8281101561485757888601518255948401946001909101908401614838565b50858210156148755787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff9490941684526001600160a01b039283166020850152604084019190915216606082015260800190565b60008060008060008060c087890312156148cb57600080fd5b86516148d681613f47565b60208801519096506001600160401b03808211156148f357600080fd5b6148ff8a838b0161469b565b965060408901519550606089015194506080890151935060a089015191508082111561492a57600080fd5b5061441189828a0161469b565b634e487b7160e01b600052601160045260246000fd5b8082018082111561206557612065614937565b8181038181111561206557612065614937565b6000806000806080858703121561498957600080fd5b845161499481613f47565b60208601519094506001600160401b03808211156149b157600080fd5b6149bd8883890161469b565b94506040870151935060608701519150808211156149da57600080fd5b50613f3b8782880161469b565b6000806000606084860312156149fc57600080fd5b8351614a0781613f47565b60208501519093506001600160401b03811115614a2357600080fd5b614a2f8682870161469b565b925050604084015190509250925092565b61ffff9390931683526001600160a01b03919091166020830152604082015260600190565b600060208284031215614a7757600080fd5b8151612062816141e3565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601e908201527f416c7469747564653a206e6f7420656e6f756768206c69717569646974790000604082015260600190565b60609190911b6bffffffffffffffffffffffff1916815260140190565b60ff84168152606060208201526000614b2760608301856140c6565b9050826040830152949350505050565b600082614b5457634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215614b6b57600080fd5b5051919050565b600080600080600060a08688031215614b8a57600080fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b808202811582820484141761206557612065614937565b60ff8616815260a060208201526000614be560a08301876140c6565b8560408401528281036060840152614bfd81866140c6565b90508281036080840152614c1181856140c6565b98975050505050505050565b61ffff8516815260018060a01b0384166020820152826040820152608060608201526000614c4e60808301846140c6565b9695505050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201526000614c9f604083018486614c58565b95945050505050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b634e487b7160e01b600052603260045260246000fd5b60208082526028908201527f416c7469747564653a206c6f63616c20636861696e5061746820646f6573206e6040820152671bdd08195e1a5cdd60c21b606082015260800190565b60008154614d39816145eb565b808552602060018381168015614d565760018114614d7057614d9e565b60ff1985168884015283151560051b880183019550614d9e565b866000528260002060005b85811015614d965781548a8201860152908301908401614d7b565b890184019650505b505050505092915050565b60ff85168152608060208201526000614dc560808301866140c6565b8460408401528281036060840152613ce98185614d2c565b818103614de8575050565b614df282546145eb565b6001600160401b03811115614e0957614e09613df7565b614e17816147ed84546145eb565b6000601f821160018114614e4b5760008315614e335750848201545b600019600385901b1c1916600184901b1784556110c3565b600085815260209020601f19841690600086815260209020845b83811015614e855782860154825560019586019590910190602001614e65565b50858310156148755793015460001960f8600387901b161c19169092555050600190811b01905550565b634e487b7160e01b600052603160045260246000fd5b60ff8616815260a060208201526000614ee160a08301876140c6565b60ff861660408401528281036060840152614bfd81866140c6565b60ff8716815260c060208201526000614f1860c08301886140c6565b60ff8716604084015260ff8616606084015260ff8516608084015282810360a0840152614f4581856140c6565b9998505050505050505050565b60ff85168152608060208201526000614f6e60808301866140c6565b60ff851660408401528281036060840152613ce981856140c6565b60ff84168152606060208201526000614fa560608301856140c6565b905060ff83166040830152949350505050565b61ffff861681526001600160a01b038516602082015260a060408201819052600090614fe6908301866140c6565b84151560608401528281036080840152614c1181856140c6565b6000806040838503121561501357600080fd5b505080516020909101519092909150565b60ff8716815260c06020820152600061504060c08301886140c6565b86604084015285606084015284608084015282810360a0840152614f4581856140c6565b60ff8516815260806020820152600061508060808301866140c6565b8460408401528281036060840152613ce981856140c6565b6000600182016150aa576150aa614937565b5060010190565b6040815260006150c460408301856140c6565b8281036020840152614c9f81856140c6565b6000602082840312156150e857600080fd5b815161206281613faf565b600061ffff808816835280871660208401525084604083015260806060830152613ce9608083018486614c58565b61ffff8716815260c06020820152600061513e60c0830188614d2c565b828103604084015261515081886140c6565b6001600160a01b0387811660608601528616608085015283810360a08501529050614f4581856140c6565b61ffff60f01b8560f01b168152836002820152826022820152600082516151a98160428501602087016140a2565b9190910160420195945050505050565b600082516151cb8184602087016140a2565b919091019291505056fea2646970667358221220909c46167e483059649bce247af82d5705c63310d48aba9c741c702e3a474e7064736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f69186dfba60ddb133e91e9a4b5673624293d8f80000000000000000000000008eeb0e9c984cf380856f5e23dc3379d81af77807000000000000000000000000f6d5a6352b7ebfe49048d29cfc3ea47c2a19af3a
-----Decoded View---------------
Arg [0] : _endpoint (address): 0xf69186dfBa60DdB133E91E9A4B5673624293d8F8
Arg [1] : _altitudeFee (address): 0x8EEb0E9c984CF380856F5E23dc3379D81Af77807
Arg [2] : _altitudeFactory (address): 0xf6d5a6352b7EbFE49048D29CFc3Ea47C2A19aF3A
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000f69186dfba60ddb133e91e9a4b5673624293d8f8
Arg [1] : 0000000000000000000000008eeb0e9c984cf380856f5e23dc3379d81af77807
Arg [2] : 000000000000000000000000f6d5a6352b7ebfe49048d29cfc3ea47c2a19af3a
Deployed Bytecode Sourcemap
35006:31763:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54450:6240;;;;;;;;;;-1:-1:-1;54450:6240:0;;;;;:::i;:::-;;:::i;36378:20::-;;;;;;;;;;-1:-1:-1;36378:20:0;;;;-1:-1:-1;;;;;36378:20:0;;;;;;-1:-1:-1;;;;;2294:32:1;;;2276:51;;2264:2;2249:18;36378:20:0;;;;;;;;36539:61;;;;;;;;;;-1:-1:-1;36539:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;2923:25:1;;;2911:2;2896:18;36539:61:0;2777:177:1;36216:43:0;;;;;;;;;;-1:-1:-1;36216:43:0;;;;-1:-1:-1;;;;;36216:43:0;;;66230:128;;;;;;;;;;-1:-1:-1;66230:128:0;;;;;:::i;:::-;;:::i;46874:865::-;;;;;;:::i;:::-;;:::i;66366:134::-;;;;;;;;;;-1:-1:-1;66366:134:0;;;;;:::i;:::-;;:::i;60838:490::-;;;;;;;;;;-1:-1:-1;60838:490:0;;;;;:::i;:::-;;:::i;:::-;;;;4085:25:1;;;4141:2;4126:18;;4119:34;;;;4058:18;60838:490:0;3911:248:1;43911:1614:0;;;;;;:::i;:::-;;:::i;36304:31::-;;;;;;;;;;-1:-1:-1;36304:31:0;;;;-1:-1:-1;;;;;36304:31:0;;;48004:1868;;;;;;:::i;:::-;;:::i;61336:639::-;;;;;;;;;;-1:-1:-1;61336:639:0;;;;;:::i;:::-;;:::i;36730:58::-;;;;;;;;;;-1:-1:-1;36730:58:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;66508:185::-;;;;;;;;;;-1:-1:-1;66508:185:0;;;;;:::i;:::-;;:::i;43015:130::-;;;;;;;;;;-1:-1:-1;43015:130:0;;;;;:::i;:::-;;:::i;40719:213::-;;;;;;;;;;-1:-1:-1;40719:213:0;;;;;:::i;:::-;;:::i;43225:210::-;;;;;;;;;;-1:-1:-1;43225:210:0;;;;;:::i;:::-;;:::i;42274:402::-;;;;;;;;;;-1:-1:-1;42274:402:0;;;;;:::i;:::-;;:::i;24465:148::-;;;;;;;;;;;;;:::i;62547:339::-;;;;;;;;;;-1:-1:-1;62547:339:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;36672:51::-;;;;;;;;;;-1:-1:-1;36672:51:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;52540:1233::-;;;;;;:::i;:::-;;:::i;63505:1204::-;;;;;;;;;;-1:-1:-1;63505:1204:0;;;;;:::i;:::-;;:::i;23814:87::-;;;;;;;;;;-1:-1:-1;23860:7:0;23887:6;-1:-1:-1;;;;;23887:6:0;23814:87;;49992:2429;;;;;;:::i;:::-;;:::i;40170:315::-;;;;;;;;;;-1:-1:-1;40170:315:0;;;;;:::i;:::-;;:::i;36342:29::-;;;;;;;;;;-1:-1:-1;36342:29:0;;;;;:::i;:::-;;:::i;:::-;;;;11962:14:1;;11955:22;11937:41;;-1:-1:-1;;;;;12052:15:1;;;12047:2;12032:18;;12025:43;12116:6;12104:19;;;12084:18;;;12077:47;;;;12160:15;;;12155:2;12140:18;;12133:43;12207:3;12192:19;;12185:35;;;;12005:3;12236:19;;12229:35;12295:3;12280:19;;12273:35;12345:15;;;;12339:3;12324:19;;12317:44;12405:14;12398:22;12392:3;12377:19;;12370:51;11924:3;11909:19;36342:29:0;11580:847:1;39272:709:0;;;;;;;;;;-1:-1:-1;39272:709:0;;;;;:::i;:::-;;:::i;36266:31::-;;;;;;;;;;-1:-1:-1;36266:31:0;;;;-1:-1:-1;;;;;36266:31:0;;;36405:74;;;;;;;;;;-1:-1:-1;36405:74:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;66008:214;;;;;;;;;;-1:-1:-1;66008:214:0;;;;;:::i;:::-;;:::i;41730:299::-;;;;;;;;;;-1:-1:-1;41730:299:0;;;;;:::i;:::-;;:::i;45770:845::-;;;;;;:::i;:::-;;:::i;65727:133::-;;;;;;;;;;-1:-1:-1;65727:133:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24768:244::-;;;;;;;;;;-1:-1:-1;24768:244:0;;;;;:::i;:::-;;:::i;42755:172::-;;;;;;;;;;-1:-1:-1;42755:172:0;;;;;:::i;:::-;;:::i;41221:266::-;;;;;;;;;;-1:-1:-1;41221:266:0;;;;;:::i;:::-;;:::i;54450:6240::-;54616:17;;-1:-1:-1;;;;;54616:17:0;54594:10;:40;54586:49;;;;;;54690:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;54668:11;:18;:61;:134;;;;-1:-1:-1;54769:32:0;;;;;;;:19;:32;;;;;;;54759:43;;;;54769:32;54759:43;:::i;:::-;;;;;;;;54743:11;54733:22;;;;;;:69;54668:134;54646:287;;;;-1:-1:-1;;;54646:287:0;;17463:2:1;54646:287:0;;;17445:21:1;17502:3;17482:18;;;17475:31;17542:34;17522:18;;;17515:62;17613:34;17593:18;;;17586:62;17685:34;17664:19;;;17657:63;-1:-1:-1;;;17736:19:1;;;17729:38;17784:19;;54646:287:0;;;;;;;;;55043:2;55029:17;;55023:24;-1:-1:-1;;55108:25:0;;;;55104:5577;;55153:18;55173:14;55189:15;55206:17;55238:8;55227:59;;;;;;;;;;;;:::i;:::-;55150:136;;;;;;;;;55301:17;55333:23;55426:2;55422;55418:11;55412:18;55399:31;;55484:2;55477:5;55473:14;55467:21;55448:40;;55517:19;:30;55537:9;-1:-1:-1;;;;;55517:30:0;-1:-1:-1;;;;;55517:30:0;;;;;;;;;;;;55553:64;;;;;;;;35298:1;55553:64;;;;;;55574:11;55553:64;;;;;;55587:15;-1:-1:-1;;;;;55553:64:0;;;;;55604:6;55553:64;;;;55612:4;55553:64;;;55517:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55517:101:0;;;;;-1:-1:-1;;;;;55517:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;55640:60;55652:11;55665:15;55682:6;55690:9;55640:60;;;;;;;;;:::i;:::-;;;;;;;;55135:615;;;;;;55104:5577;;;-1:-1:-1;;55760:33:0;;;;55756:4925;;55813:18;55833:14;55849:20;55871:19;55892:15;55922:8;55911:70;;;;;;;;;;;;:::i;:::-;56121:2;56113:11;;;56107:18;56168:14;;;56162:21;55810:171;;-1:-1:-1;55810:171:0;;-1:-1:-1;55810:171:0;;-1:-1:-1;55810:171:0;-1:-1:-1;55810:171:0;-1:-1:-1;56107:18:0;-1:-1:-1;55996:17:0;56235:43;56249:11;56162:21;56235:13;:43::i;:::-;56212:66;-1:-1:-1;56293:18:0;56324:26;56339:11;56324:12;:26;:::i;:::-;56314:37;;:6;:37;:::i;:::-;56293:58;;56387:10;56366:2;:17;;;:31;;;;;;;:::i;:::-;;;;;;;;56434:10;56412:2;:18;;;:32;;;;;;;:::i;:::-;;;;;;;;56480:12;56459:2;:17;;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;56540:5:0;;56514:11;;56507:52;;-1:-1:-1;;;;;56540:5:0;56514:11;;;;;;56540:5;56547:11;56507:32;:52::i;:::-;56581:101;56603:11;56616:15;56633:10;56645:9;56656:12;56670:11;56581:101;;;;;;;;;;23331:6:1;23319:19;;;;23301:38;;-1:-1:-1;;;;;23413:15:1;;;23408:2;23393:18;;23386:43;23460:2;23445:18;;23438:34;;;;23508:15;;23503:2;23488:18;;23481:43;23555:3;23540:19;;23533:35;;;;23366:3;23584:19;;23577:35;23288:3;23273:19;;23016:602;56581:101:0;;;;;;;;55795:946;;;;;;;;;55756:4925;;;-1:-1:-1;;56751:32:0;;;;56747:3934;;56803:18;56823:14;56839:15;56869:8;56858:52;;;;;;;;;;;;:::i;:::-;57050:2;57042:11;;;57036:18;57097:14;;;57091:21;56800:110;;-1:-1:-1;56800:110:0;;-1:-1:-1;56800:110:0;-1:-1:-1;57036:18:0;-1:-1:-1;56925:17:0;57164:43;57178:11;57091:21;57164:13;:43::i;:::-;57229:11;;;;-1:-1:-1;57222:51:0;;57229:11;;;-1:-1:-1;;;;;57229:11:0;57255:9;57266:6;57222:32;:51::i;:::-;57295:69;57316:11;57329:15;57346:6;57354:9;57295:69;;;;;;;;;:::i;56747:3934::-;-1:-1:-1;;57434:34:0;;;;57430:3251;;57488:18;57508:14;57537:8;57526:45;;;;;;;;;;;;:::i;:::-;57688:2;57677:14;;57671:21;57485:86;;-1:-1:-1;57485:86:0;-1:-1:-1;57671:21:0;-1:-1:-1;57586:23:0;57744:43;57758:11;57671:21;57744:13;:43::i;:::-;57721:66;;57824:6;57802:2;:18;;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;57852:57:0;;;;;;57872:11;;57885:15;;57902:6;;57852:57;:::i;:::-;;;;;;;;57470:507;;;;57430:3251;;;-1:-1:-1;;57987:43:0;;;;57983:2698;;58050:18;58070:14;58099:8;58088:45;;;;;;;;;;;;:::i;:::-;58250:2;58239:14;;58233:21;58047:86;;-1:-1:-1;58047:86:0;-1:-1:-1;58233:21:0;-1:-1:-1;58148:23:0;58306:43;58320:11;58233:21;58306:13;:43::i;:::-;58283:66;;58386:6;58364:2;:18;;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;58414:65:0;;;;;;58442:11;;58455:15;;58472:6;;58414:65;:::i;57983:2698::-;-1:-1:-1;;58554:44:0;;;;58550:2131;;58618:18;58638:14;58654:15;58671:17;58703:8;58692:59;;;;;;;;;;;;:::i;:::-;58615:136;;;;;;;;;58766:17;58798:23;58891:2;58887;58883:11;58877:18;58864:31;;58949:2;58942:5;58938:14;58932:21;58913:40;;58982:19;:30;59002:9;-1:-1:-1;;;;;58982:30:0;-1:-1:-1;;;;;58982:30:0;;;;;;;;;;;;59018:83;;;;;;;;35579:1;59018:83;;;;;;59058:11;59018:83;;;;;;59071:15;-1:-1:-1;;;;;59018:83:0;;;;;59088:6;59018:83;;;;59096:4;59018:83;;;58982:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58982:120:0;;;;;-1:-1:-1;;;;;58982:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;59124:77;59153:11;59166:15;59183:6;59191:9;59124:77;;;;;;;;;:::i;58550:2131::-;-1:-1:-1;;59280:33:0;;;;59276:1405;;59333:18;59353:14;59369:15;59399:8;59388:52;;;;;;;;;;;;:::i;:::-;59580:2;59572:11;;;59566:18;59627:14;;;59621:21;59330:110;;-1:-1:-1;59330:110:0;;-1:-1:-1;59330:110:0;-1:-1:-1;59566:18:0;-1:-1:-1;59455:17:0;59694:43;59708:11;59621:21;59694:13;:43::i;:::-;59671:66;;59774:6;59752:2;:18;;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;59804:10:0;;;;59795:48;;-1:-1:-1;;;59795:48:0;;59829:4;59795:48;;;25432:51:1;25499:18;;;25492:34;;;-1:-1:-1;;;;;59804:10:0;;;;59795:25;;25405:18:1;;59795:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59865:87;59904:11;59917:15;59934:6;59942:9;59865:87;;;;;;;;;:::i;59276:1405::-;-1:-1:-1;;60044:32:0;;;;60040:641;;60096:18;60116:14;60132:15;60162:8;60151:52;;;;;;;;;;;;:::i;:::-;60343:2;60335:11;;;60329:18;60390:14;;;60384:21;60093:110;;-1:-1:-1;60093:110:0;;-1:-1:-1;60093:110:0;-1:-1:-1;60329:18:0;-1:-1:-1;60218:17:0;60457:43;60471:11;60384:21;60457:13;:43::i;:::-;60522:10;;;;60515:46;;-1:-1:-1;;;60515:46:0;;-1:-1:-1;;;;;25450:32:1;;;60515:46:0;;;25432:51:1;25499:18;;;25492:34;;;60522:10:0;;-1:-1:-1;60522:10:0;;;60515:27;;25405:18:1;;60515:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60583:86;60621:11;60634:15;60651:6;60659:9;60583:86;;;;;;;;;:::i;:::-;;;;;;;;60078:603;;;;;;60040:641;54575:6115;54450:6240;;;;:::o;66230:128::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;66309:17:::1;::::0;:41:::1;::::0;-1:-1:-1;;;66309:41:0;;26322:6:1;26310:19;;66309:41:0::1;::::0;::::1;26292:38:1::0;-1:-1:-1;;;;;66309:17:0;;::::1;::::0;:32:::1;::::0;26265:18:1;;66309:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;46874:865:::0;1625:21;:19;:21::i;:::-;47164:20:::1;47187:37;47201:11;47214:9;47187:13;:37::i;:::-;47164:60;;47264:7;47243:2;:17;;;:28;;47235:71;;;;-1:-1:-1::0;;;47235:71:0::1;;;;;;;:::i;:::-;47328:10;::::0;::::1;::::0;47319:46:::1;::::0;-1:-1:-1;;;47319:46:0;;47345:10:::1;47319:46;::::0;::::1;25432:51:1::0;25499:18;;;25492:34;;;-1:-1:-1;;;;;47328:10:0;;::::1;::::0;47319:25:::1;::::0;25405:18:1;;47319:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47397:7;47376:2;:17;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;47422:11:0;;47415:53:::1;::::0;47422:11:::1;::::0;::::1;-1:-1:-1::0;;;;;47422:11:0::1;47448:10;47460:7:::0;47415:32:::1;:53::i;:::-;47561:11:::0;;47544:29:::1;::::0;47481:20:::1;::::0;35516:1:::1;::::0;47544:29:::1;::::0;47561:11:::1;::::0;::::1;-1:-1:-1::0;;;;;47561:11:0::1;::::0;47544:29:::1;;;:::i;:::-;;::::0;;-1:-1:-1;;47544:29:0;;::::1;::::0;;;;;;;47504:79:::1;::::0;;47575:7;;47544:29:::1;47504:79;;:::i;:::-;;;;;;;;;;;;;47481:102;;47594:66;35516:1;47640:2;47644:7;47653:1;47594:66;;;;;;;;;;;::::0;:16:::1;:66::i;:::-;47678:53;47699:11;47712:9;47723:7;47678:53;;;;;;;;:::i;:::-;;;;;;;;46990:749;;1669:20:::0;1063:1;2189:22;;2006:213;1669:20;46874:865;;;:::o;66366:134::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;66448:17:::1;::::0;:44:::1;::::0;-1:-1:-1;;;66448:44:0;;26322:6:1;26310:19;;66448:44:0::1;::::0;::::1;26292:38:1::0;-1:-1:-1;;;;;66448:17:0;;::::1;::::0;:35:::1;::::0;26265:18:1;;66448:44:0::1;26148:188:1::0;60838:490:0;60932:20;60954:19;60986;61008:37;61022:11;61035:9;61008:13;:37::i;:::-;60986:59;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60986:59:0;;;;;;;-1:-1:-1;;;60986:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60986:59:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;61080:38:0;;60986:59;61080:38;:::i;:::-;61079:44;;;;:::i;:::-;61149:11;;61191:17;;;;61149:69;;-1:-1:-1;;;61149:69:0;;;;;27729:25:1;;;27770:18;;;27763:34;;;;27813:18;;;27806:34;;;61056:67:0;;-1:-1:-1;;;;;;61149:11:0;;:27;;27702:18:1;;61149:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61134:84;;61230:9;61247:11;;;;;;;;;-1:-1:-1;;;;;61247:11:0;-1:-1:-1;;;;;61247:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61229:48;;;;;;61316:4;61312:1;61302:7;:11;;;;:::i;:::-;:18;;;;:::i;:::-;61288:32;;60975:353;;;60838:490;;;;;;:::o;43911:1614::-;1625:21;:19;:21::i;:::-;44696:2:::1;44672:27:::0;::::1;44666:34:::0;44512:21:::1;44759:37;44773:11:::0;44786:9;44759:13:::1;:37::i;:::-;44736:60:::0;-1:-1:-1;;;;;;44815:29:0;::::1;44807:73;;;::::0;-1:-1:-1;;;44807:73:0;;28850:2:1;44807:73:0::1;::::0;::::1;28832:21:1::0;28889:2;28869:18;;;28862:30;28928:33;28908:18;;;28901:61;28979:18;;44807:73:0::1;28648:355:1::0;44807:73:0::1;44921:7;44899:2;:18;;;:29;;44891:72;;;;-1:-1:-1::0;;;44891:72:0::1;;;;;;;:::i;:::-;44982:11;::::0;::::1;::::0;-1:-1:-1;;;44982:11:0;::::1;;;:20;44974:58;;;::::0;-1:-1:-1;;;44974:58:0;;29210:2:1;44974:58:0::1;::::0;::::1;29192:21:1::0;29249:2;29229:18;;;29222:30;29288:27;29268:18;;;29261:55;29333:18;;44974:58:0::1;29008:349:1::0;44974:58:0::1;45158:11:::0;;45151:72:::1;::::0;45158:11:::1;::::0;::::1;-1:-1:-1::0;;;;;45158:11:0::1;45188:10;45208:4;45215:7:::0;45151:36:::1;:72::i;:::-;45298:11:::0;;45281:29:::1;::::0;45236:20:::1;::::0;35298:1:::1;::::0;45281:29:::1;::::0;45298:11:::1;::::0;::::1;-1:-1:-1::0;;;;;45298:11:0::1;::::0;45281:29:::1;;;:::i;:::-;;;;;;;;;;;;;45312:7;45321:13;45353:10;45336:28;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;45336:28:0;;::::1;::::0;;;;;;;45259:106:::1;::::0;;;;;45336:28:::1;45259:106;;:::i;:::-;;;;;;;;;;;;;45236:129;;45376:71;35298:1;45404:2;45408:7;45417:13;45433;45376:16;:71::i;:::-;45465:52;45470:11;45483:9;45494:7;45503:13;45465:52;;;;;;;;;:::i;:::-;;;;;;;;44062:1463;;;1669:20:::0;1063:1;2189:22;;2006:213;48004:1868;1625:21;:19;:21::i;:::-;48853:2:::1;48829:27:::0;::::1;48823:34:::0;48669:21:::1;48916:37;48930:11:::0;48943:9;48916:13:::1;:37::i;:::-;48893:60:::0;-1:-1:-1;;;;;;48972:29:0;::::1;48964:79;;;::::0;-1:-1:-1;;;48964:79:0;;30732:2:1;48964:79:0::1;::::0;::::1;30714:21:1::0;30771:2;30751:18;;;30744:30;30810:34;30790:18;;;30783:62;-1:-1:-1;;;30861:18:1;;;30854:35;30906:19;;48964:79:0::1;30530:401:1::0;48964:79:0::1;49082:7;49062:2;:17;;;:27;49054:76;;;::::0;-1:-1:-1;;;49054:76:0;;31138:2:1;49054:76:0::1;::::0;::::1;31120:21:1::0;31177:2;31157:18;;;31150:30;31216:34;31196:18;;;31189:62;-1:-1:-1;;;31267:18:1;;;31260:34;31311:19;;49054:76:0::1;30936:400:1::0;49054:76:0::1;49171:7;49149:2;:18;;;:29;;49141:72;;;;-1:-1:-1::0;;;49141:72:0::1;;;;;;;:::i;:::-;49239:10;::::0;::::1;::::0;49232:40:::1;::::0;-1:-1:-1;;;49232:40:0;;49261:10:::1;49232:40;::::0;::::1;2276:51:1::0;49276:7:0;;-1:-1:-1;;;;;49239:10:0::1;::::0;49232:28:::1;::::0;2249:18:1;;49232:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;49224:94;;;::::0;-1:-1:-1;;;49224:94:0;;31543:2:1;49224:94:0::1;::::0;::::1;31525:21:1::0;31582:2;31562:18;;;31555:30;31621:32;31601:18;;;31594:60;31671:18;;49224:94:0::1;31341:354:1::0;49224:94:0::1;49439:10;::::0;::::1;::::0;49432:71:::1;::::0;-1:-1:-1;;;;;49439:10:0::1;49468;49488:4;49495:7:::0;49432:35:::1;:71::i;:::-;49605:11:::0;;49588:29:::1;::::0;49524:20:::1;::::0;35579:1:::1;::::0;49588:29:::1;::::0;49605:11:::1;::::0;::::1;-1:-1:-1::0;;;;;49605:11:0::1;::::0;49588:29:::1;;;:::i;:::-;;;;;;;;;;;;;49619:7;49628:13;49660:10;49643:28;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;49643:28:0;;::::1;::::0;;;;;;;49547:125:::1;::::0;;;;;49643:28:::1;49547:125;;:::i;:::-;;;;;;;;;;;;;49524:148;;49683:89;35579:1;49730:2;49734:7;49743:13;49758;49683:16;:89::i;:::-;49798:66;49820:11;49833:9;49844:7;49853:10;49798:66;;;;;;;;;:::i;61336:639::-:0;61441:23;61477:19;61499:37;61513:11;61526:9;61499:13;:37::i;:::-;61477:59;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61477:59:0;;;;;;;-1:-1:-1;;;61477:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61477:59:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;61571:38:0;;61477:59;61571:38;:::i;:::-;61570:44;;;;:::i;:::-;61547:67;;61650:12;61629:2;:18;;;:33;61625:342;;;61679:30;61727:2;:18;;;61712:12;:33;;;;:::i;:::-;61679:66;;61808:22;61798:7;61778:2;:17;;;:27;;;;:::i;:::-;:52;;;;:::i;:::-;61760:70;;61867:2;:17;;;61849:15;:35;61845:111;;;61923:2;:17;;;61905:35;;61845:111;61664:303;61625:342;61466:509;;61336:639;;;;;:::o;36730:58::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36730:58:0;;;;;;-1:-1:-1;36730:58:0;;;;-1:-1:-1;;;;;36730:58:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66508:185::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;66623:17:::1;::::0;:62:::1;::::0;-1:-1:-1;;;66623:62:0;;-1:-1:-1;;;;;66623:17:0;;::::1;::::0;:36:::1;::::0;:62:::1;::::0;66660:11;;66673;;;;66623:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66508:185:::0;;;:::o;43015:130::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;43094:11:::1;:43:::0;;-1:-1:-1;;;;;;43094:43:0::1;-1:-1:-1::0;;;;;43094:43:0;;;::::1;::::0;;;::::1;::::0;;43015:130::o;40719:213::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;40889:19:::1;;40918:4;40872:52;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;40872:52:0;;::::1;::::0;;;;;;40837:32:::1;::::0;::::1;;::::0;;;:19:::1;40872:52;40837:32:::0;;;:87:::1;::::0;:32;:87:::1;:::i;:::-;;40719:213:::0;;;:::o;43225:210::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;43335:20:::1;43358:37;43372:11;43385:9;43358:13;:37::i;:::-;43406:11;;:21:::0;;;::::1;;-1:-1:-1::0;;;43406:21:0::1;-1:-1:-1::0;;;;43406:21:0;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;43225:210:0:o;42274:402::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;42401:20:::1;42424:37;42438:11;42451:9;42424:13;:37::i;:::-;42401:60;;42503:7;42482:2;:17;;;:28;;42474:83;;;::::0;-1:-1:-1;;;42474:83:0;;32869:2:1;42474:83:0::1;::::0;::::1;32851:21:1::0;32908:2;32888:18;;;32881:30;32947:34;32927:18;;;32920:62;-1:-1:-1;;;32998:18:1;;;32991:40;33048:19;;42474:83:0::1;32667:406:1::0;42474:83:0::1;42575:11:::0;;42568:61:::1;::::0;-1:-1:-1;;;42568:61:0;;42609:4:::1;42568:61;::::0;::::1;33318:34:1::0;-1:-1:-1;;;;;33388:15:1;;;33368:18;;;33361:43;33420:18;;;33413:34;;;42575:11:0::1;::::0;;::::1;::::0;;::::1;::::0;42568:32:::1;::::0;33253:18:1;;42568:61:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42661:7;42640:2;:17;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;42274:402:0:o;24465:148::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;24572:1:::1;24556:6:::0;;24535:40:::1;::::0;-1:-1:-1;;;;;24556:6:0;;::::1;::::0;24535:40:::1;::::0;24572:1;;24535:40:::1;24603:1;24586:19:::0;;-1:-1:-1;;;;;;24586:19:0::1;::::0;;24465:148::o;62547:339::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62693:33:0;;;;;:20;:33;;;;;-1:-1:-1;;;;;62693:44:0;;;;;;;;;;62682:10;:56;;-1:-1:-1;;;62682:10:0;;62693:44;62682:56;;;;;;:::i;:::-;;;;;;;;;;62660:78;;;;;;;;62682:56;;;;;;;62660:78;;;;;;;;;;-1:-1:-1;;;;;62660:78:0;;;;;;;;;;;;;;-1:-1:-1;;;62660:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;62660:78:0;;;;;;;;;;;;;;;;;-1:-1:-1;62757:28:0;;;;:56;;;;;62804:9;-1:-1:-1;;;;;62789:24:0;:2;:11;;;-1:-1:-1;;;;;62789:24:0;;62757:56;62749:109;;;;-1:-1:-1;;;62749:109:0;;;;;;;:::i;:::-;62876:2;-1:-1:-1;62547:339:0;;;;;:::o;36672:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52540:1233::-;1625:21;:19;:21::i;:::-;52671:10:::1;52628:20;52651:31:::0;;;:19:::1;:31;::::0;;;;:36;;52683:3;;52651:36;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;;52735:13:::0;;52651:36;;-1:-1:-1;52721:41:0::1;::::0;52735:13:::1;;::::0;::::1;;::::0;-1:-1:-1;;;;;52750:11:0;;;::::1;;52721:13;:41::i;:::-;52810:9:::0;;52698:64;;-1:-1:-1;52810:22:0::1;:9;-1:-1:-1::0;;52810:22:0;52806:744:::1;;52918:11:::0;;52901:29:::1;::::0;52849:20:::1;::::0;35401:1:::1;::::0;52901:29:::1;::::0;52918:11:::1;::::0;::::1;-1:-1:-1::0;;;;;52918:11:0::1;::::0;52901:29:::1;;;:::i;:::-;;::::0;;-1:-1:-1;;52901:29:0;;::::1;::::0;;;;;;;52932:9:::1;::::0;::::1;::::0;52872:79:::1;::::0;;52943:7:::1;::::0;::::1;::::0;52901:29:::1;52872:79;;:::i;:::-;;;;;;;;;;;;;52849:102;;52966:55;35401:1;53001:2;53005:7;53014:1;52966:55;;;;;;;;;;;::::0;:16:::1;:55::i;:::-;53055:13:::0;;53070:11:::1;::::0;;::::1;::::0;53083:9;;::::1;::::0;53043:62:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;53055:13:0;;::::1;;;::::0;-1:-1:-1;;;;;53070:11:0;;::::1;::::0;53094:10:::1;::::0;53043:62:::1;:::i;:::-;;;;;;;;52834:326;52806:744;;;53170:9:::0;;:41:::1;:9;-1:-1:-1::0;;53170:41:0;53166:384:::1;;53316:11:::0;;53299:29:::1;::::0;53228:20:::1;::::0;35720:1:::1;::::0;53299:29:::1;::::0;53316:11:::1;::::0;::::1;-1:-1:-1::0;;;;;53316:11:0::1;::::0;53299:29:::1;;;:::i;:::-;;::::0;;-1:-1:-1;;53299:29:0;;::::1;::::0;;;;;;;53330:9:::1;::::0;::::1;::::0;53251:98:::1;::::0;;53341:7:::1;::::0;::::1;::::0;53299:29:::1;53251:98;;:::i;:::-;;;;;;;;;;;;;53228:121;;53364:73;35720:1;53418:2;53422:7;53431:1;53364:73;;;;;;;;;;;::::0;:16:::1;:73::i;:::-;53488:13:::0;;53503:11:::1;::::0;;::::1;::::0;53516:9;;::::1;::::0;53459:79:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;53488:13:0;;::::1;;;::::0;-1:-1:-1;;;;;53503:11:0;;::::1;::::0;53527:10:::1;::::0;53459:79:::1;:::i;:::-;;;;;;;;53213:337;53166:384;53602:10;53560:19;53582:31:::0;;;:19:::1;:31;::::0;;;;:38;;;53702:14:::1;53715:1;53582:38:::0;53702:14:::1;:::i;:::-;53670:47;;;;;;;;:::i;:::-;;;;;;;;;;;53631:19;:31;53651:10;-1:-1:-1::0;;;;;53631:31:0::1;-1:-1:-1::0;;;;;53631:31:0::1;;;;;;;;;;;;53663:3;53631:36;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:86;;:36:::1;::::0;;::::1;;:86:::0;;-1:-1:-1;;53631:86:0;::::1;;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;;;::::1;;;-1:-1:-1::0;;53631:86:0;;;;;;;;;::::1;::::0;;;;;-1:-1:-1;;;;;53631:86:0;;;;::::1;;;-1:-1:-1::0;;;;;;53631:86:0;;::::1;;::::0;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;53748:10:0::1;53728:31;::::0;;;:19:::1;:31;::::0;;;;:37;;:31;;-1:-1:-1;53728:37:0;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;53728:37:0;;;;;::::1;;::::0;;-1:-1:-1;;;;;;53728:37:0;;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;::::1;::::0;::::1;:::i;:::-;;;;;52617:1156;;;1669:20:::0;1063:1;2189:22;;2006:213;1669:20;52540:1233;:::o;63505:1204::-;63678:7;63698:19;63720:37;63734:11;63747:9;63720:13;:37::i;:::-;63698:59;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;63698:59:0;;;;;;;-1:-1:-1;;;63698:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63698:59:0;;;;;;;;;;;;;;;;-1:-1:-1;63802:10:0;;;;;:24;;;63816:5;:10;;63825:1;63816:10;63802:24;63799:572;;;35298:1;63888:2;:11;;;63871:29;;;;;;;;:::i;:::-;;;;-1:-1:-1;;63871:29:0;;;;;;;;;;63849:77;;;63902:1;;63905:13;;63920:5;;63871:29;63849:77;;:::i;:::-;;;;;;;;;;;;;63839:87;;63799:572;;;63948:5;:10;;63957:1;63948:10;63944:427;;35350:1;64028:2;:11;;;64011:29;;;;;;;;:::i;:::-;;;;-1:-1:-1;;64011:29:0;;;;;;;;;;63981:84;;;64042:1;;;;;;64051:13;;64011:29;63981:84;;:::i;63944:427::-;64087:5;:10;;64096:1;64087:10;:24;;;;64101:5;:10;;64110:1;64101:10;64087:24;:38;;;;64115:5;:10;;64124:1;64115:10;64087:38;64083:288;;;35350:1;64195:2;:11;;;64178:29;;;;;;;;:::i;:::-;;;;-1:-1:-1;;64178:29:0;;;;;;;;;;64148:78;;;64209:1;;64212:13;;64178:29;64148:78;;:::i;64083:288::-;64248:5;:10;;64257:1;64248:10;:24;;;;64262:5;:10;;64271:1;64262:10;64248:24;64244:127;;;35454:1;64343:2;:11;;;64326:29;;;;;;;;:::i;:::-;;;;-1:-1:-1;;64326:29:0;;;;;;;;;;64295:64;;;64357:1;;64326:29;64295:64;;:::i;:::-;;;;;;;;;;;;;64285:74;;64244:127;64381:26;64410:64;64425:5;64432:11;64445:13;64460;64410:14;:64::i;:::-;64583:17;;:89;;-1:-1:-1;;;64583:89:0;;64381:93;;-1:-1:-1;64560:17:0;;-1:-1:-1;;;;;64583:17:0;;;;:30;;:89;;64614:11;;64635:4;;64642:7;;64560:17;;64381:93;;64583:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;64559:113:0;63505:1204;-1:-1:-1;;;;;;;;;;;63505:1204:0:o;49992:2429::-;1625:21;:19;:21::i;:::-;50124:10:::1;50081:20;50104:31:::0;;;:19:::1;:31;::::0;;;;:36;;50136:3;;50104:36;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;;50188:13:::0;;50104:36;;-1:-1:-1;50174:41:0::1;::::0;50188:13:::1;;::::0;::::1;;::::0;-1:-1:-1;;;;;50203:11:0;;;::::1;;50174:13;:41::i;:::-;50264:9:::0;;50151:64;;-1:-1:-1;50264:22:0::1;:9;-1:-1:-1::0;;50264:22:0;50260:1938:::1;;50332:2;:9;;;50311:2;:17;;;:30;;50303:73;;;;-1:-1:-1::0;;;50303:73:0::1;;;;;;;:::i;:::-;50580:13:::0;;50595:11:::1;::::0;;::::1;::::0;50608:9;;::::1;::::0;50527:20:::1;::::0;;;50572:46:::1;::::0;-1:-1:-1;;;50580:13:0;;::::1;;;::::0;-1:-1:-1;;;;;50595:11:0;;::::1;::::0;50572:7:::1;:46::i;:::-;50526:92:::0;;-1:-1:-1;50526:92:0;-1:-1:-1;50633:18:0::1;50667:26;50526:92:::0;;50667:26:::1;:::i;:::-;50654:2;:9;;;:40;;;;:::i;:::-;50886:13:::0;;50901:11:::1;::::0;;::::1;::::0;50914:9;;::::1;::::0;50633:61;;-1:-1:-1;50841:23:0::1;::::0;50867:57:::1;::::0;-1:-1:-1;;;50886:13:0;::::1;;;::::0;-1:-1:-1;;;;;50901:11:0::1;::::0;50867:18:::1;:57::i;:::-;50841:83;;50960:15;50939:2;:17;;;:36;;;;;;;:::i;:::-;;;;;;;;51011:10;50990:2;:17;;;:31;;;;;;;:::i;:::-;;;;;;;;51058:10;51036:2;:18;;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;51083:74:0::1;::::0;-1:-1:-1;51116:10:0::1;51128:28;51141:15:::0;51128:10;:28:::1;:::i;:::-;51090:11:::0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;51090:11:0::1;::::0;;51083:32:::1;:74::i;:::-;51242:11:::0;;51225:29:::1;::::0;51172:20:::1;::::0;35350:1:::1;::::0;51225:29:::1;::::0;51242:11:::1;::::0;::::1;-1:-1:-1::0;;;;;51242:11:0::1;::::0;51225:29:::1;;;:::i;:::-;;;;;;;;;;;;;51256:2;:9;;;51267:12;51281:11;51311:10;51294:28;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;51294:28:0;;::::1;::::0;;;;;;;51195:128:::1;::::0;;;;;;51294:28:::1;51195:128;;:::i;:::-;;;;;;;;;;;;;51172:151;;51338:56;35350:1;51374:2;51378:7;51387:1;51338:56;;;;;;;;;;;::::0;:16:::1;:56::i;:::-;51429:13:::0;;51444:11:::1;::::0;::::1;::::0;51416:108:::1;::::0;;-1:-1:-1;;;51429:13:0;;::::1;;;41138:38:1::0;;-1:-1:-1;;;;;51444:11:0;;::::1;41245:2:1::0;41230:18;;41223:43;41282:18;;41275:34;;;51469:10:0::1;41340:2:1::0;41325:18;;41318:43;41392:3;41377:19;;41370:35;;;41203:3;41421:19;;41414:35;;;41480:3;41465:19;;41458:35;;;51416:108:0::1;::::0;41125:3:1;41110:19;51416:108:0::1;;;;;;;50288:1292;;;;;50260:1938;;;51590:9:::0;;:41:::1;:9;-1:-1:-1::0;;51590:41:0;51586:612:::1;;51677:2;:9;;;51656:2;:17;;;:30;;51648:73;;;;-1:-1:-1::0;;;51648:73:0::1;;;;;;;:::i;:::-;51757:2;:9;;;51736:2;:17;;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;51826:9:0::1;::::0;::::1;::::0;51788:11;;51781:55:::1;::::0;51788:11:::1;::::0;;::::1;-1:-1:-1::0;;;;;51788:11:0::1;::::0;51814:10:::1;::::0;51781:32:::1;:55::i;:::-;51940:11:::0;;51923:29:::1;::::0;51851:20:::1;::::0;35650:1:::1;::::0;51923:29:::1;::::0;51940:11:::1;::::0;::::1;-1:-1:-1::0;;;;;51940:11:0::1;::::0;51923:29:::1;;;:::i;:::-;;;;;;;;;;;;;51954:2;:9;;;51982:10;51965:28;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;51965:28:0;;::::1;::::0;;;;;;;51874:120:::1;::::0;;;;51965:28:::1;51874:120;;:::i;:::-;;;;;;;;;;;;;51851:143;;52009:75;35650:1;52064:2;52068:7;52077:1;52009:75;;;;;;;;;;;::::0;:16:::1;:75::i;:::-;52136:13:::0;;52151:11:::1;::::0;;::::1;::::0;52164:9;;::::1;::::0;52106:80:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;52136:13:0;;::::1;;;::::0;-1:-1:-1;;;;;52151:11:0;;::::1;::::0;52175:10:::1;::::0;52106:80:::1;:::i;40170:315::-:0;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;40266:20:::1;40289:37;40303:11;40316:9;40289:13;:37::i;:::-;40345:8:::0;;40266:60;;-1:-1:-1;40345:8:0::1;;:17;40337:67;;;::::0;-1:-1:-1;;;40337:67:0;;42239:2:1;40337:67:0::1;::::0;::::1;42221:21:1::0;42278:2;42258:18;;;42251:30;42317:34;42297:18;;;42290:62;-1:-1:-1;;;42368:18:1;;;42361:35;42413:19;;40337:67:0::1;42037:401:1::0;40337:67:0::1;40462:15:::0;;-1:-1:-1;;40462:15:0::1;40473:4;40462:15;::::0;;-1:-1:-1;;40170:315:0:o;36342:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36342:29:0;;;-1:-1:-1;;;;;36342:29:0;;;;-1:-1:-1;;;36342:29:0;;;;;;;;;;;;;;;-1:-1:-1;;;36342:29:0;;;;;:::o;39272:709::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;39431:9:::1;39426:298;39450:10;:17:::0;39446:21;::::1;39426:298;;;39489:19;39511:10;39522:1;39511:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;39489:35:::1;::::0;;::::1;::::0;::::1;::::0;;39511:13:::1;::::0;;::::1;::::0;;::::1;39489:35:::0;;::::1;::::0;;::::1;;;::::0;;-1:-1:-1;;;;;39489:35:0::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;39489:35:0;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;-1:-1:-1;;;39489:35:0;;::::1;::::0;;::::1;;;::::0;;;;;;;;;-1:-1:-1;39553:28:0;::::1;;:56:::0;::::1;;;;39600:9;-1:-1:-1::0;;;;;39585:24:0::1;:2;:11;;;-1:-1:-1::0;;;;;39585:24:0::1;;39553:56;39539:70;;39633:6;39632:7;39624:88;;;::::0;-1:-1:-1;;;39624:88:0;;42645:2:1;39624:88:0::1;::::0;::::1;42627:21:1::0;42684:2;42664:18;;;42657:30;;;42723:34;42703:18;;;42696:62;42794:34;42774:18;;;42767:62;-1:-1:-1;;;42845:19:1;;;42838:35;42890:19;;39624:88:0::1;42443:472:1::0;39624:88:0::1;39474:250;;39469:3;;;;:::i;:::-;;;39426:298;;;-1:-1:-1::0;39781:10:0::1;:17:::0;39734:33:::1;::::0;::::1;;::::0;;;:20:::1;:33;::::0;;;;;;;-1:-1:-1;;;;;39734:44:0;;::::1;::::0;;;;;;;:64;;;;39827:15:::1;::::0;;:42;;-1:-1:-1;;;39827:42:0;;39734:33;;39827:15;;::::1;::::0;:26:::1;::::0;:42:::1;::::0;39854:5;;39861:7;;39827:42:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39809:60;;39880:10;39896:76;;;;;;;;39906:5;39896:76;;;;;;39913:9;-1:-1:-1::0;;;;;39896:76:0::1;;;;;39924:11;39896:76;;;;;;39937:9;-1:-1:-1::0;;;;;39896:76:0::1;;;;;39948:1;39896:76;;;;39951:1;39896:76;;;;39954:1;39896:76;;;;39957:7;-1:-1:-1::0;;;;;39896:76:0::1;;;;;39966:5;39896:76;;;;::::0;39880:93:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;39880:93:0::1;;;;;-1:-1:-1::0;;;;;39880:93:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;39880:93:0::1;;;;;-1:-1:-1::0;;;;;39880:93:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;39880:93:0::1;;;;;-1:-1:-1::0;;;;;39880:93:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39415:566;39272:709:::0;;;;;:::o;66008:214::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;66145:17:::1;::::0;:69:::1;::::0;-1:-1:-1;;;66145:69:0;;-1:-1:-1;;;;;66145:17:0;;::::1;::::0;:27:::1;::::0;:69:::1;::::0;66173:8;;66183;;66193:11;;66206:7;;;;66145:69:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66008:214:::0;;;;;:::o;41730:299::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;41843:20:::1;41866:37;41880:11;41893:9;41866:13;:37::i;:::-;41921:11:::0;;41914:68:::1;::::0;-1:-1:-1;;;41914:68:0;;41947:10:::1;41914:68;::::0;::::1;33318:34:1::0;41967:4:0::1;33368:18:1::0;;;33361:43;33420:18;;;33413:34;;;41921:11:0;;-1:-1:-1;41921:11:0::1;::::0;::::1;-1:-1:-1::0;;;;;41921:11:0::1;::::0;41914:32:::1;::::0;33253:18:1;;41914:68:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42014:7;41993:2;:17;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;41730:299:0:o;45770:845::-;1625:21;:19;:21::i;:::-;46056:20:::1;46079:37;46093:11;46106:9;46079:13;:37::i;:::-;46135:8:::0;;46056:60;;-1:-1:-1;46135:8:0::1;;:16;;:8:::0;:16:::1;46127:62;;;::::0;-1:-1:-1;;;46127:62:0;;44407:2:1;46127:62:0::1;::::0;::::1;44389:21:1::0;44446:2;44426:18;;;44419:30;44485:34;44465:18;;;44458:62;-1:-1:-1;;;44536:18:1;;;44529:31;44577:19;;46127:62:0::1;44205:397:1::0;46127:62:0::1;46209:11:::0;;46202:72:::1;::::0;46209:11:::1;::::0;::::1;-1:-1:-1::0;;;;;46209:11:0::1;46239:10;46259:4;46266:7:::0;46202:36:::1;:72::i;:::-;46294:10;::::0;::::1;::::0;46285:46:::1;::::0;-1:-1:-1;;;46285:46:0;;46311:10:::1;46285:46;::::0;::::1;25432:51:1::0;25499:18;;;25492:34;;;-1:-1:-1;;;;;46294:10:0;;::::1;::::0;46285:25:::1;::::0;25405:18:1;;46285:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46363:7;46342:2;:17;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;46454:11:0;;46437:29:::1;::::0;46383:20:::1;::::0;35454:1:::1;::::0;46437:29:::1;::::0;46454:11:::1;::::0;::::1;-1:-1:-1::0;;;;;46454:11:0::1;::::0;46437:29:::1;;;:::i;:::-;;::::0;;-1:-1:-1;;46437:29:0;;::::1;::::0;;;;;;;46406:70:::1;::::0;;46468:7;;46437:29:::1;46406:70;;:::i;:::-;;;;;;;;;;;;;46383:93;;46487:57;35454:1;46524:2;46528:7;46537:1;46487:57;;;;;;;;;;;::::0;:16:::1;:57::i;:::-;46562:45;46575:11;46588:9;46599:7;46562:45;;;;;;;;:::i;65727:133::-:0;-1:-1:-1;;;;;65825:26:0;;;;;;:19;:26;;;;;;;;65817:35;;;;;;;;;;;;;;;;;65786:18;;65817:35;;65825:26;;65817:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65817:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65727:133;;;:::o;24768:244::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24857:22:0;::::1;24849:73;;;::::0;-1:-1:-1;;;24849:73:0;;44809:2:1;24849:73:0::1;::::0;::::1;44791:21:1::0;44848:2;44828:18;;;44821:30;44887:34;44867:18;;;44860:62;-1:-1:-1;;;44938:18:1;;;44931:36;44984:19;;24849:73:0::1;44607:402:1::0;24849:73:0::1;24959:6;::::0;;24938:38:::1;::::0;-1:-1:-1;;;;;24938:38:0;;::::1;::::0;24959:6;::::1;::::0;24938:38:::1;::::0;::::1;24987:6;:17:::0;;-1:-1:-1;;;;;;24987:17:0::1;-1:-1:-1::0;;;;;24987:17:0;;;::::1;::::0;;;::::1;::::0;;24768:244::o;42755:172::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42827:20:0;::::1;42819:75;;;::::0;-1:-1:-1;;;42819:75:0;;45216:2:1;42819:75:0::1;::::0;::::1;45198:21:1::0;45255:2;45235:18;;;45228:30;45294:34;45274:18;;;45267:62;-1:-1:-1;;;45345:18:1;;;45338:40;45395:19;;42819:75:0::1;45014:406:1::0;42819:75:0::1;42905:5;:14:::0;;-1:-1:-1;;;;;;42905:14:0::1;-1:-1:-1::0;;;;;42905:14:0;;;::::1;::::0;;;::::1;::::0;;42755:172::o;41221:266::-;23860:7;23887:6;-1:-1:-1;;;;;23887:6:0;22397:10;24034:23;24026:68;;;;-1:-1:-1;;;24026:68:0;;;;;;;:::i;:::-;41359:1:::1;41342:13;:18;;;;:40;;;;;41381:1;41364:13;:18;;;;41342:40;41334:84;;;::::0;-1:-1:-1;;;41334:84:0;;45627:2:1;41334:84:0::1;::::0;::::1;45609:21:1::0;45666:2;45646:18;;;45639:30;45705:33;45685:18;;;45678:61;45756:18;;41334:84:0::1;45425:355:1::0;41334:84:0::1;41429:22;::::0;;::::1;;::::0;;;:9:::1;:22;::::0;;;;;;;:37:::1;::::0;;::::1;::::0;;;;;;:50;41221:266::o;62123:416::-;62246:10;:17;62208;;62238:63;;;;-1:-1:-1;;;62238:63:0;;45987:2:1;62238:63:0;;;45969:21:1;46026:2;46006:18;;;45999:30;46065:31;46045:18;;;46038:59;46114:18;;62238:63:0;45785:353:1;62238:63:0;62346:33;;;62312:20;62346:33;;;:20;:33;;;;;;;;-1:-1:-1;;;;;62346:44:0;;;;;;;;;;62335:10;:56;;:10;;62346:44;62335:56;;;;;;:::i;:::-;;;;;;;;;;;;;;62410:13;;62335:56;;-1:-1:-1;62410:28:0;;;;-1:-1:-1;;;62410:13:0;;;;:28;:56;;;;-1:-1:-1;62442:11:0;;;;-1:-1:-1;;;;;62442:24:0;;;:11;;:24;62402:109;;;;-1:-1:-1;;;62402:109:0;;;;;;;:::i;17796:211::-;17940:58;;-1:-1:-1;;;;;25450:32:1;;17940:58:0;;;25432:51:1;25499:18;;;25492:34;;;17913:86:0;;17933:5;;-1:-1:-1;;;17963:23:0;25405:18:1;;17940:58:0;;;;-1:-1:-1;;17940:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;17940:58:0;-1:-1:-1;;;;;;17940:58:0;;;;;;;;;;17913:19;:86::i;1705:293::-;1107:1;1839:7;;:19;1831:63;;;;-1:-1:-1;;;1831:63:0;;46345:2:1;1831:63:0;;;46327:21:1;46384:2;46364:18;;;46357:30;46423:33;46403:18;;;46396:61;46474:18;;1831:63:0;46143:355:1;1831:63:0;1107:1;1972:7;:18;1705:293::o;53861:441::-;54081:13;;54020:26;;54049:83;;54067:12;;-1:-1:-1;;;54081:13:0;;;;54096:7;54105:12;54119;54049:17;:83::i;:::-;54143:17;;54184:13;;-1:-1:-1;;;54184:13:0;;;;54143:17;54199:34;;;:19;:34;;;;;;;54143:151;;-1:-1:-1;;;54143:151:0;;54020:112;;-1:-1:-1;;;;;;54143:17:0;;;;:22;;54173:9;;54143:151;;54184:13;;54199:34;54235:7;;54252:10;;54273:4;;54020:112;;54143:151;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54009:293;53861:441;;;;;:::o;18015:248::-;18186:68;;-1:-1:-1;;;;;33336:15:1;;;18186:68:0;;;33318:34:1;33388:15;;33368:18;;;33361:43;33420:18;;;33413:34;;;18159:96:0;;18179:5;;-1:-1:-1;;;18209:27:0;33253:18:1;;18186:68:0;33078:375:1;64717:547:0;64947:22;;;64910:34;64947:22;;;:9;:22;;;;;;;;:29;;;;;;;;;;;64848:12;;;;64991:17;;64987:239;;65041:77;65061:26;65089:13;65104;65041:19;:77::i;:::-;65025:93;;64987:239;;;65167:47;65187:26;65404:36;;;-1:-1:-1;;;65404:36:0;;;48924:51:1;48991:11;;;;48984:27;;;;65404:36:0;;;;;;;;;;49027:12:1;;65404:36:0;;;65272:176;65167:47;65151:63;;64987:239;-1:-1:-1;65243:13:0;-1:-1:-1;64717:547:0;;;;;;;:::o;20863:716::-;21287:23;21313:69;21341:4;21313:69;;;;;;;;;;;;;;;;;21321:5;-1:-1:-1;;;;;21313:27:0;;;:69;;;;;:::i;:::-;21397:17;;21287:95;;-1:-1:-1;21397:21:0;21393:179;;21494:10;21483:30;;;;;;;;;;;;:::i;:::-;21475:85;;;;-1:-1:-1;;;21475:85:0;;47552:2:1;21475:85:0;;;47534:21:1;47591:2;47571:18;;;47564:30;47630:34;47610:18;;;47603:62;-1:-1:-1;;;47681:18:1;;;47674:40;47731:19;;21475:85:0;47350:406:1;62894:603:0;63051:26;63106:64;63121:5;63128:11;63141:13;63156;63106:14;:64::i;:::-;63279:17;;:90;;-1:-1:-1;;;63279:90:0;;63090:80;;-1:-1:-1;63256:17:0;;-1:-1:-1;;;;;63279:17:0;;;;:30;;:90;;63310:11;;63331:4;;63338:8;;63256:17;;63090:80;;63279:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63255:114;;;63401:9;63388;:22;;63380:109;;;;-1:-1:-1;;;63380:109:0;;47963:2:1;63380:109:0;;;47945:21:1;48002:2;47982:18;;;47975:30;48041:34;48021:18;;;48014:62;48112:34;48092:18;;;48085:62;-1:-1:-1;;;48163:19:1;;;48156:41;48214:19;;63380:109:0;47761:478:1;63380:109:0;63079:418;62894:603;;;;;;;:::o;65456:263::-;65642:69;;65582:12;;65623:1;;65642:69;;65623:1;;65667:10;;65679:16;;65697:13;;65642:69;;;:::i;:::-;;;;;;;;;;;;;65635:76;;;65456:263;;;;;:::o;11692:229::-;11829:12;11861:52;11883:6;11891:4;11897:1;11900:12;11829;13100;13114:23;13141:6;-1:-1:-1;;;;;13141:11:0;13160:5;13167:4;13141:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13099:73;;;;13190:69;13217:6;13225:7;13234:10;13246:12;13190:26;:69::i;:::-;13183:76;12812:455;-1:-1:-1;;;;;;;12812:455:0:o;15385:644::-;15570:12;15599:7;15595:427;;;15627:10;:17;15648:1;15627:22;15623:290;;-1:-1:-1;;;;;9231:19:0;;;15837:60;;;;-1:-1:-1;;;15837:60:0;;49951:2:1;15837:60:0;;;49933:21:1;49990:2;49970:18;;;49963:30;50029:31;50009:18;;;50002:59;50078:18;;15837:60:0;49749:353:1;15837:60:0;-1:-1:-1;15934:10:0;15927:17;;15595:427;15977:33;15985:10;15997:12;16732:17;;:21;16728:388;;16964:10;16958:17;17021:15;17008:10;17004:2;17000:19;16993:44;16728:388;17091:12;17084:20;;-1:-1:-1;;;17084:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:159:1:-;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;110:57;14:159;;;:::o;178:127::-;239:10;234:3;230:20;227:1;220:31;270:4;267:1;260:15;294:4;291:1;284:15;310:275;381:2;375:9;446:2;427:13;;-1:-1:-1;;423:27:1;411:40;;-1:-1:-1;;;;;466:34:1;;502:22;;;463:62;460:88;;;528:18;;:::i;:::-;564:2;557:22;310:275;;-1:-1:-1;310:275:1:o;590:186::-;638:4;-1:-1:-1;;;;;663:6:1;660:30;657:56;;;693:18;;:::i;:::-;-1:-1:-1;759:2:1;738:15;-1:-1:-1;;734:29:1;765:4;730:40;;590:186::o;781:462::-;823:5;876:3;869:4;861:6;857:17;853:27;843:55;;894:1;891;884:12;843:55;930:6;917:20;961:48;977:31;1005:2;977:31;:::i;:::-;961:48;:::i;:::-;1034:2;1025:7;1018:19;1080:3;1073:4;1068:2;1060:6;1056:15;1052:26;1049:35;1046:55;;;1097:1;1094;1087:12;1046:55;1162:2;1155:4;1147:6;1143:17;1136:4;1127:7;1123:18;1110:55;1210:1;1185:16;;;1203:4;1181:27;1174:38;;;;1189:7;781:462;-1:-1:-1;;;781:462:1:o;1248:768::-;1350:6;1358;1366;1374;1427:3;1415:9;1406:7;1402:23;1398:33;1395:53;;;1444:1;1441;1434:12;1395:53;1467:28;1485:9;1467:28;:::i;:::-;1457:38;;1546:2;1535:9;1531:18;1518:32;-1:-1:-1;;;;;1610:2:1;1602:6;1599:14;1596:34;;;1626:1;1623;1616:12;1596:34;1649:49;1690:7;1681:6;1670:9;1666:22;1649:49;:::i;:::-;1639:59;;1748:2;1737:9;1733:18;1720:32;1707:45;;1792:2;1785:5;1781:14;1774:5;1771:25;1761:53;;1810:1;1807;1800:12;1761:53;1833:5;;-1:-1:-1;1891:2:1;1876:18;;1863:32;;1907:16;;;1904:36;;;1936:1;1933;1926:12;1904:36;;1959:51;2002:7;1991:8;1980:9;1976:24;1959:51;:::i;:::-;1949:61;;;1248:768;;;;;;;:::o;2338:114::-;2422:4;2415:5;2411:16;2404:5;2401:27;2391:55;;2442:1;2439;2432:12;2457:315;2522:6;2530;2583:2;2571:9;2562:7;2558:23;2554:32;2551:52;;;2599:1;2596;2589:12;2551:52;2622:28;2640:9;2622:28;:::i;:::-;2612:38;;2700:2;2689:9;2685:18;2672:32;2713:29;2736:5;2713:29;:::i;:::-;2761:5;2751:15;;;2457:315;;;;;:::o;3194:184::-;3252:6;3305:2;3293:9;3284:7;3280:23;3276:32;3273:52;;;3321:1;3318;3311:12;3273:52;3344:28;3362:9;3344:28;:::i;:::-;3334:38;3194:184;-1:-1:-1;;;3194:184:1:o;3383:131::-;-1:-1:-1;;;;;3458:31:1;;3448:42;;3438:70;;3504:1;3501;3494:12;3519:387;3595:6;3603;3611;3664:2;3652:9;3643:7;3639:23;3635:32;3632:52;;;3680:1;3677;3670:12;3632:52;3703:28;3721:9;3703:28;:::i;:::-;3693:38;;3781:2;3770:9;3766:18;3753:32;3794:31;3819:5;3794:31;:::i;:::-;3519:387;;3844:5;;-1:-1:-1;;;3896:2:1;3881:18;;;;3868:32;;3519:387::o;4164:665::-;4267:6;4275;4283;4291;4299;4352:3;4340:9;4331:7;4327:23;4323:33;4320:53;;;4369:1;4366;4359:12;4320:53;4392:28;4410:9;4392:28;:::i;:::-;4382:38;;4470:2;4459:9;4455:18;4442:32;4483:31;4508:5;4483:31;:::i;:::-;4533:5;-1:-1:-1;4585:2:1;4570:18;;4557:32;;-1:-1:-1;4636:2:1;4621:18;;4608:32;;-1:-1:-1;4691:3:1;4676:19;;4663:33;-1:-1:-1;;;;;4708:30:1;;4705:50;;;4751:1;4748;4741:12;4705:50;4774:49;4815:7;4806:6;4795:9;4791:22;4774:49;:::i;:::-;4764:59;;;4164:665;;;;;;;;:::o;5059:315::-;5127:6;5135;5188:2;5176:9;5167:7;5163:23;5159:32;5156:52;;;5204:1;5201;5194:12;5156:52;5243:9;5230:23;5262:31;5287:5;5262:31;:::i;:::-;5312:5;5364:2;5349:18;;;;5336:32;;-1:-1:-1;;;5059:315:1:o;5474:250::-;5559:1;5569:113;5583:6;5580:1;5577:13;5569:113;;;5659:11;;;5653:18;5640:11;;;5633:39;5605:2;5598:10;5569:113;;;-1:-1:-1;;5716:1:1;5698:16;;5691:27;5474:250::o;5729:270::-;5770:3;5808:5;5802:12;5835:6;5830:3;5823:19;5851:76;5920:6;5913:4;5908:3;5904:14;5897:4;5890:5;5886:16;5851:76;:::i;:::-;5981:2;5960:15;-1:-1:-1;;5956:29:1;5947:39;;;;5988:4;5943:50;;5729:270;-1:-1:-1;;5729:270:1:o;6004:548::-;6269:4;6261:6;6257:17;6246:9;6239:36;6323:6;6315;6311:19;6306:2;6295:9;6291:18;6284:47;6396:1;6392;6387:3;6383:11;6379:19;6371:6;6367:32;6362:2;6351:9;6347:18;6340:60;6436:6;6431:2;6420:9;6416:18;6409:34;6480:3;6474;6463:9;6459:19;6452:32;6220:4;6501:45;6541:3;6530:9;6526:19;6518:6;6501:45;:::i;6557:347::-;6608:8;6618:6;6672:3;6665:4;6657:6;6653:17;6649:27;6639:55;;6690:1;6687;6680:12;6639:55;-1:-1:-1;6713:20:1;;-1:-1:-1;;;;;6745:30:1;;6742:50;;;6788:1;6785;6778:12;6742:50;6825:4;6817:6;6813:17;6801:29;;6877:3;6870:4;6861:6;6853;6849:19;6845:30;6842:39;6839:59;;;6894:1;6891;6884:12;6839:59;6557:347;;;;;:::o;6909:481::-;6987:6;6995;7003;7056:2;7044:9;7035:7;7031:23;7027:32;7024:52;;;7072:1;7069;7062:12;7024:52;7095:28;7113:9;7095:28;:::i;:::-;7085:38;;7174:2;7163:9;7159:18;7146:32;-1:-1:-1;;;;;7193:6:1;7190:30;7187:50;;;7233:1;7230;7223:12;7187:50;7272:58;7322:7;7313:6;7302:9;7298:22;7272:58;:::i;:::-;6909:481;;7349:8;;-1:-1:-1;7246:84:1;;-1:-1:-1;;;;6909:481:1:o;7395:247::-;7454:6;7507:2;7495:9;7486:7;7482:23;7478:32;7475:52;;;7523:1;7520;7513:12;7475:52;7562:9;7549:23;7581:31;7606:5;7581:31;:::i;7647:118::-;7733:5;7726:13;7719:21;7712:5;7709:32;7699:60;;7755:1;7752;7745:12;7770:454;7843:6;7851;7859;7912:2;7900:9;7891:7;7887:23;7883:32;7880:52;;;7928:1;7925;7918:12;7880:52;7951:28;7969:9;7951:28;:::i;:::-;7941:38;;8029:2;8018:9;8014:18;8001:32;8042:31;8067:5;8042:31;:::i;:::-;8092:5;-1:-1:-1;8149:2:1;8134:18;;8121:32;8162:30;8121:32;8162:30;:::i;:::-;8211:7;8201:17;;;7770:454;;;;;:::o;8229:529::-;8314:6;8322;8330;8338;8391:3;8379:9;8370:7;8366:23;8362:33;8359:53;;;8408:1;8405;8398:12;8359:53;8431:28;8449:9;8431:28;:::i;:::-;8421:38;;8509:2;8498:9;8494:18;8481:32;8522:31;8547:5;8522:31;:::i;:::-;8572:5;-1:-1:-1;8624:2:1;8609:18;;8596:32;;-1:-1:-1;8680:2:1;8665:18;;8652:32;8693:33;8652:32;8693:33;:::i;:::-;8229:529;;;;-1:-1:-1;8229:529:1;;-1:-1:-1;;8229:529:1:o;8763:319::-;8830:6;8838;8891:2;8879:9;8870:7;8866:23;8862:32;8859:52;;;8907:1;8904;8897:12;8859:52;8930:28;8948:9;8930:28;:::i;:::-;8920:38;;9008:2;8997:9;8993:18;8980:32;9021:31;9046:5;9021:31;:::i;9183:1026::-;9416:13;;9409:21;9402:29;9384:48;;9492:4;9480:17;;;9474:24;-1:-1:-1;;;;;9470:50:1;9448:20;;;9441:80;9568:4;9556:17;;;9550:24;9371:3;9356:19;;;9583:53;;9615:20;;9550:24;5455:6;5444:18;5432:31;;5379:90;9583:53;;9685:4;9677:6;9673:17;9667:24;9700:56;9750:4;9739:9;9735:20;9719:14;-1:-1:-1;;;;;2087:31:1;2075:44;;2021:104;9700:56;;9812:4;9804:6;9800:17;9794:24;9787:4;9776:9;9772:20;9765:54;9875:4;9867:6;9863:17;9857:24;9850:4;9839:9;9835:20;9828:54;9938:4;9930:6;9926:17;9920:24;9913:4;9902:9;9898:20;9891:54;9994:4;9986:6;9982:17;9976:24;10009:56;10059:4;10048:9;10044:20;10028:14;-1:-1:-1;;;;;2087:31:1;2075:44;;2021:104;10009:56;-1:-1:-1;10084:6:1;10127:15;;;10121:22;9157:13;9150:21;10184:18;;;;9138:34;9183:1026;:::o;10214:217::-;10361:2;10350:9;10343:21;10324:4;10381:44;10421:2;10410:9;10406:18;10398:6;10381:44;:::i;10436:180::-;10495:6;10548:2;10536:9;10527:7;10523:23;10519:32;10516:52;;;10564:1;10561;10554:12;10516:52;-1:-1:-1;10587:23:1;;10436:180;-1:-1:-1;10436:180:1:o;10621:954::-;10740:6;10748;10756;10764;10772;10780;10833:3;10821:9;10812:7;10808:23;10804:33;10801:53;;;10850:1;10847;10840:12;10801:53;10889:9;10876:23;10908:29;10931:5;10908:29;:::i;:::-;10956:5;-1:-1:-1;10980:37:1;11013:2;10998:18;;10980:37;:::i;:::-;10970:47;;11069:2;11058:9;11054:18;11041:32;11082:33;11107:7;11082:33;:::i;:::-;11134:7;-1:-1:-1;11192:2:1;11177:18;;11164:32;-1:-1:-1;;;;;11245:14:1;;;11242:34;;;11272:1;11269;11262:12;11242:34;11295:49;11336:7;11327:6;11316:9;11312:22;11295:49;:::i;:::-;11285:59;;11391:3;11380:9;11376:19;11363:33;11353:43;;11449:3;11438:9;11434:19;11421:33;11405:49;;11479:2;11469:8;11466:16;11463:36;;;11495:1;11492;11485:12;11463:36;;11518:51;11561:7;11550:8;11539:9;11535:24;11518:51;:::i;:::-;11508:61;;;10621:954;;;;;;;;:::o;12432:891::-;12546:6;12554;12562;12570;12578;12631:3;12619:9;12610:7;12606:23;12602:33;12599:53;;;12648:1;12645;12638:12;12599:53;12687:9;12674:23;12706:31;12731:5;12706:31;:::i;:::-;12756:5;-1:-1:-1;12780:37:1;12813:2;12798:18;;12780:37;:::i;:::-;12770:47;;12869:2;12858:9;12854:18;12841:32;12882:33;12907:7;12882:33;:::i;:::-;12934:7;-1:-1:-1;12992:2:1;12977:18;;12964:32;-1:-1:-1;;;;;13045:14:1;;;13042:34;;;13072:1;13069;13062:12;13042:34;13095:49;13136:7;13127:6;13116:9;13112:22;13095:49;:::i;:::-;13085:59;;13197:3;13186:9;13182:19;13169:33;13153:49;;13227:2;13217:8;13214:16;13211:36;;;13243:1;13240;13233:12;13211:36;;13266:51;13309:7;13298:8;13287:9;13283:24;13266:51;:::i;13557:622::-;13652:6;13660;13668;13676;13684;13737:3;13725:9;13716:7;13712:23;13708:33;13705:53;;;13754:1;13751;13744:12;13705:53;13777:28;13795:9;13777:28;:::i;:::-;13767:38;;13824:37;13857:2;13846:9;13842:18;13824:37;:::i;:::-;13814:47;;13908:2;13897:9;13893:18;13880:32;13870:42;;13963:2;13952:9;13948:18;13935:32;-1:-1:-1;;;;;13982:6:1;13979:30;13976:50;;;14022:1;14019;14012:12;13976:50;14061:58;14111:7;14102:6;14091:9;14087:22;14061:58;:::i;:::-;13557:622;;;;-1:-1:-1;13557:622:1;;-1:-1:-1;14138:8:1;;14035:84;13557:622;-1:-1:-1;;;13557:622:1:o;14184:1329::-;14380:4;14409:2;14449;14438:9;14434:18;14479:2;14468:9;14461:21;14502:6;14537;14531:13;14568:6;14560;14553:22;14594:2;14584:12;;14627:2;14616:9;14612:18;14605:25;;14689:2;14679:6;14676:1;14672:14;14661:9;14657:30;14653:39;14727:2;14719:6;14715:15;14748:1;14758:726;14772:6;14769:1;14766:13;14758:726;;;14837:22;;;-1:-1:-1;;14833:36:1;14821:49;;14893:13;;14965:9;;14976:4;14961:20;14946:36;;15029:11;;;15023:18;15043:6;15019:31;15002:15;;;14995:56;15098:11;;;15092:18;-1:-1:-1;;;;;15088:44:1;15071:15;;;15064:69;15156:4;15203:11;;;15197:18;15180:15;;;15173:43;15239:4;15282:11;;;15276:18;14929:4;15314:15;;;15307:27;;;15276:18;15357:47;15388:15;;;15276:18;15357:47;:::i;:::-;15462:12;;;;15347:57;-1:-1:-1;;;15427:15:1;;;;14794:1;14787:9;14758:726;;;-1:-1:-1;15501:6:1;;14184:1329;-1:-1:-1;;;;;;;;14184:1329:1:o;15518:383::-;15592:6;15600;15608;15661:2;15649:9;15640:7;15636:23;15632:32;15629:52;;;15677:1;15674;15667:12;15629:52;15700:28;15718:9;15700:28;:::i;:::-;15690:38;;15778:2;15767:9;15763:18;15750:32;15791:29;15814:5;15791:29;:::i;15906:380::-;15985:1;15981:12;;;;16028;;;16049:61;;16103:4;16095:6;16091:17;16081:27;;16049:61;16156:2;16148:6;16145:14;16125:18;16122:38;16119:161;;16202:10;16197:3;16193:20;16190:1;16183:31;16237:4;16234:1;16227:15;16265:4;16262:1;16255:15;16119:161;;15906:380;;;:::o;16416:840::-;16542:3;16571:1;16604:6;16598:13;16634:36;16660:9;16634:36;:::i;:::-;16689:1;16706:18;;;16733:133;;;;16880:1;16875:356;;;;16699:532;;16733:133;-1:-1:-1;;16766:24:1;;16754:37;;16839:14;;16832:22;16820:35;;16811:45;;;-1:-1:-1;16733:133:1;;16875:356;16906:6;16903:1;16896:17;16936:4;16981:2;16978:1;16968:16;17006:1;17020:165;17034:6;17031:1;17028:13;17020:165;;;17112:14;;17099:11;;;17092:35;17155:16;;;;17049:10;;17020:165;;;17024:3;;;17214:6;17209:3;17205:16;17198:23;;16699:532;-1:-1:-1;17247:3:1;;16416:840;-1:-1:-1;;;;;;16416:840:1:o;17814:441::-;17867:5;17920:3;17913:4;17905:6;17901:17;17897:27;17887:55;;17938:1;17935;17928:12;17887:55;17967:6;17961:13;17998:48;18014:31;18042:2;18014:31;:::i;17998:48::-;18071:2;18062:7;18055:19;18117:3;18110:4;18105:2;18097:6;18093:15;18089:26;18086:35;18083:55;;;18134:1;18131;18124:12;18083:55;18147:77;18221:2;18214:4;18205:7;18201:18;18194:4;18186:6;18182:17;18147:77;:::i;18260:947::-;18391:6;18399;18407;18415;18423;18476:3;18464:9;18455:7;18451:23;18447:33;18444:53;;;18493:1;18490;18483:12;18444:53;18525:9;18519:16;18544:29;18567:5;18544:29;:::i;:::-;18641:2;18626:18;;18620:25;18592:5;;-1:-1:-1;;;;;;18694:14:1;;;18691:34;;;18721:1;18718;18711:12;18691:34;18744:60;18796:7;18787:6;18776:9;18772:22;18744:60;:::i;:::-;18734:70;;18844:2;18833:9;18829:18;18823:25;18813:35;;18894:2;18883:9;18879:18;18873:25;18857:41;;18923:2;18913:8;18910:16;18907:36;;;18939:1;18936;18929:12;18907:36;18962:62;19016:7;19005:8;18994:9;18990:24;18962:62;:::i;:::-;18952:72;;19070:3;19059:9;19055:19;19049:26;19033:42;;19100:2;19090:8;19087:16;19084:36;;;19116:1;19113;19106:12;19084:36;;19139:62;19193:7;19182:8;19171:9;19167:24;19139:62;:::i;19212:544::-;19313:2;19308:3;19305:11;19302:448;;;19349:1;19374:5;19370:2;19363:17;19419:4;19415:2;19405:19;19489:2;19477:10;19473:19;19470:1;19466:27;19460:4;19456:38;19525:4;19513:10;19510:20;19507:47;;;-1:-1:-1;19548:4:1;19507:47;19603:2;19598:3;19594:12;19591:1;19587:20;19581:4;19577:31;19567:41;;19658:82;19676:2;19669:5;19666:13;19658:82;;;19721:17;;;19702:1;19691:13;19658:82;;;19662:3;;;19212:544;;;:::o;19932:1348::-;20056:3;20050:10;-1:-1:-1;;;;;20075:6:1;20072:30;20069:56;;;20105:18;;:::i;:::-;20134:96;20223:6;20183:38;20215:4;20209:11;20183:38;:::i;:::-;20177:4;20134:96;:::i;:::-;20285:4;;20349:2;20338:14;;20366:1;20361:662;;;;21067:1;21084:6;21081:89;;;-1:-1:-1;21136:19:1;;;21130:26;21081:89;-1:-1:-1;;19889:1:1;19885:11;;;19881:24;19877:29;19867:40;19913:1;19909:11;;;19864:57;21183:81;;20331:943;;20361:662;16363:1;16356:14;;;16400:4;16387:18;;-1:-1:-1;;20397:20:1;;;20514:236;20528:7;20525:1;20522:14;20514:236;;;20617:19;;;20611:26;20596:42;;20709:27;;;;20677:1;20665:14;;;;20544:19;;20514:236;;;20518:3;20778:6;20769:7;20766:19;20763:201;;;20839:19;;;20833:26;-1:-1:-1;;20922:1:1;20918:14;;;20934:3;20914:24;20910:37;20906:42;20891:58;20876:74;;20763:201;-1:-1:-1;;;;;21010:1:1;20994:14;;;20990:22;20977:36;;-1:-1:-1;19932:1348:1:o;21285:458::-;21544:6;21532:19;;;;21514:38;;-1:-1:-1;;;;;21626:15:1;;;21621:2;21606:18;;21599:43;21673:2;21658:18;;21651:34;;;;21721:15;21716:2;21701:18;;21694:43;21501:3;21486:19;;21285:458::o;21748:868::-;21879:6;21887;21895;21903;21911;21919;21972:3;21960:9;21951:7;21947:23;21943:33;21940:53;;;21989:1;21986;21979:12;21940:53;22021:9;22015:16;22040:29;22063:5;22040:29;:::i;:::-;22137:2;22122:18;;22116:25;22088:5;;-1:-1:-1;;;;;;22190:14:1;;;22187:34;;;22217:1;22214;22207:12;22187:34;22240:60;22292:7;22283:6;22272:9;22268:22;22240:60;:::i;:::-;22230:70;;22340:2;22329:9;22325:18;22319:25;22309:35;;22384:2;22373:9;22369:18;22363:25;22353:35;;22428:3;22417:9;22413:19;22407:26;22397:36;;22479:3;22468:9;22464:19;22458:26;22442:42;;22509:2;22499:8;22496:16;22493:36;;;22525:1;22522;22515:12;22493:36;;22548:62;22602:7;22591:8;22580:9;22576:24;22548:62;:::i;22621:127::-;22682:10;22677:3;22673:20;22670:1;22663:31;22713:4;22710:1;22703:15;22737:4;22734:1;22727:15;22753:125;22818:9;;;22839:10;;;22836:36;;;22852:18;;:::i;22883:128::-;22950:9;;;22971:11;;;22968:37;;;22985:18;;:::i;23623:744::-;23736:6;23744;23752;23760;23813:3;23801:9;23792:7;23788:23;23784:33;23781:53;;;23830:1;23827;23820:12;23781:53;23862:9;23856:16;23881:29;23904:5;23881:29;:::i;:::-;23978:2;23963:18;;23957:25;23929:5;;-1:-1:-1;;;;;;24031:14:1;;;24028:34;;;24058:1;24055;24048:12;24028:34;24081:60;24133:7;24124:6;24113:9;24109:22;24081:60;:::i;:::-;24071:70;;24181:2;24170:9;24166:18;24160:25;24150:35;;24231:2;24220:9;24216:18;24210:25;24194:41;;24260:2;24250:8;24247:16;24244:36;;;24276:1;24273;24266:12;24244:36;;24299:62;24353:7;24342:8;24331:9;24327:24;24299:62;:::i;24372:520::-;24467:6;24475;24483;24536:2;24524:9;24515:7;24511:23;24507:32;24504:52;;;24552:1;24549;24542:12;24504:52;24584:9;24578:16;24603:29;24626:5;24603:29;:::i;:::-;24700:2;24685:18;;24679:25;24651:5;;-1:-1:-1;;;;;;24716:30:1;;24713:50;;;24759:1;24756;24749:12;24713:50;24782:60;24834:7;24825:6;24814:9;24810:22;24782:60;:::i;:::-;24772:70;;;24882:2;24871:9;24867:18;24861:25;24851:35;;24372:520;;;;;:::o;24897:356::-;25127:6;25115:19;;;;25097:38;;-1:-1:-1;;;;;25171:32:1;;;;25166:2;25151:18;;25144:60;25235:2;25220:18;;25213:34;25085:2;25070:18;;24897:356::o;25537:245::-;25604:6;25657:2;25645:9;25636:7;25632:23;25628:32;25625:52;;;25673:1;25670;25663:12;25625:52;25705:9;25699:16;25724:28;25746:5;25724:28;:::i;25787:356::-;25989:2;25971:21;;;26008:18;;;26001:30;26067:34;26062:2;26047:18;;26040:62;26134:2;26119:18;;25787:356::o;26341:354::-;26543:2;26525:21;;;26582:2;26562:18;;;26555:30;26621:32;26616:2;26601:18;;26594:60;26686:2;26671:18;;26341:354::o;26700:229::-;26849:2;26845:15;;;;-1:-1:-1;;26841:53:1;26829:66;;26920:2;26911:12;;26700:229::o;26934:366::-;27145:4;27137:6;27133:17;27122:9;27115:36;27187:2;27182;27171:9;27167:18;27160:30;27096:4;27207:44;27247:2;27236:9;27232:18;27224:6;27207:44;:::i;:::-;27199:52;;27287:6;27282:2;27271:9;27267:18;27260:34;26934:366;;;;;;:::o;27305:217::-;27345:1;27371;27361:132;;27415:10;27410:3;27406:20;27403:1;27396:31;27450:4;27447:1;27440:15;27478:4;27475:1;27468:15;27361:132;-1:-1:-1;27507:9:1;;27305:217::o;27851:184::-;27921:6;27974:2;27962:9;27953:7;27949:23;27945:32;27942:52;;;27990:1;27987;27980:12;27942:52;-1:-1:-1;28013:16:1;;27851:184;-1:-1:-1;27851:184:1:o;28040:430::-;28146:6;28154;28162;28170;28178;28231:3;28219:9;28210:7;28206:23;28202:33;28199:53;;;28248:1;28245;28238:12;28199:53;-1:-1:-1;;28271:16:1;;28327:2;28312:18;;28306:25;28371:2;28356:18;;28350:25;28415:2;28400:18;;28394:25;28459:3;28444:19;;;28438:26;28271:16;;28306:25;;-1:-1:-1;28350:25:1;28394;-1:-1:-1;28438:26:1;;-1:-1:-1;28040:430:1;-1:-1:-1;28040:430:1:o;28475:168::-;28548:9;;;28579;;28596:15;;;28590:22;;28576:37;28566:71;;28617:18;;:::i;29362:689::-;29665:4;29657:6;29653:17;29642:9;29635:36;29707:3;29702:2;29691:9;29687:18;29680:31;29616:4;29734:45;29774:3;29763:9;29759:19;29751:6;29734:45;:::i;:::-;29815:6;29810:2;29799:9;29795:18;29788:34;29870:9;29862:6;29858:22;29853:2;29842:9;29838:18;29831:50;29904:32;29929:6;29921;29904:32;:::i;:::-;29890:46;;29985:9;29977:6;29973:22;29967:3;29956:9;29952:19;29945:51;30013:32;30038:6;30030;30013:32;:::i;:::-;30005:40;29362:689;-1:-1:-1;;;;;;;;29362:689:1:o;30056:469::-;30297:6;30289;30285:19;30274:9;30267:38;30370:1;30366;30361:3;30357:11;30353:19;30345:6;30341:32;30336:2;30325:9;30321:18;30314:60;30410:6;30405:2;30394:9;30390:18;30383:34;30453:3;30448:2;30437:9;30433:18;30426:31;30248:4;30474:45;30514:3;30503:9;30499:19;30491:6;30474:45;:::i;:::-;30466:53;30056:469;-1:-1:-1;;;;;;30056:469:1:o;31700:266::-;31788:6;31783:3;31776:19;31840:6;31833:5;31826:4;31821:3;31817:14;31804:43;-1:-1:-1;31892:1:1;31867:16;;;31885:4;31863:27;;;31856:38;;;;31948:2;31927:15;;;-1:-1:-1;;31923:29:1;31914:39;;;31910:50;;31700:266::o;31971:326::-;32166:6;32158;32154:19;32143:9;32136:38;32210:2;32205;32194:9;32190:18;32183:30;32117:4;32230:61;32287:2;32276:9;32272:18;32264:6;32256;32230:61;:::i;:::-;32222:69;31971:326;-1:-1:-1;;;;;31971:326:1:o;32302:360::-;32513:6;32505;32500:3;32487:33;32583:2;32579:15;;;;-1:-1:-1;;32575:53:1;32539:16;;32564:65;;;32653:2;32645:11;;32302:360;-1:-1:-1;32302:360:1:o;33458:127::-;33519:10;33514:3;33510:20;33507:1;33500:31;33550:4;33547:1;33540:15;33574:4;33571:1;33564:15;33590:404;33792:2;33774:21;;;33831:2;33811:18;;;33804:30;33870:34;33865:2;33850:18;;33843:62;-1:-1:-1;;;33936:2:1;33921:18;;33914:38;33984:3;33969:19;;33590:404::o;33999:771::-;34048:3;34089:5;34083:12;34118:36;34144:9;34118:36;:::i;:::-;34163:19;;;34201:4;34224:1;34241:18;;;34268:146;;;;34428:1;34423:341;;;;34234:530;;34268:146;-1:-1:-1;;34310:24:1;;34296:12;;;34289:46;34382:14;;34375:22;34372:1;34368:30;34359:40;;34355:49;;;-1:-1:-1;34268:146:1;;34423:341;34454:5;34451:1;34444:16;34501:2;34498:1;34488:16;34526:1;34540:174;34554:6;34551:1;34548:13;34540:174;;;34641:14;;34623:11;;;34619:20;;34612:44;34684:16;;;;34569:10;;34540:174;;;34738:11;;34734:20;;;-1:-1:-1;;34234:530:1;;;;;;33999:771;;;;:::o;34775:533::-;35029:4;35021:6;35017:17;35006:9;34999:36;35071:3;35066:2;35055:9;35051:18;35044:31;34980:4;35098:45;35138:3;35127:9;35123:19;35115:6;35098:45;:::i;:::-;35179:6;35174:2;35163:9;35159:18;35152:34;35234:9;35226:6;35222:22;35217:2;35206:9;35202:18;35195:50;35262:40;35295:6;35287;35262:40;:::i;35313:1426::-;35426:3;35420:4;35417:13;35414:26;;35433:5;;35313:1426::o;35414:26::-;35463:37;35495:3;35489:10;35463:37;:::i;:::-;-1:-1:-1;;;;;35515:6:1;35512:30;35509:56;;;35545:18;;:::i;:::-;35574:96;35663:6;35623:38;35655:4;35649:11;35623:38;:::i;35574:96::-;35696:1;35724:2;35716:6;35713:14;35741:1;35736:746;;;;36526:1;36543:6;36540:89;;;-1:-1:-1;36595:19:1;;;36589:26;36540:89;-1:-1:-1;;19889:1:1;19885:11;;;19881:24;19877:29;19867:40;19913:1;19909:11;;;19864:57;36642:81;;35706:1027;;35736:746;16363:1;16356:14;;;16400:4;16387:18;;-1:-1:-1;;35772:20:1;;;16363:1;16356:14;;;16400:4;16387:18;;35934:9;35956:251;35970:7;35967:1;35964:14;35956:251;;;36052:21;;;36046:28;36031:44;;36102:1;36175:18;;;;36130:15;;;;35993:4;35986:12;35956:251;;;35960:3;36235:6;36226:7;36223:19;36220:203;;;36296:21;;36290:28;-1:-1:-1;;36393:3:1;36381:1;36377:14;;;36373:24;36369:37;36365:42;36350:58;36335:74;;;-1:-1:-1;;36469:1:1;36453:14;;;36449:22;36436:36;;-1:-1:-1;35313:1426:1:o;36744:127::-;36805:10;36800:3;36796:20;36793:1;36786:31;36836:4;36833:1;36826:15;36860:4;36857:1;36850:15;36876:706;37185:4;37177:6;37173:17;37162:9;37155:36;37227:3;37222:2;37211:9;37207:18;37200:31;37136:4;37254:45;37294:3;37283:9;37279:19;37271:6;37254:45;:::i;:::-;37347:4;37339:6;37335:17;37330:2;37319:9;37315:18;37308:45;37401:9;37393:6;37389:22;37384:2;37373:9;37369:18;37362:50;37435:32;37460:6;37452;37435:32;:::i;37587:723::-;37918:4;37910:6;37906:17;37895:9;37888:36;37960:3;37955:2;37944:9;37940:18;37933:31;37869:4;37987:45;38027:3;38016:9;38012:19;38004:6;37987:45;:::i;:::-;38080:4;38072:6;38068:17;38063:2;38052:9;38048:18;38041:45;38134:4;38126:6;38122:17;38117:2;38106:9;38102:18;38095:45;38189:4;38181:6;38177:17;38171:3;38160:9;38156:19;38149:46;38244:9;38236:6;38232:22;38226:3;38215:9;38211:19;38204:51;38272:32;38297:6;38289;38272:32;:::i;:::-;38264:40;37587:723;-1:-1:-1;;;;;;;;;37587:723:1:o;38315:545::-;38578:4;38570:6;38566:17;38555:9;38548:36;38620:3;38615:2;38604:9;38600:18;38593:31;38529:4;38647:45;38687:3;38676:9;38672:19;38664:6;38647:45;:::i;:::-;38740:4;38732:6;38728:17;38723:2;38712:9;38708:18;38701:45;38794:9;38786:6;38782:22;38777:2;38766:9;38762:18;38755:50;38822:32;38847:6;38839;38822:32;:::i;38865:383::-;39082:4;39074:6;39070:17;39059:9;39052:36;39124:2;39119;39108:9;39104:18;39097:30;39033:4;39144:44;39184:2;39173:9;39169:18;39161:6;39144:44;:::i;:::-;39136:52;;39236:4;39228:6;39224:17;39219:2;39208:9;39204:18;39197:45;38865:383;;;;;;:::o;39253:640::-;39534:6;39522:19;;39504:38;;-1:-1:-1;;;;;39578:32:1;;39573:2;39558:18;;39551:60;39598:3;39642:2;39627:18;;39620:31;;;-1:-1:-1;;39674:45:1;;39699:19;;39691:6;39674:45;:::i;:::-;39769:6;39762:14;39755:22;39750:2;39739:9;39735:18;39728:50;39827:9;39819:6;39815:22;39809:3;39798:9;39794:19;39787:51;39855:32;39880:6;39872;39855:32;:::i;39898:245::-;39977:6;39985;40038:2;40026:9;40017:7;40013:23;40009:32;40006:52;;;40054:1;40051;40044:12;40006:52;-1:-1:-1;;40077:16:1;;40133:2;40118:18;;;40112:25;40077:16;;40112:25;;-1:-1:-1;39898:245:1:o;40148:672::-;40461:4;40453:6;40449:17;40438:9;40431:36;40503:3;40498:2;40487:9;40483:18;40476:31;40412:4;40530:45;40570:3;40559:9;40555:19;40547:6;40530:45;:::i;:::-;40611:6;40606:2;40595:9;40591:18;40584:34;40654:6;40649:2;40638:9;40634:18;40627:34;40698:6;40692:3;40681:9;40677:19;40670:35;40754:9;40746:6;40742:22;40736:3;40725:9;40721:19;40714:51;40782:32;40807:6;40799;40782:32;:::i;41504:528::-;41761:4;41753:6;41749:17;41738:9;41731:36;41803:3;41798:2;41787:9;41783:18;41776:31;41712:4;41830:45;41870:3;41859:9;41855:19;41847:6;41830:45;:::i;:::-;41911:6;41906:2;41895:9;41891:18;41884:34;41966:9;41958:6;41954:22;41949:2;41938:9;41934:18;41927:50;41994:32;42019:6;42011;41994:32;:::i;42920:135::-;42959:3;42980:17;;;42977:43;;43000:18;;:::i;:::-;-1:-1:-1;43047:1:1;43036:13;;42920:135::o;43060:381::-;43257:2;43246:9;43239:21;43220:4;43283:44;43323:2;43312:9;43308:18;43300:6;43283:44;:::i;:::-;43375:9;43367:6;43363:22;43358:2;43347:9;43343:18;43336:50;43403:32;43428:6;43420;43403:32;:::i;43446:251::-;43516:6;43569:2;43557:9;43548:7;43544:23;43540:32;43537:52;;;43585:1;43582;43575:12;43537:52;43617:9;43611:16;43636:31;43661:5;43636:31;:::i;43702:498::-;43902:4;43931:6;43976:2;43968:6;43964:15;43953:9;43946:34;44028:2;44020:6;44016:15;44011:2;44000:9;43996:18;43989:43;;44068:6;44063:2;44052:9;44048:18;44041:34;44111:3;44106:2;44095:9;44091:18;44084:31;44132:62;44189:3;44178:9;44174:19;44166:6;44158;44132:62;:::i;46503:842::-;46849:6;46841;46837:19;46826:9;46819:38;46893:3;46888:2;46877:9;46873:18;46866:31;46800:4;46920:53;46968:3;46957:9;46953:19;46945:6;46920:53;:::i;:::-;47021:9;47013:6;47009:22;47004:2;46993:9;46989:18;46982:50;47055:32;47080:6;47072;47055:32;:::i;:::-;-1:-1:-1;;;;;47161:15:1;;;47156:2;47141:18;;47134:43;47214:15;;47208:3;47193:19;;47186:44;47267:22;;;47114:3;47246:19;;47239:51;47041:46;-1:-1:-1;47307:32:1;47041:46;47324:6;47307:32;:::i;48244:520::-;48516:5;48511:3;48507:15;48498:6;48493:3;48489:16;48485:38;48480:3;48473:51;48553:6;48549:1;48544:3;48540:11;48533:27;48590:6;48585:2;48580:3;48576:12;48569:28;48455:3;48626:6;48620:13;48642:75;48710:6;48705:2;48700:3;48696:12;48689:4;48681:6;48677:17;48642:75;:::i;:::-;48737:16;;;;48755:2;48733:25;;48244:520;-1:-1:-1;;;;;48244:520:1:o;49457:287::-;49586:3;49624:6;49618:13;49640:66;49699:6;49694:3;49687:4;49679:6;49675:17;49640:66;:::i;:::-;49722:16;;;;;49457:287;-1:-1:-1;;49457:287:1:o
Swarm Source
ipfs://909c46167e483059649bce247af82d5705c63310d48aba9c741c702e3a474e70
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.