CELO Price: $0.12 (+2.48%)
Gas: 25 GWei

Contract

0x42B55484D8F550991820dC08C670f36C91325636

Overview

CELO Balance

Celo Mainnet LogoCelo Mainnet LogoCelo Mainnet Logo0 CELO

CELO Value

$0.00

More Info

Private Name Tags

Multichain Info

Transaction Hash
Block
From
To
Delegate Transac...439532422025-08-22 9:13:20155 days ago1755854000IN
0x42B55484...C91325636
0.015 CELO0.0312380725.001
Pause439526062025-08-22 9:02:44155 days ago1755853364IN
0x42B55484...C91325636
0 CELO0.0007304525.001
Sort Weekly Rewa...439524622025-08-22 9:00:20155 days ago1755853220IN
0x42B55484...C91325636
0 CELO0.0899141425.001
Record Points438306242025-08-20 23:09:42156 days ago1755731382IN
0x42B55484...C91325636
0 CELO0.0215720925.00109999
Delegate Transac...438306172025-08-20 23:09:35156 days ago1755731375IN
0x42B55484...C91325636
0.001 CELO0.0312022926.5
Record Points438306102025-08-20 23:09:28156 days ago1755731368IN
0x42B55484...C91325636
0 CELO0.0228641426.5
Delegate Transac...438306032025-08-20 23:09:21156 days ago1755731361IN
0x42B55484...C91325636
0.001 CELO0.031144626.5
Record Points438305952025-08-20 23:09:13156 days ago1755731353IN
0x42B55484...C91325636
0 CELO0.022370325.00101
Delegate Transac...438305882025-08-20 23:09:06156 days ago1755731346IN
0x42B55484...C91325636
0.001 CELO0.0310850526.5
Record Points438305802025-08-20 23:08:58156 days ago1755731338IN
0x42B55484...C91325636
0 CELO0.0223725.0000001
Delegate Transac...438305732025-08-20 23:08:51156 days ago1755731331IN
0x42B55484...C91325636
0.001 CELO0.0310255126.5
Record Points438305652025-08-20 23:08:43156 days ago1755731323IN
0x42B55484...C91325636
0 CELO0.0223697825.00109999
Delegate Transac...438305572025-08-20 23:08:35156 days ago1755731315IN
0x42B55484...C91325636
0.001 CELO0.0309659326.5
Sort Weekly Rewa...438049922025-08-20 16:02:30156 days ago1755705750IN
0x42B55484...C91325636
0 CELO0.0898504125.00280702
Record Points437778092025-08-20 8:29:27157 days ago1755678567IN
0x42B55484...C91325636
0 CELO0.02343925.00109999
Delegate Transac...437777982025-08-20 8:29:16157 days ago1755678556IN
0x42B55484...C91325636
0.001 CELO0.0257518525.00109999
Record Points437777912025-08-20 8:29:09157 days ago1755678549IN
0x42B55484...C91325636
0 CELO0.0150173825.00109999
Delegate Transac...437777842025-08-20 8:29:02157 days ago1755678542IN
0x42B55484...C91325636
0.001 CELO0.0229382926.5
Record Points437777762025-08-20 8:28:54157 days ago1755678534IN
0x42B55484...C91325636
0 CELO0.0202334425.00109999
Delegate Transac...437777692025-08-20 8:28:47157 days ago1755678527IN
0x42B55484...C91325636
0.001 CELO0.0246101526.5
Record Points437777612025-08-20 8:28:39157 days ago1755678519IN
0x42B55484...C91325636
0 CELO0.0202889925.00109999
Delegate Transac...437777542025-08-20 8:28:32157 days ago1755678512IN
0x42B55484...C91325636
0.001 CELO0.0251168826.5
Record Points437777462025-08-20 8:28:24157 days ago1755678504IN
0x42B55484...C91325636
0 CELO0.0202333525.001
Delegate Transac...437777402025-08-20 8:28:18157 days ago1755678498IN
0x42B55484...C91325636
0.001 CELO0.0256236426.5
Record Points437777312025-08-20 8:28:09157 days ago1755678489IN
0x42B55484...C91325636
0 CELO0.0150176825.00109999
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
439532422025-08-22 9:13:20155 days ago1755854000
0x42B55484...C91325636
0.015 CELO
438306172025-08-20 23:09:35156 days ago1755731375
0x42B55484...C91325636
0.001 CELO
438306032025-08-20 23:09:21156 days ago1755731361
0x42B55484...C91325636
0.001 CELO
438305882025-08-20 23:09:06156 days ago1755731346
0x42B55484...C91325636
0.001 CELO
438305732025-08-20 23:08:51156 days ago1755731331
0x42B55484...C91325636
0.001 CELO
438305572025-08-20 23:08:35156 days ago1755731315
0x42B55484...C91325636
0.001 CELO
437777982025-08-20 8:29:16157 days ago1755678556
0x42B55484...C91325636
0.001 CELO
437777842025-08-20 8:29:02157 days ago1755678542
0x42B55484...C91325636
0.001 CELO
437777692025-08-20 8:28:47157 days ago1755678527
0x42B55484...C91325636
0.001 CELO
437777542025-08-20 8:28:32157 days ago1755678512
0x42B55484...C91325636
0.001 CELO
437777402025-08-20 8:28:18157 days ago1755678498
0x42B55484...C91325636
0.001 CELO
437777222025-08-20 8:28:00157 days ago1755678480
0x42B55484...C91325636
0.001 CELO
437777002025-08-20 8:27:38157 days ago1755678458
0x42B55484...C91325636
0.001 CELO
437773722025-08-20 8:22:10157 days ago1755678130
0x42B55484...C91325636
0.015 CELO
437434502025-08-19 22:56:48157 days ago1755644208
0x42B55484...C91325636
0.001 CELO
437434352025-08-19 22:56:33157 days ago1755644193
0x42B55484...C91325636
0.001 CELO
437434202025-08-19 22:56:18157 days ago1755644178
0x42B55484...C91325636
0.001 CELO
437434052025-08-19 22:56:03157 days ago1755644163
0x42B55484...C91325636
0.001 CELO
437433902025-08-19 22:55:48157 days ago1755644148
0x42B55484...C91325636
0.001 CELO
437433752025-08-19 22:55:33157 days ago1755644133
0x42B55484...C91325636
0.001 CELO
437433592025-08-19 22:55:17157 days ago1755644117
0x42B55484...C91325636
0.001 CELO
437431012025-08-19 22:50:59157 days ago1755643859
0x42B55484...C91325636
1 CELO
437430902025-08-19 22:50:48157 days ago1755643848
0x42B55484...C91325636
1 CELO
437430832025-08-19 22:50:41157 days ago1755643841
0x42B55484...C91325636
1 CELO
437430762025-08-19 22:50:34157 days ago1755643834
0x42B55484...C91325636
1 CELO
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Learna

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
constantinople EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at celoscan.io on 2025-08-19
*/

// Sources flattened with hardhat v2.26.1 https://hardhat.org

// SPDX-License-Identifier: MIT

// File @openzeppelin/contracts/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}


// File @openzeppelin/contracts/access/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/interfaces/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC6093.sol)
pragma solidity >=0.8.4;

/**
 * @dev Standard ERC-20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC-721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC-1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)

pragma solidity >=0.4.16;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity >=0.6.2;

/**
 * @dev Interface for the optional metadata functions from the ERC-20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC-20
 * applications.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * Both values are immutable: they can only be set once during construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /// @inheritdoc IERC20
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /// @inheritdoc IERC20
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /// @inheritdoc IERC20
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Skips emitting an {Approval} event indicating an allowance update. This is not
     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     *
     * ```solidity
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner`'s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance < type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.3.0) (utils/Pausable.sol)

pragma solidity ^0.8.20;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    bool private _paused;

    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    /**
     * @dev The operation failed because the contract is paused.
     */
    error EnforcedPause();

    /**
     * @dev The operation failed because the contract is not paused.
     */
    error ExpectedPause();

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        if (paused()) {
            revert EnforcedPause();
        }
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        if (!paused()) {
            revert ExpectedPause();
        }
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


// File contracts/Approved.sol

// Original license: SPDX_License_Identifier: MIT
pragma solidity 0.8.28;
abstract contract Approved is Ownable, Pausable {
    error AddressIsZero();
    
    event Approval(address indexed);
    event UnApproval(address indexed);

    // Mapping of account to approvals
    mapping (address => bool) private approval;

    // Only approved account is allowed
    modifier onlyApproved {
        require(_isApproved(_msgSender()), "Not approved account");
        _;
    }

    constructor() Ownable(_msgSender()) {
       _setPermission(_msgSender(), true);
         
    }
    //    _approve(toApprove, true);

    /**
     * @dev Set approval for
     * @param target : Account to set approval for
     * @param value : Approval state - true or false
     */
    function _setPermission(address target, bool value) internal {
        if(target == address(0)) revert AddressIsZero();
        approval[target] = value;
    }

    /**
     * @dev Set approval for target
     * @param target : Account to set approval for
     */
    function setPermission(address target) public onlyOwner {
        _setPermission(target, true);
        emit Approval(target);
    }

    /**
     * @dev Set approval for target
     * @param target : Account to set approval for
     */
    function _isApproved(address target) internal view returns(bool result) {
        result = approval[target];
    }

    /**
     * @dev Set approval for target
     * @param target : Account to set approval for
     */
    function isPermitted(address target) public view returns(bool) {
        return _isApproved(target);
    }

    /**
     * @dev Set approval for target
     * @param target : Account to set approval for
     */
    function unApprove(address target) public onlyOwner {
        _setPermission(target, false);
        emit UnApproval(target);
    }

}


// File contracts/Admins.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity 0.8.28;
abstract contract Admins is Approved {
    struct Admin {
        address id;
        bool active;
    }

    /// @dev Total number of admins
    uint private adminCount;

    /// Admins slots
    mapping(uint8 => address) private slots;

    /// @dev Mapping of slots to admin data
    mapping(address => bool) private isAdmin;

    /**
     * @dev Only admin
     * @notice Even if no admin is added, we will always byepass the out-of-bound error since 
     * we already added at least one content to the admins array in the constructor, it wil always fetch zero slot.
    */
    modifier onlyAdmin() {
        require(_isAdmin(_msgSender()), 'Only admin');
        _; 
    }

    function _isAdmin(address target) internal view returns(bool result) {
        result = isAdmin[target];
    }
    
    /**
     * @dev Add admin and activate them
     * @param target : Account to add
     */
    function _addAdmin(address target) internal {
        require(!isAdmin[target], 'Admin already added');
        isAdmin[target] = true;
        uint8 slot = uint8(adminCount);
        adminCount = slot + 1;
        slots[slot] = target;
    }

    /**
     * @dev Toggle admin status either activate or deactivate them by toggling back and forth. 
     * @param target : Target account
     */
    function toggleAdminStatus(address target) public onlyOwner {
        bool status = isAdmin[target];
        isAdmin[target] = !status;
    }

    /// Initialize an empty slot in the admins array
    function setAdmin(address target) public onlyOwner {
        _addAdmin(target);
    }

    /// Return all admins
    function getAdmins() public view returns(Admin[] memory _admins) {
        uint8 _adminCount = uint8(adminCount);
        if(_adminCount == 0) return _admins;
        _admins = new Admin[](_adminCount);
        for(uint8 i = 0; i < _adminCount; i++) {
            address target = slots[i];
            _admins[i] = Admin(target, isAdmin[target]);
        }
        return _admins;
    }
}


// File contracts/interfaces/IKnowToken.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity 0.8.28;

interface IKnowToken {
    function allocate(uint amount, address to) external returns(bool);
    function burn(address holder, uint amount) external returns(bool);
}


// File contracts/interfaces/ILearna.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity 0.8.28;
interface ILearna {
    enum Mode { LOCAL, LIVE }

    error UserBlacklisted();
    error NotEligible();
    error ClaimEnded(uint64);
    error InvalidAddress(address);
    error CampaignClaimNotActivated();
    error InsufficientAllowance(uint256);
    error ClaimAddressNotSet();
    error NotInitialized();

    event NewCampaign(Campaign campaign);
    event CampaignUpdated(Campaign campaign);
    event PointRecorded(address indexed user, uint weekId, bytes32 campainHash, QuizResultInput quizResult);
    event Sorted(uint _weekId, uint newWeekId, CampaignData[] campaigns);
    event CampaignCreated(uint weekId, address indexed tipper, Campaign data, bytes32[] campainHashes);
    event UserStatusChanged(address[] users, bool[] newStatus);

    struct CData {
        uint platformToken;
        uint256 fundsNative;
        uint256 fundsERC20;
        uint96 totalPoints;
        uint64 lastUpdated;
        uint activeLearners; 
        address operator;
        address token;
        CampaignData data;
    }

    struct Campaign {
        CData data;
        address[] users;
    }

    struct GetCampaign {
        Campaign cp;
        uint32 slot;
    }

    struct CampaignData {
        bytes32 hash_;
        bytes encoded;
    }

    struct WeekInitializer {
        bool hasSlot;
        uint32 slot;
    }

    struct WeekProfileData {
        uint weekId;
        ReadProfile[] campaigns;
    }

    struct ReadProfile {
        Eligibility eligibility;
        Profile profile;
        bool isClaimed;
        bytes32 hash_;
    }

    struct Answer {
        bytes questionHash;
        uint64 selected;
        bool isUserSelected;
    }

    struct AnswerInput {
        string questionHash;
        uint64 selected;
        bool isUserSelected;
    }

    struct QuizResultOther {
        bytes id;
        bytes quizId;
        uint32 score;
        bytes title;
        uint64 totalPoints;
        uint16 percentage;
        uint64 timeSpent;
        bytes completedAt;
    }

    struct QuizResultOtherInput {
        string id;
        string quizId;
        uint32 score;
        string title;
        uint64 totalPoints;
        uint16 percentage;
        uint64 timeSpent;
        string completedAt;
    }

    struct QuizResultInput {
        AnswerInput[] answers;
        QuizResultOtherInput other;
    }

    struct QuizResult {
        Answer[] answers;
        QuizResultOther other;
    }

    struct ProfileOther {
        uint amountMinted;
        uint8 totalQuizPerWeek;
        bytes32 passkey;
        bool haskey;
    }

    struct Profile {
        QuizResult[] quizResults;
        ProfileOther other;
    }

    struct WeekData {
        uint weekId;
        Campaign[] campaigns;
        uint96 claimDeadline;
    } 

    // Readonly data
    struct ReadData {
        State state;
        WeekData[] wd;
        CampaignData[] approved;
        WeekProfileData[] profileData;
    }

    struct State {
        uint minimumToken;
        uint64 transitionInterval;
        uint64 transitionDate;
        uint weekId;
    }

    struct Eligibility {
        bool isEligible;
        uint erc20Amount;
        uint nativeAmount;
        uint platform;
        address token;
        bytes32 hash_;
        uint weekId;
    }

    // Eligibilities for the previous 3 weeks at most
    struct Eligibilities {
        Eligibility[] elgs;
        uint weekId;
    }

    struct UserCampaigns {
        uint weekId;
        bytes32[] campaigns;
    }

    function checkEligibility(address user) external view returns (Eligibilities memory);
    // function setIsClaimed(address user, uint weekId, bytes32 hash_) external;
    function hasClaimed(address user, uint weekId, bytes32 hash_) external view returns(bool);
    function getPlatformToken() external view returns(address);
    function onCampaignValueChanged(
        uint weekId, 
        bytes32 hash_, 
        uint256 fundsNative, 
        uint256 fundsERC20,
        uint256 platformToken,
        address user
    ) external;
}


// File contracts/Week.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity 0.8.28;
abstract contract Week is ILearna, Admins {

    /// @dev  Other state variables
    State private state;

    ///@notice Platform token 
    IKnowToken internal token;

    ///@notice Claim address
    address public claim;

    /// @dev Claim deadlines
    mapping(uint => uint96) private claimDeadlines;

    ///@dev Mapping that shows whether user has claimed reward for a specific week or not
    mapping(address user => mapping(uint week => mapping(bytes32 => bool))) internal isClaimed;

    /**@dev Set claimed status for a user
     * @param user : User address
     * @param weekId : Week Id
     * @param hash_ : Hash of the claim
     */
    // function _setIsClaimed(address user, uint weekId, bytes32 hash_) internal whenNotPaused onlyApproved() {
    function _setIsClaimed(address user, uint weekId, bytes32 hash_) internal {
        if(!isClaimed[user][weekId][hash_]) isClaimed[user][weekId][hash_] = true;
    }

    /**
        * @notice This function checks if a user has claimed their reward for a specific week.
        * @dev It returns true if the user has claimed the reward, false otherwise.
        * @param user : User address
        * @param weekId : Week Id
        * @return bool : True if user has claimed reward for the week, false otherwise
     */
    function hasClaimed(address user, uint weekId, bytes32 hash_) external view returns(bool) {
        return isClaimed[user][weekId][hash_];
    }

    function _getDeadline(uint weekId) internal view returns(uint96 deadline) {
        deadline = claimDeadlines[weekId];
    }
    
    /**
     * @dev Set claim deadline
     * @param weekId : Week Id
     * @param deadline : New deadline
     */
    function _setClaimDeadline(uint weekId, uint96 deadline) internal {
        claimDeadlines[weekId] = deadline;
    }

    /** 
     * @dev Update minimum token
     * @param minToken : New minimum payable token
     */
    function _setMinimumToken(uint minToken) internal {
        state.minimumToken = minToken;
    }

    /**
     * @dev Set approval for target
     * @param newClaim : Account to set approval for
     */
    function setClaimAddress(address newClaim) public onlyOwner returns(bool) {
        claim = newClaim;
        return true;
    }

    /**
     * @dev Update minimum token - onlyOwner
     * @param minToken : New minimum payable token
     */
    function setMinimumToken(uint minToken) public onlyOwner {
        _setMinimumToken(minToken);
    }

    /**
     * @dev Update transition interval
     * @param intervalInMin : New interval
     * @param pastWeek : Week Id
     */
    function _setTransitionInterval(uint32 intervalInMin, uint pastWeek) internal {
        if(intervalInMin > 0) {
            unchecked {
                uint64 newInterval = intervalInMin * 1 minutes;
                uint64 transitionDate = _now() + newInterval;
                state.transitionInterval = newInterval;
                state.transitionDate = transitionDate;
                _setClaimDeadline(pastWeek, transitionDate);
            }
        } 
    }

    /**
     * @dev Update transition interval
     * @param interval : New interval
     * @notice Transition interval will always reset the transition date 
    */
    function setTransitionInterval(uint32 interval) public onlyOwner {
        if(interval > 0) state.transitionInterval = interval * 1 minutes;
    }

    /**
     * @dev Transition to a new week and return the new week Id
     */
    function _transitionToNewWeek() internal returns(uint newWeekId) {
        state.weekId ++;
        newWeekId = state.weekId;
    }

    /// @dev Return the state variable object
    function _getState() internal view returns(State memory st) {
        st = state;
    }

    /// @dev Update the token variable. Only-owner function
    function setToken(address _token) public onlyOwner returns(bool) {
        require(_token != address(0), "Token is zero");
        token = IKnowToken(_token);
        return true;
    }

    /// @dev Get platform token
    function getPlatformToken() external view returns(address) {
        return address(token);
    }

    // Return the current unix time stamp on the network
    function _now() internal view returns(uint64 time) {
        time = uint64(block.timestamp);
    } 
}


// File contracts/Campaigns.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity 0.8.28;
/**
 * @title Campaigns. 
 * @author : Bobeu - https://github.com/bobeu
 * @notice Non-deployable parent contract that perform CRUD operation on campaigns
*/ 
abstract contract Campaigns is Week {
    ///@dev 
    CampaignData[] private campaignList;   

    ///@dev All registered campaign
    mapping(bytes32 => bool) private isRegistered;

    // Campaigns
    // mapping(bytes32 campaignHash => Initializer) private initializer;

    ///@dev Week inititializer
    mapping(uint weekId => mapping(bytes32 => WeekInitializer)) private wInit;

    //week data for all campaigns
    mapping(uint weekId => Campaign[]) private campaigns;


    // Total campaigns
    uint private allCampaigns;

    // Mapping of campaigns to identifiers
    mapping(uint campaignIndex => bytes32 campaingHashValue) private indexer;

    ///@dev Registers a new campaign
    function _checkAndInitializeCampaign(CampaignData memory data) internal {
        if(!isRegistered[data.hash_]){
            isRegistered[data.hash_] = true;
            campaignList.push(data);
        }
    }

    /**
     * @dev Adds a campaign to a new week
     * @param data : Campaign data struct
     * @param weekId : Week Id
     * @param operator : Campaign operator or owner
     * @param fundsNative : Amount to fund in native asset
     * @param fundsERC20 : Amount to fund in erc20 asset
     * @param platformToken : Amount to fund in platform asset
     * @param token : ERC20 token address
    */
    function _addCampaignToNewWeek(
        CampaignData memory data,
        uint weekId,
        address operator,
        uint256 fundsNative,
        uint256 fundsERC20,
        uint256 platformToken,
        address token
    ) internal returns(Campaign memory cmp) {
        WeekInitializer memory wi = wInit[weekId][data.hash_];
        if(!wi.hasSlot){
            wi.hasSlot = true;
            wi.slot = uint32(campaigns[weekId].length);
            campaigns[weekId].push();
            campaigns[weekId][wi.slot].data = CData(platformToken, fundsNative, fundsERC20, 0, _now(), 0, operator, token, data);
            wInit[weekId][data.hash_] = wi;
            cmp = _getCampaign(weekId, data.hash_).cp;
            emit NewCampaign(cmp);
        } else {
            cmp = _getCampaign(weekId, data.hash_).cp;
            unchecked {
                cmp.data.fundsNative += fundsNative;
                cmp.data.platformToken += platformToken;
            }
            if(operator != cmp.data.operator) cmp.data.operator = operator;
            // If token is not zero address, then update the fundsERC20
            // If token is zero address, then fundsERC20 will not be updated

            // If token is same as existing token, then update the fundsERC20
            // If token is different, then update the token address and fundsERC20
            if(fundsERC20 > 0 && token != address(0)) {
                bool execute = false;
                if(token == cmp.data.token){
                    execute = true;
                } else {
                    if(cmp.data.fundsERC20 == 0) {
                        cmp.data.token = token;
                        execute = true;
                    }
                }
                if(execute) {
                    if(IERC20(token).allowance(_msgSender(), address(this)) >= fundsERC20) {
                        if(IERC20(token).transferFrom(_msgSender(), claim, fundsERC20)){
                            unchecked {
                                cmp.data.fundsERC20 += fundsERC20;
                            }
                        }
                    }
                }
            }
            cmp.data.lastUpdated = _now();
            _setCampaign(wi.slot, weekId, cmp.data);
            emit CampaignUpdated(cmp);
        }
    }

    /**
     * @dev Only approved campaign can pass
     * @param hash_ : Campaign Hash : Hash of the campaign string e.g keccack256("Solidity")
     * @param weekId : week id
    */
    function _validateCampaign(bytes32 hash_, uint weekId) internal view {
        require(isRegistered[hash_], "Campaign not registered");
        require(wInit[weekId][hash_].hasSlot, "Campaign not in current week");
    }

    /**
     * @dev Return the hashed result of a campaign string
     * @param campaign : Campaign string
     */
    function _getHash(string memory campaign) internal pure returns(CampaignData memory data) {
        data.encoded = bytes(campaign);
        data.hash_ = keccak256(data.encoded);
    }

    /**
     * @dev Initializeds a new campaign and create an index for it if not exist, Then initialize the campaign for the
     * parsed weekId. If already iniitialized, update the existing campaign in storage.
     * @param data : Campaign data struct
     * @param weekId : Week Id
     * @param operator : Campaign operator or owner
     * @param fundsNative : Amount to fund in native asset
     * @param fundsERC20 : Amount to fund in erc20 asset
     * @param platformToken : Amount to fund in platform asset
     * @param token : ERC20 token address
    */
    function _tryInitializeCampaign(
        uint weekId,
        CampaignData memory data,
        address operator,
        uint256 fundsNative,
        uint256 fundsERC20,
        uint256 platformToken,
        address token
    ) internal returns(Campaign memory cmp) {
        _checkAndInitializeCampaign(data);
        cmp = _addCampaignToNewWeek(
            data, 
            weekId, 
            operator, 
            fundsNative, 
            fundsERC20, 
            platformToken,
            token
        );
        _validateCampaign(data.hash_, weekId);
    }

    ///@dev Activates or deactivates campaigns
    function toggleCampaignStatus(string[] memory _campaigns) public returns(bool) {
        for(uint i = 0; i < _campaigns.length; i++) {
            bytes32 hash_ = _getHash(_campaigns[i]).hash_;
            bool status = isRegistered[hash_];
            isRegistered[hash_] = !status;
        }
        return true;
    }

    /**
     * Fetches the campaign for the particular week
     * @param weekId : Week id
     * @return data : Campaigns
     */
    function _getCampaings(uint weekId) internal view returns(Campaign[] memory data) {
        data = campaigns[weekId];
    }

    /**
     * Update campaign data in storage
     * @param weekId : Week id
     * @param _campaign : Other data
     * @param slot : Campaign Id
     */
    function _setCampaign(
        uint32 slot,
        uint weekId, 
        CData memory _campaign
    ) internal  {
        campaigns[weekId][slot].data = _campaign;
    }

    /**
     * Update campaign data in storage
     * @param weekId : Week id
     * @param slot : Campaign Id
     * @param user : Target user
     */
    function _updateCampaignUsersList(
        uint32 slot,
        uint weekId, 
        address user
    ) internal  {
        campaigns[weekId][slot].users.push(user);
    }

    /**
     * Update other campaign data
     * @param weekId : Week id
     * @param hash_ : Campaign Id
     * @notice Fetch a campaign only if there is a slot for such campaign for the requested week
     */
    function _getCampaign(uint weekId, bytes32 hash_) internal view returns(GetCampaign memory res) {
        WeekInitializer memory wi = wInit[weekId][hash_];
        res.slot = wi.slot;
        if(wi.hasSlot) {
            res.cp = campaigns[weekId][wi.slot];
        }
    }

    ///@dev Return approved campaigns
    function _getApprovedCampaigns() internal view returns(CampaignData[] memory result) {
        result = campaignList;
    }

    ///@dev Return campaigns for the previous week. This will be used to determine the amount claimables by learners
    function getCampaignsForThePastWeek() external view returns(Campaign[] memory result) {
        uint pastWeek = _getState().weekId;
        if(pastWeek == 0) return result;
        return _getCampaings(pastWeek - 1);
    }

    /**
     * @dev Set up all campaigns for the new week. 
     * @notice it transition into a new week bringing forward the funds from the previous week to the new week.
     * @param newIntervalInMin : New interval to update
     * @param callback : Callback function to run for each campaign
    */
    function _initializeAllCampaigns(uint32 newIntervalInMin, uint _platformToken, function(CData memory, uint) internal returns(CData memory) callback) internal returns(uint pastWeek, uint newWeek, CampaignData[] memory cData) {
        State memory st = _getState();
        require(st.transitionDate < _now(), "Transition is in future");
        pastWeek = st.weekId;
        cData = _getApprovedCampaigns();
        newWeek = _transitionToNewWeek();
        _setTransitionInterval(newIntervalInMin, pastWeek);
        for(uint i = 0; i < cData.length; i++) {
            bytes32 hash_ = cData[i].hash_;
            GetCampaign memory cmp = _getCampaign(pastWeek, hash_);
            _bringForward(pastWeek, newWeek, hash_);
            _setCampaign(cmp.slot, pastWeek, callback(cmp.cp.data, _platformToken)); 
        }
    }

    /**
     * @dev Bring forward the campaign balances from the previous week to a new week
     * @param weekEnded : Current week
     * @param newWeek : New week
     * @param hash_ : Campaign hash
     */
    function _bringForward(uint weekEnded, uint newWeek, bytes32 hash_) internal {
        GetCampaign memory prevWk;
        if(weekEnded > 0){
            uint prevWkId = weekEnded - 1;
            // If the week ended is greater than 0, then we can bring forward the funds
            prevWk = _getCampaign(prevWkId, hash_);
            _tryInitializeCampaign(
                newWeek,
                prevWk.cp.data.data,
                prevWk.cp.data.operator,
                prevWk.cp.data.fundsNative,
                prevWk.cp.data.fundsERC20,
                prevWk.cp.data.platformToken,
                prevWk.cp.data.token
            );
            // Reset the funds for the previous week
            prevWk.cp.data.fundsERC20 = 0;
            prevWk.cp.data.fundsNative = 0;
            prevWk.cp.data.platformToken = 0;
            prevWk.cp.data.lastUpdated = _now();
            _setCampaign(prevWk.slot, prevWkId, prevWk.cp.data);
        } else {
            prevWk = _getCampaign(weekEnded, hash_);
            _tryInitializeCampaign(
                newWeek,
                prevWk.cp.data.data,
                prevWk.cp.data.operator,
                0,
                0,
                0,
                prevWk.cp.data.token
            );
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)

pragma solidity ^0.8.20;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
 * consider using {ReentrancyGuardTransient} instead.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    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
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // 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;
    }
}


// File contracts/libraries/Utils.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity 0.8.28;

library Utils {
    /**@dev Calculate the rate
     * @param fullPoints : Full or aggregate share/points
     * @param unitPoint : Point her user
     * @param principal : Principal amount
     * @param decimals : Number of leading zeros on which the principal is based ex. Celo is based in 18 zeros
     * @notice Rate is returned in %, and we use 1 ether i.e 1e18 as the full percentage i.e 100%
    */
    function calculateShare(
        uint96 fullPoints, 
        uint64 unitPoint,
        uint principal,
        uint8 decimals
    )
        internal
        pure 
        returns (uint share) 
    {
        if(fullPoints == 0 || unitPoint == 0 || principal == 0) return 0;
        require(fullPoints >= unitPoint, 'Invalid principal');
        unchecked {
            uint base = 10 ** decimals;
            share = (((unitPoint * base) / fullPoints) * principal) /base;
        } 
    }
    
}


// File contracts/Learna.sol

// Original license: SPDX_License_Identifier: MIT

pragma solidity 0.8.28;
contract Learna is Campaigns, ReentrancyGuard {
    using Utils for uint96;

    Mode private mode;

    ///@notice Flag that controls whether to use key mechanism for learners or not
    bool public useKey;

    // Dev Address
    address private dev;

    // Campaign fee receiver
    address private immutable feeTo;

    // Profiles for each campaign in week id
    mapping(uint weekId => mapping(bytes32 hash_ => mapping(address => Profile))) private learners;

    /// @dev All campaigns user subscribed to for all the weeks.
    mapping(uint => mapping(address => bytes32[])) private userCampaigns;

    /// @dev Mapping showing whether users have registred for a campaign for given week or not
    mapping(address => mapping(bytes32 => mapping(uint => bool))) registered;

    modifier validateAddress(address target) {
        require(target != address(0), "Token is zero");
        _;
    }

    /**
     * @dev Constructor
     * @param _admins : Addresses to be added as admin
     * @param transitionInterval : Interval in time with which a week can be sorted. Ex. If its 7 days, this mean an admin
     *                              cannot perform the sort function until its 7 days from the last sorted time. 
     * @param _mode : Deployment mode - LOCAL or LIVE
     * @notice We instanitate the admins array with an empty content. This is to ensure that anyone with slot 0 will always be
     * false otherwise anyone with 0 slot will automatically inherits the attributes of an admin in slot 0. If such as admin is active,
     * anyone could perform an admin role.
     */
    constructor(
        address[] memory _admins, 
        uint32 transitionInterval, 
        Mode _mode, 
        address _feeTo,
        string[] memory _campaigns
    ) {
        _setMinimumToken(1e16);
        mode = _mode;
        dev = _msgSender();
        require(_feeTo != address(0), "Fee manager is zero");
        feeTo = _feeTo;
        if(mode == Mode.LIVE){
            _setTransitionInterval(transitionInterval, _getState().weekId);
            useKey = false;
        } else {
            useKey = true;
        }
        for(uint i = 0; i < _admins.length; i++) {
            if(_admins[i] != address(0)) _addAdmin(_admins[i]); 
        } 

        for(uint i = 0; i < _campaigns.length; i++) {
            _tryInitializeCampaign(_getState().weekId, _getHash(_campaigns[i]), _msgSender(), 0, 0, 0, address(0));
        }
    }

    receive() external payable {}

    /**
     * Fetch profile
     * @param weekId : Week id
     * @param hash_ : Campaign hash
     * @param user : Target user
     * @return profile : Profile data
    */
    function _getProfile(uint weekId, bytes32 hash_, address user) internal view returns(Profile memory profile) {
        profile = learners[weekId][hash_][user];
    }

    /**
     * Toggle useKey status. 
     @notice Toggling the function will continously alter the state of the useKey variable by negating the current status 
    */
    function toggleUseKey() public onlyOwner returns(bool) {
        bool status = useKey;
        useKey = !status;
        return true;
    }

    /**
     * Update profile
     * @param weekId : Week id
     * @param hash_ : Campaign hash
     * @param user : Target user
     * @param profile : Profile data
    */
    function _setProfile(uint weekId, bytes32 hash_, address user, ProfileOther memory profile) internal {
        learners[weekId][hash_][user].other = profile;
    }

    /**
     * Forward value to a specific address
     * @param amount : Amount to forward
     * @param to : Address to forward the fee to
     */
    function _sendValue(uint amount, address to) internal {
        if(amount > 0) {
            require(address(this).balance >= amount, "Insufficient bal");
            (bool s,) = to.call{value: amount}('');
            require(s, "Failed");
        }
    }

    ///////////////////////////////////////////////////////////
    //     PUBLIC FUNCTION : SET UP A CAMPAIGN               //
    ///////////////////////////////////////////////////////////
    /**
     * @dev Add new campaign to the current week and fund it. Also, can be used to increase the funds in existing campaign for the week.
     * @param _campaign : Campaign string
     * @param token : ERC20 contract address if fundsErc20 is greater than 0
     * @param fundsErc20 : Amount to fund the campaign in ERC20 currency e.g $GROW, $G. etc
     * @notice Anyone can setUp or add campaign provided they have enough to fund it. Campaign can be funded in two ways:
     * - ERC20. If the amount in fundsErc20 is greater than 0, it is suppose that the sender intends to also fund the campaign
     *    in ERC20-based asset hence the 'token' parameter must not be zero.
     * - Native such as CELO.
     */
    function setUpCampaign(
        string memory _campaign, 
        uint256 fundsErc20,
        address token
    ) public payable returns(bool) {
        _sendValue(msg.value, claim);
        _tryInitializeCampaign(
            _getState().weekId,
            _getHash(_campaign),
            _msgSender(),
            msg.value,
            fundsErc20,
            0,
            token
        );

        return true;
    }


    /////////////////////////////////////////////////////////////////////////
    //     PUBLIC FUNCTION :  ADJUST THE FUNDS IN A CAMPAING              //
    ////////////////////////////////////////////////////////////////////////
    
    /**
     * @dev Adjust funds in campaigns. Only admin function
     * @param hash_ : Campaign hashes
     * @param erc20Value : ERC20 values.
     * @param nativeValue : Values in native coin e.g CELO
     * @notice The function can increase or decrease the values in a campaign. Just parse desired values.
     *         - Value cannot be adjusted beyond the balances in this contract.
     */
    function adjustCampaignValues(
        bytes32 hash_, 
        uint erc20Value,
        uint nativeValue
    ) public onlyAdmin returns(bool) {
        uint weekId = _getState().weekId;
        _validateCampaign(hash_, weekId);
        GetCampaign memory res = _getCampaign(weekId, hash_);
        require(res.cp.data.token != address(0), "Token is zero");
        require(IERC20(res.cp.data.token).balanceOf(claim) >= erc20Value, "ERC20Bal inconsistent");
        require(claim.balance >= nativeValue, "New value exceeds balance");
        res.cp.data.fundsERC20 = erc20Value;
        res.cp.data.fundsNative = nativeValue;
        res.cp.data.lastUpdated = _now();
        _setCampaign(res.slot, weekId, res.cp.data);

        return true;
    }

    ////////////////////////////////////////////////////////////////////////////////////////
    //    PUBLIC FUNCTION : KEEP TRACK OF POINTS EARNED FROM PARTICIPATING IN QUIZZES     //
    ////////////////////////////////////////////////////////////////////////////////////////

    /**
     * @dev Delegate transaction to the Admin account also generate user key for all the campaigns.
     */
    function delegateTransaction() external payable returns(bool) {
       return _generateKey(msg.value);
    }

    /**
     * @dev Register users for weekly reward
     * @param user : User 
     * @param hash_ : Campaign hash 
     * @param quizResult : Array of quiz result for a campaign
     * @notice Only owner function
    */
    function recordPoints(address user, QuizResultInput memory quizResult, bytes32 hash_) 
        public 
        payable
        onlyAdmin
        whenNotPaused 
        returns(bool) 
    { 
        uint weekId = _getState().weekId;
        _sendValue(msg.value, feeTo);
        require(user != address(0), "Invalid user"); 
        _validateCampaign(hash_, weekId);
        GetCampaign memory res = _getCampaign(weekId, hash_);
        Profile memory pf = _getProfile(weekId, hash_, user);
        if(!_checkRegistration(weekId, hash_, user)) {
            _updateCampaignUsersList(res.slot, weekId, user);
            unchecked {
                res.cp.data.activeLearners += 1;
            }
        }
        require(pf.other.totalQuizPerWeek <= 120, 'Storage limit exceeded');
    
        unchecked {
            pf.other.totalQuizPerWeek += 1;
            res.cp.data.totalPoints += quizResult.other.score; 
        }
        _setProfile(weekId,  hash_, user, pf.other);
        uint index = learners[weekId][hash_][user].quizResults.length;
        learners[weekId][hash_][user].quizResults.push();
        learners[weekId][hash_][user].quizResults[index].other.id = bytes(quizResult.other.id);
        learners[weekId][hash_][user].quizResults[index].other.quizId = bytes(quizResult.other.quizId);
        learners[weekId][hash_][user].quizResults[index].other.completedAt = bytes(quizResult.other.completedAt);
        learners[weekId][hash_][user].quizResults[index].other.title = bytes(quizResult.other.title);
        learners[weekId][hash_][user].quizResults[index].other.score = quizResult.other.score;
        learners[weekId][hash_][user].quizResults[index].other.totalPoints = quizResult.other.totalPoints;
        learners[weekId][hash_][user].quizResults[index].other.percentage = quizResult.other.percentage;
        learners[weekId][hash_][user].quizResults[index].other.timeSpent = quizResult.other.timeSpent;

        for(uint i = 0; i < quizResult.answers.length; i++){
            AnswerInput memory answer = quizResult.answers[i]; 
            learners[weekId][hash_][user].quizResults[index].answers.push();
            learners[weekId][hash_][user].quizResults[index].answers[i] = Answer(bytes(answer.questionHash), answer.selected, answer.isUserSelected); 
        }
        _setCampaign(res.slot, weekId, res.cp.data); 

        emit PointRecorded(user, weekId, hash_, quizResult);
        return true;
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////
    //                                       PUBLIC FUNCTIONS                                    //
    ///////////////////////////////////////////////////////////////////////////////////////////////

     /**
     * @dev Allocate weekly earnings
     * @param newIntervalInMin : New transition interval for the new week. The interval is used to determined the claim deadline.
     * @param amountInKnowToken : Amount to allocate in GROW token
     * @notice We first for allowance of owner to this contract. If allowance is zero, we assume allocation should come from
     * the GROW Token. Also, previous week payout will be closed. Learners must withdraw from past week before the current week ends
    */
    function sortWeeklyReward(uint amountInKnowToken, uint32 newIntervalInMin) 
        public 
        whenNotPaused 
        onlyAdmin
        returns(bool) 
    {
        (uint currentWk, uint newWk, CampaignData[] memory cData) = _initializeAllCampaigns(newIntervalInMin, amountInKnowToken, _callback);
        if(amountInKnowToken > 0) {
            require(address(token) != address(0), "Tk empty");
            require(token.allocate(amountInKnowToken, claim), 'Allocation failed');
        }

        emit Sorted(currentWk, newWk, cData);  
 
        return true;
    }

    /**
     * @dev Triggers stopped state.
    */
    function pause() public onlyOwner {
        _pause();
    }

    /**
     * @dev Returns to normal state.
     */
    function unpause() public onlyOwner {
        _unpause();
    }

    ///////////////////////////////////
    //        INTERNAL FUNCTIONS     //
    ///////////////////////////////////

    /**@dev If activated, generate new key for the user, and allocate some amount of GROW token to them based on the 
        amount of value they have sent along with the call. 
    */
    function _createKey(address user, uint value, uint weekId, bytes32 hash_) internal returns(Profile memory pf) {
        pf = _getProfile(weekId, hash_, user);
        if(value > 0) {
            token.allocate(value, user);
        }
        if(!pf.other.haskey) {
            pf.other.haskey = true;
            pf.other.passkey = keccak256(abi.encodePacked(user, weekId, value));
        }
    }

    /**
     * @dev Generate user key for all campaigns in the current week.
     * @param value : Amount sent as minimum token
     */
    function _generateKey(uint256 value) internal returns(bool) {
        uint weekId = _getState().weekId;
        uint minimumToken = _getState().minimumToken;
        Campaign[] memory cps = _getCampaings(weekId);
        if(minimumToken > 0) {
            require(value >= minimumToken, "Insufficient token");
        }
        _sendValue(value, feeTo);
        uint valuePerCampaign;
        if(value > 0 && value >= cps.length) {
            unchecked {
                valuePerCampaign = value / cps.length;
            }
        }
        address user = _msgSender();
        for(uint i = 0; i < cps.length; i++) {
            bytes32 hash_ = cps[i].data.data.hash_;
            Profile memory pf = _createKey(user, valuePerCampaign, weekId, hash_);
            _setProfile(weekId,  hash_, user, pf.other);
        }
        return true;
    }

    function _checkRegistration(uint weekId, bytes32 hash_, address user) internal returns(bool isReg) {
        if(!registered[user][hash_][weekId]){
            registered[user][hash_][weekId] = true;
            userCampaigns[weekId][user].push(hash_);
        } else {
            isReg = true;
        }
    }

    /**
     * @dev Callback function to update campaign values
     * @param weekId : Week Id
     * @param hash_ : Campaign hash
     * @param fundsNative : Amount in native currency e.g CELO
     * @param fundsERC20 : Amount in ERC20 currency e.g $GROW, $G. etc
     * @param platformToken : Amount in platform token e.g GROW token
    */
    function onCampaignValueChanged(
        uint weekId, 
        bytes32 hash_, 
        uint256 fundsNative, 
        uint256 fundsERC20,
        uint256 platformToken,
        address user
    ) external onlyApproved {
        // _validateCampaign(hash_, weekId);
        _setIsClaimed(user, weekId, hash_);
        GetCampaign memory res = _getCampaign(weekId, hash_);
        if(res.cp.data.fundsERC20 >= fundsERC20){
            res.cp.data.fundsERC20 -= fundsERC20;
        }
        if(res.cp.data.fundsNative >= fundsNative){
            res.cp.data.fundsNative -= fundsNative;
        }
        if(res.cp.data.platformToken >= platformToken){
            res.cp.data.platformToken -= platformToken;
        }
        res.cp.data.lastUpdated = _now();
        _setCampaign(res.slot, weekId, res.cp.data);
    }

    function _callback(CData memory _cp, uint platformToken) internal returns(CData memory cp) {
        cp = _cp;
        (uint native, uint256 erc20) = _rebalance(cp.token, cp.fundsNative, cp.fundsERC20);
        cp.fundsNative = native;
        cp.fundsERC20 = erc20;
        unchecked {
            cp.platformToken += platformToken;
        }
        cp.lastUpdated = _now();
    }
    
    /**
     * @dev Calculates user's share of the weekly payout
     * @param userPoints : Total points accumulated by the user
     * @param cp : Campaign 
     */
    function _calculateShare( 
        uint64 userPoints, 
        CData memory cp
    ) internal view returns(uint erc20Amount, uint nativeClaim, uint platform) {
        uint8 erc20Decimals;
        assert(cp.totalPoints >= userPoints);
        if(cp.totalPoints > 0 && cp.token != address(0)) { 
            erc20Decimals = IERC20Metadata(cp.token).decimals(); 
            unchecked {
                if(cp.fundsERC20 > 0) erc20Amount = cp.totalPoints.calculateShare(userPoints, cp.fundsERC20, erc20Decimals);
                if(cp.fundsNative > 0) nativeClaim = cp.totalPoints.calculateShare(userPoints, cp.fundsNative, 18);
                if(cp.platformToken > 0) {
                    erc20Decimals = IERC20Metadata(address(token)).decimals();
                    platform =  cp.totalPoints.calculateShare(userPoints, cp.platformToken, erc20Decimals);
                }
            }
        }
    }

    /**
     * Check reward eligibility for the requested week
     * @param user : Target user
     * @param weekId : Requested week Id
     * @param hash_ : Hash of the campaign name
     */
    function _getEligibility(address user, bytes32 hash_, uint weekId, bool nullifier, bool validate) 
        internal 
        view 
        returns(Eligibility memory elg) 
    {
        if(validate) _validateCampaign(hash_, weekId);
        if(!isClaimed[user][weekId][hash_]) {
            CData memory cp = _getCampaign(weekId, hash_).cp.data;
            Profile memory pf = _getProfile(weekId, hash_, user);
            uint64 totalScore;
            for(uint i = 0; i < pf.quizResults.length; i++) { 
                unchecked {
                    totalScore += pf.quizResults[i].other.score;
                }
            }
            (uint erc20, uint native, uint platform) = _calculateShare(nullifier? 0 : totalScore, cp);
            bool protocolVerified = mode == Mode.LIVE? _now() <= _getDeadline(weekId) && (cp.fundsNative > 0 || cp.fundsERC20 > 0) : true;
            bool isEligible = protocolVerified && (native > 0 || erc20 > 0 || platform > 0);
            elg = Eligibility(
                isEligible,
                erc20,  
                native, 
                platform,
                cp.token, 
                hash_,
                weekId
            );
        }
    }

    /**
     * @dev Assign 2% of payouts to the dev
     * @param token : ERC20 token to be used for payout
     * @return nativeBalance : Celo balance of this contract after dev share 
     * @return erc20Balance : ERC20 balance of this contract after dev share
     */
    function _rebalance(address token, uint256 native, uint256 erc20) internal returns(uint256 nativeBalance, uint256 erc20Balance) {
        uint8 devRate = 2;
        nativeBalance = native;
        erc20Balance = erc20;
        uint devShare;
        unchecked {
            if(nativeBalance > 0 && (address(this).balance >= nativeBalance)) {
                devShare = (nativeBalance * devRate) / 100;
                (bool done,) = dev.call{value: devShare}('');
                require(done, 'T.Failed');
                nativeBalance -= devShare;
            }
            if(erc20Balance > 0 && (IERC20(token).balanceOf(address(this)) >= erc20Balance)) {
                devShare = (erc20Balance * devRate) / 100;
                if(token != address(0)){
                    require(IERC20(token).transfer(dev, devShare), 'ERC20 TFailed');
                }
                erc20Balance -= devShare; 
            }
        }
    }

    /////////////////////////////////////////////////////////////////////////////////
    //                          READ-ONLY FUNCTIONS                                //
    /////////////////////////////////////////////////////////////////////////////////

    /**
     * Get users eligibility for all the campaigns for the previous weeks ended
     * @param user : User
     * @notice Claim will always be for the concluded 3 weeks back. The position must match and can be extracted directly from 
     * the frontend when reading the user's campaigns. Learner can only claim from the past three weeks campaign pool; 
     */
    function checkEligibility(address user) 
        external 
        view
        returns(Eligibilities memory result) 
    {
        uint weekId = _getState().weekId;
        if(weekId > 0) weekId -= 1;
        Campaign[] memory cps = _getCampaings(weekId);
        uint cSize = cps.length;
        result.elgs = new Eligibility[](cSize);
        result.weekId = weekId;
        for(uint j = 0; j < cSize; j++){
            bool nullifier = false;
            // If useKey is enabled, learners must have created a key for all the campaigns they subscribed to
            if(useKey){
                if(!_getProfile(weekId, cps[j].data.data.hash_, user).other.haskey) nullifier = true;
            }
            result.elgs[j] = _getEligibility(user, cps[j].data.data.hash_, weekId, nullifier, false);
        }

        return result;
    } 

    // Fetch past claims
    function getData(address user) public view returns(ReadData memory data) {
        data.state = _getState();
        data.approved = _getApprovedCampaigns();
        uint weekIds = data.state.weekId;
        weekIds ++;
        data.wd = new WeekData[](weekIds);
        data.profileData = new WeekProfileData[](weekIds);
        uint hashSize = data.approved.length; 
        for(uint i = 0; i < weekIds; i++) {
            data.wd[i].campaigns = _getCampaings(i);
            data.wd[i].claimDeadline = _getDeadline(i);
            ReadProfile[] memory _userCampaigns = new ReadProfile[](hashSize);
            if(user != address(0)) {
                data.profileData[i].weekId = i;
                for(uint hashId = 0; hashId < hashSize; hashId++) { 
                    bytes32 hash_ = data.approved[hashId].hash_;
                    bool nullifier = false;
                    // If useKey is enabled, learners must have created a key for all the first campaign they joined
                    if(useKey){
                        if(!_getProfile(i, hash_, user).other.haskey) nullifier = true;
                    }
                    _userCampaigns[hashId] = ReadProfile( 
                        _getEligibility(user, hash_, i, nullifier, false),
                        _getProfile(i, hash_, user), 
                        isClaimed[user][i][hash_],
                        hash_
                    );
                }
                data.profileData[i].campaigns = _userCampaigns;
            }
        }
        return data;
    } 
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address[]","name":"_admins","type":"address[]"},{"internalType":"uint32","name":"transitionInterval","type":"uint32"},{"internalType":"enum ILearna.Mode","name":"_mode","type":"uint8"},{"internalType":"address","name":"_feeTo","type":"address"},{"internalType":"string[]","name":"_campaigns","type":"string[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AddressIsZero","type":"error"},{"inputs":[],"name":"CampaignClaimNotActivated","type":"error"},{"inputs":[],"name":"ClaimAddressNotSet","type":"error"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"ClaimEnded","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"NotEligible","type":"error"},{"inputs":[],"name":"NotInitialized","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"UserBlacklisted","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"","type":"address"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"weekId","type":"uint256"},{"indexed":true,"internalType":"address","name":"tipper","type":"address"},{"components":[{"components":[{"internalType":"uint256","name":"platformToken","type":"uint256"},{"internalType":"uint256","name":"fundsNative","type":"uint256"},{"internalType":"uint256","name":"fundsERC20","type":"uint256"},{"internalType":"uint96","name":"totalPoints","type":"uint96"},{"internalType":"uint64","name":"lastUpdated","type":"uint64"},{"internalType":"uint256","name":"activeLearners","type":"uint256"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"bytes","name":"encoded","type":"bytes"}],"internalType":"struct ILearna.CampaignData","name":"data","type":"tuple"}],"internalType":"struct ILearna.CData","name":"data","type":"tuple"},{"internalType":"address[]","name":"users","type":"address[]"}],"indexed":false,"internalType":"struct ILearna.Campaign","name":"data","type":"tuple"},{"indexed":false,"internalType":"bytes32[]","name":"campainHashes","type":"bytes32[]"}],"name":"CampaignCreated","type":"event"},{"anonymous":false,"inputs":[{"components":[{"components":[{"internalType":"uint256","name":"platformToken","type":"uint256"},{"internalType":"uint256","name":"fundsNative","type":"uint256"},{"internalType":"uint256","name":"fundsERC20","type":"uint256"},{"internalType":"uint96","name":"totalPoints","type":"uint96"},{"internalType":"uint64","name":"lastUpdated","type":"uint64"},{"internalType":"uint256","name":"activeLearners","type":"uint256"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"bytes","name":"encoded","type":"bytes"}],"internalType":"struct ILearna.CampaignData","name":"data","type":"tuple"}],"internalType":"struct ILearna.CData","name":"data","type":"tuple"},{"internalType":"address[]","name":"users","type":"address[]"}],"indexed":false,"internalType":"struct ILearna.Campaign","name":"campaign","type":"tuple"}],"name":"CampaignUpdated","type":"event"},{"anonymous":false,"inputs":[{"components":[{"components":[{"internalType":"uint256","name":"platformToken","type":"uint256"},{"internalType":"uint256","name":"fundsNative","type":"uint256"},{"internalType":"uint256","name":"fundsERC20","type":"uint256"},{"internalType":"uint96","name":"totalPoints","type":"uint96"},{"internalType":"uint64","name":"lastUpdated","type":"uint64"},{"internalType":"uint256","name":"activeLearners","type":"uint256"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"bytes","name":"encoded","type":"bytes"}],"internalType":"struct ILearna.CampaignData","name":"data","type":"tuple"}],"internalType":"struct ILearna.CData","name":"data","type":"tuple"},{"internalType":"address[]","name":"users","type":"address[]"}],"indexed":false,"internalType":"struct ILearna.Campaign","name":"campaign","type":"tuple"}],"name":"NewCampaign","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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"weekId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"campainHash","type":"bytes32"},{"components":[{"components":[{"internalType":"string","name":"questionHash","type":"string"},{"internalType":"uint64","name":"selected","type":"uint64"},{"internalType":"bool","name":"isUserSelected","type":"bool"}],"internalType":"struct ILearna.AnswerInput[]","name":"answers","type":"tuple[]"},{"components":[{"internalType":"string","name":"id","type":"string"},{"internalType":"string","name":"quizId","type":"string"},{"internalType":"uint32","name":"score","type":"uint32"},{"internalType":"string","name":"title","type":"string"},{"internalType":"uint64","name":"totalPoints","type":"uint64"},{"internalType":"uint16","name":"percentage","type":"uint16"},{"internalType":"uint64","name":"timeSpent","type":"uint64"},{"internalType":"string","name":"completedAt","type":"string"}],"internalType":"struct ILearna.QuizResultOtherInput","name":"other","type":"tuple"}],"indexed":false,"internalType":"struct ILearna.QuizResultInput","name":"quizResult","type":"tuple"}],"name":"PointRecorded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_weekId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newWeekId","type":"uint256"},{"components":[{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"bytes","name":"encoded","type":"bytes"}],"indexed":false,"internalType":"struct ILearna.CampaignData[]","name":"campaigns","type":"tuple[]"}],"name":"Sorted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"","type":"address"}],"name":"UnApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"users","type":"address[]"},{"indexed":false,"internalType":"bool[]","name":"newStatus","type":"bool[]"}],"name":"UserStatusChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"uint256","name":"erc20Value","type":"uint256"},{"internalType":"uint256","name":"nativeValue","type":"uint256"}],"name":"adjustCampaignValues","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"checkEligibility","outputs":[{"components":[{"components":[{"internalType":"bool","name":"isEligible","type":"bool"},{"internalType":"uint256","name":"erc20Amount","type":"uint256"},{"internalType":"uint256","name":"nativeAmount","type":"uint256"},{"internalType":"uint256","name":"platform","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"uint256","name":"weekId","type":"uint256"}],"internalType":"struct ILearna.Eligibility[]","name":"elgs","type":"tuple[]"},{"internalType":"uint256","name":"weekId","type":"uint256"}],"internalType":"struct ILearna.Eligibilities","name":"result","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delegateTransaction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getAdmins","outputs":[{"components":[{"internalType":"address","name":"id","type":"address"},{"internalType":"bool","name":"active","type":"bool"}],"internalType":"struct Admins.Admin[]","name":"_admins","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCampaignsForThePastWeek","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"platformToken","type":"uint256"},{"internalType":"uint256","name":"fundsNative","type":"uint256"},{"internalType":"uint256","name":"fundsERC20","type":"uint256"},{"internalType":"uint96","name":"totalPoints","type":"uint96"},{"internalType":"uint64","name":"lastUpdated","type":"uint64"},{"internalType":"uint256","name":"activeLearners","type":"uint256"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"bytes","name":"encoded","type":"bytes"}],"internalType":"struct ILearna.CampaignData","name":"data","type":"tuple"}],"internalType":"struct ILearna.CData","name":"data","type":"tuple"},{"internalType":"address[]","name":"users","type":"address[]"}],"internalType":"struct ILearna.Campaign[]","name":"result","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getData","outputs":[{"components":[{"components":[{"internalType":"uint256","name":"minimumToken","type":"uint256"},{"internalType":"uint64","name":"transitionInterval","type":"uint64"},{"internalType":"uint64","name":"transitionDate","type":"uint64"},{"internalType":"uint256","name":"weekId","type":"uint256"}],"internalType":"struct ILearna.State","name":"state","type":"tuple"},{"components":[{"internalType":"uint256","name":"weekId","type":"uint256"},{"components":[{"components":[{"internalType":"uint256","name":"platformToken","type":"uint256"},{"internalType":"uint256","name":"fundsNative","type":"uint256"},{"internalType":"uint256","name":"fundsERC20","type":"uint256"},{"internalType":"uint96","name":"totalPoints","type":"uint96"},{"internalType":"uint64","name":"lastUpdated","type":"uint64"},{"internalType":"uint256","name":"activeLearners","type":"uint256"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"bytes","name":"encoded","type":"bytes"}],"internalType":"struct ILearna.CampaignData","name":"data","type":"tuple"}],"internalType":"struct ILearna.CData","name":"data","type":"tuple"},{"internalType":"address[]","name":"users","type":"address[]"}],"internalType":"struct ILearna.Campaign[]","name":"campaigns","type":"tuple[]"},{"internalType":"uint96","name":"claimDeadline","type":"uint96"}],"internalType":"struct ILearna.WeekData[]","name":"wd","type":"tuple[]"},{"components":[{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"bytes","name":"encoded","type":"bytes"}],"internalType":"struct ILearna.CampaignData[]","name":"approved","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"weekId","type":"uint256"},{"components":[{"components":[{"internalType":"bool","name":"isEligible","type":"bool"},{"internalType":"uint256","name":"erc20Amount","type":"uint256"},{"internalType":"uint256","name":"nativeAmount","type":"uint256"},{"internalType":"uint256","name":"platform","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"uint256","name":"weekId","type":"uint256"}],"internalType":"struct ILearna.Eligibility","name":"eligibility","type":"tuple"},{"components":[{"components":[{"components":[{"internalType":"bytes","name":"questionHash","type":"bytes"},{"internalType":"uint64","name":"selected","type":"uint64"},{"internalType":"bool","name":"isUserSelected","type":"bool"}],"internalType":"struct ILearna.Answer[]","name":"answers","type":"tuple[]"},{"components":[{"internalType":"bytes","name":"id","type":"bytes"},{"internalType":"bytes","name":"quizId","type":"bytes"},{"internalType":"uint32","name":"score","type":"uint32"},{"internalType":"bytes","name":"title","type":"bytes"},{"internalType":"uint64","name":"totalPoints","type":"uint64"},{"internalType":"uint16","name":"percentage","type":"uint16"},{"internalType":"uint64","name":"timeSpent","type":"uint64"},{"internalType":"bytes","name":"completedAt","type":"bytes"}],"internalType":"struct ILearna.QuizResultOther","name":"other","type":"tuple"}],"internalType":"struct ILearna.QuizResult[]","name":"quizResults","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"amountMinted","type":"uint256"},{"internalType":"uint8","name":"totalQuizPerWeek","type":"uint8"},{"internalType":"bytes32","name":"passkey","type":"bytes32"},{"internalType":"bool","name":"haskey","type":"bool"}],"internalType":"struct ILearna.ProfileOther","name":"other","type":"tuple"}],"internalType":"struct ILearna.Profile","name":"profile","type":"tuple"},{"internalType":"bool","name":"isClaimed","type":"bool"},{"internalType":"bytes32","name":"hash_","type":"bytes32"}],"internalType":"struct ILearna.ReadProfile[]","name":"campaigns","type":"tuple[]"}],"internalType":"struct ILearna.WeekProfileData[]","name":"profileData","type":"tuple[]"}],"internalType":"struct ILearna.ReadData","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPlatformToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"weekId","type":"uint256"},{"internalType":"bytes32","name":"hash_","type":"bytes32"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"isPermitted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"weekId","type":"uint256"},{"internalType":"bytes32","name":"hash_","type":"bytes32"},{"internalType":"uint256","name":"fundsNative","type":"uint256"},{"internalType":"uint256","name":"fundsERC20","type":"uint256"},{"internalType":"uint256","name":"platformToken","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"onCampaignValueChanged","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"components":[{"components":[{"internalType":"string","name":"questionHash","type":"string"},{"internalType":"uint64","name":"selected","type":"uint64"},{"internalType":"bool","name":"isUserSelected","type":"bool"}],"internalType":"struct ILearna.AnswerInput[]","name":"answers","type":"tuple[]"},{"components":[{"internalType":"string","name":"id","type":"string"},{"internalType":"string","name":"quizId","type":"string"},{"internalType":"uint32","name":"score","type":"uint32"},{"internalType":"string","name":"title","type":"string"},{"internalType":"uint64","name":"totalPoints","type":"uint64"},{"internalType":"uint16","name":"percentage","type":"uint16"},{"internalType":"uint64","name":"timeSpent","type":"uint64"},{"internalType":"string","name":"completedAt","type":"string"}],"internalType":"struct ILearna.QuizResultOtherInput","name":"other","type":"tuple"}],"internalType":"struct ILearna.QuizResultInput","name":"quizResult","type":"tuple"},{"internalType":"bytes32","name":"hash_","type":"bytes32"}],"name":"recordPoints","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newClaim","type":"address"}],"name":"setClaimAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minToken","type":"uint256"}],"name":"setMinimumToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"setPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"interval","type":"uint32"}],"name":"setTransitionInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_campaign","type":"string"},{"internalType":"uint256","name":"fundsErc20","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"setUpCampaign","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountInKnowToken","type":"uint256"},{"internalType":"uint32","name":"newIntervalInMin","type":"uint32"}],"name":"sortWeeklyReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"toggleAdminStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_campaigns","type":"string[]"}],"name":"toggleCampaignStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleUseKey","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"unApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useKey","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a060405234801561001057600080fd5b5060405161671738038061671783398101604081905261002f916111f5565b338061006f576040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600060048201526024015b60405180910390fd5b6100788161033b565b5061008433600161038b565b6001601255610099662386f26fc10000600555565b6013805484919060ff1916600183818111156100b7576100b76112f0565b02179055506013805462010000600160b01b0319163362010000021790556001600160a01b038216610145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f466565206d616e61676572206973207a65726f000000000000000000000000006044820152606401610066565b6001600160a01b038216608052600160135460ff16600181111561016b5761016b6112f0565b036101f7576101e7846101de604080516080810182526000808252602082018190529181018290526060810191909152506040805160808101825260055481526006546001600160401b038082166020840152680100000000000000009091041691810191909152600754606082015290565b606001516103f6565b6013805461ff0019169055610207565b6013805461ff0019166101001790555b60005b85518110156102765760006001600160a01b03168682815181106102305761023061131f565b60200260200101516001600160a01b03161461026e5761026e86828151811061025b5761025b61131f565b602002602001015161046860201b60201c565b60010161020a565b5060005b8151811015610330576103276102f0604080516080810182526000808252602082018190529181018290526060810191909152506040805160808101825260055481526006546001600160401b038082166020840152680100000000000000009091041691810191909152600754606082015290565b6060015161031c8484815181106103095761030961131f565b602002602001015161055760201b60201c565b33600080808061057a565b5060010161027a565b50505050505061168e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166103cb576040517f867915ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b63ffffffff82161561046457600680544263ffffffff603c8602169081016001600160401b0381166801000000000000000081026001600160801b03199094168317939093179093556000848152600a6020526040902080546001600160601b031916909217909155905b50505b5050565b6001600160a01b03811660009081526004602052604090205460ff16156104eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f41646d696e20616c7265616479206164646564000000000000000000000000006044820152606401610066565b6001600160a01b0381166000908152600460205260409020805460ff191660019081179091556002549061052090829061134e565b60ff90811660025516600090815260036020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082019091526000815260208082018390528251920191909120815290565b610582610f92565b61058b876105b4565b61059a8789888888888861065c565b87519091506105a99089610b4d565b979650505050505050565b80516000908152600d602052604090205460ff166106595780516000908152600d602090815260408220805460ff19166001908117909155600c80549182018155909252825160029092027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c78101928355908301518392917fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c801906104619082611436565b50565b610664610f92565b6000878152600e602090815260408083208b51845282529182902082518084019093525460ff8116151580845261010090910463ffffffff16918301919091526108d25760018082526000898152600f60208181526040808420805463ffffffff811684890152938352929094018255908252825161012081018452878152908101899052918201879052606082015260808101426001600160401b0316815260200160008152602001886001600160a01b03168152602001846001600160a01b031681526020018a815250600f60008a8152602001908152602001600020826020015163ffffffff168154811061075e5761075e61131f565b60009182526020918290208351600a929092020190815582820151600182015560408301516002820155606083015160038201805460808601516001600160601b039093166001600160a01b0319918216176c010000000000000000000000006001600160401b039094169390930292909217905560a0840151600483015560c084015160058301805483166001600160a01b0392831617905560e08501516006840180549093169116179055610100830151805160078301908155928101519192909160088401906108319082611436565b50505060008a8152600e602090815260408083208e5184528252909120845181549286015164ffffffffff1990931690151564ffffffff0019161761010063ffffffff9093169290920291909117905550508851610890908990610c48565b6000015191507f7e5566222c32876a37c4f46a32c3530645f8a210462fc0afd712d176268d8ea2826040516108c59190611579565b60405180910390a1610b41565b88516108df908990610c48565b5180516020018051880190528051805186019052805160c001519092506001600160a01b038881169116146109215781516001600160a01b03881660c0909101525b60008511801561093957506001600160a01b03831615155b15610ae4576000826000015160e001516001600160a01b0316846001600160a01b0316036109695750600161098c565b82516040015160000361098c575081516001600160a01b03841660e09091015260015b8015610ae257856001600160a01b03851663dd62ed3e336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381865afa158015610a05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a29919061164c565b10610ae2576001600160a01b0384166323b872dd3360095460405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03928316600482015291166024820152604481018990526064016020604051808303816000875af1158015610aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad19190611665565b15610ae25782516040018051870190525b505b81516001600160401b03421660809091015260208101518251610b0991908a90610e8c565b7f73ed9dac93997d0aad8785921b99a78c26845d99ba132a409c657482323a550b82604051610b389190611579565b60405180910390a15b50979650505050505050565b6000828152600d602052604090205460ff16610bc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616d706169676e206e6f7420726567697374657265640000000000000000006044820152606401610066565b6000818152600e6020908152604080832085845290915290205460ff16610464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43616d706169676e206e6f7420696e2063757272656e74207765656b000000006044820152606401610066565b610c50611007565b6000838152600e6020908152604080832085845282529182902082518084019093525460ff811615158352610100900463ffffffff1682820181905290830152805115610e8557600f6000858152602001908152602001600020816020015163ffffffff1681548110610cc557610cc561131f565b60009182526020918290206040805161016081018252600a9093029091018054838301908152600182015460608501526002820154608085015260038201546001600160601b03811660a08601526001600160401b036c010000000000000000000000009091041660c0850152600482015460e085015260058201546001600160a01b0390811661010086015260068301541661012085015282518084019093526007820180548452600883018054959693958795939487946101408801949093909291840191610d9590611394565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc190611394565b8015610e0e5780601f10610de357610100808354040283529160200191610e0e565b820191906000526020600020905b815481529060010190602001808311610df157829003601f168201915b50505050508152505081525050815260200160098201805480602002602001604051908101604052809291908181526020018280548015610e7857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e5a575b5050509190925250505082525b5092915050565b6000828152600f60205260409020805482919063ffffffff8616908110610eb557610eb561131f565b60009182526020918290208351600a929092020190815582820151600182015560408301516002820155606083015160038201805460808601516001600160601b039093166001600160a01b0319918216176c010000000000000000000000006001600160401b039094169390930292909217905560a0840151600483015560c084015160058301805483166001600160a01b0392831617905560e0850151600684018054909316911617905561010083015180516007830190815592810151919290916008840190610f889082611436565b5050505050505050565b6040518060400160405280610ffa60408051610120810182526000808252602080830182905282840182905260608084018390526080840183905260a0840183905260c0840183905260e0840183905284518086019095529184528301529061010082015290565b8152602001606081525090565b604051806040016040528061101a610f92565b8152600060209091015290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561107e5761107e611027565b604052919050565b60006001600160401b0382111561109f5761109f611027565b5060051b60200190565b80516001600160a01b03811681146110c057600080fd5b919050565b805163ffffffff811681146110c057600080fd5b8051600281106110c057600080fd5b60005b838110156111035781810151838201526020016110eb565b50506000910152565b600082601f83011261111d57600080fd5b815161113061112b82611086565b611056565b8082825260208201915060208360051b86010192508583111561115257600080fd5b602085015b838110156111eb5780516001600160401b0381111561117557600080fd5b8601603f8101881361118657600080fd5b60208101516001600160401b038111156111a2576111a2611027565b6111b5601f8201601f1916602001611056565b8181526040838301018a10156111ca57600080fd5b6111db8260208301604086016110e8565b8552505060209283019201611157565b5095945050505050565b600080600080600060a0868803121561120d57600080fd5b85516001600160401b0381111561122357600080fd5b8601601f8101881361123457600080fd5b805161124261112b82611086565b8082825260208201915060208360051b85010192508a83111561126457600080fd5b6020840193505b8284101561128d5761127c846110a9565b82526020938401939091019061126b565b975061129f92505050602087016110c5565b93506112ad604087016110d9565b92506112bb606087016110a9565b60808701519092506001600160401b038111156112d757600080fd5b6112e38882890161110c565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60ff818116838216019081111561138e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b600181811c908216806113a857607f821691505b6020821081036113e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561143157806000526020600020601f840160051c8101602085101561140e5750805b601f840160051c820191505b8181101561142e576000815560010161141a565b50505b505050565b81516001600160401b0381111561144f5761144f611027565b6114638161145d8454611394565b846113e7565b6020601f821160018114611497576000831561147f5750848201515b600019600385901b1c1916600184901b17845561142e565b600084815260208120601f198516915b828110156114c757878501518255602094850194600190920191016114a7565b50848210156114e55786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b805182526000602082015160406020850152805180604086015261151f8160608701602085016110e8565b601f01601f1916939093016060019392505050565b600081518084526020840193506020830160005b8281101561156f5781516001600160a01b0316865260209586019590910190600101611548565b5093949350505050565b6020815260008251604060208401528051606084015260208101516080840152604081015160a084015260608101516115bd60c08501826001600160601b03169052565b5060808101516001600160401b03811660e08501525060a081015161010084015260c08101516001600160a01b0381166101208501525060e08101516001600160a01b0381166101408501525061010001516101206101608401526116266101808401826114f4565b90506020840151601f198483030160408501526116438282611534565b95945050505050565b60006020828403121561165e57600080fd5b5051919050565b60006020828403121561167757600080fd5b8151801515811461168757600080fd5b9392505050565b6080516150676116b060003960008181610ddf0152612e0d01526150676000f3fe6080604052600436106101dc5760003560e01c80638456cb5911610102578063b029d68e11610095578063c8559a9e11610064578063c8559a9e14610563578063e4f6da1b14610583578063f2fde38b146105a2578063fe1db20b146105c257600080fd5b8063b029d68e146104ee578063b5252f9b14610503578063b85a35d214610523578063bb3790871461054357600080fd5b80639db412d0116100d15780639db412d0146104705780639ed374f7146104905780639f2032e4146104ae578063a75ec94e146104ce57600080fd5b80638456cb59146104135780638da5cb5b146104285780638fa4fdfd14610446578063958420271461044e57600080fd5b80634b6b0a611161017a5780635c975abb116101495780635c975abb14610392578063704b6c02146103b1578063715018a6146103d15780637723bafb146103e657600080fd5b80634b6b0a61146103075780634b7739c9146103275780634e71d92d1461033a5780635895668c1461037257600080fd5b8063373a5d79116101b6578063373a5d791461025257806338266b22146102a35780633f4ba83a146102d05780633fd8cc4e146102e757600080fd5b806308ddc0ae146101e8578063144fa6d71461021057806331ae450b1461023057600080fd5b366101e357005b600080fd5b6101fb6101f636600461405f565b6105e2565b60405190151581526020015b60405180910390f35b34801561021c57600080fd5b506101fb61022b3660046140b5565b610641565b34801561023c57600080fd5b506102456106ba565b60405161020791906140d0565b34801561025e57600080fd5b506101fb61026d36600461412a565b6001600160a01b0383166000908152600b60209081526040808320858452825280832084845290915290205460ff169392505050565b3480156102af57600080fd5b506102c36102be3660046140b5565b6107b1565b6040516102079190614706565b3480156102dc57600080fd5b506102e5610b50565b005b3480156102f357600080fd5b506101fb6103023660046140b5565b610b62565b34801561031357600080fd5b506101fb61032236600461479b565b610b85565b6101fb610335366004614942565b610d9a565b34801561034657600080fd5b5060095461035a906001600160a01b031681565b6040516001600160a01b039091168152602001610207565b34801561037e57600080fd5b506101fb61038d366004614ad7565b611496565b34801561039e57600080fd5b50600054600160a01b900460ff166101fb565b3480156103bd57600080fd5b506102e56103cc3660046140b5565b611516565b3480156103dd57600080fd5b506102e561152a565b3480156103f257600080fd5b506104066104013660046140b5565b61153c565b6040516102079190614b8c565b34801561041f57600080fd5b506102e56116a4565b34801561043457600080fd5b506000546001600160a01b031661035a565b6101fb6116b4565b34801561045a57600080fd5b506104636116c4565b6040516102079190614bf3565b34801561047c57600080fd5b506102e561048b366004614c06565b6116fb565b34801561049c57600080fd5b506008546001600160a01b031661035a565b3480156104ba57600080fd5b506102e56104c9366004614c57565b61180a565b3480156104da57600080fd5b506102e56104e9366004614c70565b61181b565b3480156104fa57600080fd5b506101fb61185b565b34801561050f57600080fd5b506102e561051e3660046140b5565b611886565b34801561052f57600080fd5b506102e561053e3660046140b5565b6118d0565b34801561054f57600080fd5b506101fb61055e3660046140b5565b61191a565b34801561056f57600080fd5b506102e561057e3660046140b5565b611949565b34801561058f57600080fd5b506013546101fb90610100900460ff1681565b3480156105ae57600080fd5b506102e56105bd3660046140b5565b61197a565b3480156105ce57600080fd5b506101fb6105dd366004614c8b565b6119b5565b6009546000906105fc9034906001600160a01b0316611b46565b610634610607611c22565b60600151604080518082019091526000815260208082018890528751908801208152333487600088611c84565b50600190505b9392505050565b600061064b611cbf565b6001600160a01b0382166106965760405162461bcd60e51b815260206004820152600d60248201526c546f6b656e206973207a65726f60981b60448201526064015b60405180910390fd5b50600880546001600160a01b0319166001600160a01b03831617905560015b919050565b60025460609060ff81166000036106cf575090565b8060ff166001600160401b038111156106ea576106ea613f26565b60405190808252806020026020018201604052801561072f57816020015b60408051808201909152600080825260208201528152602001906001900390816107085790505b50915060005b8160ff168160ff1610156107ac5760ff808216600081815260036020908152604080832054815180830183526001600160a01b03909116808252808552600484529190932054909416151590820152855190918691811061079857610798614cb7565b602090810291909101015250600101610735565b505090565b6107fc60408051610100810190915260006080820181815260a0830182905260c0830182905260e0830191909152819081526020016060815260200160608152602001606081525090565b610804611c22565b815261080e611cec565b60408201528051606001518061082381614ce3565b915050806001600160401b0381111561083e5761083e613f26565b60405190808252806020026020018201604052801561089c57816020015b6108896040518060600160405280600081526020016060815260200160006001600160601b031681525090565b81526020019060019003908161085c5790505b506020830152806001600160401b038111156108ba576108ba613f26565b60405190808252806020026020018201604052801561090057816020015b6040805180820190915260008152606060208201528152602001906001900390816108d85790505b50606083015260408201515160005b82811015610b485761092081611de7565b8460200151828151811061093657610936614cb7565b602002602001015160200181905250610964816000908152600a60205260409020546001600160601b031690565b8460200151828151811061097a5761097a614cb7565b6020026020010151604001906001600160601b031690816001600160601b0316815250506000826001600160401b038111156109b8576109b8613f26565b6040519080825280602002602001820160405280156109f157816020015b6109de613dc3565b8152602001906001900390816109d65790505b5090506001600160a01b03861615610b3f578185606001518381518110610a1a57610a1a614cb7565b60209081029190910101515260005b83811015610b1757600086604001518281518110610a4957610a49614cb7565b60200260200101516000015190506000601360019054906101000a900460ff1615610a8957610a7985838b611fef565b6020015160600151610a89575060015b6040518060800160405280610aa28b8589866000612483565b8152602001610ab287858d611fef565b81526001600160a01b038b166000908152600b602090815260408083208a845282528083208784528252918290205460ff16151590830152018390528451859085908110610b0257610b02614cb7565b60209081029190910101525050600101610a29565b508085606001518381518110610b2f57610b2f614cb7565b6020026020010151602001819052505b5060010161090f565b505050919050565b610b58611cbf565b610b6061263d565b565b6001600160a01b03811660009081526001602052604081205460ff165b92915050565b6000610baa335b6001600160a01b031660009081526004602052604090205460ff1690565b610bc65760405162461bcd60e51b815260040161068d90614cfc565b6000610bd0611c22565b606001519050610be08582612692565b6000610bec8287612759565b80515160e001519091506001600160a01b0316610c3b5760405162461bcd60e51b815260206004820152600d60248201526c546f6b656e206973207a65726f60981b604482015260640161068d565b80515160e001516009546040516370a0823160e01b81526001600160a01b039182166004820152879291909116906370a0823190602401602060405180830381865afa158015610c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb39190614d20565b1015610cf95760405162461bcd60e51b8152602060048201526015602482015274115490cc8c10985b081a5b98dbdb9cda5cdd195b9d605a1b604482015260640161068d565b6009546001600160a01b031631841115610d555760405162461bcd60e51b815260206004820152601960248201527f4e65772076616c756520657863656564732062616c616e636500000000000000604482015260640161068d565b80515160400185905280515160209081018590528151516001600160401b034216608090910152810151815151610d8e91908490612994565b50600195945050505050565b6000610da533610b8c565b610dc15760405162461bcd60e51b815260040161068d90614cfc565b610dc9612a91565b6000610dd3611c22565b606001519050610e03347f0000000000000000000000000000000000000000000000000000000000000000611b46565b6001600160a01b038516610e485760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2103ab9b2b960a11b604482015260640161068d565b610e528382612692565b6000610e5e8285612759565b90506000610e6d838689611fef565b9050610e7a838689612abc565b610e9b57610e8d82602001518489612b55565b81515160a001805160010190525b607881602001516020015160ff161115610ef05760405162461bcd60e51b815260206004820152601660248201527514dd1bdc9859d9481b1a5b5a5d08195e18d95959195960521b604482015260640161068d565b602081810180518201805160010160ff1690529087015160400151835151606001805163ffffffff9092169091016001600160601b0316905251610f3990849087908a90612bc1565b600083815260146020908152604080832088845282528083206001600160a01b038b16808552908352908320805460018101808355828652938b01515192909452909183908110610f8c57610f8c614cb7565b90600052602060002090600702016001016000019081610fac9190614dba565b5060208088015181015160008681526014835260408082208a835284528082206001600160a01b038d16835290935291909120805483908110610ff157610ff1614cb7565b906000526020600020906007020160010160010190816110119190614dba565b5060208088015160e0015160008681526014835260408082208a835284528082206001600160a01b038d1683529093529190912080548390811061105757611057614cb7565b906000526020600020906007020160010160050190816110779190614dba565b506020808801516060015160008681526014835260408082208a835284528082206001600160a01b038d168352909352919091208054839081106110bd576110bd614cb7565b906000526020600020906007020160010160030190816110dd9190614dba565b506020808801516040908101516000878152601484528281208a825284528281206001600160a01b038d168252909352912080548390811061112157611121614cb7565b60009182526020808320600792909202909101600301805463ffffffff191663ffffffff949094169390931790925588820151608001518682526014835260408083208a845284528083206001600160a01b038d16845290935291902080548390811061119057611190614cb7565b60009182526020808320600792909202909101600501805467ffffffffffffffff19166001600160401b0394909416939093179092558882015160a001518682526014835260408083208a845284528083206001600160a01b038d16845290935291902080548390811061120657611206614cb7565b60009182526020808320600560079093020191909101805461ffff94909416600160401b0269ffff000000000000000019909416939093179092558882015160c001518682526014835260408083208a845284528083206001600160a01b038d16845290935291902080548390811061128157611281614cb7565b9060005260206000209060070201600101600401600a6101000a8154816001600160401b0302191690836001600160401b0316021790555060005b87515181101561142e576000886000015182815181106112de576112de614cb7565b60209081029190910181015160008881526014835260408082208c835284528082206001600160a01b038f168352909352919091208054919250908490811061132957611329614cb7565b6000918252602080832060079092029091018054600101815582526040805160608101825284518152848301516001600160401b03168184015284820151151581830152898452601483528184208c855283528184206001600160a01b038f1685529092529091208054859081106113a3576113a3614cb7565b906000526020600020906007020160000183815481106113c5576113c5614cb7565b6000918252602090912082516002909202019081906113e49082614dba565b506020820151600191820180546040909401511515600160401b0268ffffffffffffffffff199094166001600160401b0390921691909117929092179091559190910190506112bc565b50602083015183515161144391908690612994565b876001600160a01b03167fe0df5b06e1ab66524ad8b49d46638d970e291a5048eaad107252e763984c3e6985888a60405161148093929190614e78565b60405180910390a2506001979650505050505050565b6000805b825181101561150d5760006114e58483815181106114ba576114ba614cb7565b6020026020010151604080518082019091526000815260208082018390528251920191909120815290565b516000908152600d60205260409020805460ff19811660ff909116151790555060010161149a565b50600192915050565b61151e611cbf565b61152781612c33565b50565b611532611cbf565b610b606000612cfe565b604080518082019091526060815260006020820152600061155b611c22565b606001519050801561157557611572600182614f32565b90505b600061158082611de7565b8051909150806001600160401b0381111561159d5761159d613f26565b6040519080825280602002602001820160405280156115d657816020015b6115c3613df7565b8152602001906001900390816115bb5790505b5084526020840183905260005b8181101561169b57601354600090610100900460ff161561163f5761162f8585848151811061161457611614614cb7565b60200260200101516000015161010001516000015189611fef565b602001516060015161163f575060015b6116738785848151811061165557611655614cb7565b60200260200101516000015161010001516000015187846000612483565b865180518490811061168757611687614cb7565b6020908102919091010152506001016115e3565b50505050919050565b6116ac611cbf565b610b60612d4e565b60006116bf34612d91565b905090565b606060006116d0611c22565b606001519050806000036116e2575090565b6116f56116f0600183614f32565b611de7565b91505090565b3360009081526001602052604090205460ff166117515760405162461bcd60e51b8152602060048201526014602482015273139bdd08185c1c1c9bdd9959081858d8dbdd5b9d60621b604482015260640161068d565b61175c818787612ecc565b60006117688787612759565b80515160400151909150841161179257805151604001805185919061178e908390614f32565b9052505b8051516020015185116117b95780515160200180518691906117b5908390614f32565b9052505b8051515183116117da5780515180518491906117d6908390614f32565b9052505b8051516001600160401b034216608090910152602081015181515161180191908990612994565b50505050505050565b611812611cbf565b61152781600555565b611823611cbf565b63ffffffff8116156115275761183a81603c614f45565b6006805467ffffffffffffffff191663ffffffff9290921691909117905550565b6000611865611cbf565b506013805461ff001981166101009182900460ff1615909102179055600190565b61188e611cbf565b611899816000612f3a565b6040516001600160a01b038216907fdf982251973669f107e8764c0488f080ceca6d72192314e1f94e347378ce4a0190600090a250565b6118d8611cbf565b6118e3816001612f3a565b6040516001600160a01b038216907f19996ea5aede4d14af17b07567999b4c9d512663cfdaa4b01313d0c4af7a6ce790600090a250565b6000611924611cbf565b50600980546001600160a01b0383166001600160a01b03199091161790556001919050565b611951611cbf565b6001600160a01b03166000908152600460205260409020805460ff19811660ff90911615179055565b611982611cbf565b6001600160a01b0381166119ac57604051631e4fbdf760e01b81526000600482015260240161068d565b61152781612cfe565b60006119bf612a91565b6119c833610b8c565b6119e45760405162461bcd60e51b815260040161068d90614cfc565b60008060006119f68587612f8c612fdc565b919450925090508515611aff576008546001600160a01b0316611a465760405162461bcd60e51b8152602060048201526008602482015267546b20656d70747960c01b604482015260640161068d565b600854600954604051630faa7cc560e21b8152600481018990526001600160a01b039182166024820152911690633ea9f314906044016020604051808303816000875af1158015611a9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abf9190614f64565b611aff5760405162461bcd60e51b8152602060048201526011602482015270105b1b1bd8d85d1a5bdb8819985a5b1959607a1b604482015260640161068d565b7f7384e755c7195e3b4189c9d1fe1777168cc7a79d47c98e4172c731cd5d248866838383604051611b3293929190614f81565b60405180910390a150600195945050505050565b8115611c1e573031821115611b905760405162461bcd60e51b815260206004820152601060248201526f125b9cdd59999a58da595b9d0818985b60821b604482015260640161068d565b6000816001600160a01b03168360405160006040518083038185875af1925050503d8060008114611bdd576040519150601f19603f3d011682016040523d82523d6000602084013e611be2565b606091505b5050905080611c1c5760405162461bcd60e51b815260206004820152600660248201526511985a5b195960d21b604482015260640161068d565b505b5050565b604080516080810182526000808252602082018190529181018290526060810191909152506040805160808101825260055481526006546001600160401b038082166020840152600160401b9091041691810191909152600754606082015290565b611c8c613e42565b611c95876130f7565b611ca4878988888888886131a2565b9050611cb4876000015189612692565b979650505050505050565b6000546001600160a01b03163314610b605760405163118cdaa760e01b815233600482015260240161068d565b6060600c805480602002602001604051908101604052809291908181526020016000905b82821015611dde578382906000526020600020906002020160405180604001604052908160008201548152602001600182018054611d4d90614d39565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7990614d39565b8015611dc65780601f10611d9b57610100808354040283529160200191611dc6565b820191906000526020600020905b815481529060010190602001808311611da957829003601f168201915b50505050508152505081526020019060010190611d10565b50505050905090565b6060600f6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611fe45760008481526020908190206040805161016081018252600a86029092018054838301908152600182015460608501526002820154608085015260038201546001600160601b03811660a0860152600160601b90046001600160401b031660c0850152600482015460e085015260058201546001600160a01b0390811661010086015260068301541661012085015282518084019093526007820180548452600883018054959693958795939487946101408801949093909291840191611ee990614d39565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1590614d39565b8015611f625780601f10611f3757610100808354040283529160200191611f62565b820191906000526020600020905b815481529060010190602001808311611f4557829003601f168201915b50505050508152505081525050815260200160098201805480602002602001604051908101604052809291908181526020018280548015611fcc57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611fae575b50505050508152505081526020019060010190611e1c565b505050509050919050565b611ff7613e62565b600084815260146020908152604080832086845282528083206001600160a01b03861684528252808320815181546060948102820185018452928101838152909491938593919285929185015b828210156124325760008481526020808220604080516007870290920180546060948102840185018352918301828152929490938593928592909185015b8282101561217357838290600052602060002090600202016040518060600160405290816000820180546120b590614d39565b80601f01602080910402602001604051908101604052809291908181526020018280546120e190614d39565b801561212e5780601f106121035761010080835404028352916020019161212e565b820191906000526020600020905b81548152906001019060200180831161211157829003601f168201915b50505091835250506001918201546001600160401b038116602080840191909152600160401b90910460ff161515604090920191909152918352929092019101612082565b505050508152602001600182016040518061010001604052908160008201805461219c90614d39565b80601f01602080910402602001604051908101604052809291908181526020018280546121c890614d39565b80156122155780601f106121ea57610100808354040283529160200191612215565b820191906000526020600020905b8154815290600101906020018083116121f857829003601f168201915b5050505050815260200160018201805461222e90614d39565b80601f016020809104026020016040519081016040528092919081815260200182805461225a90614d39565b80156122a75780601f1061227c576101008083540402835291602001916122a7565b820191906000526020600020905b81548152906001019060200180831161228a57829003601f168201915b5050509183525050600282015463ffffffff1660208201526003820180546040909201916122d490614d39565b80601f016020809104026020016040519081016040528092919081815260200182805461230090614d39565b801561234d5780601f106123225761010080835404028352916020019161234d565b820191906000526020600020905b81548152906001019060200180831161233057829003601f168201915b505050918352505060048201546001600160401b03808216602084015261ffff600160401b8304166040840152600160501b90910416606082015260058201805460809092019161239d90614d39565b80601f01602080910402602001604051908101604052809291908181526020018280546123c990614d39565b80156124165780601f106123eb57610100808354040283529160200191612416565b820191906000526020600020905b8154815290600101906020018083116123f957829003601f168201915b5050505050815250508152505081526020019060010190612044565b505050908252506040805160808101825260018401548152600284015460ff908116602083810191909152600386015493830193909352600490940154909316151560608401520152949350505050565b61248b613df7565b811561249b5761249b8585612692565b6001600160a01b0386166000908152600b60209081526040808320878452825280832088845290915290205460ff166126345760006124da8587612759565b5151905060006124eb86888a611fef565b90506000805b82515181101561253657825180518290811061250f5761250f614cb7565b6020026020010151602001516040015163ffffffff168201915080806001019150506124f1565b5060008060006125538961254a578461254d565b60005b8761365b565b919450925090506000600160135460ff16600181111561257557612575614fa0565b146125815760016125c3565b60008b8152600a60205260409020546001600160601b03166001600160401b034216118015906125c357506000876020015111806125c3575060008760400151115b905060008180156125e9575060008411806125de5750600085115b806125e95750600083115b6040805160e08082018352921515815260208101979097528601949094525050606083015293909301516001600160a01b03166080840152505060a0810186905260c0810185905290505b95945050505050565b612645613832565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000828152600d602052604090205460ff166126f05760405162461bcd60e51b815260206004820152601760248201527f43616d706169676e206e6f742072656769737465726564000000000000000000604482015260640161068d565b6000818152600e6020908152604080832085845290915290205460ff16611c1e5760405162461bcd60e51b815260206004820152601c60248201527f43616d706169676e206e6f7420696e2063757272656e74207765656b00000000604482015260640161068d565b612761613eac565b6000838152600e6020908152604080832085845282529182902082518084019093525460ff811615158352610100900463ffffffff168282018190529083015280511561298d57600f6000858152602001908152602001600020816020015163ffffffff16815481106127d6576127d6614cb7565b60009182526020918290206040805161016081018252600a9093029091018054838301908152600182015460608501526002820154608085015260038201546001600160601b03811660a08601526001600160401b03600160601b9091041660c0850152600482015460e085015260058201546001600160a01b039081166101008601526006830154166101208501528251808401909352600782018054845260088301805495969395879593948794610140880194909390929184019161289d90614d39565b80601f01602080910402602001604051908101604052809291908181526020018280546128c990614d39565b80156129165780601f106128eb57610100808354040283529160200191612916565b820191906000526020600020905b8154815290600101906020018083116128f957829003601f168201915b5050505050815250508152505081526020016009820180548060200260200160405190810160405280929190818152602001828054801561298057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612962575b5050509190925250505082525b5092915050565b6000828152600f60205260409020805482919063ffffffff86169081106129bd576129bd614cb7565b60009182526020918290208351600a929092020190815582820151600182015560408301516002820155606083015160038201805460808601516001600160601b039093166001600160a01b031991821617600160601b6001600160401b039094169390930292909217905560a0840151600483015560c084015160058301805483166001600160a01b0392831617905560e0850151600684018054909316911617905561010083015180516007830190815592810151919290916008840190612a879082614dba565b5050505050505050565b600054600160a01b900460ff1615610b605760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b0381166000908152601660209081526040808320858452825280832086845290915281205460ff16612b4b576001600160a01b038216600081815260166020908152604080832087845282528083208884528252808320805460ff1916600190811790915560158352818420948452938252822080549384018155825290200183905561063a565b5060019392505050565b6000828152600f60205260409020805463ffffffff8516908110612b7b57612b7b614cb7565b60009182526020808320600a92909202909101600901805460018101825590835291200180546001600160a01b0319166001600160a01b03929092169190911790555050565b60009384526014602090815260408086209486529381528385206001600160a01b03909316855291825292829020835160018201559083015160028201805460ff90921660ff199283161790559183015160038201556060909201516004909201805492151592909116919091179055565b6001600160a01b03811660009081526004602052604090205460ff1615612c925760405162461bcd60e51b815260206004820152601360248201527210591b5a5b88185b1c9958591e481859191959606a1b604482015260640161068d565b6001600160a01b0381166000908152600460205260409020805460ff1916600190811790915560025490612cc7908290614fb6565b60ff90811660025516600090815260036020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612d56612a91565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126753390565b600080612d9c611c22565b6060015190506000612dac611c22565b5190506000612dba83611de7565b90508115612e075781851015612e075760405162461bcd60e51b815260206004820152601260248201527124b739bab33334b1b4b2b73a103a37b5b2b760711b604482015260640161068d565b612e31857f0000000000000000000000000000000000000000000000000000000000000000611b46565b60008086118015612e43575081518610155b15612e5c5781518681612e5857612e58614fcf565b0490505b3360005b8351811015612ebe576000848281518110612e7d57612e7d614cb7565b60200260200101516000015161010001516000015190506000612ea284868a8561385c565b9050612eb48883868460200151612bc1565b5050600101612e60565b506001979650505050505050565b6001600160a01b0383166000908152600b60209081526040808320858452825280832084845290915290205460ff16611c1c576001600160a01b0383166000908152600b6020908152604080832085845282528083208484529091529020805460ff19166001179055505050565b6001600160a01b038216612f615760405163867915ab60e01b815260040160405180910390fd5b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b612f94613ecc565b829050600080612fb18360e0015184602001518560400151613960565b60208501919091526040840152505080519190910181526001600160401b0342166080820152919050565b60008060606000612feb611c22565b9050426001600160401b031681604001516001600160401b0316106130525760405162461bcd60e51b815260206004820152601760248201527f5472616e736974696f6e20697320696e20667574757265000000000000000000604482015260640161068d565b80606001519350613061611cec565b915061306b613b81565b92506130778785613b9f565b60005b82518110156130ec57600083828151811061309757613097614cb7565b602002602001015160000151905060006130b18783612759565b90506130be878784613c17565b6130e28160200151886130dd8460000151600001518d8d63ffffffff16565b612994565b505060010161307a565b505093509350939050565b80516000908152600d602052604090205460ff166115275780516000908152600d602090815260408220805460ff19166001908117909155600c80549182018155909252825160029092027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c78101928355908301518392917fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c8019061319c9082614dba565b50505050565b6131aa613e42565b6000878152600e602090815260408083208b51845282529182902082518084019093525460ff8116151580845261010090910463ffffffff169183019190915261340f5760018082526000898152600f60208181526040808420805463ffffffff811684890152938352929094018255908252825161012081018452878152908101899052918201879052606082015260808101426001600160401b0316815260200160008152602001886001600160a01b03168152602001846001600160a01b031681526020018a815250600f60008a8152602001908152602001600020826020015163ffffffff16815481106132a4576132a4614cb7565b60009182526020918290208351600a929092020190815582820151600182015560408301516002820155606083015160038201805460808601516001600160601b039093166001600160a01b031991821617600160601b6001600160401b039094169390930292909217905560a0840151600483015560c084015160058301805483166001600160a01b0392831617905560e085015160068401805490931691161790556101008301518051600783019081559281015191929091600884019061336e9082614dba565b50505060008a8152600e602090815260408083208e5184528252909120845181549286015164ffffffffff1990931690151564ffffffff0019161761010063ffffffff90931692909202919091179055505088516133cd908990612759565b6000015191507f7e5566222c32876a37c4f46a32c3530645f8a210462fc0afd712d176268d8ea2826040516134029190614fe5565b60405180910390a161364f565b61341d888a60000151612759565b5180516020018051880190528051805186019052805160c001519092506001600160a01b0388811691161461345f5781516001600160a01b03881660c0909101525b60008511801561347757506001600160a01b03831615155b156135f2576000826000015160e001516001600160a01b0316846001600160a01b0316036134a7575060016134ca565b8251604001516000036134ca575081516001600160a01b03841660e09091015260015b80156135f057856001600160a01b03851663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381865afa15801561352b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061354f9190614d20565b106135f0576001600160a01b0384166323b872dd3360095460405160e084901b6001600160e01b03191681526001600160a01b03928316600482015291166024820152604481018990526064016020604051808303816000875af11580156135bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135df9190614f64565b156135f05782516040018051870190525b505b81516001600160401b0342166080909101526020810151825161361791908a90612994565b7f73ed9dac93997d0aad8785921b99a78c26845d99ba132a409c657482323a550b826040516136469190614fe5565b60405180910390a15b50979650505050505050565b600080600080856001600160401b031685606001516001600160601b0316101561368757613687614ff8565b600085606001516001600160601b03161180156136b0575060e08501516001600160a01b031615155b1561382a578460e001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061371b919061500e565b604086015190915015613753576137508686604001518388606001516001600160601b0316613cf2909392919063ffffffff16565b93505b60208501511561378957613786868660200151601288606001516001600160601b0316613cf2909392919063ffffffff16565b92505b84511561382a57600860009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613807919061500e565b85516060870151919250613827916001600160601b031690889084613cf2565b91505b509250925092565b600054600160a01b900460ff16610b6057604051638dfc202b60e01b815260040160405180910390fd5b613864613e62565b61386f838387611fef565b905083156138f057600854604051630faa7cc560e21b8152600481018690526001600160a01b03878116602483015290911690633ea9f314906044016020604051808303816000875af11580156138ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138ee9190614f64565b505b8060200151606001516139585760208181015160016060918201526040519087901b6bffffffffffffffffffffffff191691810191909152603481018490526054810185905260740160408051601f1981840301815291815281516020928301209183015101525b949350505050565b8181600260008315801590613976575030318411155b15613a225750601354604051606460ff841686020491600091620100009091046001600160a01b03169083908381818185875af1925050503d80600081146139da576040519150601f19603f3d011682016040523d82523d6000602084013e6139df565b606091505b5050905080613a1b5760405162461bcd60e51b8152602060048201526008602482015267150b91985a5b195960c21b604482015260640161068d565b8185039450505b600083118015613a9a57506040516370a0823160e01b815230600482015283906001600160a01b038916906370a0823190602401602060405180830381865afa158015613a73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a979190614d20565b10155b15613b775750606460ff82168302046001600160a01b03871615613b715760135460405163a9059cbb60e01b8152620100009091046001600160a01b0390811660048301526024820183905288169063a9059cbb906044016020604051808303816000875af1158015613b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b359190614f64565b613b715760405162461bcd60e51b815260206004820152600d60248201526c115490cc8c081511985a5b1959609a1b604482015260640161068d565b80830392505b5050935093915050565b6007805460009182613b9283614ce3565b9091555050600754919050565b63ffffffff821615611c1e57600680544263ffffffff603c8602169081016001600160401b038116600160401b81026fffffffffffffffffffffffffffffffff199094168317939093179093556000848152600a6020526040902080546bffffffffffffffffffffffff19169092179091559061319c565b613c1f613eac565b8315613cb7576000613c32600186614f32565b9050613c3e8184612759565b80515161010081015160c082015160208301516040840151845160e090950151959750613c6d958a9590611c84565b508151516000604090910181905282515160200181905282515152428251516001600160401b039091166080909101526020820151825151613cb191908390612994565b5061319c565b613cc18483612759565b80515161010081015160c082015160e090920151929350613ceb9286929060009081908190611c84565b5050505050565b60006001600160601b0385161580613d1157506001600160401b038416155b80613d1a575082155b15613d2757506000613958565b836001600160401b0316856001600160601b03161015613d7d5760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081c1c9a5b98da5c185b607a1b604482015260640161068d565b60ff8216600a0a80846001600160601b0388166001600160401b038816830281613da957613da9614fcf565b040281613db857613db8614fcf565b049695505050505050565b6040518060800160405280613dd6613df7565b8152602001613de3613e62565b815260006020820181905260409091015290565b6040518060e0016040528060001515815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160008019168152602001600081525090565b6040518060400160405280613e55613ecc565b8152602001606081525090565b604051806040016040528060608152602001613ea7604051806080016040528060008152602001600060ff168152602001600080191681526020016000151581525090565b905290565b6040518060400160405280613ebf613e42565b8152600060209091015290565b60408051610120810182526000808252602080830182905282840182905260608084018390526080840183905260a0840183905260c0840183905260e0840183905284518086019095529184528301529061010082015290565b634e487b7160e01b600052604160045260246000fd5b60405161010081016001600160401b0381118282101715613f5f57613f5f613f26565b60405290565b604080519081016001600160401b0381118282101715613f5f57613f5f613f26565b604051606081016001600160401b0381118282101715613f5f57613f5f613f26565b604051601f8201601f191681016001600160401b0381118282101715613fd157613fd1613f26565b604052919050565b600082601f830112613fea57600080fd5b81356001600160401b0381111561400357614003613f26565b614016601f8201601f1916602001613fa9565b81815284602083860101111561402b57600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160a01b03811681146106b557600080fd5b60008060006060848603121561407457600080fd5b83356001600160401b0381111561408a57600080fd5b61409686828701613fd9565b935050602084013591506140ac60408501614048565b90509250925092565b6000602082840312156140c757600080fd5b61063a82614048565b602080825282518282018190526000918401906040840190835b8181101561411f57835180516001600160a01b03168452602090810151151581850152909301926040909201916001016140ea565b509095945050505050565b60008060006060848603121561413f57600080fd5b61414884614048565b95602085013595506040909401359392505050565b6000815180845260005b8181101561418357602081850181015186830182015201614167565b506000602082860101526020601f19601f83011685010191505092915050565b805182526000602082015160406020850152613958604085018261415d565b600081518084526020840193506020830160005b828110156141fd5781516001600160a01b03168652602095860195909101906001016141d6565b5093949350505050565b6000815160408452805160408501526020810151606085015260408101516080850152606081015161424460a08601826001600160601b03169052565b5060808101516001600160401b03811660c08601525060a081015160e085015260c08101516001600160a01b0381166101008601525060e08101516001600160a01b0381166101208601525061010001516101206101408501526142ac6101608501826141a3565b90506020830151848203602086015261263482826141c2565b600082825180855260208501945060208160051b8301016020850160005b8381101561431557601f198584030188526142ff838351614207565b60209889019890935091909101906001016142e3565b50909695505050505050565b600082825180855260208501945060208160051b8301016020850160005b8381101561431557601f1985840301885281518051845260208101516060602086015261436f60608601826142c5565b6040928301516001600160601b03169590920194909452602098890198909350919091019060010161433f565b600082825180855260208501945060208160051b8301016020850160005b8381101561431557601f198584030188526143d68383516141a3565b60209889019890935091909101906001016143ba565b8051151582526020808201519083015260408082015190830152606080820151908301526080808201516001600160a01b03169083015260a0808201519083015260c090810151910152565b60008151610100845261444f61010085018261415d565b905060208301518482036020860152614468828261415d565b9150506040830151614482604086018263ffffffff169052565b506060830151848203606086015261449a828261415d565b91505060808301516144b760808601826001600160401b03169052565b5060a08301516144cd60a086018261ffff169052565b5060c08301516144e860c08601826001600160401b03169052565b5060e083015184820360e0860152612634828261415d565b600082825180855260208501945060208160051b8301016020850160005b8381101561431557601f19858403018852815180518452602090810151604082860181905281519086018190529101906060600582901b86018101919086019060005b818110156146ec57605f19888503018352845161457f8582516143ec565b602081015161014060e08701526101e08601815160a06101408901528181518084526102008a0191506102008160051b8b0101935060208301925060005b81811015614687576101ff198b860301835283518051604080885281519088018190526060600582901b8901810192602001919089019060005b8181101561465357605f198b8603018352835180516060875261461d606088018261415d565b6020838101516001600160401b0316898201526040938401511515939098019290925250949384019392909201916001016145f7565b505050506020820151915086810360208801526146708183614438565b9650505060209384019392909201916001016145bd565b5050505060209182015180516101608901528083015160ff166101808901526040808201516101a08a015260609182015115156101c08a0152840151151561010089015292909201516101209096019590955294840194939290920191600101614561565b5050506020998a019990945092909201915060010161451e565b6020815260008251805160208401526001600160401b0360208201511660408401526001600160401b0360408201511660608401526060810151608084015250602083015160e060a0840152614760610100840182614321565b90506040840151601f198483030160c085015261477d828261439c565b9150506060840151601f198483030160e08501526126348282614500565b6000806000606084860312156147b057600080fd5b505081359360208301359350604090920135919050565b60006001600160401b038211156147e0576147e0613f26565b5060051b60200190565b80356001600160401b03811681146106b557600080fd5b801515811461152757600080fd5b803563ffffffff811681146106b557600080fd5b803561ffff811681146106b557600080fd5b6000610100828403121561484857600080fd5b614850613f3c565b905081356001600160401b0381111561486857600080fd5b61487484828501613fd9565b82525060208201356001600160401b0381111561489057600080fd5b61489c84828501613fd9565b6020830152506148ae6040830161480f565b604082015260608201356001600160401b038111156148cc57600080fd5b6148d884828501613fd9565b6060830152506148ea608083016147ea565b60808201526148fb60a08301614823565b60a082015261490c60c083016147ea565b60c082015260e08201356001600160401b0381111561492a57600080fd5b61493684828501613fd9565b60e08301525092915050565b60008060006060848603121561495757600080fd5b61496084614048565b925060208401356001600160401b0381111561497b57600080fd5b84016040818703121561498d57600080fd5b614995613f65565b81356001600160401b038111156149ab57600080fd5b8201601f810188136149bc57600080fd5b80356149cf6149ca826147c7565b613fa9565b8082825260208201915060208360051b85010192508a8311156149f157600080fd5b602084015b83811015614a945780356001600160401b03811115614a1457600080fd5b85016060818e03601f19011215614a2a57600080fd5b614a32613f87565b60208201356001600160401b03811115614a4b57600080fd5b614a5a8f602083860101613fd9565b825250614a69604083016147ea565b602082015260608201359150614a7e82614801565b60408101919091528352602092830192016149f6565b50845250505060208201356001600160401b03811115614ab357600080fd5b614abf88828501614835565b60208301525093969395505050506040919091013590565b600060208284031215614ae957600080fd5b81356001600160401b03811115614aff57600080fd5b8201601f81018413614b1057600080fd5b8035614b1e6149ca826147c7565b8082825260208201915060208360051b850101925086831115614b4057600080fd5b602084015b83811015614b815780356001600160401b03811115614b6357600080fd5b614b7289602083890101613fd9565b84525060209283019201614b45565b509695505050505050565b602080825282516040838301528051606084018190526000929190910190829060808501905b80831015614bdc57614bc58285516143ec565b60e082019150602084019350600183019250614bb2565b506020860151604086015280935050505092915050565b60208152600061063a60208301846142c5565b60008060008060008060c08789031215614c1f57600080fd5b8635955060208701359450604087013593506060870135925060808701359150614c4b60a08801614048565b90509295509295509295565b600060208284031215614c6957600080fd5b5035919050565b600060208284031215614c8257600080fd5b61063a8261480f565b60008060408385031215614c9e57600080fd5b82359150614cae6020840161480f565b90509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201614cf557614cf5614ccd565b5060010190565b6020808252600a908201526927b7363c9030b236b4b760b11b604082015260600190565b600060208284031215614d3257600080fd5b5051919050565b600181811c90821680614d4d57607f821691505b602082108103614d6d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611c1c57806000526020600020601f840160051c81016020851015614d9a5750805b601f840160051c820191505b81811015613ceb5760008155600101614da6565b81516001600160401b03811115614dd357614dd3613f26565b614de781614de18454614d39565b84614d73565b6020601f821160018114614e1b5760008315614e035750848201515b600019600385901b1c1916600184901b178455613ceb565b600084815260208120601f198516915b82811015614e4b5787850151825560209485019460019092019101614e2b565b5084821015614e695786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b83815282602082015260606040820152600060a0820183516040606085015281815180845260c08601915060c08160051b870101935060208301925060005b81811015614f135760bf198786030183528351805160608752614edd606088018261415d565b6020838101516001600160401b031689820152604093840151151593909801929092525094938401939290920191600101614eb7565b505050506020840151838203605f19016080850152611cb48282614438565b81810381811115610b7f57610b7f614ccd565b63ffffffff818116838216029081169081811461298d5761298d614ccd565b600060208284031215614f7657600080fd5b815161063a81614801565b838152826020820152606060408201526000612634606083018461439c565b634e487b7160e01b600052602160045260246000fd5b60ff8181168382160190811115610b7f57610b7f614ccd565b634e487b7160e01b600052601260045260246000fd5b60208152600061063a6020830184614207565b634e487b7160e01b600052600160045260246000fd5b60006020828403121561502057600080fd5b815160ff8116811461063a57600080fdfea2646970667358221220cd2551b841c7ab2ee101bcd93b958a38c0e1e9919a092d487496632d04dbc0da64736f6c634300081c003300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000378bc6636445edf805cc7730cd7b8953037e3f8100000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000c0f6ef6c8a58fb431015d4d2d7e0925718eac010000000000000000000000000d7c271d20c9e323336bfc843aeb8dec23b346352000000000000000000000000a1f70ffa4322e3609dd905b41f17bf3913366bc1000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003e00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000008736f6c696469747900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057761676d69000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000772656163746a730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086574686572736a73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6a61766173637269707400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a74797065736372697074000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007686172646861740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096661726361737465720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000373646b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046465666900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000463656c6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001173656c662d70726f746f636f6c2d73646b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e63727970746f63757272656e6379000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101dc5760003560e01c80638456cb5911610102578063b029d68e11610095578063c8559a9e11610064578063c8559a9e14610563578063e4f6da1b14610583578063f2fde38b146105a2578063fe1db20b146105c257600080fd5b8063b029d68e146104ee578063b5252f9b14610503578063b85a35d214610523578063bb3790871461054357600080fd5b80639db412d0116100d15780639db412d0146104705780639ed374f7146104905780639f2032e4146104ae578063a75ec94e146104ce57600080fd5b80638456cb59146104135780638da5cb5b146104285780638fa4fdfd14610446578063958420271461044e57600080fd5b80634b6b0a611161017a5780635c975abb116101495780635c975abb14610392578063704b6c02146103b1578063715018a6146103d15780637723bafb146103e657600080fd5b80634b6b0a61146103075780634b7739c9146103275780634e71d92d1461033a5780635895668c1461037257600080fd5b8063373a5d79116101b6578063373a5d791461025257806338266b22146102a35780633f4ba83a146102d05780633fd8cc4e146102e757600080fd5b806308ddc0ae146101e8578063144fa6d71461021057806331ae450b1461023057600080fd5b366101e357005b600080fd5b6101fb6101f636600461405f565b6105e2565b60405190151581526020015b60405180910390f35b34801561021c57600080fd5b506101fb61022b3660046140b5565b610641565b34801561023c57600080fd5b506102456106ba565b60405161020791906140d0565b34801561025e57600080fd5b506101fb61026d36600461412a565b6001600160a01b0383166000908152600b60209081526040808320858452825280832084845290915290205460ff169392505050565b3480156102af57600080fd5b506102c36102be3660046140b5565b6107b1565b6040516102079190614706565b3480156102dc57600080fd5b506102e5610b50565b005b3480156102f357600080fd5b506101fb6103023660046140b5565b610b62565b34801561031357600080fd5b506101fb61032236600461479b565b610b85565b6101fb610335366004614942565b610d9a565b34801561034657600080fd5b5060095461035a906001600160a01b031681565b6040516001600160a01b039091168152602001610207565b34801561037e57600080fd5b506101fb61038d366004614ad7565b611496565b34801561039e57600080fd5b50600054600160a01b900460ff166101fb565b3480156103bd57600080fd5b506102e56103cc3660046140b5565b611516565b3480156103dd57600080fd5b506102e561152a565b3480156103f257600080fd5b506104066104013660046140b5565b61153c565b6040516102079190614b8c565b34801561041f57600080fd5b506102e56116a4565b34801561043457600080fd5b506000546001600160a01b031661035a565b6101fb6116b4565b34801561045a57600080fd5b506104636116c4565b6040516102079190614bf3565b34801561047c57600080fd5b506102e561048b366004614c06565b6116fb565b34801561049c57600080fd5b506008546001600160a01b031661035a565b3480156104ba57600080fd5b506102e56104c9366004614c57565b61180a565b3480156104da57600080fd5b506102e56104e9366004614c70565b61181b565b3480156104fa57600080fd5b506101fb61185b565b34801561050f57600080fd5b506102e561051e3660046140b5565b611886565b34801561052f57600080fd5b506102e561053e3660046140b5565b6118d0565b34801561054f57600080fd5b506101fb61055e3660046140b5565b61191a565b34801561056f57600080fd5b506102e561057e3660046140b5565b611949565b34801561058f57600080fd5b506013546101fb90610100900460ff1681565b3480156105ae57600080fd5b506102e56105bd3660046140b5565b61197a565b3480156105ce57600080fd5b506101fb6105dd366004614c8b565b6119b5565b6009546000906105fc9034906001600160a01b0316611b46565b610634610607611c22565b60600151604080518082019091526000815260208082018890528751908801208152333487600088611c84565b50600190505b9392505050565b600061064b611cbf565b6001600160a01b0382166106965760405162461bcd60e51b815260206004820152600d60248201526c546f6b656e206973207a65726f60981b60448201526064015b60405180910390fd5b50600880546001600160a01b0319166001600160a01b03831617905560015b919050565b60025460609060ff81166000036106cf575090565b8060ff166001600160401b038111156106ea576106ea613f26565b60405190808252806020026020018201604052801561072f57816020015b60408051808201909152600080825260208201528152602001906001900390816107085790505b50915060005b8160ff168160ff1610156107ac5760ff808216600081815260036020908152604080832054815180830183526001600160a01b03909116808252808552600484529190932054909416151590820152855190918691811061079857610798614cb7565b602090810291909101015250600101610735565b505090565b6107fc60408051610100810190915260006080820181815260a0830182905260c0830182905260e0830191909152819081526020016060815260200160608152602001606081525090565b610804611c22565b815261080e611cec565b60408201528051606001518061082381614ce3565b915050806001600160401b0381111561083e5761083e613f26565b60405190808252806020026020018201604052801561089c57816020015b6108896040518060600160405280600081526020016060815260200160006001600160601b031681525090565b81526020019060019003908161085c5790505b506020830152806001600160401b038111156108ba576108ba613f26565b60405190808252806020026020018201604052801561090057816020015b6040805180820190915260008152606060208201528152602001906001900390816108d85790505b50606083015260408201515160005b82811015610b485761092081611de7565b8460200151828151811061093657610936614cb7565b602002602001015160200181905250610964816000908152600a60205260409020546001600160601b031690565b8460200151828151811061097a5761097a614cb7565b6020026020010151604001906001600160601b031690816001600160601b0316815250506000826001600160401b038111156109b8576109b8613f26565b6040519080825280602002602001820160405280156109f157816020015b6109de613dc3565b8152602001906001900390816109d65790505b5090506001600160a01b03861615610b3f578185606001518381518110610a1a57610a1a614cb7565b60209081029190910101515260005b83811015610b1757600086604001518281518110610a4957610a49614cb7565b60200260200101516000015190506000601360019054906101000a900460ff1615610a8957610a7985838b611fef565b6020015160600151610a89575060015b6040518060800160405280610aa28b8589866000612483565b8152602001610ab287858d611fef565b81526001600160a01b038b166000908152600b602090815260408083208a845282528083208784528252918290205460ff16151590830152018390528451859085908110610b0257610b02614cb7565b60209081029190910101525050600101610a29565b508085606001518381518110610b2f57610b2f614cb7565b6020026020010151602001819052505b5060010161090f565b505050919050565b610b58611cbf565b610b6061263d565b565b6001600160a01b03811660009081526001602052604081205460ff165b92915050565b6000610baa335b6001600160a01b031660009081526004602052604090205460ff1690565b610bc65760405162461bcd60e51b815260040161068d90614cfc565b6000610bd0611c22565b606001519050610be08582612692565b6000610bec8287612759565b80515160e001519091506001600160a01b0316610c3b5760405162461bcd60e51b815260206004820152600d60248201526c546f6b656e206973207a65726f60981b604482015260640161068d565b80515160e001516009546040516370a0823160e01b81526001600160a01b039182166004820152879291909116906370a0823190602401602060405180830381865afa158015610c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb39190614d20565b1015610cf95760405162461bcd60e51b8152602060048201526015602482015274115490cc8c10985b081a5b98dbdb9cda5cdd195b9d605a1b604482015260640161068d565b6009546001600160a01b031631841115610d555760405162461bcd60e51b815260206004820152601960248201527f4e65772076616c756520657863656564732062616c616e636500000000000000604482015260640161068d565b80515160400185905280515160209081018590528151516001600160401b034216608090910152810151815151610d8e91908490612994565b50600195945050505050565b6000610da533610b8c565b610dc15760405162461bcd60e51b815260040161068d90614cfc565b610dc9612a91565b6000610dd3611c22565b606001519050610e03347f000000000000000000000000378bc6636445edf805cc7730cd7b8953037e3f81611b46565b6001600160a01b038516610e485760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2103ab9b2b960a11b604482015260640161068d565b610e528382612692565b6000610e5e8285612759565b90506000610e6d838689611fef565b9050610e7a838689612abc565b610e9b57610e8d82602001518489612b55565b81515160a001805160010190525b607881602001516020015160ff161115610ef05760405162461bcd60e51b815260206004820152601660248201527514dd1bdc9859d9481b1a5b5a5d08195e18d95959195960521b604482015260640161068d565b602081810180518201805160010160ff1690529087015160400151835151606001805163ffffffff9092169091016001600160601b0316905251610f3990849087908a90612bc1565b600083815260146020908152604080832088845282528083206001600160a01b038b16808552908352908320805460018101808355828652938b01515192909452909183908110610f8c57610f8c614cb7565b90600052602060002090600702016001016000019081610fac9190614dba565b5060208088015181015160008681526014835260408082208a835284528082206001600160a01b038d16835290935291909120805483908110610ff157610ff1614cb7565b906000526020600020906007020160010160010190816110119190614dba565b5060208088015160e0015160008681526014835260408082208a835284528082206001600160a01b038d1683529093529190912080548390811061105757611057614cb7565b906000526020600020906007020160010160050190816110779190614dba565b506020808801516060015160008681526014835260408082208a835284528082206001600160a01b038d168352909352919091208054839081106110bd576110bd614cb7565b906000526020600020906007020160010160030190816110dd9190614dba565b506020808801516040908101516000878152601484528281208a825284528281206001600160a01b038d168252909352912080548390811061112157611121614cb7565b60009182526020808320600792909202909101600301805463ffffffff191663ffffffff949094169390931790925588820151608001518682526014835260408083208a845284528083206001600160a01b038d16845290935291902080548390811061119057611190614cb7565b60009182526020808320600792909202909101600501805467ffffffffffffffff19166001600160401b0394909416939093179092558882015160a001518682526014835260408083208a845284528083206001600160a01b038d16845290935291902080548390811061120657611206614cb7565b60009182526020808320600560079093020191909101805461ffff94909416600160401b0269ffff000000000000000019909416939093179092558882015160c001518682526014835260408083208a845284528083206001600160a01b038d16845290935291902080548390811061128157611281614cb7565b9060005260206000209060070201600101600401600a6101000a8154816001600160401b0302191690836001600160401b0316021790555060005b87515181101561142e576000886000015182815181106112de576112de614cb7565b60209081029190910181015160008881526014835260408082208c835284528082206001600160a01b038f168352909352919091208054919250908490811061132957611329614cb7565b6000918252602080832060079092029091018054600101815582526040805160608101825284518152848301516001600160401b03168184015284820151151581830152898452601483528184208c855283528184206001600160a01b038f1685529092529091208054859081106113a3576113a3614cb7565b906000526020600020906007020160000183815481106113c5576113c5614cb7565b6000918252602090912082516002909202019081906113e49082614dba565b506020820151600191820180546040909401511515600160401b0268ffffffffffffffffff199094166001600160401b0390921691909117929092179091559190910190506112bc565b50602083015183515161144391908690612994565b876001600160a01b03167fe0df5b06e1ab66524ad8b49d46638d970e291a5048eaad107252e763984c3e6985888a60405161148093929190614e78565b60405180910390a2506001979650505050505050565b6000805b825181101561150d5760006114e58483815181106114ba576114ba614cb7565b6020026020010151604080518082019091526000815260208082018390528251920191909120815290565b516000908152600d60205260409020805460ff19811660ff909116151790555060010161149a565b50600192915050565b61151e611cbf565b61152781612c33565b50565b611532611cbf565b610b606000612cfe565b604080518082019091526060815260006020820152600061155b611c22565b606001519050801561157557611572600182614f32565b90505b600061158082611de7565b8051909150806001600160401b0381111561159d5761159d613f26565b6040519080825280602002602001820160405280156115d657816020015b6115c3613df7565b8152602001906001900390816115bb5790505b5084526020840183905260005b8181101561169b57601354600090610100900460ff161561163f5761162f8585848151811061161457611614614cb7565b60200260200101516000015161010001516000015189611fef565b602001516060015161163f575060015b6116738785848151811061165557611655614cb7565b60200260200101516000015161010001516000015187846000612483565b865180518490811061168757611687614cb7565b6020908102919091010152506001016115e3565b50505050919050565b6116ac611cbf565b610b60612d4e565b60006116bf34612d91565b905090565b606060006116d0611c22565b606001519050806000036116e2575090565b6116f56116f0600183614f32565b611de7565b91505090565b3360009081526001602052604090205460ff166117515760405162461bcd60e51b8152602060048201526014602482015273139bdd08185c1c1c9bdd9959081858d8dbdd5b9d60621b604482015260640161068d565b61175c818787612ecc565b60006117688787612759565b80515160400151909150841161179257805151604001805185919061178e908390614f32565b9052505b8051516020015185116117b95780515160200180518691906117b5908390614f32565b9052505b8051515183116117da5780515180518491906117d6908390614f32565b9052505b8051516001600160401b034216608090910152602081015181515161180191908990612994565b50505050505050565b611812611cbf565b61152781600555565b611823611cbf565b63ffffffff8116156115275761183a81603c614f45565b6006805467ffffffffffffffff191663ffffffff9290921691909117905550565b6000611865611cbf565b506013805461ff001981166101009182900460ff1615909102179055600190565b61188e611cbf565b611899816000612f3a565b6040516001600160a01b038216907fdf982251973669f107e8764c0488f080ceca6d72192314e1f94e347378ce4a0190600090a250565b6118d8611cbf565b6118e3816001612f3a565b6040516001600160a01b038216907f19996ea5aede4d14af17b07567999b4c9d512663cfdaa4b01313d0c4af7a6ce790600090a250565b6000611924611cbf565b50600980546001600160a01b0383166001600160a01b03199091161790556001919050565b611951611cbf565b6001600160a01b03166000908152600460205260409020805460ff19811660ff90911615179055565b611982611cbf565b6001600160a01b0381166119ac57604051631e4fbdf760e01b81526000600482015260240161068d565b61152781612cfe565b60006119bf612a91565b6119c833610b8c565b6119e45760405162461bcd60e51b815260040161068d90614cfc565b60008060006119f68587612f8c612fdc565b919450925090508515611aff576008546001600160a01b0316611a465760405162461bcd60e51b8152602060048201526008602482015267546b20656d70747960c01b604482015260640161068d565b600854600954604051630faa7cc560e21b8152600481018990526001600160a01b039182166024820152911690633ea9f314906044016020604051808303816000875af1158015611a9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abf9190614f64565b611aff5760405162461bcd60e51b8152602060048201526011602482015270105b1b1bd8d85d1a5bdb8819985a5b1959607a1b604482015260640161068d565b7f7384e755c7195e3b4189c9d1fe1777168cc7a79d47c98e4172c731cd5d248866838383604051611b3293929190614f81565b60405180910390a150600195945050505050565b8115611c1e573031821115611b905760405162461bcd60e51b815260206004820152601060248201526f125b9cdd59999a58da595b9d0818985b60821b604482015260640161068d565b6000816001600160a01b03168360405160006040518083038185875af1925050503d8060008114611bdd576040519150601f19603f3d011682016040523d82523d6000602084013e611be2565b606091505b5050905080611c1c5760405162461bcd60e51b815260206004820152600660248201526511985a5b195960d21b604482015260640161068d565b505b5050565b604080516080810182526000808252602082018190529181018290526060810191909152506040805160808101825260055481526006546001600160401b038082166020840152600160401b9091041691810191909152600754606082015290565b611c8c613e42565b611c95876130f7565b611ca4878988888888886131a2565b9050611cb4876000015189612692565b979650505050505050565b6000546001600160a01b03163314610b605760405163118cdaa760e01b815233600482015260240161068d565b6060600c805480602002602001604051908101604052809291908181526020016000905b82821015611dde578382906000526020600020906002020160405180604001604052908160008201548152602001600182018054611d4d90614d39565b80601f0160208091040260200160405190810160405280929190818152602001828054611d7990614d39565b8015611dc65780601f10611d9b57610100808354040283529160200191611dc6565b820191906000526020600020905b815481529060010190602001808311611da957829003601f168201915b50505050508152505081526020019060010190611d10565b50505050905090565b6060600f6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611fe45760008481526020908190206040805161016081018252600a86029092018054838301908152600182015460608501526002820154608085015260038201546001600160601b03811660a0860152600160601b90046001600160401b031660c0850152600482015460e085015260058201546001600160a01b0390811661010086015260068301541661012085015282518084019093526007820180548452600883018054959693958795939487946101408801949093909291840191611ee990614d39565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1590614d39565b8015611f625780601f10611f3757610100808354040283529160200191611f62565b820191906000526020600020905b815481529060010190602001808311611f4557829003601f168201915b50505050508152505081525050815260200160098201805480602002602001604051908101604052809291908181526020018280548015611fcc57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611fae575b50505050508152505081526020019060010190611e1c565b505050509050919050565b611ff7613e62565b600084815260146020908152604080832086845282528083206001600160a01b03861684528252808320815181546060948102820185018452928101838152909491938593919285929185015b828210156124325760008481526020808220604080516007870290920180546060948102840185018352918301828152929490938593928592909185015b8282101561217357838290600052602060002090600202016040518060600160405290816000820180546120b590614d39565b80601f01602080910402602001604051908101604052809291908181526020018280546120e190614d39565b801561212e5780601f106121035761010080835404028352916020019161212e565b820191906000526020600020905b81548152906001019060200180831161211157829003601f168201915b50505091835250506001918201546001600160401b038116602080840191909152600160401b90910460ff161515604090920191909152918352929092019101612082565b505050508152602001600182016040518061010001604052908160008201805461219c90614d39565b80601f01602080910402602001604051908101604052809291908181526020018280546121c890614d39565b80156122155780601f106121ea57610100808354040283529160200191612215565b820191906000526020600020905b8154815290600101906020018083116121f857829003601f168201915b5050505050815260200160018201805461222e90614d39565b80601f016020809104026020016040519081016040528092919081815260200182805461225a90614d39565b80156122a75780601f1061227c576101008083540402835291602001916122a7565b820191906000526020600020905b81548152906001019060200180831161228a57829003601f168201915b5050509183525050600282015463ffffffff1660208201526003820180546040909201916122d490614d39565b80601f016020809104026020016040519081016040528092919081815260200182805461230090614d39565b801561234d5780601f106123225761010080835404028352916020019161234d565b820191906000526020600020905b81548152906001019060200180831161233057829003601f168201915b505050918352505060048201546001600160401b03808216602084015261ffff600160401b8304166040840152600160501b90910416606082015260058201805460809092019161239d90614d39565b80601f01602080910402602001604051908101604052809291908181526020018280546123c990614d39565b80156124165780601f106123eb57610100808354040283529160200191612416565b820191906000526020600020905b8154815290600101906020018083116123f957829003601f168201915b5050505050815250508152505081526020019060010190612044565b505050908252506040805160808101825260018401548152600284015460ff908116602083810191909152600386015493830193909352600490940154909316151560608401520152949350505050565b61248b613df7565b811561249b5761249b8585612692565b6001600160a01b0386166000908152600b60209081526040808320878452825280832088845290915290205460ff166126345760006124da8587612759565b5151905060006124eb86888a611fef565b90506000805b82515181101561253657825180518290811061250f5761250f614cb7565b6020026020010151602001516040015163ffffffff168201915080806001019150506124f1565b5060008060006125538961254a578461254d565b60005b8761365b565b919450925090506000600160135460ff16600181111561257557612575614fa0565b146125815760016125c3565b60008b8152600a60205260409020546001600160601b03166001600160401b034216118015906125c357506000876020015111806125c3575060008760400151115b905060008180156125e9575060008411806125de5750600085115b806125e95750600083115b6040805160e08082018352921515815260208101979097528601949094525050606083015293909301516001600160a01b03166080840152505060a0810186905260c0810185905290505b95945050505050565b612645613832565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000828152600d602052604090205460ff166126f05760405162461bcd60e51b815260206004820152601760248201527f43616d706169676e206e6f742072656769737465726564000000000000000000604482015260640161068d565b6000818152600e6020908152604080832085845290915290205460ff16611c1e5760405162461bcd60e51b815260206004820152601c60248201527f43616d706169676e206e6f7420696e2063757272656e74207765656b00000000604482015260640161068d565b612761613eac565b6000838152600e6020908152604080832085845282529182902082518084019093525460ff811615158352610100900463ffffffff168282018190529083015280511561298d57600f6000858152602001908152602001600020816020015163ffffffff16815481106127d6576127d6614cb7565b60009182526020918290206040805161016081018252600a9093029091018054838301908152600182015460608501526002820154608085015260038201546001600160601b03811660a08601526001600160401b03600160601b9091041660c0850152600482015460e085015260058201546001600160a01b039081166101008601526006830154166101208501528251808401909352600782018054845260088301805495969395879593948794610140880194909390929184019161289d90614d39565b80601f01602080910402602001604051908101604052809291908181526020018280546128c990614d39565b80156129165780601f106128eb57610100808354040283529160200191612916565b820191906000526020600020905b8154815290600101906020018083116128f957829003601f168201915b5050505050815250508152505081526020016009820180548060200260200160405190810160405280929190818152602001828054801561298057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612962575b5050509190925250505082525b5092915050565b6000828152600f60205260409020805482919063ffffffff86169081106129bd576129bd614cb7565b60009182526020918290208351600a929092020190815582820151600182015560408301516002820155606083015160038201805460808601516001600160601b039093166001600160a01b031991821617600160601b6001600160401b039094169390930292909217905560a0840151600483015560c084015160058301805483166001600160a01b0392831617905560e0850151600684018054909316911617905561010083015180516007830190815592810151919290916008840190612a879082614dba565b5050505050505050565b600054600160a01b900460ff1615610b605760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b0381166000908152601660209081526040808320858452825280832086845290915281205460ff16612b4b576001600160a01b038216600081815260166020908152604080832087845282528083208884528252808320805460ff1916600190811790915560158352818420948452938252822080549384018155825290200183905561063a565b5060019392505050565b6000828152600f60205260409020805463ffffffff8516908110612b7b57612b7b614cb7565b60009182526020808320600a92909202909101600901805460018101825590835291200180546001600160a01b0319166001600160a01b03929092169190911790555050565b60009384526014602090815260408086209486529381528385206001600160a01b03909316855291825292829020835160018201559083015160028201805460ff90921660ff199283161790559183015160038201556060909201516004909201805492151592909116919091179055565b6001600160a01b03811660009081526004602052604090205460ff1615612c925760405162461bcd60e51b815260206004820152601360248201527210591b5a5b88185b1c9958591e481859191959606a1b604482015260640161068d565b6001600160a01b0381166000908152600460205260409020805460ff1916600190811790915560025490612cc7908290614fb6565b60ff90811660025516600090815260036020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612d56612a91565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126753390565b600080612d9c611c22565b6060015190506000612dac611c22565b5190506000612dba83611de7565b90508115612e075781851015612e075760405162461bcd60e51b815260206004820152601260248201527124b739bab33334b1b4b2b73a103a37b5b2b760711b604482015260640161068d565b612e31857f000000000000000000000000378bc6636445edf805cc7730cd7b8953037e3f81611b46565b60008086118015612e43575081518610155b15612e5c5781518681612e5857612e58614fcf565b0490505b3360005b8351811015612ebe576000848281518110612e7d57612e7d614cb7565b60200260200101516000015161010001516000015190506000612ea284868a8561385c565b9050612eb48883868460200151612bc1565b5050600101612e60565b506001979650505050505050565b6001600160a01b0383166000908152600b60209081526040808320858452825280832084845290915290205460ff16611c1c576001600160a01b0383166000908152600b6020908152604080832085845282528083208484529091529020805460ff19166001179055505050565b6001600160a01b038216612f615760405163867915ab60e01b815260040160405180910390fd5b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b612f94613ecc565b829050600080612fb18360e0015184602001518560400151613960565b60208501919091526040840152505080519190910181526001600160401b0342166080820152919050565b60008060606000612feb611c22565b9050426001600160401b031681604001516001600160401b0316106130525760405162461bcd60e51b815260206004820152601760248201527f5472616e736974696f6e20697320696e20667574757265000000000000000000604482015260640161068d565b80606001519350613061611cec565b915061306b613b81565b92506130778785613b9f565b60005b82518110156130ec57600083828151811061309757613097614cb7565b602002602001015160000151905060006130b18783612759565b90506130be878784613c17565b6130e28160200151886130dd8460000151600001518d8d63ffffffff16565b612994565b505060010161307a565b505093509350939050565b80516000908152600d602052604090205460ff166115275780516000908152600d602090815260408220805460ff19166001908117909155600c80549182018155909252825160029092027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c78101928355908301518392917fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c8019061319c9082614dba565b50505050565b6131aa613e42565b6000878152600e602090815260408083208b51845282529182902082518084019093525460ff8116151580845261010090910463ffffffff169183019190915261340f5760018082526000898152600f60208181526040808420805463ffffffff811684890152938352929094018255908252825161012081018452878152908101899052918201879052606082015260808101426001600160401b0316815260200160008152602001886001600160a01b03168152602001846001600160a01b031681526020018a815250600f60008a8152602001908152602001600020826020015163ffffffff16815481106132a4576132a4614cb7565b60009182526020918290208351600a929092020190815582820151600182015560408301516002820155606083015160038201805460808601516001600160601b039093166001600160a01b031991821617600160601b6001600160401b039094169390930292909217905560a0840151600483015560c084015160058301805483166001600160a01b0392831617905560e085015160068401805490931691161790556101008301518051600783019081559281015191929091600884019061336e9082614dba565b50505060008a8152600e602090815260408083208e5184528252909120845181549286015164ffffffffff1990931690151564ffffffff0019161761010063ffffffff90931692909202919091179055505088516133cd908990612759565b6000015191507f7e5566222c32876a37c4f46a32c3530645f8a210462fc0afd712d176268d8ea2826040516134029190614fe5565b60405180910390a161364f565b61341d888a60000151612759565b5180516020018051880190528051805186019052805160c001519092506001600160a01b0388811691161461345f5781516001600160a01b03881660c0909101525b60008511801561347757506001600160a01b03831615155b156135f2576000826000015160e001516001600160a01b0316846001600160a01b0316036134a7575060016134ca565b8251604001516000036134ca575081516001600160a01b03841660e09091015260015b80156135f057856001600160a01b03851663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381865afa15801561352b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061354f9190614d20565b106135f0576001600160a01b0384166323b872dd3360095460405160e084901b6001600160e01b03191681526001600160a01b03928316600482015291166024820152604481018990526064016020604051808303816000875af11580156135bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135df9190614f64565b156135f05782516040018051870190525b505b81516001600160401b0342166080909101526020810151825161361791908a90612994565b7f73ed9dac93997d0aad8785921b99a78c26845d99ba132a409c657482323a550b826040516136469190614fe5565b60405180910390a15b50979650505050505050565b600080600080856001600160401b031685606001516001600160601b0316101561368757613687614ff8565b600085606001516001600160601b03161180156136b0575060e08501516001600160a01b031615155b1561382a578460e001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061371b919061500e565b604086015190915015613753576137508686604001518388606001516001600160601b0316613cf2909392919063ffffffff16565b93505b60208501511561378957613786868660200151601288606001516001600160601b0316613cf2909392919063ffffffff16565b92505b84511561382a57600860009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613807919061500e565b85516060870151919250613827916001600160601b031690889084613cf2565b91505b509250925092565b600054600160a01b900460ff16610b6057604051638dfc202b60e01b815260040160405180910390fd5b613864613e62565b61386f838387611fef565b905083156138f057600854604051630faa7cc560e21b8152600481018690526001600160a01b03878116602483015290911690633ea9f314906044016020604051808303816000875af11580156138ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138ee9190614f64565b505b8060200151606001516139585760208181015160016060918201526040519087901b6bffffffffffffffffffffffff191691810191909152603481018490526054810185905260740160408051601f1981840301815291815281516020928301209183015101525b949350505050565b8181600260008315801590613976575030318411155b15613a225750601354604051606460ff841686020491600091620100009091046001600160a01b03169083908381818185875af1925050503d80600081146139da576040519150601f19603f3d011682016040523d82523d6000602084013e6139df565b606091505b5050905080613a1b5760405162461bcd60e51b8152602060048201526008602482015267150b91985a5b195960c21b604482015260640161068d565b8185039450505b600083118015613a9a57506040516370a0823160e01b815230600482015283906001600160a01b038916906370a0823190602401602060405180830381865afa158015613a73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a979190614d20565b10155b15613b775750606460ff82168302046001600160a01b03871615613b715760135460405163a9059cbb60e01b8152620100009091046001600160a01b0390811660048301526024820183905288169063a9059cbb906044016020604051808303816000875af1158015613b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b359190614f64565b613b715760405162461bcd60e51b815260206004820152600d60248201526c115490cc8c081511985a5b1959609a1b604482015260640161068d565b80830392505b5050935093915050565b6007805460009182613b9283614ce3565b9091555050600754919050565b63ffffffff821615611c1e57600680544263ffffffff603c8602169081016001600160401b038116600160401b81026fffffffffffffffffffffffffffffffff199094168317939093179093556000848152600a6020526040902080546bffffffffffffffffffffffff19169092179091559061319c565b613c1f613eac565b8315613cb7576000613c32600186614f32565b9050613c3e8184612759565b80515161010081015160c082015160208301516040840151845160e090950151959750613c6d958a9590611c84565b508151516000604090910181905282515160200181905282515152428251516001600160401b039091166080909101526020820151825151613cb191908390612994565b5061319c565b613cc18483612759565b80515161010081015160c082015160e090920151929350613ceb9286929060009081908190611c84565b5050505050565b60006001600160601b0385161580613d1157506001600160401b038416155b80613d1a575082155b15613d2757506000613958565b836001600160401b0316856001600160601b03161015613d7d5760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081c1c9a5b98da5c185b607a1b604482015260640161068d565b60ff8216600a0a80846001600160601b0388166001600160401b038816830281613da957613da9614fcf565b040281613db857613db8614fcf565b049695505050505050565b6040518060800160405280613dd6613df7565b8152602001613de3613e62565b815260006020820181905260409091015290565b6040518060e0016040528060001515815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160008019168152602001600081525090565b6040518060400160405280613e55613ecc565b8152602001606081525090565b604051806040016040528060608152602001613ea7604051806080016040528060008152602001600060ff168152602001600080191681526020016000151581525090565b905290565b6040518060400160405280613ebf613e42565b8152600060209091015290565b60408051610120810182526000808252602080830182905282840182905260608084018390526080840183905260a0840183905260c0840183905260e0840183905284518086019095529184528301529061010082015290565b634e487b7160e01b600052604160045260246000fd5b60405161010081016001600160401b0381118282101715613f5f57613f5f613f26565b60405290565b604080519081016001600160401b0381118282101715613f5f57613f5f613f26565b604051606081016001600160401b0381118282101715613f5f57613f5f613f26565b604051601f8201601f191681016001600160401b0381118282101715613fd157613fd1613f26565b604052919050565b600082601f830112613fea57600080fd5b81356001600160401b0381111561400357614003613f26565b614016601f8201601f1916602001613fa9565b81815284602083860101111561402b57600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160a01b03811681146106b557600080fd5b60008060006060848603121561407457600080fd5b83356001600160401b0381111561408a57600080fd5b61409686828701613fd9565b935050602084013591506140ac60408501614048565b90509250925092565b6000602082840312156140c757600080fd5b61063a82614048565b602080825282518282018190526000918401906040840190835b8181101561411f57835180516001600160a01b03168452602090810151151581850152909301926040909201916001016140ea565b509095945050505050565b60008060006060848603121561413f57600080fd5b61414884614048565b95602085013595506040909401359392505050565b6000815180845260005b8181101561418357602081850181015186830182015201614167565b506000602082860101526020601f19601f83011685010191505092915050565b805182526000602082015160406020850152613958604085018261415d565b600081518084526020840193506020830160005b828110156141fd5781516001600160a01b03168652602095860195909101906001016141d6565b5093949350505050565b6000815160408452805160408501526020810151606085015260408101516080850152606081015161424460a08601826001600160601b03169052565b5060808101516001600160401b03811660c08601525060a081015160e085015260c08101516001600160a01b0381166101008601525060e08101516001600160a01b0381166101208601525061010001516101206101408501526142ac6101608501826141a3565b90506020830151848203602086015261263482826141c2565b600082825180855260208501945060208160051b8301016020850160005b8381101561431557601f198584030188526142ff838351614207565b60209889019890935091909101906001016142e3565b50909695505050505050565b600082825180855260208501945060208160051b8301016020850160005b8381101561431557601f1985840301885281518051845260208101516060602086015261436f60608601826142c5565b6040928301516001600160601b03169590920194909452602098890198909350919091019060010161433f565b600082825180855260208501945060208160051b8301016020850160005b8381101561431557601f198584030188526143d68383516141a3565b60209889019890935091909101906001016143ba565b8051151582526020808201519083015260408082015190830152606080820151908301526080808201516001600160a01b03169083015260a0808201519083015260c090810151910152565b60008151610100845261444f61010085018261415d565b905060208301518482036020860152614468828261415d565b9150506040830151614482604086018263ffffffff169052565b506060830151848203606086015261449a828261415d565b91505060808301516144b760808601826001600160401b03169052565b5060a08301516144cd60a086018261ffff169052565b5060c08301516144e860c08601826001600160401b03169052565b5060e083015184820360e0860152612634828261415d565b600082825180855260208501945060208160051b8301016020850160005b8381101561431557601f19858403018852815180518452602090810151604082860181905281519086018190529101906060600582901b86018101919086019060005b818110156146ec57605f19888503018352845161457f8582516143ec565b602081015161014060e08701526101e08601815160a06101408901528181518084526102008a0191506102008160051b8b0101935060208301925060005b81811015614687576101ff198b860301835283518051604080885281519088018190526060600582901b8901810192602001919089019060005b8181101561465357605f198b8603018352835180516060875261461d606088018261415d565b6020838101516001600160401b0316898201526040938401511515939098019290925250949384019392909201916001016145f7565b505050506020820151915086810360208801526146708183614438565b9650505060209384019392909201916001016145bd565b5050505060209182015180516101608901528083015160ff166101808901526040808201516101a08a015260609182015115156101c08a0152840151151561010089015292909201516101209096019590955294840194939290920191600101614561565b5050506020998a019990945092909201915060010161451e565b6020815260008251805160208401526001600160401b0360208201511660408401526001600160401b0360408201511660608401526060810151608084015250602083015160e060a0840152614760610100840182614321565b90506040840151601f198483030160c085015261477d828261439c565b9150506060840151601f198483030160e08501526126348282614500565b6000806000606084860312156147b057600080fd5b505081359360208301359350604090920135919050565b60006001600160401b038211156147e0576147e0613f26565b5060051b60200190565b80356001600160401b03811681146106b557600080fd5b801515811461152757600080fd5b803563ffffffff811681146106b557600080fd5b803561ffff811681146106b557600080fd5b6000610100828403121561484857600080fd5b614850613f3c565b905081356001600160401b0381111561486857600080fd5b61487484828501613fd9565b82525060208201356001600160401b0381111561489057600080fd5b61489c84828501613fd9565b6020830152506148ae6040830161480f565b604082015260608201356001600160401b038111156148cc57600080fd5b6148d884828501613fd9565b6060830152506148ea608083016147ea565b60808201526148fb60a08301614823565b60a082015261490c60c083016147ea565b60c082015260e08201356001600160401b0381111561492a57600080fd5b61493684828501613fd9565b60e08301525092915050565b60008060006060848603121561495757600080fd5b61496084614048565b925060208401356001600160401b0381111561497b57600080fd5b84016040818703121561498d57600080fd5b614995613f65565b81356001600160401b038111156149ab57600080fd5b8201601f810188136149bc57600080fd5b80356149cf6149ca826147c7565b613fa9565b8082825260208201915060208360051b85010192508a8311156149f157600080fd5b602084015b83811015614a945780356001600160401b03811115614a1457600080fd5b85016060818e03601f19011215614a2a57600080fd5b614a32613f87565b60208201356001600160401b03811115614a4b57600080fd5b614a5a8f602083860101613fd9565b825250614a69604083016147ea565b602082015260608201359150614a7e82614801565b60408101919091528352602092830192016149f6565b50845250505060208201356001600160401b03811115614ab357600080fd5b614abf88828501614835565b60208301525093969395505050506040919091013590565b600060208284031215614ae957600080fd5b81356001600160401b03811115614aff57600080fd5b8201601f81018413614b1057600080fd5b8035614b1e6149ca826147c7565b8082825260208201915060208360051b850101925086831115614b4057600080fd5b602084015b83811015614b815780356001600160401b03811115614b6357600080fd5b614b7289602083890101613fd9565b84525060209283019201614b45565b509695505050505050565b602080825282516040838301528051606084018190526000929190910190829060808501905b80831015614bdc57614bc58285516143ec565b60e082019150602084019350600183019250614bb2565b506020860151604086015280935050505092915050565b60208152600061063a60208301846142c5565b60008060008060008060c08789031215614c1f57600080fd5b8635955060208701359450604087013593506060870135925060808701359150614c4b60a08801614048565b90509295509295509295565b600060208284031215614c6957600080fd5b5035919050565b600060208284031215614c8257600080fd5b61063a8261480f565b60008060408385031215614c9e57600080fd5b82359150614cae6020840161480f565b90509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201614cf557614cf5614ccd565b5060010190565b6020808252600a908201526927b7363c9030b236b4b760b11b604082015260600190565b600060208284031215614d3257600080fd5b5051919050565b600181811c90821680614d4d57607f821691505b602082108103614d6d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611c1c57806000526020600020601f840160051c81016020851015614d9a5750805b601f840160051c820191505b81811015613ceb5760008155600101614da6565b81516001600160401b03811115614dd357614dd3613f26565b614de781614de18454614d39565b84614d73565b6020601f821160018114614e1b5760008315614e035750848201515b600019600385901b1c1916600184901b178455613ceb565b600084815260208120601f198516915b82811015614e4b5787850151825560209485019460019092019101614e2b565b5084821015614e695786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b83815282602082015260606040820152600060a0820183516040606085015281815180845260c08601915060c08160051b870101935060208301925060005b81811015614f135760bf198786030183528351805160608752614edd606088018261415d565b6020838101516001600160401b031689820152604093840151151593909801929092525094938401939290920191600101614eb7565b505050506020840151838203605f19016080850152611cb48282614438565b81810381811115610b7f57610b7f614ccd565b63ffffffff818116838216029081169081811461298d5761298d614ccd565b600060208284031215614f7657600080fd5b815161063a81614801565b838152826020820152606060408201526000612634606083018461439c565b634e487b7160e01b600052602160045260246000fd5b60ff8181168382160190811115610b7f57610b7f614ccd565b634e487b7160e01b600052601260045260246000fd5b60208152600061063a6020830184614207565b634e487b7160e01b600052600160045260246000fd5b60006020828403121561502057600080fd5b815160ff8116811461063a57600080fdfea2646970667358221220cd2551b841c7ab2ee101bcd93b958a38c0e1e9919a092d487496632d04dbc0da64736f6c634300081c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000378bc6636445edf805cc7730cd7b8953037e3f8100000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000c0f6ef6c8a58fb431015d4d2d7e0925718eac010000000000000000000000000d7c271d20c9e323336bfc843aeb8dec23b346352000000000000000000000000a1f70ffa4322e3609dd905b41f17bf3913366bc1000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003e00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000008736f6c696469747900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057761676d69000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000772656163746a730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086574686572736a73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6a61766173637269707400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a74797065736372697074000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007686172646861740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096661726361737465720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000373646b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046465666900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000463656c6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001173656c662d70726f746f636f6c2d73646b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e63727970746f63757272656e6379000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _admins (address[]): 0xC0f6Ef6C8A58fB431015D4D2d7e0925718EaC010,0xD7c271d20c9E323336bFC843AEb8deC23B346352,0xa1f70ffA4322E3609dD905b41f17Bf3913366bC1
Arg [1] : transitionInterval (uint32): 60
Arg [2] : _mode (uint8): 1
Arg [3] : _feeTo (address): 0x378bc6636445Edf805cc7730cD7b8953037e3F81
Arg [4] : _campaigns (string[]): solidity,wagmi,reactjs,ethersjs,javascript,typescript,hardhat,farcaster,sdk,defi,celo,self-protocol-sdk,cryptocurrency

-----Encoded View---------------
49 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 000000000000000000000000000000000000000000000000000000000000003c
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 000000000000000000000000378bc6636445edf805cc7730cd7b8953037e3f81
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 000000000000000000000000c0f6ef6c8a58fb431015d4d2d7e0925718eac010
Arg [7] : 000000000000000000000000d7c271d20c9e323336bfc843aeb8dec23b346352
Arg [8] : 000000000000000000000000a1f70ffa4322e3609dd905b41f17bf3913366bc1
Arg [9] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [10] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [11] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000260
Arg [14] : 00000000000000000000000000000000000000000000000000000000000002a0
Arg [15] : 00000000000000000000000000000000000000000000000000000000000002e0
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000320
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000360
Arg [18] : 00000000000000000000000000000000000000000000000000000000000003a0
Arg [19] : 00000000000000000000000000000000000000000000000000000000000003e0
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000420
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000460
Arg [22] : 00000000000000000000000000000000000000000000000000000000000004a0
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [24] : 736f6c6964697479000000000000000000000000000000000000000000000000
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [26] : 7761676d69000000000000000000000000000000000000000000000000000000
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [28] : 72656163746a7300000000000000000000000000000000000000000000000000
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [30] : 6574686572736a73000000000000000000000000000000000000000000000000
Arg [31] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [32] : 6a61766173637269707400000000000000000000000000000000000000000000
Arg [33] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [34] : 7479706573637269707400000000000000000000000000000000000000000000
Arg [35] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [36] : 6861726468617400000000000000000000000000000000000000000000000000
Arg [37] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [38] : 6661726361737465720000000000000000000000000000000000000000000000
Arg [39] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [40] : 73646b0000000000000000000000000000000000000000000000000000000000
Arg [41] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [42] : 6465666900000000000000000000000000000000000000000000000000000000
Arg [43] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [44] : 63656c6f00000000000000000000000000000000000000000000000000000000
Arg [45] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [46] : 73656c662d70726f746f636f6c2d73646b000000000000000000000000000000
Arg [47] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [48] : 63727970746f63757272656e6379000000000000000000000000000000000000


Deployed Bytecode Sourcemap

57777:22273:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62707:441;;;;;;:::i;:::-;;:::i;:::-;;;2722:14:1;;2715:22;2697:41;;2685:2;2670:18;62707:441:0;;;;;;;;41563:189;;;;;;;;;;-1:-1:-1;41563:189:0;;;;;:::i;:::-;;:::i;32483:396::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38964:146::-;;;;;;;;;;-1:-1:-1;38964:146:0;;;;;:::i;:::-;-1:-1:-1;;;;;39072:15:0;;39048:4;39072:15;;;:9;:15;;;;;;;;:23;;;;;;;;:30;;;;;;;;;;;38964:146;;;;;;78467:1579;;;;;;;;;;-1:-1:-1;78467:1579:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;69415:65::-;;;;;;;;;;;;;:::i;:::-;;30336:108;;;;;;;;;;-1:-1:-1;30336:108:0;;;;;:::i;:::-;;:::i;63806:764::-;;;;;;;;;;-1:-1:-1;63806:764:0;;;;;:::i;:::-;;:::i;65328:2484::-;;;;;;:::i;:::-;;:::i;37853:20::-;;;;;;;;;;-1:-1:-1;37853:20:0;;;;-1:-1:-1;;;;;37853:20:0;;;;;;-1:-1:-1;;;;;21326:32:1;;;21308:51;;21296:2;21281:18;37853:20:0;21162:203:1;48034:327:0;;;;;;;;;;-1:-1:-1;48034:327:0;;;;;:::i;:::-;;:::i;27719:86::-;;;;;;;;;;-1:-1:-1;27766:4:0;27790:7;-1:-1:-1;;;27790:7:0;;;;27719:86;;32361:87;;;;;;;;;;-1:-1:-1;32361:87:0;;;;;:::i;:::-;;:::i;3571:103::-;;;;;;;;;;;;;:::i;77572:860::-;;;;;;;;;;-1:-1:-1;77572:860:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;69290:61::-;;;;;;;;;;;;;:::i;2896:87::-;;;;;;;;;;-1:-1:-1;2942:7:0;2969:6;-1:-1:-1;;;;;2969:6:0;2896:87;;64981:110;;;:::i;50123:226::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;71907:838::-;;;;;;;;;;-1:-1:-1;71907:838:0;;;;;:::i;:::-;;:::i;41793:99::-;;;;;;;;;;-1:-1:-1;41878:5:0;;-1:-1:-1;;;;;41878:5:0;41793:99;;40078:102;;;;;;;;;;-1:-1:-1;40078:102:0;;;;;:::i;:::-;;:::i;40977:148::-;;;;;;;;;;-1:-1:-1;40977:148:0;;;;;:::i;:::-;;:::i;60853:143::-;;;;;;;;;;;;;:::i;30559:134::-;;;;;;;;;;-1:-1:-1;30559:134:0;;;;;:::i;:::-;;:::i;29855:135::-;;;;;;;;;;-1:-1:-1;29855:135:0;;;;;:::i;:::-;;:::i;39823:131::-;;;;;;;;;;-1:-1:-1;39823:131:0;;;;;:::i;:::-;;:::i;32155:144::-;;;;;;;;;;-1:-1:-1;32155:144:0;;;;;:::i;:::-;;:::i;57971:18::-;;;;;;;;;;-1:-1:-1;57971:18:0;;;;;;;;;;;3829:220;;;;;;;;;;-1:-1:-1;3829:220:0;;;;;:::i;:::-;;:::i;68640:588::-;;;;;;;;;;-1:-1:-1;68640:588:0;;;;;:::i;:::-;;:::i;62707:441::-;62887:5;;62848:4;;62865:28;;62876:9;;-1:-1:-1;;;;;62887:5:0;62865:10;:28::i;:::-;62904:212;62941:11;:9;:11::i;:::-;:18;;;-1:-1:-1;;;;;;;;;;;;;;;;46715:30:0;;;46769:23;;;;;;46756:36;;930:10;63035:9;63059:10;63084:1;63100:5;62904:22;:212::i;:::-;;63136:4;63129:11;;62707:441;;;;;;:::o;41563:189::-;41622:4;2782:13;:11;:13::i;:::-;-1:-1:-1;;;;;41647:20:0;::::1;41639:46;;;::::0;-1:-1:-1;;;41639:46:0;;25288:2:1;41639:46:0::1;::::0;::::1;25270:21:1::0;25327:2;25307:18;;;25300:30;-1:-1:-1;;;25346:18:1;;;25339:43;25399:18;;41639:46:0::1;;;;;;;;;-1:-1:-1::0;41696:5:0::1;:26:::0;;-1:-1:-1;;;;;;41696:26:0::1;-1:-1:-1::0;;;;;41696:26:0;::::1;;::::0;;-1:-1:-1;2806:1:0::1;41563:189:::0;;;:::o;32483:396::-;32585:10;;32524:22;;32610:16;;;32559:17;32610:16;32607:35;;32628:14;32483:396;:::o;32607:35::-;32675:11;32663:24;;-1:-1:-1;;;;;32663:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;32663:24:0;;;;;;;;;;;;;;;;32653:34;;32702:7;32698:149;32719:11;32715:15;;:1;:15;;;32698:149;;;32769:8;;;;32752:14;32769:8;;;:5;:8;;;;;;;;;32805:30;;;;;;;-1:-1:-1;;;;;32769:8:0;;;32805:30;;;32819:15;;;:7;:15;;;;;;;;;;32805:30;;;;;;32792:10;;32805:30;;32792:7;;:10;;;;;;:::i;:::-;;;;;;;;;;:43;-1:-1:-1;32732:3:0;;32698:149;;;;32857:14;32483:396;:::o;78467:1579::-;78518:20;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78518:20:0;78564:11;:9;:11::i;:::-;78551:24;;78602:23;:21;:23::i;:::-;78586:13;;;:39;78651:10;;:17;;;;78679:10;78651:17;78679:10;:::i;:::-;;;;78725:7;-1:-1:-1;;;;;78710:23:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78710:23:0;;;;;;;;;;;;;;;;-1:-1:-1;78700:7:0;;;:33;78785:7;-1:-1:-1;;;;;78763:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;78763:30:0;;;;;;;;;;;;;;;-1:-1:-1;78744:16:0;;;:49;78820:13;;;;:20;78804:13;78852:1165;78872:7;78868:1;:11;78852:1165;;;78924:16;78938:1;78924:13;:16::i;:::-;78901:4;:7;;;78909:1;78901:10;;;;;;;;:::i;:::-;;;;;;;:20;;:39;;;;78982:15;78995:1;39175:15;39214:22;;;:14;:22;;;;;;-1:-1:-1;;;;;39214:22:0;;39118:126;78982:15;78955:4;:7;;;78963:1;78955:10;;;;;;;;:::i;:::-;;;;;;;:24;;:42;-1:-1:-1;;;;;78955:42:0;;;-1:-1:-1;;;;;78955:42:0;;;;;79012:35;79068:8;-1:-1:-1;;;;;79050:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;79012:65:0;-1:-1:-1;;;;;;79095:18:0;;;79092:914;;79163:1;79134:4;:16;;;79151:1;79134:19;;;;;;;;:::i;:::-;;;;;;;;;;;:30;:26;79183:743;79213:8;79204:6;:17;79183:743;;;79257:13;79273:4;:13;;;79287:6;79273:21;;;;;;;;:::i;:::-;;;;;;;:27;;;79257:43;;79323:14;79489:6;;;;;;;;;;;79486:123;;;79527:27;79539:1;79542:5;79549:4;79527:11;:27::i;:::-;:33;;;:40;;;79523:62;;-1:-1:-1;79581:4:0;79523:62;79656:250;;;;;;;;79695:49;79711:4;79717:5;79724:1;79727:9;79738:5;79695:15;:49::i;:::-;79656:250;;;;79771:27;79783:1;79786:5;79793:4;79771:11;:27::i;:::-;79656:250;;-1:-1:-1;;;;;79826:15:0;;;;;;:9;79656:250;79826:15;;;;;;;:18;;;;;;;;:25;;;;;;;;;;;;79656:250;;;;;;;;;;79631:22;;:14;;79646:6;;79631:22;;;;;;:::i;:::-;;;;;;;;;;:275;-1:-1:-1;;79223:8:0;;79183:743;;;;79976:14;79944:4;:16;;;79961:1;79944:19;;;;;;;;:::i;:::-;;;;;;;:29;;:46;;;;79092:914;-1:-1:-1;78881:3:0;;78852:1165;;;;80027:11;;78467:1579;;;:::o;69415:65::-;2782:13;:11;:13::i;:::-;69462:10:::1;:8;:10::i;:::-;69415:65::o:0;30336:108::-;-1:-1:-1;;;;;30197:16:0;;30393:4;30197:16;;;:8;:16;;;;;;;;30417:19;30410:26;30336:108;-1:-1:-1;;30336:108:0:o;63806:764::-;63946:4;31457:22;930:10;31466:12;-1:-1:-1;;;;;31612:15:0;31579:11;31612:15;;;:7;:15;;;;;;;;;31523:112;31457:22;31449:45;;;;-1:-1:-1;;;31449:45:0;;;;;;;:::i;:::-;63963:11:::1;63977;:9;:11::i;:::-;:18;;;63963:32;;64006;64024:5;64031:6;64006:17;:32::i;:::-;64049:22;64074:27;64087:6;64095:5;64074:12;:27::i;:::-;64120:6:::0;;:11;:17:::1;;::::0;64049:52;;-1:-1:-1;;;;;;64120:31:0::1;64112:57;;;::::0;-1:-1:-1;;;64112:57:0;;25288:2:1;64112:57:0::1;::::0;::::1;25270:21:1::0;25327:2;25307:18;;;25300:30;-1:-1:-1;;;25346:18:1;;;25339:43;25399:18;;64112:57:0::1;25086:337:1::0;64112:57:0::1;64195:6:::0;;:11;:17:::1;;::::0;64224:5:::1;::::0;64188:42:::1;::::0;-1:-1:-1;;;64188:42:0;;-1:-1:-1;;;;;64224:5:0;;::::1;64188:42;::::0;::::1;21308:51:1::0;64234:10:0;;64188:35;;;::::1;::::0;::::1;::::0;21281:18:1;;64188:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;64180:90;;;::::0;-1:-1:-1;;;64180:90:0;;26562:2:1;64180:90:0::1;::::0;::::1;26544:21:1::0;26601:2;26581:18;;;26574:30;-1:-1:-1;;;26620:18:1;;;26613:51;26681:18;;64180:90:0::1;26360:345:1::0;64180:90:0::1;64289:5;::::0;-1:-1:-1;;;;;64289:5:0::1;:13;:28:::0;-1:-1:-1;64289:28:0::1;64281:66;;;::::0;-1:-1:-1;;;64281:66:0;;26912:2:1;64281:66:0::1;::::0;::::1;26894:21:1::0;26951:2;26931:18;;;26924:30;26990:27;26970:18;;;26963:55;27035:18;;64281:66:0::1;26710:349:1::0;64281:66:0::1;64358:6:::0;;:11;:22:::1;;:35:::0;;;64404:6;;:11;:23:::1;::::0;;::::1;:37:::0;;;64452:6;;:11;-1:-1:-1;;;;;42034:15:0;64452:32:::1;:23;::::0;;::::1;:32:::0;64508:8;::::1;::::0;64526:6;;:11;64495:43:::1;::::0;64508:8;64518:6;;64495:12:::1;:43::i;:::-;-1:-1:-1::0;64558:4:0::1;::::0;63806:764;-1:-1:-1;;;;;63806:764:0:o;65328:2484::-;65509:4;31457:22;930:10;31466:12;850:98;31457:22;31449:45;;;;-1:-1:-1;;;31449:45:0;;;;;;;:::i;:::-;27324:19:::1;:17;:19::i;:::-;65533:11:::2;65547;:9;:11::i;:::-;:18;;;65533:32;;65576:28;65587:9;65598:5;65576:10;:28::i;:::-;-1:-1:-1::0;;;;;65623:18:0;::::2;65615:43;;;::::0;-1:-1:-1;;;65615:43:0;;27266:2:1;65615:43:0::2;::::0;::::2;27248:21:1::0;27305:2;27285:18;;;27278:30;-1:-1:-1;;;27324:18:1;;;27317:42;27376:18;;65615:43:0::2;27064:336:1::0;65615:43:0::2;65670:32;65688:5;65695:6;65670:17;:32::i;:::-;65713:22;65738:27;65751:6;65759:5;65738:12;:27::i;:::-;65713:52;;65776:17;65796:32;65808:6;65816:5;65823:4;65796:11;:32::i;:::-;65776:52;;65843:39;65862:6;65870:5;65877:4;65843:18;:39::i;:::-;65839:210;;65899:48;65924:3;:8;;;65934:6;65942:4;65899:24;:48::i;:::-;65991:6:::0;;:11;:26:::2;;:31:::0;;66021:1:::2;65991:31;::::0;;65839:210:::2;66096:3;66067:2;:8;;;:25;;;:32;;;;66059:67;;;::::0;-1:-1:-1;;;66059:67:0;;27607:2:1;66059:67:0::2;::::0;::::2;27589:21:1::0;27646:2;27626:18;;;27619:30;-1:-1:-1;;;27665:18:1;;;27658:52;27727:18;;66059:67:0::2;27405:346:1::0;66059:67:0::2;66168:8;::::0;;::::2;::::0;;:25;::::2;:30:::0;;66197:1:::2;66168:30;;;::::0;;66240:16;;::::2;::::0;:22:::2;;::::0;66213:6;;:11;:23:::2;;:49:::0;;::::2;::::0;;::::2;::::0;;::::2;-1:-1:-1::0;;;;;66213:49:0::2;::::0;;66319:8;66285:43:::2;::::0;66297:6;;66306:5;;66313:4;;66285:11:::2;:43::i;:::-;66339:10;66352:16:::0;;;:8:::2;:16;::::0;;;;;;;:23;;;;;;;;-1:-1:-1;;;;;66352:29:0;::::2;::::0;;;;;;;;;:48;;66411::::2;::::0;::::2;::::0;;;;;;66536:16;;::::2;::::0;:19;66470:29;;;;66536:19;;66352:48;;66470;::::2;;;;;:::i;:::-;;;;;;;;;;;:54;;:57;;:86;;;;;;:::i;:::-;-1:-1:-1::0;66637:16:0::2;::::0;;::::2;::::0;:23;::::2;::::0;66567:16:::2;::::0;;;:8:::2;:16:::0;;;;;;:23;;;;;;;;-1:-1:-1;;;;;66567:29:0;::::2;::::0;;;;;;;;;:48;;66609:5;;66567:48;::::2;;;;;:::i;:::-;;;;;;;;;;;:54;;:61;;:94;;;;;;:::i;:::-;-1:-1:-1::0;66747:16:0::2;::::0;;::::2;::::0;:28:::2;;::::0;66672:16:::2;::::0;;;:8:::2;:16:::0;;;;;;:23;;;;;;;;-1:-1:-1;;;;;66672:29:0;::::2;::::0;;;;;;;;;:48;;66714:5;;66672:48;::::2;;;;;:::i;:::-;;;;;;;;;;;:54;;:66;;:104;;;;;;:::i;:::-;-1:-1:-1::0;66856:16:0::2;::::0;;::::2;::::0;:22:::2;;::::0;66787:16:::2;::::0;;;:8:::2;:16:::0;;;;;;:23;;;;;;;;-1:-1:-1;;;;;66787:29:0;::::2;::::0;;;;;;;;;:48;;66829:5;;66787:48;::::2;;;;;:::i;:::-;;;;;;;;;;;:54;;:60;;:92;;;;;;:::i;:::-;-1:-1:-1::0;66953:16:0::2;::::0;;::::2;::::0;:22:::2;::::0;;::::2;::::0;66890:16:::2;::::0;;;:8:::2;:16:::0;;;;;:23;;;;;;;;-1:-1:-1;;;;;66890:29:0;::::2;::::0;;;;;;;:48;;66932:5;;66890:48;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;:60:::0;;:85;;-1:-1:-1;;66890:85:0::2;;::::0;;;::::2;::::0;;;::::2;::::0;;;67055:16;;::::2;::::0;:28:::2;;::::0;66986:16;;;:8:::2;:16:::0;;;;;;:23;;;;;;;;-1:-1:-1;;;;;66986:29:0;::::2;::::0;;;;;;;;:48;;67028:5;;66986:48;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;:66:::0;;:97;;-1:-1:-1;;66986:97:0::2;-1:-1:-1::0;;;;;66986:97:0;;;::::2;::::0;;;::::2;::::0;;;67162:16;;::::2;::::0;:27:::2;;::::0;67094:16;;;:8:::2;:16:::0;;;;;;:23;;;;;;;;-1:-1:-1;;;;;67094:29:0;::::2;::::0;;;;;;;;:48;;67136:5;;67094:48;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:65;:48:::2;::::0;;::::2;;:65:::0;;;;:95;;::::2;::::0;;;::::2;-1:-1:-1::0;;;67094:95:0::2;-1:-1:-1::0;;67094:95:0;;::::2;::::0;;;::::2;::::0;;;67267:16;;::::2;::::0;:26:::2;;::::0;67200:16;;;:8:::2;:16:::0;;;;;;:23;;;;;;;;-1:-1:-1;;;;;67200:29:0;::::2;::::0;;;;;;;;:48;;67242:5;;67200:48;::::2;;;;;:::i;:::-;;;;;;;;;;;:54;;:64;;;:93;;;;;-1:-1:-1::0;;;;;67200:93:0::2;;;;;-1:-1:-1::0;;;;;67200:93:0::2;;;;;;67310:6;67306:358;67326:18:::0;;:25;67322:29;::::2;67306:358;;;67372:25;67400:10;:18;;;67419:1;67400:21;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;67437:16:::2;::::0;;;:8:::2;:16:::0;;;;;;:23;;;;;;;;-1:-1:-1;;;;;67437:29:0;::::2;::::0;;;;;;;;;:48;;67400:21;;-1:-1:-1;67437:29:0;67479:5;;67437:48;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;::::0;;::::2;:63:::0;;::::2;;::::0;;;;67577:74:::2;::::0;;::::2;::::0;::::2;::::0;;67590:19;;67577:74;;67612:15;;::::2;::::0;-1:-1:-1;;;;;67577:74:0::2;::::0;;::::2;::::0;67629:21;;::::2;::::0;67577:74:::2;;::::0;;;;67515:16;;;:8:::2;:16:::0;;;;;:23;;;;;;;;-1:-1:-1;;;;;67515:29:0;::::2;::::0;;;;;;;;:48;;67557:5;;67515:48;::::2;;;;;:::i;:::-;;;;;;;;;;;:56;;67572:1;67515:59;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:136;;:59:::2;::::0;;::::2;;::::0;;;:136:::2;::::0;:59;:136:::2;:::i;:::-;-1:-1:-1::0;67515:136:0::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;;::::2;::::0;;::::2;::::0;::::2;;-1:-1:-1::0;;;67515:136:0::2;-1:-1:-1::0;;67515:136:0;;;-1:-1:-1;;;;;67515:136:0;;::::2;::::0;;;;;;;::::2;::::0;;;67353:3;;;::::2;::::0;-1:-1:-1;67306:358:0::2;;;-1:-1:-1::0;67687:8:0::2;::::0;::::2;::::0;67705:6;;:11;67674:43:::2;::::0;67687:8;67697:6;;67674:12:::2;:43::i;:::-;67750:4;-1:-1:-1::0;;;;;67736:46:0::2;;67756:6;67764:5;67771:10;67736:46;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;67800:4:0::2;::::0;65328:2484;-1:-1:-1;;;;;;;65328:2484:0:o;48034:327::-;48107:4;;48124:208;48144:10;:17;48140:1;:21;48124:208;;;48183:13;48199:23;48208:10;48219:1;48208:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;46715:30:0;;;46769:23;;;;;;;;46756:36;;-1:-1:-1;46614:186:0;48199:23;:29;;48257:19;;;:12;:19;;;;;;;-1:-1:-1;;48291:29:0;;48257:19;;;;48313:7;48291:29;;;-1:-1:-1;48257:19:0;48163:3;48124:208;;;-1:-1:-1;48349:4:0;;48034:327;-1:-1:-1;;48034:327:0:o;32361:87::-;2782:13;:11;:13::i;:::-;32423:17:::1;32433:6;32423:9;:17::i;:::-;32361:87:::0;:::o;3571:103::-;2782:13;:11;:13::i;:::-;3636:30:::1;3663:1;3636:18;:30::i;77572:860::-:0;-1:-1:-1;;;;;;;;;;;;;;;;;77709:11:0;77723;:9;:11::i;:::-;:18;;;;-1:-1:-1;77755:10:0;;77752:26;;77767:11;77777:1;77767:11;;:::i;:::-;;;77752:26;77789:21;77813;77827:6;77813:13;:21::i;:::-;77858:10;;77789:45;;-1:-1:-1;77858:10:0;-1:-1:-1;;;;;77893:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;77879:38:0;;77928:13;;;:22;;;77879:11;77961:438;77981:5;77977:1;:9;77961:438;;;78159:6;;78007:14;;78159:6;;;;;78156:129;;;78189:49;78201:6;78209:3;78213:1;78209:6;;;;;;;;:::i;:::-;;;;;;;:11;;;:16;;;:22;;;78233:4;78189:11;:49::i;:::-;:55;;;:62;;;78185:84;;-1:-1:-1;78265:4:0;78185:84;78316:71;78332:4;78338:3;78342:1;78338:6;;;;;;;;:::i;:::-;;;;;;;:11;;;:16;;;:22;;;78362:6;78370:9;78381:5;78316:15;:71::i;:::-;78299:11;;:14;;78311:1;;78299:14;;;;;;:::i;:::-;;;;;;;;;;:88;-1:-1:-1;77988:3:0;;77961:438;;;;78411:13;;;77572:860;;;:::o;69290:61::-;2782:13;:11;:13::i;:::-;69335:8:::1;:6;:8::i;64981:110::-:0;65037:4;65060:23;65073:9;65060:12;:23::i;:::-;65053:30;;64981:110;:::o;50123:226::-;50183:24;50220:13;50236:11;:9;:11::i;:::-;:18;;;50220:34;;50268:8;50280:1;50268:13;50265:31;;50283:13;50123:226;:::o;50265:31::-;50314:27;50328:12;50339:1;50328:8;:12;:::i;:::-;50314:13;:27::i;:::-;50307:34;;;50123:226;:::o;71907:838::-;930:10;30164:11;30197:16;;;:8;:16;;;;;;;;29193:58;;;;-1:-1:-1;;;29193:58:0;;32100:2:1;29193:58:0;;;32082:21:1;32139:2;32119:18;;;32112:30;-1:-1:-1;;;32158:18:1;;;32151:50;32218:18;;29193:58:0;31898:344:1;29193:58:0;72188:34:::1;72202:4;72208:6;72216:5;72188:13;:34::i;:::-;72233:22;72258:27;72271:6;72279:5;72258:12;:27::i;:::-;72299:6:::0;;:11;:22:::1;;::::0;72233:52;;-1:-1:-1;72299:36:0;-1:-1:-1;72296:103:0::1;;72351:6:::0;;:11;:22:::1;;:36:::0;;72377:10;;72351:22;:36:::1;::::0;72377:10;;72351:36:::1;:::i;:::-;::::0;;-1:-1:-1;72296:103:0::1;72412:6:::0;;:11;:23:::1;;::::0;:38;-1:-1:-1;72409:107:0::1;;72466:6:::0;;:11;:23:::1;;:38:::0;;72493:11;;72466:23;:38:::1;::::0;72493:11;;72466:38:::1;:::i;:::-;::::0;;-1:-1:-1;72409:107:0::1;72529:6:::0;;:11;:25;:42;-1:-1:-1;72526:115:0::1;;72587:6:::0;;:11;:42;;72616:13;;72587:11;:42:::1;::::0;72616:13;;72587:42:::1;:::i;:::-;::::0;;-1:-1:-1;72526:115:0::1;72651:6:::0;;:11;-1:-1:-1;;;;;42034:15:0;72651:32:::1;:23;::::0;;::::1;:32:::0;72707:8:::1;::::0;::::1;::::0;72725:6;;:11;72694:43:::1;::::0;72707:8;72717:6;;72694:12:::1;:43::i;:::-;72131:614;71907:838:::0;;;;;;:::o;40078:102::-;2782:13;:11;:13::i;:::-;40146:26:::1;40163:8;39669:5:::0;:29;39608:98;40977:148;2782:13;:11;:13::i;:::-;41056:12:::1;::::0;::::1;::::0;41053:64:::1;;41097:20;:8:::0;41108:9:::1;41097:20;:::i;:::-;41070:24:::0;:47;;-1:-1:-1;;41070:47:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;40977:148;:::o;60853:143::-;60902:4;2782:13;:11;:13::i;:::-;-1:-1:-1;60933:6:0::1;::::0;;-1:-1:-1;;60950:16:0;::::1;60933:6;::::0;;;::::1;;;60959:7;60950:16:::0;;::::1;;::::0;;-1:-1:-1;;60853:143:0:o;30559:134::-;2782:13;:11;:13::i;:::-;30622:29:::1;30637:6;30645:5;30622:14;:29::i;:::-;30667:18;::::0;-1:-1:-1;;;;;30667:18:0;::::1;::::0;::::1;::::0;;;::::1;30559:134:::0;:::o;29855:135::-;2782:13;:11;:13::i;:::-;29922:28:::1;29937:6;29945:4;29922:14;:28::i;:::-;29966:16;::::0;-1:-1:-1;;;;;29966:16:0;::::1;::::0;::::1;::::0;;;::::1;29855:135:::0;:::o;39823:131::-;39891:4;2782:13;:11;:13::i;:::-;-1:-1:-1;39908:5:0::1;:16:::0;;-1:-1:-1;;;;;39908:16:0;::::1;-1:-1:-1::0;;;;;;39908:16:0;;::::1;;::::0;;;39823:131;;;:::o;32155:144::-;2782:13;:11;:13::i;:::-;-1:-1:-1;;;;;32240:15:0::1;32226:11;32240:15:::0;;;:7:::1;:15;::::0;;;;;;-1:-1:-1;;32266:25:0;::::1;32240:15;::::0;;::::1;32284:7;32266:25;::::0;;32155:144::o;3829:220::-;2782:13;:11;:13::i;:::-;-1:-1:-1;;;;;3914:22:0;::::1;3910:93;;3960:31;::::0;-1:-1:-1;;;3960:31:0;;3988:1:::1;3960:31;::::0;::::1;21308:51:1::0;21281:18;;3960:31:0::1;21162:203:1::0;3910:93:0::1;4013:28;4032:8;4013:18;:28::i;68640:588::-:0;68793:4;27324:19;:17;:19::i;:::-;31457:22:::1;930:10:::0;31466:12:::1;850:98:::0;31457:22:::1;31449:45;;;;-1:-1:-1::0;;;31449:45:0::1;;;;;;;:::i;:::-;68817:14:::2;68833:10:::0;68845:27:::2;68876:71;68900:16;68918:17;68937:9;68876:23;:71::i;:::-;68816:131:::0;;-1:-1:-1;68816:131:0;-1:-1:-1;68816:131:0;-1:-1:-1;68961:21:0;;68958:187:::2;;69015:5;::::0;-1:-1:-1;;;;;69015:5:0::2;68999:49;;;::::0;-1:-1:-1;;;68999:49:0;;32698:2:1;68999:49:0::2;::::0;::::2;32680:21:1::0;32737:1;32717:18;;;32710:29;-1:-1:-1;;;32755:18:1;;;32748:38;32803:18;;68999:49:0::2;32496:331:1::0;68999:49:0::2;69071:5;::::0;69105::::2;::::0;69071:40:::2;::::0;-1:-1:-1;;;69071:40:0;;::::2;::::0;::::2;33006:25:1::0;;;-1:-1:-1;;;;;69105:5:0;;::::2;33047:18:1::0;;;33040:60;69071:5:0;::::2;::::0;:14:::2;::::0;32979:18:1;;69071:40:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69063:70;;;::::0;-1:-1:-1;;;69063:70:0;;33563:2:1;69063:70:0::2;::::0;::::2;33545:21:1::0;33602:2;33582:18;;;33575:30;-1:-1:-1;;;33621:18:1;;;33614:47;33678:18;;69063:70:0::2;33361:341:1::0;69063:70:0::2;69162:31;69169:9;69180:5;69187;69162:31;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;69216:4:0::2;::::0;68640:588;-1:-1:-1;;;;;68640:588:0:o;61512:262::-;61580:10;;61577:190;;61623:4;61615:21;:31;-1:-1:-1;61615:31:0;61607:60;;;;-1:-1:-1;;;61607:60:0;;34389:2:1;61607:60:0;;;34371:21:1;34428:2;34408:18;;;34401:30;-1:-1:-1;;;34447:18:1;;;34440:46;34503:18;;61607:60:0;34187:340:1;61607:60:0;61683:6;61694:2;-1:-1:-1;;;;;61694:7:0;61709:6;61694:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61682:38;;;61743:1;61735:20;;;;-1:-1:-1;;;61735:20:0;;34944:2:1;61735:20:0;;;34926:21:1;34983:1;34963:18;;;34956:29;-1:-1:-1;;;35001:18:1;;;34994:36;35047:18;;61735:20:0;34742:329:1;61735:20:0;61592:175;61577:190;61512:262;;:::o;41405:89::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41476:10:0;;;;;;;;41481:5;41476:10;;;;;-1:-1:-1;;;;;41476:10:0;;;;;;;-1:-1:-1;;;41476:10:0;;;;;;;;;;;;;;;;;;41405:89::o;47386:592::-;47641:19;;:::i;:::-;47673:33;47701:4;47673:27;:33::i;:::-;47723:199;47759:4;47779:6;47801:8;47825:11;47852:10;47878:13;47906:5;47723:21;:199::i;:::-;47717:205;;47933:37;47951:4;:10;;;47963:6;47933:17;:37::i;:::-;47386:592;;;;;;;;;:::o;3061:166::-;2942:7;2969:6;-1:-1:-1;;;;;2969:6:0;930:10;3121:23;3117:103;;3168:40;;-1:-1:-1;;;3168:40:0;;930:10;3168:40;;;21308:51:1;21281:18;;3168:40:0;21162:203:1;49872:125:0;49927:28;49977:12;49968:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49872:125;:::o;48505:::-;48563:22;48605:9;:17;48615:6;48605:17;;;;;;;;;;;48598:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48598:24:0;;;;;;-1:-1:-1;;;48598:24:0;;-1:-1:-1;;;;;48598:24:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48598:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48598:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48505:125;;;:::o;60506:167::-;60591:22;;:::i;:::-;60636:16;;;;:8;:16;;;;;;;;:23;;;;;;;;-1:-1:-1;;;;;60636:29:0;;;;;;;;;60626:39;;;;;;;;;;;;;;;;;;;;;;60636:29;;60626:39;;;;60636:29;;60626:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60626:39:0;;;-1:-1:-1;;60626:39:0;;;;;-1:-1:-1;;;;;60626:39:0;;;;;;;;;;-1:-1:-1;;;60626:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60626:39:0;;;-1:-1:-1;;60626:39:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60626:39:0;;;-1:-1:-1;;60626:39:0;;;;-1:-1:-1;;;;;60626:39:0;;;;;;;;-1:-1:-1;;;60626:39:0;;;;;;;-1:-1:-1;;;60626:39:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60626:39:0;;;-1:-1:-1;60626:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60506:167;-1:-1:-1;;;;60506:167:0:o;74454:1232::-;74604:22;;:::i;:::-;74648:8;74645:45;;;74658:32;74676:5;74683:6;74658:17;:32::i;:::-;-1:-1:-1;;;;;74705:15:0;;;;;;:9;:15;;;;;;;;:23;;;;;;;;:30;;;;;;;;;;;74701:978;;74752:15;74770:27;74783:6;74791:5;74770:12;:27::i;:::-;:30;:35;;-1:-1:-1;74770:30:0;74840:32;74852:6;74860:5;74867:4;74840:11;:32::i;:::-;74820:52;-1:-1:-1;74887:17:0;;74919:179;74939:14;;:21;74935:25;;74919:179;;;75034:14;;:17;;75049:1;;75034:17;;;;;;:::i;:::-;;;;;;;:23;;;:29;;;75020:43;;;;;;74962:3;;;;;;;74919:179;;;;75113:10;75125:11;75138:13;75155:46;75171:9;:25;;75186:10;75171:25;;;75182:1;75171:25;75198:2;75155:15;:46::i;:::-;75112:89;;-1:-1:-1;75112:89:0;-1:-1:-1;75112:89:0;-1:-1:-1;75216:21:0;75248:9;75240:4;;;;;:17;;;;;;;:::i;:::-;;:101;;75337:4;75240:101;;;39175:15;39214:22;;;:14;:22;;;;;;-1:-1:-1;;;;;39214:22:0;-1:-1:-1;;;;;42034:15:0;75259:30;;;;;:75;;;75311:1;75294:2;:14;;;:18;:39;;;;75332:1;75316:2;:13;;;:17;75294:39;75216:125;;75356:15;75374:16;:61;;;;;75404:1;75395:6;:10;:23;;;;75417:1;75409:5;:9;75395:23;:39;;;;75433:1;75422:8;:12;75395:39;75456:211;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75456:211:0;;;;75594:8;;;;;-1:-1:-1;;;;;75456:211:0;;;;;-1:-1:-1;;75456:211:0;;;;;;;;;;;;;-1:-1:-1;74701:978:0;74454:1232;;;;;;;:::o;28620:120::-;27583:16;:14;:16::i;:::-;28689:5:::1;28679:15:::0;;-1:-1:-1;;;;28679:15:0::1;::::0;;28710:22:::1;930:10:::0;28719:12:::1;28710:22;::::0;-1:-1:-1;;;;;21326:32:1;;;21308:51;;21296:2;21281:18;28710:22:0::1;;;;;;;28620:120::o:0;46264:223::-;46352:19;;;;:12;:19;;;;;;;;46344:55;;;;-1:-1:-1;;;46344:55:0;;35410:2:1;46344:55:0;;;35392:21:1;35449:2;35429:18;;;35422:30;35488:25;35468:18;;;35461:53;35531:18;;46344:55:0;35208:347:1;46344:55:0;46418:13;;;;:5;:13;;;;;;;;:20;;;;;;;;:28;;;46410:69;;;;-1:-1:-1;;;46410:69:0;;35762:2:1;46410:69:0;;;35744:21:1;35801:2;35781:18;;;35774:30;35840;35820:18;;;35813:58;35888:18;;46410:69:0;35560:352:1;49546:279:0;49618:22;;:::i;:::-;49653:25;49681:13;;;:5;:13;;;;;;;;:20;;;;;;;;;49653:48;;;;;;;;;;;;;;;;;;;;;;;;;;;49712:8;;;:18;49744:10;;49741:77;;;49780:9;:17;49790:6;49780:17;;;;;;;;;;;49798:2;:7;;;49780:26;;;;;;;;;;:::i;:::-;;;;;;;;;;49771:35;;;;;;;;49780:26;;;;;;;49771:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49771:35:0;;;;;;-1:-1:-1;;;;;;;;49771:35:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49771:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49780:26;;49771:35;;;;49780:26;;49771:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49771:35:0;;;;;;;;;;;;;;;;-1:-1:-1;;;49771:35:0;;;;-1:-1:-1;;;49771:35:0;;49741:77;49642:183;49546:279;;;;:::o;48800:176::-;48928:17;;;;:9;:17;;;;;:23;;48959:9;;48928:17;:23;;;;;;;;;;:::i;:::-;;;;;;;;;;:40;;:23;;;;;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48928:40:0;;;-1:-1:-1;;;;;;48928:40:0;;;;-1:-1:-1;;;;;;;;48928:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48928:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;:40;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;48800:176:0:o;27878:132::-;27766:4;27790:7;-1:-1:-1;;;27790:7:0;;;;27940:63;;;27976:15;;-1:-1:-1;;;27976:15:0;;;;;;;;;;;71232:317;-1:-1:-1;;;;;71346:16:0;;71319:10;71346:16;;;:10;:16;;;;;;;;:23;;;;;;;;:31;;;;;;;;;;;71342:200;;-1:-1:-1;;;;;71393:16:0;;;;;;:10;:16;;;;;;;;:23;;;;;;;;:31;;;;;;;;:38;;-1:-1:-1;;71393:38:0;71427:4;71393:38;;;;;;71446:13;:21;;;;;:27;;;;;;;;:39;;;;;;;;;;;;;;;71342:200;;;-1:-1:-1;71526:4:0;71232:317;;;;;:::o;49142:178::-;49272:17;;;;:9;:17;;;;;:23;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:29;;:40;;;;;;;;;;;;;;;-1:-1:-1;;;;;;49272:40:0;-1:-1:-1;;;;;49272:40:0;;;;;;;;;;-1:-1:-1;;49142:178:0:o;61185:165::-;61297:16;;;;:8;:16;;;;;;;;:23;;;;;;;;;-1:-1:-1;;;;;61297:29:0;;;;;;;;;;;;:45;;:35;;;:45;;;;;;;;;;;;;;-1:-1:-1;;61297:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61185:165::o;31745:248::-;-1:-1:-1;;;;;31809:15:0;;;;;;:7;:15;;;;;;;;31808:16;31800:48;;;;-1:-1:-1;;;31800:48:0;;36119:2:1;31800:48:0;;;36101:21:1;36158:2;36138:18;;;36131:30;-1:-1:-1;;;36177:18:1;;;36170:49;36236:18;;31800:48:0;35917:343:1;31800:48:0;-1:-1:-1;;;;;31859:15:0;;;;;;:7;:15;;;;;:22;;-1:-1:-1;;31859:22:0;31877:4;31859:22;;;;;;31911:10;;;31946:8;;31911:10;;31946:8;:::i;:::-;31933:21;;;;:10;:21;31965:11;;;;;:5;:11;;;;;:20;;-1:-1:-1;;;;;;31965:20:0;-1:-1:-1;;;;;31965:20:0;;;;;;;;;;31745:248::o;4209:191::-;4283:16;4302:6;;-1:-1:-1;;;;;4319:17:0;;;-1:-1:-1;;;;;;4319:17:0;;;;;;4352:40;;4302:6;;;;;;;4352:40;;4283:16;4352:40;4272:128;4209:191;:::o;28361:118::-;27324:19;:17;:19::i;:::-;28421:7:::1;:14:::0;;-1:-1:-1;;;;28421:14:0::1;-1:-1:-1::0;;;28421:14:0::1;::::0;;28451:20:::1;28458:12;930:10:::0;;850:98;70356:868;70410:4;70427:11;70441;:9;:11::i;:::-;:18;;;70427:32;;70470:17;70490:11;:9;:11::i;:::-;:24;;-1:-1:-1;70490:24:0;70549:21;70563:6;70549:13;:21::i;:::-;70525:45;-1:-1:-1;70584:16:0;;70581:100;;70634:12;70625:5;:21;;70617:52;;;;-1:-1:-1;;;70617:52:0;;36620:2:1;70617:52:0;;;36602:21:1;36659:2;36639:18;;;36632:30;-1:-1:-1;;;36678:18:1;;;36671:48;36736:18;;70617:52:0;36418:342:1;70617:52:0;70691:24;70702:5;70709;70691:10;:24::i;:::-;70726:21;70769:1;70761:5;:9;:32;;;;;70783:3;:10;70774:5;:19;;70761:32;70758:145;;;70866:3;:10;70858:5;:18;;;;;:::i;:::-;;70839:37;;70758:145;930:10;70913:12;70951:244;70971:3;:10;70967:1;:14;70951:244;;;71003:13;71019:3;71023:1;71019:6;;;;;;;;:::i;:::-;;;;;;;:11;;;:16;;;:22;;;71003:38;;71056:17;71076:49;71087:4;71093:16;71111:6;71119:5;71076:10;:49::i;:::-;71056:69;;71140:43;71152:6;71161:5;71168:4;71174:2;:8;;;71140:11;:43::i;:::-;-1:-1:-1;;70983:3:0;;70951:244;;;-1:-1:-1;71212:4:0;;70356:868;-1:-1:-1;;;;;;;70356:868:0:o;38430:166::-;-1:-1:-1;;;;;38519:15:0;;;;;;:9;:15;;;;;;;;:23;;;;;;;;:30;;;;;;;;;;;38515:73;;-1:-1:-1;;;;;38551:15:0;;;;;;:9;:15;;;;;;;;:23;;;;;;;;:30;;;;;;;;:37;;-1:-1:-1;;38551:37:0;38584:4;38551:37;;;38430:166;;;:::o;29578:162::-;-1:-1:-1;;;;;29653:20:0;;29650:47;;29682:15;;-1:-1:-1;;;29682:15:0;;;;;;;;;;;29650:47;-1:-1:-1;;;;;29708:16:0;;;;;;;;:8;:16;;;;;:24;;-1:-1:-1;;29708:24:0;;;;;;;;;;29578:162::o;72753:391::-;72827:15;;:::i;:::-;72860:3;72855:8;;72875:11;72888:13;72905:51;72916:2;:8;;;72926:2;:14;;;72942:2;:13;;;72905:10;:51::i;:::-;72967:14;;;:23;;;;73001:13;;;:21;-1:-1:-1;;73058:33:0;;;;;;;;-1:-1:-1;;;;;42034:15:0;73113:23;:14;;;:23;72967:14;73113:2;-1:-1:-1;72753:391:0:o;50666:838::-;50832:13;50847:12;50861:27;50901:15;50919:11;:9;:11::i;:::-;50901:29;-1:-1:-1;42034:15:0;-1:-1:-1;;;;;50949:26:0;:2;:17;;;-1:-1:-1;;;;;50949:26:0;;50941:62;;;;-1:-1:-1;;;50941:62:0;;37099:2:1;50941:62:0;;;37081:21:1;37138:2;37118:18;;;37111:30;37177:25;37157:18;;;37150:53;37220:18;;50941:62:0;36897:347:1;50941:62:0;51025:2;:9;;;51014:20;;51053:23;:21;:23::i;:::-;51045:31;;51097:22;:20;:22::i;:::-;51087:32;;51130:50;51153:16;51171:8;51130:22;:50::i;:::-;51195:6;51191:306;51211:5;:12;51207:1;:16;51191:306;;;51245:13;51261:5;51267:1;51261:8;;;;;;;;:::i;:::-;;;;;;;:14;;;51245:30;;51290:22;51315:29;51328:8;51338:5;51315:12;:29::i;:::-;51290:54;;51359:39;51373:8;51383:7;51392:5;51359:13;:39::i;:::-;51413:71;51426:3;:8;;;51436;51446:37;51455:3;:6;;;:11;;;51468:14;51446:8;:37;;:::i;:::-;51413:12;:71::i;:::-;-1:-1:-1;;51225:3:0;;51191:306;;;;50890:614;50666:838;;;;;;;:::o;43067:215::-;43167:10;;43154:24;;;;:12;:24;;;;;;;;43150:125;;43207:10;;43194:24;;;;:12;:24;;;;;;;:31;;-1:-1:-1;;43194:31:0;43221:4;43194:31;;;;;;43240:12;:23;;;;;;;;;;;;;;;;;;;;;;;;;;43207:4;;43240:23;;;;;;;;:::i;:::-;;;;43067:215;:::o;43703:2365::-;43957:19;;:::i;:::-;43989:25;44017:13;;;:5;:13;;;;;;;;44031:10;;44017:25;;;;;;;;43989:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44053:2008;;44096:4;44083:17;;;:10;44132:17;;;:9;:17;;;;;;;;:24;;44115:42;;;:7;;;:42;44172:17;;;:24;;;;;;;;;44245:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42034:15;-1:-1:-1;;;;;44245:82:0;;;;;44302:1;44245:82;;;;44305:8;-1:-1:-1;;;;;44245:82:0;;;;;44315:5;-1:-1:-1;;;;;44245:82:0;;;;;44322:4;44245:82;;;44211:9;:17;44221:6;44211:17;;;;;;;;;;;44229:2;:7;;;44211:26;;;;;;;;;;:::i;:::-;;;;;;;;;;:116;;:26;;;;;;:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44211:116:0;;;-1:-1:-1;;;;;;44211:116:0;;;;-1:-1:-1;;;;;;;;44211:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44211:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:26;;:116;;;;;;;;;;:::i;:::-;-1:-1:-1;;;44342:13:0;;;;:5;:13;;;;;;;;44356:10;;44342:25;;;;;;;:30;;;;;;;;-1:-1:-1;;44342:30:0;;;;;;-1:-1:-1;;44342:30:0;;;;;;;;;;;;;;;;;-1:-1:-1;;44414:10:0;;44393:32;;44342:13;;44393:12;:32::i;:::-;:35;;;44387:41;;44448:16;44460:3;44448:16;;;;;;:::i;:::-;;;;;;;;44053:2008;;;44503:32;44516:6;44524:4;:10;;;44503:12;:32::i;:::-;:35;44582:8;;:20;;:35;;;;;;44636:8;;:39;;;;;;44720:8;;:17;;;44503:35;;-1:-1:-1;;;;;;44708:29:0;;;;;;44705:62;;44739:8;;-1:-1:-1;;;;;44739:28:0;;:17;;;;:28;44705:62;45114:1;45101:10;:14;:37;;;;-1:-1:-1;;;;;;45119:19:0;;;;45101:37;45098:814;;;45159:12;45210:3;:8;;;:14;;;-1:-1:-1;;;;;45201:23:0;:5;-1:-1:-1;;;;;45201:23:0;;45198:275;;-1:-1:-1;45258:4:0;45198:275;;;45314:8;;:19;;;:8;:24;45311:143;;-1:-1:-1;45367:8:0;;-1:-1:-1;;;;;45367:22:0;;:14;;;;:22;45426:4;45311:143;45494:7;45491:406;;;45585:10;-1:-1:-1;;;;;45529:23:0;;;930:10;45529:52;;-1:-1:-1;;;;;;45529:52:0;;;;;;;-1:-1:-1;;;;;37707:32:1;;;45529:52:0;;;37689:51:1;45575:4:0;37756:18:1;;;37749:60;37662:18;;45529:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;45526:352;;-1:-1:-1;;;;;45627:26:0;;;930:10;45668:5;;45627:59;;;;;;-1:-1:-1;;;;;;45627:59:0;;;-1:-1:-1;;;;;38040:32:1;;;45627:59:0;;;38022:51:1;45668:5:0;;38089:18:1;;;38082:60;38158:18;;;38151:34;;;37995:18;;45627:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45624:231;;;45763:8;;:19;;:33;;;;;;45624:231;45140:772;45098:814;45926:8;;-1:-1:-1;;;;;42034:15:0;45926:29;:20;;;;:29;45983:7;;;;46000:8;;45970:39;;45983:7;45992:6;;45970:12;:39::i;:::-;46029:20;46045:3;46029:20;;;;;;:::i;:::-;;;;;;;;44053:2008;43978:2090;43703:2365;;;;;;;;;:::o;73327:920::-;73437:16;73455;73473:13;73499:19;73554:10;-1:-1:-1;;;;;73536:28:0;:2;:14;;;-1:-1:-1;;;;;73536:28:0;;;73529:36;;;;:::i;:::-;73596:1;73579:2;:14;;;-1:-1:-1;;;;;73579:18:0;;:44;;;;-1:-1:-1;73601:8:0;;;;-1:-1:-1;;;;;73601:22:0;;;73579:44;73576:664;;;73672:2;:8;;;-1:-1:-1;;;;;73657:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73740:13;;;;73641:51;;-1:-1:-1;73740:17:0;73737:107;;73773:71;73803:10;73815:2;:13;;;73830;73773:2;:14;;;-1:-1:-1;;;;;73773:29:0;;;:71;;;;;;:::i;:::-;73759:85;;73737:107;73866:14;;;;:18;73863:98;;73900:61;73930:10;73942:2;:14;;;73958:2;73900;:14;;;-1:-1:-1;;;;;73900:29:0;;;:61;;;;;;:::i;:::-;73886:75;;73863:98;73983:16;;:20;73980:234;;74067:5;;;;;;;;;-1:-1:-1;;;;;74067:5:0;-1:-1:-1;;;;;74044:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74162:16;;74120:14;;;;74028:57;;-1:-1:-1;74120:74:0;;-1:-1:-1;;;;;74120:29:0;;74150:10;;74028:57;74120:29;:74::i;:::-;74108:86;;73980:234;73488:759;73327:920;;;;;:::o;28087:130::-;27766:4;27790:7;-1:-1:-1;;;27790:7:0;;;;28146:64;;28183:15;;-1:-1:-1;;;28183:15:0;;;;;;;;;;;69802:406;69893:17;;:::i;:::-;69928:32;69940:6;69948:5;69955:4;69928:11;:32::i;:::-;69923:37;-1:-1:-1;69974:9:0;;69971:68;;70000:5;;:27;;-1:-1:-1;;;70000:27:0;;;;;33006:25:1;;;-1:-1:-1;;;;;33067:32:1;;;33047:18;;;33040:60;70000:5:0;;;;:14;;32979:18:1;;70000:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;69971:68;70053:2;:8;;;:15;;;70049:152;;70085:8;;;;;70103:4;70085:15;;;;:22;70151:37;;38807:15:1;;;;-1:-1:-1;;38803:53:1;70151:37:0;;;38791:66:1;;;;38873:12;;;38866:28;;;38910:12;;;38903:28;;;38947:12;;70151:37:0;;;-1:-1:-1;;70151:37:0;;;;;;;;;70141:48;;70151:37;70141:48;;;;70122:8;;;;:16;:67;70049:152;69802:406;;;;;;:::o;75971:954::-;76154:6;76186:5;76126:1;76054:21;76254:17;;;;;:61;;-1:-1:-1;76284:4:0;76276:21;:38;-1:-1:-1;76276:38:0;76254:61;76251:294;;;-1:-1:-1;76412:3:0;;:29;;76375:3;76348:23;;;;;76347:31;;76398:9;;76412:3;;;;-1:-1:-1;;;;;76412:3:0;;76347:31;;76398:9;76412:29;76398:9;76412:29;76347:31;76412:3;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76397:44;;;76468:4;76460:25;;;;-1:-1:-1;;;76460:25:0;;39172:2:1;76460:25:0;;;39154:21:1;39211:1;39191:18;;;39184:29;-1:-1:-1;;;39229:18:1;;;39222:38;39277:18;;76460:25:0;38970:331:1;76460:25:0;76521:8;76504:25;;;;76317:228;76251:294;76577:1;76562:12;:16;:76;;;;-1:-1:-1;76583:38:0;;-1:-1:-1;;;76583:38:0;;76615:4;76583:38;;;21308:51:1;76625:12:0;;-1:-1:-1;;;;;76583:23:0;;;;;21281:18:1;;76583:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;76562:76;76559:348;;;-1:-1:-1;76697:3:0;76671:22;;;;;76670:30;-1:-1:-1;;;;;76722:19:0;;;76719:129;;76796:3;;76773:37;;-1:-1:-1;;;76773:37:0;;76796:3;;;;-1:-1:-1;;;;;76796:3:0;;;76773:37;;;39480:51:1;39547:18;;;39540:34;;;76773:22:0;;;;;39453:18:1;;76773:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76765:63;;;;-1:-1:-1;;;76765:63:0;;39787:2:1;76765:63:0;;;39769:21:1;39826:2;39806:18;;;39799:30;-1:-1:-1;;;39845:18:1;;;39838:43;39898:18;;76765:63:0;39585:337:1;76765:63:0;76882:8;76866:24;;;;76559:348;76099:826;;75971:954;;;;;;:::o;41216:134::-;41292:12;:15;;41265:14;;;41292:15;;;:::i;:::-;;;;-1:-1:-1;;41330:12:0;;;41216:134;-1:-1:-1;41216:134:0:o;40324:474::-;40416:17;;;;40413:377;;40607:24;:38;;42034:15;40479:46;40516:9;40500:25;;40479:46;40568:20;;;-1:-1:-1;;;;;40664:37:0;;-1:-1:-1;;;40664:37:0;;-1:-1:-1;;40664:37:0;;;;;;;;;;;;40479:18;39454:22;;;:14;:22;;;;;:33;;-1:-1:-1;;39454:33:0;;;;;;;40479:46;40720:43;39377:118;51727:1314;51815:25;;:::i;:::-;51854:13;;51851:1183;;51883:13;51899;51911:1;51899:9;:13;:::i;:::-;51883:29;;52025;52038:8;52048:5;52025:12;:29::i;:::-;52136:9;;:14;:19;;;;52174:23;;;;52216:26;;;;52261:25;;;;52305:28;;52352:20;;;;;52016:38;;-1:-1:-1;52069:318:0;;52110:7;;52305:28;52069:22;:318::i;:::-;-1:-1:-1;52456:9:0;;:14;52484:1;52456:25;;;;:29;;;52500:9;;:14;:26;;:30;;;52545:9;;:14;:32;42034:15;52592:9;;:14;-1:-1:-1;;;;;52592:35:0;;;:26;;;;:35;52655:11;;;;52678:9;;:14;52642:51;;52655:11;52668:8;;52642:12;:51::i;:::-;51868:837;51851:1183;;;52735:30;52748:9;52759:5;52735:12;:30::i;:::-;52847:9;;:14;:19;;;;52885:23;;;;52987:20;;;;;52726:39;;-1:-1:-1;52780:242:0;;52821:7;;52885:23;52847:9;;;;;;52780:22;:242::i;:::-;;51804:1237;51727:1314;;;:::o;57149:503::-;57337:10;-1:-1:-1;;;;;57369:15:0;;;;:33;;-1:-1:-1;;;;;;57388:14:0;;;57369:33;:51;;;-1:-1:-1;57406:14:0;;57369:51;57366:64;;;-1:-1:-1;57429:1:0;57422:8;;57366:64;57463:9;-1:-1:-1;;;;;57449:23:0;:10;-1:-1:-1;;;;;57449:23:0;;;57441:53;;;;-1:-1:-1;;;57441:53:0;;40129:2:1;57441:53:0;;;40111:21:1;40168:2;40148:18;;;40141:30;-1:-1:-1;;;40187:18:1;;;40180:47;40244:18;;57441:53:0;39927:341:1;57441:53:0;57542:14;;;:2;:14;;57616:9;-1:-1:-1;;;;;57581:31:0;;-1:-1:-1;;;;;57582:16:0;;;;57581:31;;;;;:::i;:::-;;57580:45;57579:53;;;;;:::i;:::-;;;57149:503;-1:-1:-1;;;;;;57149:503:0:o;-1:-1:-1:-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:255;218:2;212:9;260:6;248:19;;-1:-1:-1;;;;;282:34:1;;318:22;;;279:62;276:88;;;344:18;;:::i;:::-;380:2;373:22;146:255;:::o;406:257::-;478:4;472:11;;;510:17;;-1:-1:-1;;;;;542:34:1;;578:22;;;539:62;536:88;;;604:18;;:::i;668:251::-;740:2;734:9;782:2;770:15;;-1:-1:-1;;;;;800:34:1;;836:22;;;797:62;794:88;;;862:18;;:::i;924:275::-;995:2;989:9;1060:2;1041:13;;-1:-1:-1;;1037:27:1;1025:40;;-1:-1:-1;;;;;1080:34:1;;1116:22;;;1077:62;1074:88;;;1142:18;;:::i;:::-;1178:2;1171:22;924:275;;-1:-1:-1;924:275:1:o;1204:559::-;1247:5;1300:3;1293:4;1285:6;1281:17;1277:27;1267:55;;1318:1;1315;1308:12;1267:55;1358:6;1345:20;-1:-1:-1;;;;;1380:6:1;1377:30;1374:56;;;1410:18;;:::i;:::-;1454:59;1501:2;1478:17;;-1:-1:-1;;1474:31:1;1507:4;1470:42;1454:59;:::i;:::-;1538:6;1529:7;1522:23;1592:3;1585:4;1576:6;1568;1564:19;1560:30;1557:39;1554:59;;;1609:1;1606;1599:12;1554:59;1674:6;1667:4;1659:6;1655:17;1648:4;1639:7;1635:18;1622:59;1730:1;1701:20;;;1723:4;1697:31;1690:42;;;;1705:7;1204:559;-1:-1:-1;;;1204:559:1:o;1768:173::-;1836:20;;-1:-1:-1;;;;;1885:31:1;;1875:42;;1865:70;;1931:1;1928;1921:12;1946:510;2033:6;2041;2049;2102:2;2090:9;2081:7;2077:23;2073:32;2070:52;;;2118:1;2115;2108:12;2070:52;2158:9;2145:23;-1:-1:-1;;;;;2183:6:1;2180:30;2177:50;;;2223:1;2220;2213:12;2177:50;2246;2288:7;2279:6;2268:9;2264:22;2246:50;:::i;:::-;2236:60;-1:-1:-1;;2365:2:1;2350:18;;2337:32;;-1:-1:-1;2412:38:1;2446:2;2431:18;;2412:38;:::i;:::-;2402:48;;1946:510;;;;;:::o;2749:186::-;2808:6;2861:2;2849:9;2840:7;2836:23;2832:32;2829:52;;;2877:1;2874;2867:12;2829:52;2900:29;2919:9;2900:29;:::i;3049:784::-;3285:2;3297:21;;;3367:13;;3270:18;;;3389:22;;;3237:4;;3468:15;;;3442:2;3427:18;;;3237:4;3511:296;3525:6;3522:1;3519:13;3511:296;;;3584:13;;3626:9;;-1:-1:-1;;;;;3622:35:1;3610:48;;3720:2;3712:11;;;3706:18;3699:26;3692:34;3678:12;;;3671:56;3782:15;;;;3756:2;3747:12;;;;3654:1;3540:9;3511:296;;;-1:-1:-1;3824:3:1;;3049:784;-1:-1:-1;;;;;3049:784:1:o;3838:420::-;3915:6;3923;3931;3984:2;3972:9;3963:7;3959:23;3955:32;3952:52;;;4000:1;3997;3990:12;3952:52;4023:29;4042:9;4023:29;:::i;:::-;4013:39;4121:2;4106:18;;4093:32;;-1:-1:-1;4222:2:1;4207:18;;;4194:32;;3838:420;-1:-1:-1;;;3838:420:1:o;4485:399::-;4526:3;4564:5;4558:12;4591:6;4586:3;4579:19;4616:1;4626:139;4640:6;4637:1;4634:13;4626:139;;;4748:4;4733:13;;;4729:24;;4723:31;4703:11;;;4699:22;;4692:63;4655:12;4626:139;;;4630:3;4810:1;4803:4;4794:6;4789:3;4785:16;4781:27;4774:38;4873:4;4866:2;4862:7;4857:2;4849:6;4845:15;4841:29;4836:3;4832:39;4828:50;4821:57;;;4485:399;;;;:::o;4889:255::-;4980:5;4974:12;4969:3;4962:25;4944:3;5033:4;5026:5;5022:16;5016:23;5071:4;5064;5059:3;5055:14;5048:28;5092:46;5132:4;5127:3;5123:14;5109:12;5092:46;:::i;5149:446::-;5202:3;5240:5;5234:12;5267:6;5262:3;5255:19;5299:4;5294:3;5290:14;5283:21;;5338:4;5331:5;5327:16;5361:1;5371:199;5385:6;5382:1;5379:13;5371:199;;;5450:13;;-1:-1:-1;;;;;5446:39:1;5434:52;;5515:4;5506:14;;;;5543:17;;;;5482:1;5400:9;5371:199;;;-1:-1:-1;5586:3:1;;5149:446;-1:-1:-1;;;;5149:446:1:o;5600:1191::-;5651:3;5695:5;5689:12;5722:4;5717:3;5710:17;5765:12;5759:19;5752:4;5747:3;5743:14;5736:43;5833:4;5819:12;5815:23;5809:30;5804:2;5799:3;5795:12;5788:52;5895:4;5881:12;5877:23;5871:30;5865:3;5860;5856:13;5849:53;5957:2;5943:12;5939:21;5933:28;5970:48;6013:3;6008;6004:13;5988:14;-1:-1:-1;;;;;4435:38:1;4423:51;;4370:110;5970:48;-1:-1:-1;6073:3:1;6055:22;;6049:29;-1:-1:-1;;;;;4328:30:1;;6130:3;6121:13;;4316:43;-1:-1:-1;6190:3:1;6172:22;;6166:29;6160:3;6151:13;;6144:52;6251:3;6233:22;;6227:29;-1:-1:-1;;;;;3006:31:1;;6309:3;6300:13;;2994:44;-1:-1:-1;6369:3:1;6351:22;;6345:29;-1:-1:-1;;;;;3006:31:1;;6427:6;6418:16;;2994:44;-1:-1:-1;6490:3:1;6472:22;6466:29;6526:6;6520:3;6511:13;;6504:29;6555:61;6611:3;6602:13;;6466:29;6555:61;:::i;:::-;6542:74;;6664:4;6657:5;6653:16;6647:23;6713:3;6706:5;6702:15;6695:4;6690:3;6686:14;6679:39;6734:51;6779:5;6763:14;6734:51;:::i;6796:597::-;6857:3;6888;6920:5;6914:12;6947:6;6942:3;6935:19;6979:4;6974:3;6970:14;6963:21;;7037:4;7027:6;7024:1;7020:14;7013:5;7009:26;7005:37;7076:4;7069:5;7065:16;7099:1;7109:258;7123:6;7120:1;7117:13;7109:258;;;7210:2;7206:7;7198:5;7192:4;7188:16;7184:30;7179:3;7172:43;7236:47;7278:4;7269:6;7263:13;7236:47;:::i;:::-;7318:4;7343:14;;;;7228:55;;-1:-1:-1;7306:17:1;;;;;7145:1;7138:9;7109:258;;;-1:-1:-1;7383:4:1;;6796:597;-1:-1:-1;;;;;;6796:597:1:o;7398:908::-;7459:3;7490;7522:5;7516:12;7549:6;7544:3;7537:19;7581:4;7576:3;7572:14;7565:21;;7639:4;7629:6;7626:1;7622:14;7615:5;7611:26;7607:37;7678:4;7671:5;7667:16;7701:1;7711:569;7725:6;7722:1;7719:13;7711:569;;;7812:2;7808:7;7800:5;7794:4;7790:16;7786:30;7781:3;7774:43;7846:6;7840:13;7885:2;7879:9;7873:4;7866:23;7936:4;7932:2;7928:13;7922:20;7979:4;7972;7966;7962:15;7955:29;8011:67;8072:4;8066;8062:15;8048:12;8011:67;:::i;:::-;8133:4;8125:13;;;8119:20;-1:-1:-1;;;;;8115:53:1;8098:15;;;;8091:78;;;;8231:4;8256:14;;;;7997:81;;-1:-1:-1;8219:17:1;;;;;7747:1;7740:9;7711:569;;8311:605;8376:3;8407;8439:5;8433:12;8466:6;8461:3;8454:19;8498:4;8493:3;8489:14;8482:21;;8556:4;8546:6;8543:1;8539:14;8532:5;8528:26;8524:37;8595:4;8588:5;8584:16;8618:1;8628:262;8642:6;8639:1;8636:13;8628:262;;;8729:2;8725:7;8717:5;8711:4;8707:16;8703:30;8698:3;8691:43;8755:51;8801:4;8792:6;8786:13;8755:51;:::i;:::-;8841:4;8866:14;;;;8747:59;;-1:-1:-1;8829:17:1;;;;;8664:1;8657:9;8628:262;;8921:474;9012:12;;9005:20;8998:28;8986:41;;9076:4;9065:16;;;9059:23;9043:14;;;9036:47;9132:4;9121:16;;;9115:23;9099:14;;;9092:47;9188:4;9177:16;;;9171:23;9155:14;;;9148:47;9248:4;9237:16;;;9231:23;-1:-1:-1;;;;;9227:49:1;9211:14;;;9204:73;9264:3;9315:16;;;9309:23;9293:14;;;9286:47;9382:4;9371:16;;;9365:23;9349:14;;9342:47;8921:474::o;9594:1146::-;9652:3;9696:5;9690:12;9723:6;9718:3;9711:19;9751:48;9791:6;9786:3;9782:16;9768:12;9751:48;:::i;:::-;9739:60;;9847:4;9840:5;9836:16;9830:23;9895:3;9889:4;9885:14;9878:4;9873:3;9869:14;9862:38;9923;9956:4;9940:14;9923:38;:::i;:::-;9909:52;;;10009:4;10002:5;9998:16;9992:23;10024:49;10067:4;10062:3;10058:14;10042;9476:10;9465:22;9453:35;;9400:94;10024:49;;10121:4;10114:5;10110:16;10104:23;10171:3;10163:6;10159:16;10152:4;10147:3;10143:14;10136:40;10199;10232:6;10216:14;10199:40;:::i;:::-;10185:54;;;10287:4;10280:5;10276:16;10270:23;10302:49;10345:4;10340:3;10336:14;10320;-1:-1:-1;;;;;4328:30:1;4316:43;;4263:102;10302:49;;10399:4;10392:5;10388:16;10382:23;10414:49;10457:4;10452:3;10448:14;10432;9575:6;9564:18;9552:31;;9499:90;10414:49;;10511:4;10504:5;10500:16;10494:23;10526:49;10569:4;10564:3;10560:14;10544;-1:-1:-1;;;;;4328:30:1;4316:43;;4263:102;10526:49;;10623:4;10616:5;10612:16;10606:23;10673:3;10665:6;10661:16;10654:4;10649:3;10645:14;10638:40;10694;10727:6;10711:14;10694:40;:::i;11042:4189::-;11110:3;11141;11173:5;11167:12;11200:6;11195:3;11188:19;11232:4;11227:3;11223:14;11216:21;;11290:4;11280:6;11277:1;11273:14;11266:5;11262:26;11258:37;11329:4;11322:5;11318:16;11352:1;11362:3843;11376:6;11373:1;11370:13;11362:3843;;;-1:-1:-1;;11441:16:1;;;11437:30;11425:43;;11491:13;;11572:9;;11559:23;;11629:4;11621:13;;;11615:20;11541:4;11655:15;;;11648:29;;;11738:19;;11531:15;;;11770:24;;;11925:23;;;11826:4;11876:1;11872:16;;;11862:27;;11858:38;;;11816:15;;;;-1:-1:-1;11986:3108:1;12002:8;11997:3;11994:17;11986:3108;;;12106:2;12102:7;12095:4;12087:6;12083:17;12079:31;12072:5;12065:46;12144:8;12138:15;12170:48;12211:6;12206:2;12200:9;12170:48;:::i;:::-;12271:4;12267:2;12263:13;12257:20;12320:6;12313:4;12305:6;12301:17;12294:33;12370:3;12362:6;12358:16;12419:14;12413:21;12479:4;12470:6;12462;12458:19;12451:33;12514:6;12559:14;12553:21;12606:8;12598:6;12591:24;12653:3;12645:6;12641:16;12632:25;;12723:3;12711:8;12708:1;12704:16;12696:6;12692:29;12688:39;12674:53;;12780:4;12764:14;12760:25;12744:41;;12813:1;12831:1780;12847:8;12842:3;12839:17;12831:1780;;;-1:-1:-1;;12936:19:1;;;12932:34;12918:49;;12998:15;;13108:9;;13060:4;13138:20;;;13235:21;;13048:17;;;13277:24;;;13343:4;13403:1;13399:16;;;13387:29;;13383:40;;;13480:4;13460:25;;13331:17;;;;-1:-1:-1;13539:738:1;13555:8;13550:3;13547:17;13539:738;;;13677:2;13673:7;13664:6;13656;13652:19;13648:33;13641:5;13634:48;13723:8;13717:15;13785:2;13779:9;13828:4;13820:6;13813:20;13872:51;13917:4;13909:6;13905:17;13889:14;13872:51;:::i;:::-;13992:4;13984:13;;;13978:20;-1:-1:-1;;;;;13974:45:1;13955:17;;;13948:72;14099:4;14091:13;;;14085:20;14078:28;14071:36;14052:17;;;;14045:63;;;;-1:-1:-1;13858:65:1;14186:19;;;;14239:16;;;;;13583:1;13574:11;13539:738;;;13543:3;;;;14334:4;14330:2;14326:13;14320:20;14298:42;;14399:6;14391;14387:19;14380:4;14372:6;14368:17;14361:46;14438:57;14488:6;14472:14;14438:57;:::i;:::-;14428:67;-1:-1:-1;;;14542:4:1;14528:19;;;;14577:16;;;;;12875:1;12866:11;12831:1780;;;-1:-1:-1;;;;14676:4:1;14656:25;;;14650:32;10823:12;;14758:3;14746:16;;10811:25;10878:16;;;10872:23;10897:4;10868:34;10852:14;;;10845:58;10952:4;10941:16;;;10935:23;10919:14;;;10912:47;11022:4;11011:16;;;11005:23;10998:31;10991:39;10975:14;;;10968:63;14808:13;;14802:20;2531:13;2524:21;14883:6;14871:19;;2512:34;14942:13;;;;14936:20;14927:6;14915:19;;;14908:49;;;;15019:19;;;;14984:6;15064:16;;;;;12030:1;12021:11;11986:3108;;;-1:-1:-1;;;15156:4:1;15181:14;;;;15115:6;;-1:-1:-1;15144:17:1;;;;;-1:-1:-1;11398:1:1;11391:9;11362:3843;;15236:1097;15417:2;15406:9;15399:21;15380:4;15445:6;15439:13;15494:2;15488:9;15483:2;15472:9;15468:18;15461:37;-1:-1:-1;;;;;15552:2:1;15548;15544:11;15538:18;15534:43;15529:2;15518:9;15514:18;15507:71;-1:-1:-1;;;;;15632:2:1;15628;15624:11;15618:18;15614:43;15609:2;15598:9;15594:18;15587:71;15709:2;15705;15701:11;15695:18;15689:3;15678:9;15674:19;15667:47;;15761:2;15753:6;15749:15;15743:22;15802:4;15796:3;15785:9;15781:19;15774:33;15830:71;15896:3;15885:9;15881:19;15867:12;15830:71;:::i;:::-;15816:85;;15950:2;15942:6;15938:15;15932:22;16023:2;16019:7;16007:9;15999:6;15995:22;15991:36;15985:3;15974:9;15970:19;15963:65;16051:64;16108:6;16092:14;16051:64;:::i;:::-;16037:78;;;16164:2;16156:6;16152:15;16146:22;16238:2;16234:7;16222:9;16214:6;16210:22;16206:36;16199:4;16188:9;16184:20;16177:66;16260:67;16320:6;16304:14;16260:67;:::i;16338:466::-;16415:6;16423;16431;16484:2;16472:9;16463:7;16459:23;16455:32;16452:52;;;16500:1;16497;16490:12;16452:52;-1:-1:-1;;16545:23:1;;;16665:2;16650:18;;16637:32;;-1:-1:-1;16768:2:1;16753:18;;;16740:32;;16338:466;-1:-1:-1;16338:466:1:o;16809:194::-;16880:4;-1:-1:-1;;;;;16905:6:1;16902:30;16899:56;;;16935:18;;:::i;:::-;-1:-1:-1;16980:1:1;16976:14;16992:4;16972:25;;16809:194::o;17008:171::-;17075:20;;-1:-1:-1;;;;;17124:30:1;;17114:41;;17104:69;;17169:1;17166;17159:12;17184:118;17270:5;17263:13;17256:21;17249:5;17246:32;17236:60;;17292:1;17289;17282:12;17307:163;17374:20;;17434:10;17423:22;;17413:33;;17403:61;;17460:1;17457;17450:12;17475:159;17542:20;;17602:6;17591:18;;17581:29;;17571:57;;17624:1;17621;17614:12;17639:1245;17706:5;17754:6;17742:9;17737:3;17733:19;17729:32;17726:52;;;17774:1;17771;17764:12;17726:52;17796:22;;:::i;:::-;17787:31;;17854:9;17841:23;-1:-1:-1;;;;;17879:6:1;17876:30;17873:50;;;17919:1;17916;17909:12;17873:50;17946:46;17988:3;17979:6;17968:9;17964:22;17946:46;:::i;:::-;17939:5;17932:61;;18046:2;18035:9;18031:18;18018:32;-1:-1:-1;;;;;18065:8:1;18062:32;18059:52;;;18107:1;18104;18097:12;18059:52;18143:48;18187:3;18176:8;18165:9;18161:24;18143:48;:::i;:::-;18138:2;18131:5;18127:14;18120:72;;18224:37;18257:2;18246:9;18242:18;18224:37;:::i;:::-;18219:2;18212:5;18208:14;18201:61;18315:2;18304:9;18300:18;18287:32;-1:-1:-1;;;;;18334:8:1;18331:32;18328:52;;;18376:1;18373;18366:12;18328:52;18412:48;18456:3;18445:8;18434:9;18430:24;18412:48;:::i;:::-;18407:2;18400:5;18396:14;18389:72;;18494:38;18527:3;18516:9;18512:19;18494:38;:::i;:::-;18488:3;18481:5;18477:15;18470:63;18566:38;18599:3;18588:9;18584:19;18566:38;:::i;:::-;18560:3;18553:5;18549:15;18542:63;18638:38;18671:3;18660:9;18656:19;18638:38;:::i;:::-;18632:3;18625:5;18621:15;18614:63;18730:3;18719:9;18715:19;18702:33;-1:-1:-1;;;;;18750:8:1;18747:32;18744:52;;;18792:1;18789;18782:12;18744:52;18829:48;18873:3;18862:8;18851:9;18847:24;18829:48;:::i;:::-;18823:3;18816:5;18812:15;18805:73;;17639:1245;;;;:::o;18889:2268::-;18999:6;19007;19015;19068:2;19056:9;19047:7;19043:23;19039:32;19036:52;;;19084:1;19081;19074:12;19036:52;19107:29;19126:9;19107:29;:::i;:::-;19097:39;;19187:2;19176:9;19172:18;19159:32;-1:-1:-1;;;;;19206:6:1;19203:30;19200:50;;;19246:1;19243;19236:12;19200:50;19269:22;;19325:4;19307:16;;;19303:27;19300:47;;;19343:1;19340;19333:12;19300:47;19369:22;;:::i;:::-;19429:2;19416:16;-1:-1:-1;;;;;19447:8:1;19444:32;19441:52;;;19489:1;19486;19479:12;19441:52;19512:17;;19560:4;19552:13;;19548:27;-1:-1:-1;19538:55:1;;19589:1;19586;19579:12;19538:55;19629:2;19616:16;19652:75;19668:58;19719:6;19668:58;:::i;:::-;19652:75;:::i;:::-;19749:3;19773:6;19768:3;19761:19;19805:2;19800:3;19796:12;19789:19;;19860:2;19850:6;19847:1;19843:14;19839:2;19835:23;19831:32;19817:46;;19886:7;19878:6;19875:19;19872:39;;;19907:1;19904;19897:12;19872:39;19939:2;19935;19931:11;19951:832;19967:6;19962:3;19959:15;19951:832;;;20053:3;20040:17;-1:-1:-1;;;;;20076:11:1;20073:35;20070:55;;;20121:1;20118;20111:12;20070:55;20148:20;;20220:2;20192:16;;;-1:-1:-1;;20188:30:1;20184:39;20181:59;;;20236:1;20233;20226:12;20181:59;20268:22;;:::i;:::-;20340:2;20336;20332:11;20319:25;-1:-1:-1;;;;;20363:8:1;20360:32;20357:52;;;20405:1;20402;20395:12;20357:52;20438:54;20484:7;20479:2;20468:8;20464:2;20460:17;20456:26;20438:54;:::i;:::-;20429:7;20422:71;;20531:32;20557:4;20553:2;20549:13;20531:32;:::i;:::-;20526:2;20517:7;20513:16;20506:58;20613:2;20609;20605:11;20592:25;20577:40;;20630:30;20652:7;20630:30;:::i;:::-;20693:4;20680:18;;20673:35;;;;20721:20;;20770:2;20761:12;;;;19984;19951:832;;;-1:-1:-1;20792:20:1;;-1:-1:-1;;;20858:2:1;20850:11;;20837:25;-1:-1:-1;;;;;20874:32:1;;20871:52;;;20919:1;20916;20909:12;20871:52;20955:66;21013:7;21002:8;20998:2;20994:17;20955:66;:::i;:::-;20950:2;20939:14;;20932:90;-1:-1:-1;18889:2268:1;;20943:5;;-1:-1:-1;;;;21119:4:1;21104:20;;;;21091:34;;18889:2268::o;21370:1064::-;21464:6;21517:2;21505:9;21496:7;21492:23;21488:32;21485:52;;;21533:1;21530;21523:12;21485:52;21573:9;21560:23;-1:-1:-1;;;;;21598:6:1;21595:30;21592:50;;;21638:1;21635;21628:12;21592:50;21661:22;;21714:4;21706:13;;21702:27;-1:-1:-1;21692:55:1;;21743:1;21740;21733:12;21692:55;21783:2;21770:16;21806:75;21822:58;21873:6;21822:58;:::i;21806:75::-;21903:3;21927:6;21922:3;21915:19;21959:2;21954:3;21950:12;21943:19;;22014:2;22004:6;22001:1;21997:14;21993:2;21989:23;21985:32;21971:46;;22040:7;22032:6;22029:19;22026:39;;;22061:1;22058;22051:12;22026:39;22093:2;22089;22085:11;22105:299;22121:6;22116:3;22113:15;22105:299;;;22207:3;22194:17;-1:-1:-1;;;;;22230:11:1;22227:35;22224:55;;;22275:1;22272;22265:12;22224:55;22304:57;22353:7;22348:2;22334:11;22330:2;22326:20;22322:29;22304:57;:::i;:::-;22292:70;;-1:-1:-1;22391:2:1;22382:12;;;;22138;22105:299;;;-1:-1:-1;22423:5:1;21370:1064;-1:-1:-1;;;;;;21370:1064:1:o;22439:805::-;22630:2;22612:21;;;22703:13;;22752:4;22732:18;;;22725:32;22806:19;;22671:2;22656:18;;22834:22;;;22593:4;;22914:21;;;;;22593:4;;22887:3;22872:19;;;22963:194;22977:6;22974:1;22971:13;22963:194;;;23026:49;23071:3;23062:6;23056:13;23026:49;:::i;:::-;23104:4;23099:3;23095:14;23088:21;;23144:2;23136:6;23132:15;23122:25;;22999:1;22996;22992:9;22987:14;;22963:194;;;22967:3;23213:2;23205:6;23201:15;23195:22;23188:4;23177:9;23173:20;23166:52;23235:3;23227:11;;;;;22439:805;;;;:::o;23249:321::-;23480:2;23469:9;23462:21;23443:4;23500:64;23560:2;23549:9;23545:18;23537:6;23500:64;:::i;23575:783::-;23679:6;23687;23695;23703;23711;23719;23772:3;23760:9;23751:7;23747:23;23743:33;23740:53;;;23789:1;23786;23779:12;23740:53;23834:23;;;-1:-1:-1;23954:2:1;23939:18;;23926:32;;-1:-1:-1;24057:2:1;24042:18;;24029:32;;-1:-1:-1;24160:2:1;24145:18;;24132:32;;-1:-1:-1;24263:3:1;24248:19;;24235:33;;-1:-1:-1;24313:39:1;24347:3;24332:19;;24313:39;:::i;:::-;24303:49;;23575:783;;;;;;;;:::o;24363:226::-;24422:6;24475:2;24463:9;24454:7;24450:23;24446:32;24443:52;;;24491:1;24488;24481:12;24443:52;-1:-1:-1;24536:23:1;;24363:226;-1:-1:-1;24363:226:1:o;24594:184::-;24652:6;24705:2;24693:9;24684:7;24680:23;24676:32;24673:52;;;24721:1;24718;24711:12;24673:52;24744:28;24762:9;24744:28;:::i;24783:298::-;24850:6;24858;24911:2;24899:9;24890:7;24886:23;24882:32;24879:52;;;24927:1;24924;24917:12;24879:52;24972:23;;;-1:-1:-1;25038:37:1;25071:2;25056:18;;25038:37;:::i;:::-;25028:47;;24783:298;;;;;:::o;25428:127::-;25489:10;25484:3;25480:20;25477:1;25470:31;25520:4;25517:1;25510:15;25544:4;25541:1;25534:15;25560:127;25621:10;25616:3;25612:20;25609:1;25602:31;25652:4;25649:1;25642:15;25676:4;25673:1;25666:15;25692:135;25731:3;25752:17;;;25749:43;;25772:18;;:::i;:::-;-1:-1:-1;25819:1:1;25808:13;;25692:135::o;25832:334::-;26034:2;26016:21;;;26073:2;26053:18;;;26046:30;-1:-1:-1;;;26107:2:1;26092:18;;26085:40;26157:2;26142:18;;25832:334::o;26171:184::-;26241:6;26294:2;26282:9;26273:7;26269:23;26265:32;26262:52;;;26310:1;26307;26300:12;26262:52;-1:-1:-1;26333:16:1;;26171:184;-1:-1:-1;26171:184:1:o;27756:380::-;27835:1;27831:12;;;;27878;;;27899:61;;27953:4;27945:6;27941:17;27931:27;;27899:61;28006:2;27998:6;27995:14;27975:18;27972:38;27969:161;;28052:10;28047:3;28043:20;28040:1;28033:31;28087:4;28084:1;28077:15;28115:4;28112:1;28105:15;27969:161;;27756:380;;;:::o;28266:517::-;28367:2;28362:3;28359:11;28356:421;;;28403:5;28400:1;28393:16;28447:4;28444:1;28434:18;28517:2;28505:10;28501:19;28498:1;28494:27;28488:4;28484:38;28553:4;28541:10;28538:20;28535:47;;;-1:-1:-1;28576:4:1;28535:47;28631:2;28626:3;28622:12;28619:1;28615:20;28609:4;28605:31;28595:41;;28686:81;28704:2;28697:5;28694:13;28686:81;;;28763:1;28749:16;;28730:1;28719:13;28686:81;;28959:1295;29083:3;29077:10;-1:-1:-1;;;;;29102:6:1;29099:30;29096:56;;;29132:18;;:::i;:::-;29161:96;29250:6;29210:38;29242:4;29236:11;29210:38;:::i;:::-;29204:4;29161:96;:::i;:::-;29306:4;29337:2;29326:14;;29354:1;29349:648;;;;30041:1;30058:6;30055:89;;;-1:-1:-1;30110:19:1;;;30104:26;30055:89;-1:-1:-1;;28916:1:1;28912:11;;;28908:24;28904:29;28894:40;28940:1;28936:11;;;28891:57;30157:81;;29319:929;;29349:648;28213:1;28206:14;;;28250:4;28237:18;;-1:-1:-1;;29385:20:1;;;29502:222;29516:7;29513:1;29510:14;29502:222;;;29598:19;;;29592:26;29577:42;;29705:4;29690:20;;;;29658:1;29646:14;;;;29532:12;29502:222;;;29506:3;29752:6;29743:7;29740:19;29737:201;;;29813:19;;;29807:26;-1:-1:-1;;29896:1:1;29892:14;;;29908:3;29888:24;29884:37;29880:42;29865:58;29850:74;;29737:201;-1:-1:-1;;;;29984:1:1;29968:14;;;29964:22;29951:36;;-1:-1:-1;28959:1295:1:o;30259:1501::-;30510:6;30499:9;30492:25;30553:6;30548:2;30537:9;30533:18;30526:34;30596:2;30591;30580:9;30576:18;30569:30;30473:4;30637:3;30626:9;30622:19;30676:6;30670:13;30719:2;30714;30703:9;30699:18;30692:30;30742:6;30777:12;30771:19;30814:6;30806;30799:22;30852:3;30841:9;30837:19;30830:26;;30915:3;30905:6;30902:1;30898:14;30887:9;30883:30;30879:40;30865:54;;30960:2;30946:12;30942:21;30928:35;;30981:1;30991:562;31005:6;31002:1;30999:13;30991:562;;;31098:3;31094:8;31082:9;31074:6;31070:22;31066:37;31061:3;31054:50;31133:6;31127:13;31181:2;31175:9;31212:2;31204:6;31197:18;31242:49;31287:2;31279:6;31275:15;31259:14;31242:49;:::i;:::-;31346:2;31338:11;;;31332:18;-1:-1:-1;;;;;31328:43:1;31311:15;;;31304:68;31437:2;31429:11;;;31423:18;31416:26;31409:34;31392:15;;;;31385:59;;;;-1:-1:-1;31228:63:1;31496:15;;;;31531:12;;;;;31027:1;31020:9;30991:562;;;-1:-1:-1;;;;31602:2:1;31590:15;;31584:22;31647;;;-1:-1:-1;;31643:36:1;31637:3;31622:19;;31615:65;31697:57;31651:6;31584:22;31697:57;:::i;31765:128::-;31832:9;;;31853:11;;;31850:37;;;31867:18;;:::i;32247:244::-;32358:10;32331:18;;;32351;;;32327:43;32390:28;;;;32437:24;;;32427:58;;32465:18;;:::i;33111:245::-;33178:6;33231:2;33219:9;33210:7;33206:23;33202:32;33199:52;;;33247:1;33244;33237:12;33199:52;33279:9;33273:16;33298:28;33320:5;33298:28;:::i;33707:475::-;34002:6;33991:9;33984:25;34045:6;34040:2;34029:9;34025:18;34018:34;34088:2;34083;34072:9;34068:18;34061:30;33965:4;34108:68;34172:2;34161:9;34157:18;34149:6;34108:68;:::i;35076:127::-;35137:10;35132:3;35128:20;35125:1;35118:31;35168:4;35165:1;35158:15;35192:4;35189:1;35182:15;36265:148;36353:4;36332:12;;;36346;;;36328:31;;36371:13;;36368:39;;;36387:18;;:::i;36765:127::-;36826:10;36821:3;36817:20;36814:1;36807:31;36857:4;36854:1;36847:15;36881:4;36878:1;36871:15;37249:261;37430:2;37419:9;37412:21;37393:4;37450:54;37500:2;37489:9;37485:18;37477:6;37450:54;:::i;38196:127::-;38257:10;38252:3;38248:20;38245:1;38238:31;38288:4;38285:1;38278:15;38312:4;38309:1;38302:15;38328:273;38396:6;38449:2;38437:9;38428:7;38424:23;38420:32;38417:52;;;38465:1;38462;38455:12;38417:52;38497:9;38491:16;38547:4;38540:5;38536:16;38529:5;38526:27;38516:55;;38567:1;38564;38557:12

Swarm Source

ipfs://cd2551b841c7ab2ee101bcd93b958a38c0e1e9919a092d487496632d04dbc0da

Block Transaction Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
0x42B55484D8F550991820dC08C670f36C91325636
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.