Token MoonEdge

 

Overview ERC-20

Price
$0.00 @ 0.003619 MATIC (-0.59%)
Fully Diluted Market Cap
Total Supply:
199,998,635.854982 MOONED

Holders:
91,716 addresses

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

A decentralized launchpad fully dedicated to IDO on Polygon.

Market

Volume (24H):$38.08
Market Capitalization:$378,109.00
Circulating Supply:116,727,499.00 MOONED
Market Data Source: Coinmarketcap


Update? Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x3135f74e7ef16c53f02be20083a42e71783c1e35

Contract Name:
MoonedgeChild

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-13
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// File: @openzeppelin/contracts/utils/Context.sol

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

// File: @openzeppelin/contracts/utils/Address.sol

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
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);
}


/**
 * @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}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The defaut value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these 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 override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 value {ERC20} uses, unless this function is
     * 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 override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

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

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), currentAllowance - amount);

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` 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.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

// File: contracts/token/ERC20/extensions/ERC20Capped.sol

/**
 * @dev Extension of {ERC20} that adds a cap to the supply of tokens.
 */
abstract contract ERC20Capped is ERC20 {
    uint256 private _cap;

    /**
     * @dev Sets the value of the `cap`. This value is immutable, it can only be
     * set once during construction.
     */
    constructor (uint256 cap_) {
        require(cap_ > 0, "ERC20Capped: cap is 0");
        _cap = cap_;
    }

    /**
     * @dev Returns the cap on the token's total supply.
     */
    function cap() public view virtual returns (uint256) {
        return _cap;
    }

    /**
     * @dev See {ERC20-_mint}.
     */
    function _mint(address account, uint256 amount) internal virtual override {
        require(ERC20.totalSupply() + amount <= cap(), "ERC20Capped: cap exceeded");
        super._mint(account, amount);
    }
}

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: contracts/token/ERC20/utils/ERC20Fallback.sol

abstract contract ERC20Fallback {
    using Address for address;
    using SafeERC20 for IERC20;

    event TokenWithdrawn(IERC20 token, address indexed to, uint256 value);

    /**
    * @dev Faalback Redeem tokens. The ability to redeem token whe okenst are accidentally sent to the contract
    * @param token_ Address of the IERC20 token
    * @param to_ address Recipient of the recovered tokens
    * @param amount_ Number of tokens to be emitted
    */
    function fallbackRedeem(IERC20 token_,  address to_, uint256 amount_) external {
      _prevalidateFallbackRedeem(token_, to_, amount_);

      _processFallbackRedeem(token_, to_, amount_);
      emit TokenWithdrawn(token_, to_, amount_);

      _updateFallbackRedeem(token_, to_, amount_);
      _postValidateFallbackRedeem(token_, to_, amount_);
    }

    /**
    * @dev Validation of an fallback redeem. Use require statements to revert state when conditions are not met.
    * Use `super` in contracts that inherit from TokenEscrow to extend their validations.
    * Example from TokenEscrow.sol's _prevalidateFallbackRedeem method:
    *     super._prevalidateFallbackRedeem(token, payee, amount);
    *    
    * @param token_ The token address of IERC20 token
    * @param to_ Address performing the token deposit
    * @param amount_ Number of tokens deposit
    *
    * Requirements:
    *
    * - `msg.sender` must be owner.
    * - `token` cannot be the zero address.
    * - `to` cannot be the zero address.
    * - this address must have a token balance of at least `amount`.
    */
    function _prevalidateFallbackRedeem(IERC20 token_,  address to_, uint256 amount_) internal virtual view {
      require(address(token_) != address(0), "ERC20Fallback: token is the zero address");
      require(to_ != address(0), "ERC20Fallback: cannot recover to zero address");
      require(amount_ != 0, "ERC20Fallback: amount is 0");
      
      uint256 amount = token_.balanceOf(address(this));
      require(amount >= amount_, "ERC20Fallback: no token to release");
      this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
    }

    /**
    * @dev Executed when fallbackRedeem has been validated and is ready to be executed. Doesn't necessarily emit/send
    * tokens.
    * @param token_ The token address of IERC20 token
    * @param to_ Address where the token sent to
    * @param amount_ Number of tokens deposit
    */
    function _processFallbackRedeem(IERC20 token_,address to_, uint256 amount_) internal virtual {
      _deliverTokens(token_, to_, amount_);
    }

    /**
    * @dev Override for extensions that require an internal state to check for validity fallback redeem,
    * etc.)
    * @param token_ The token address of IERC20 token
    * @param to_ Address where the token sent to
    * @param amount_ Number of tokens deposit
    */
    function _updateFallbackRedeem(IERC20 token_, address to_, uint256 amount_) internal virtual {
      // solhint-disable-previous-line no-empty-blocks
    }

    /**
    * @dev Validation of an executed fallback redeem. Observe state and use revert statements to undo rollback when valid
    * conditions are not met.
    * @param token_ The token address of IERC20 token
    * @param to_ Address where the token sent to
    * @param amount_ Number of tokens deposit
    */
    function _postValidateFallbackRedeem(IERC20 token_, address to_, uint256 amount_) internal virtual view {
      // solhint-disable-previous-line no-empty-blocks
    }

    /**
     * @dev Source of tokens. Override this method to modify the way in which the tokenescrow ultimately gets and sends
     * its tokens.
     * @param token_ The token address of IERC20 token
     * @param to_ Address where the token sent to
     * @param amount_ Number of tokens to be emitted
     */
    function _deliverTokens(IERC20 token_, address to_, uint256 amount_) internal virtual returns (bool) {
      token_.safeTransfer(to_, amount_);
      return true;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

// File: @openzeppelin/contracts/access/AccessControl.sol

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    function hasRole(bytes32 role, address account) external view returns (bool);
    function getRoleAdmin(bytes32 role) external view returns (bytes32);
    function grantRole(bytes32 role, address account) external;
    function revokeRole(bytes32 role, address account) external;
    function renounceRole(bytes32 role, address account) external;
}

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping (address => bool) members;
        bytes32 adminRole;
    }

    mapping (bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId
            || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if(!hasRole(role, account)) {
            revert(string(abi.encodePacked(
                "AccessControl: account ",
                Strings.toHexString(uint160(account), 20),
                " is missing role ",
                Strings.toHexString(uint256(role), 32)
            )));
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
        _roles[role].adminRole = adminRole;
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: contracts/MoonedgeChild.sol

contract MoonedgeChild is AccessControl, ERC20Capped, ERC20Fallback, Ownable {
    uint8 immutable private _decimals;
    bytes32 public constant DEPOSITOR_ROLE = keccak256("DEPOSITOR_ROLE");

    address private _childChainManagerProxy = 0xA6FA4fB5f76172d178d61B04b0ecd319C5d1C0aa; //matic mainnet

    constructor (
        string memory name_,
        string memory symbol_,
        uint8 decimals_,
        address initialAccount,
        uint256 initialBalance,
        uint256 supplyCap
    ) 
        ERC20(name_, symbol_) 
        ERC20Capped(supplyCap * (uint256(10) ** decimals_))
        ERC20Fallback()
    {
        require(initialAccount != address(0), "MoonedgeChild: initialAccount is a zero address");
        _decimals = decimals_;
        uint256 newSupply = initialBalance * (uint256(10) ** decimals_);
        _mint(initialAccount, newSupply);
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
        _setupRole(DEPOSITOR_ROLE, childChainManagerProxy());
    }

    /**
    * @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 value {ERC20} uses, unless {decimals} is
    * set in constructor.
    *
    * 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 override returns (uint8) {
        return _decimals;
    }

    //-------------------------------------------------------------------------------------------
    //Matic Child Functions 
    //-------------------------------------------------------------------------------------------

    /**
     * @notice called when token is deposited on root chain
     * @dev Should be callable only by ChildChainManager
     * Should handle deposit by minting the required amount for user
     * Make sure minting is done only by this function
     * @param user user address for whom deposit is being done
     * @param depositData abi encoded amount
     */

    function deposit(address user, bytes calldata depositData)
        external
        onlyRole(DEPOSITOR_ROLE)
    {
        uint256 amount = abi.decode(depositData, (uint256));
        _mint(user, amount);
    }

    /**
     * @notice called when user wants to withdraw tokens back to root chain
     * @dev Should burn user's tokens. This transaction will be verified when exiting on root chain
     * @param amount amount of tokens to withdraw
     */
    function withdraw(uint256 amount) external {
        _burn(_msgSender(), amount);
    }

    /**
     * @notice Example function to handle minting tokens on matic chain
     * @dev Minting can be done as per requirement,
     * This implementation allows only admin to mint tokens but it can be changed as per requirement
     * @param user user for whom tokens are being minted
     * @param amount amount of token to mint
     */
    function mint(address user, uint256 amount) public onlyRole(DEPOSITOR_ROLE) {
        _mint(user, amount);
    }

    function childChainManagerProxy() public view returns(address) {
        return _childChainManagerProxy;
    }

    /**
    * @dev Validation of an fallback redeem. Use require statements to revert state when conditions are not met.
    * Use `super` in contracts that inherit from TokenEscrow to extend their validations.
    * Example from TokenEscrow.sol's _prevalidateFallbackRedeem method:
    *     super._prevalidateFallbackRedeem(token, payee, amount);
    *    
    * @param token_ The token address of IERC20 token
    * @param to_ Address performing the token deposit
    * @param amount_ Number of tokens deposit
    *
    * Requirements:
    *
    * - `msg.sender` must be owner.
    * - `token` cannot be the zero address.
    * - `to` cannot be the zero address.
    * - this address must have a token balance of at least `amount`.
    * - must be admin
    */
    function _prevalidateFallbackRedeem(IERC20 token_,  address to_, uint256 amount_) 
        internal 
        virtual
        override
        view
        onlyRole(DEFAULT_ADMIN_ROLE) 
    {
        super._prevalidateFallbackRedeem(token_, to_, amount_);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"address","name":"initialAccount","type":"address"},{"internalType":"uint256","name":"initialBalance","type":"uint256"},{"internalType":"uint256","name":"supplyCap","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokenWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSITOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"childChainManagerProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes","name":"depositData","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"fallbackRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","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":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405273a6fa4fb5f76172d178d61b04b0ecd319c5d1c0aa600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b506040516200499d3803806200499d83398181016040528101906200008c91906200081f565b83600a6200009b919062000b61565b81620000a8919062000c9e565b86868160049080519060200190620000c2929190620006b8565b508060059080519060200190620000db929190620006b8565b5050506000811162000124576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200011b90620009b6565b60405180910390fd5b806006819055505060006200013e6200030560201b60201c565b905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002479062000994565b60405180910390fd5b8360ff1660808160ff1660f81b81525050600084600a62000272919062000b61565b836200027f919062000c9e565b90506200029384826200030d60201b60201c565b620002b76000801b620002ab6200030560201b60201c565b6200039e60201b60201c565b620002f87f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a9620002ec620003b460201b60201c565b6200039e60201b60201c565b5050505050505062000faf565b600033905090565b6200031d620003de60201b60201c565b8162000333620003e860201b620006cb1760201c565b6200033f919062000aa9565b111562000383576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200037a90620009d8565b60405180910390fd5b6200039a8282620003f260201b6200111a1760201c565b5050565b620003b082826200055860201b60201c565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600654905090565b6000600354905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000465576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200045c90620009fa565b60405180910390fd5b62000479600083836200064960201b60201c565b80600360008282546200048d919062000aa9565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620004e5919062000aa9565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200054c919062000a1c565b60405180910390a35050565b6200056a82826200064e60201b60201c565b6200064557600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620005ea6200030560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b505050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054620006c69062000d80565b90600052602060002090601f016020900481019282620006ea576000855562000736565b82601f106200070557805160ff191683800117855562000736565b8280016001018555821562000736579182015b828111156200073557825182559160200191906001019062000718565b5b50905062000745919062000749565b5090565b5b80821115620007645760008160009055506001016200074a565b5090565b60006200077f620007798462000a62565b62000a39565b9050828152602081018484840111156200079857600080fd5b620007a584828562000d4a565b509392505050565b600081519050620007be8162000f61565b92915050565b600082601f830112620007d657600080fd5b8151620007e884826020860162000768565b91505092915050565b600081519050620008028162000f7b565b92915050565b600081519050620008198162000f95565b92915050565b60008060008060008060c087890312156200083957600080fd5b600087015167ffffffffffffffff8111156200085457600080fd5b6200086289828a01620007c4565b965050602087015167ffffffffffffffff8111156200088057600080fd5b6200088e89828a01620007c4565b9550506040620008a189828a0162000808565b9450506060620008b489828a01620007ad565b9350506080620008c789828a01620007f1565b92505060a0620008da89828a01620007f1565b9150509295509295509295565b6000620008f6602f8362000a98565b9150620009038262000e97565b604082019050919050565b60006200091d60158362000a98565b91506200092a8262000ee6565b602082019050919050565b60006200094460198362000a98565b9150620009518262000f0f565b602082019050919050565b60006200096b601f8362000a98565b9150620009788262000f38565b602082019050919050565b6200098e8162000d33565b82525050565b60006020820190508181036000830152620009af81620008e7565b9050919050565b60006020820190508181036000830152620009d1816200090e565b9050919050565b60006020820190508181036000830152620009f38162000935565b9050919050565b6000602082019050818103600083015262000a15816200095c565b9050919050565b600060208201905062000a33600083018462000983565b92915050565b600062000a4562000a58565b905062000a53828262000db6565b919050565b6000604051905090565b600067ffffffffffffffff82111562000a805762000a7f62000e4a565b5b62000a8b8262000e79565b9050602081019050919050565b600082825260208201905092915050565b600062000ab68262000d33565b915062000ac38362000d33565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000afb5762000afa62000dec565b5b828201905092915050565b6000808291508390505b600185111562000b585780860481111562000b305762000b2f62000dec565b5b600185161562000b405780820291505b808102905062000b508562000e8a565b945062000b10565b94509492505050565b600062000b6e8262000d33565b915062000b7b8362000d3d565b925062000baa7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000bb2565b905092915050565b60008262000bc4576001905062000c97565b8162000bd4576000905062000c97565b816001811462000bed576002811462000bf85762000c2e565b600191505062000c97565b60ff84111562000c0d5762000c0c62000dec565b5b8360020a91508482111562000c275762000c2662000dec565b5b5062000c97565b5060208310610133831016604e8410600b841016171562000c685782820a90508381111562000c625762000c6162000dec565b5b62000c97565b62000c77848484600162000b06565b9250905081840481111562000c915762000c9062000dec565b5b81810290505b9392505050565b600062000cab8262000d33565b915062000cb88362000d33565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000cf45762000cf362000dec565b5b828202905092915050565b600062000d0c8262000d13565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101562000d6a57808201518184015260208101905062000d4d565b8381111562000d7a576000848401525b50505050565b6000600282049050600182168062000d9957607f821691505b6020821081141562000db05762000daf62000e1b565b5b50919050565b62000dc18262000e79565b810181811067ffffffffffffffff8211171562000de35762000de262000e4a565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f4d6f6f6e656467654368696c643a20696e697469616c4163636f756e7420697360008201527f2061207a65726f20616464726573730000000000000000000000000000000000602082015250565b7f45524332304361707065643a2063617020697320300000000000000000000000600082015250565b7f45524332304361707065643a2063617020657863656564656400000000000000600082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b62000f6c8162000cff565b811462000f7857600080fd5b50565b62000f868162000d33565b811462000f9257600080fd5b50565b62000fa08162000d3d565b811462000fac57600080fd5b50565b60805160f81c6139cf62000fce600039600061083601526139cf6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806362f629e7116100f9578063a3b0b5a311610097578063cf2c52cb11610071578063cf2c52cb1461051d578063d547741f14610539578063dd62ed3e14610555578063f2fde38b14610585576101c4565b8063a3b0b5a31461049f578063a457c2d7146104bd578063a9059cbb146104ed576101c4565b80638da5cb5b116100d35780638da5cb5b1461041557806391d148541461043357806395d89b4114610463578063a217fddf14610481576101c4565b806362f629e7146103bd57806370a08231146103db578063715018a61461040b576101c4565b80632f2ff15d1161016657806336568abe1161014057806336568abe14610339578063395093511461035557806340c10f191461038557806359e39c36146103a1576101c4565b80632f2ff15d146102e1578063313ce567146102fd578063355274ea1461031b576101c4565b806318160ddd116101a257806318160ddd1461024757806323b872dd14610265578063248a9ca3146102955780632e1a7d4d146102c5576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063095ea7b314610217575b600080fd5b6101e360048036038101906101de91906126e4565b6105a1565b6040516101f09190612c80565b60405180910390f35b61020161061b565b60405161020e9190612cdf565b60405180910390f35b610231600480360381019061022c919061261a565b6106ad565b60405161023e9190612c80565b60405180910390f35b61024f6106cb565b60405161025c9190612fc1565b60405180910390f35b61027f600480360381019061027a9190612573565b6106d5565b60405161028c9190612c80565b60405180910390f35b6102af60048036038101906102aa919061267f565b6107d6565b6040516102bc9190612c9b565b60405180910390f35b6102df60048036038101906102da919061275c565b6107f5565b005b6102fb60048036038101906102f691906126a8565b610809565b005b610305610832565b6040516103129190612fdc565b60405180910390f35b61032361085a565b6040516103309190612fc1565b60405180910390f35b610353600480360381019061034e91906126a8565b610864565b005b61036f600480360381019061036a919061261a565b6108e7565b60405161037c9190612c80565b60405180910390f35b61039f600480360381019061039a919061261a565b610993565b005b6103bb60048036038101906103b6919061270d565b6109d4565b005b6103c5610a55565b6040516103d29190612c3c565b60405180910390f35b6103f560048036038101906103f0919061250e565b610a7f565b6040516104029190612fc1565b60405180910390f35b610413610ac8565b005b61041d610c05565b60405161042a9190612c3c565b60405180910390f35b61044d600480360381019061044891906126a8565b610c2f565b60405161045a9190612c80565b60405180910390f35b61046b610c99565b6040516104789190612cdf565b60405180910390f35b610489610d2b565b6040516104969190612c9b565b60405180910390f35b6104a7610d32565b6040516104b49190612c9b565b60405180910390f35b6104d760048036038101906104d2919061261a565b610d56565b6040516104e49190612c80565b60405180910390f35b6105076004803603810190610502919061261a565b610e4a565b6040516105149190612c80565b60405180910390f35b610537600480360381019061053291906125c2565b610e68565b005b610553600480360381019061054e91906126a8565b610ebe565b005b61056f600480360381019061056a9190612537565b610ee7565b60405161057c9190612fc1565b60405180910390f35b61059f600480360381019061059a919061250e565b610f6e565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061061457506106138261126f565b5b9050919050565b60606004805461062a90613236565b80601f016020809104026020016040519081016040528092919081815260200182805461065690613236565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050505050905090565b60006106c16106ba6112d9565b84846112e1565b6001905092915050565b6000600354905090565b60006106e28484846114ac565b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061072d6112d9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156107ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a490612e21565b60405180910390fd5b6107ca856107b96112d9565b85846107c591906130e4565b6112e1565b60019150509392505050565b6000806000838152602001908152602001600020600101549050919050565b6108066108006112d9565b8261172e565b50565b610812826107d6565b6108238161081e6112d9565b611904565b61082d83836119a1565b505050565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b6000600654905090565b61086c6112d9565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d090612f81565b60405180910390fd5b6108e38282611a81565b5050565b60006109896108f46112d9565b8484600260006109026112d9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546109849190613034565b6112e1565b6001905092915050565b7f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a96109c5816109c06112d9565b611904565b6109cf8383611b62565b505050565b6109df838383611bcc565b6109ea838383611bf2565b8173ffffffffffffffffffffffffffffffffffffffff167f8210728e7c071f615b840ee026032693858fbcd5e5359e67e438c890f59e56208483604051610a32929190612cb6565b60405180910390a2610a45838383611c03565b610a50838383611c08565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ad06112d9565b73ffffffffffffffffffffffffffffffffffffffff16610aee610c05565b73ffffffffffffffffffffffffffffffffffffffff1614610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b90612e41565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060058054610ca890613236565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd490613236565b8015610d215780601f10610cf657610100808354040283529160200191610d21565b820191906000526020600020905b815481529060010190602001808311610d0457829003601f168201915b5050505050905090565b6000801b81565b7f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a981565b60008060026000610d656112d9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1990612f61565b60405180910390fd5b610e3f610e2d6112d9565b858584610e3a91906130e4565b6112e1565b600191505092915050565b6000610e5e610e576112d9565b84846114ac565b6001905092915050565b7f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a9610e9a81610e956112d9565b611904565b60008383810190610eab919061275c565b9050610eb78582611b62565b5050505050565b610ec7826107d6565b610ed881610ed36112d9565b611904565b610ee28383611a81565b505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610f766112d9565b73ffffffffffffffffffffffffffffffffffffffff16610f94610c05565b73ffffffffffffffffffffffffffffffffffffffff1614610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe190612e41565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105190612d61565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561118a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118190612fa1565b60405180910390fd5b61119660008383611c0d565b80600360008282546111a89190613034565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111fe9190613034565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112639190612fc1565b60405180910390a35050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134890612ee1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b890612d81565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161149f9190612fc1565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561151c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151390612ea1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561158c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158390612d21565b60405180910390fd5b611597838383611c0d565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561161e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161590612da1565b60405180910390fd5b818161162a91906130e4565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116bc9190613034565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117209190612fc1565b60405180910390a350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561179e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179590612e61565b60405180910390fd5b6117aa82600083611c0d565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182890612d41565b60405180910390fd5b818161183d91906130e4565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816003600082825461189291906130e4565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118f79190612fc1565b60405180910390a3505050565b61190e8282610c2f565b61199d576119338173ffffffffffffffffffffffffffffffffffffffff166014611c12565b6119418360001c6020611c12565b604051602001611952929190612c02565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119949190612cdf565b60405180910390fd5b5050565b6119ab8282610c2f565b611a7d57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a226112d9565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611a8b8282610c2f565b15611b5e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b036112d9565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611b6a61085a565b81611b736106cb565b611b7d9190613034565b1115611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb590612ec1565b60405180910390fd5b611bc8828261111a565b5050565b6000801b611be181611bdc6112d9565b611904565b611bec848484611f0c565b50505050565b611bfd838383612106565b50505050565b505050565b505050565b505050565b606060006002836002611c25919061308a565b611c2f9190613034565b67ffffffffffffffff811115611c6e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ca05781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611cfe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611d88577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611dc8919061308a565b611dd29190613034565b90505b6001811115611ebe577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611e3a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110611e77577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611eb79061320c565b9050611dd5565b5060008414611f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef990612d01565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390612e81565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe390612dc1565b60405180910390fd5b6000811415612030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202790612e01565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161206b9190612c3c565b60206040518083038186803b15801561208357600080fd5b505afa158015612097573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120bb9190612785565b905081811015612100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f790612f21565b60405180910390fd5b50505050565b600061213383838673ffffffffffffffffffffffffffffffffffffffff1661213e9092919063ffffffff16565b600190509392505050565b6121bf8363a9059cbb60e01b848460405160240161215d929190612c57565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506121c4565b505050565b6000612226826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661228b9092919063ffffffff16565b905060008151111561228657808060200190518101906122469190612656565b612285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227c90612f41565b60405180910390fd5b5b505050565b606061229a84846000856122a3565b90509392505050565b6060824710156122e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122df90612de1565b60405180910390fd5b6122f1856123b7565b612330576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232790612f01565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516123599190612beb565b60006040518083038185875af1925050503d8060008114612396576040519150601f19603f3d011682016040523d82523d6000602084013e61239b565b606091505b50915091506123ab8282866123ca565b92505050949350505050565b600080823b905060008111915050919050565b606083156123da5782905061242a565b6000835111156123ed5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124219190612cdf565b60405180910390fd5b9392505050565b6000813590506124408161390f565b92915050565b60008151905061245581613926565b92915050565b60008135905061246a8161393d565b92915050565b60008135905061247f81613954565b92915050565b60008083601f84011261249757600080fd5b8235905067ffffffffffffffff8111156124b057600080fd5b6020830191508360018202830111156124c857600080fd5b9250929050565b6000813590506124de8161396b565b92915050565b6000813590506124f381613982565b92915050565b60008151905061250881613982565b92915050565b60006020828403121561252057600080fd5b600061252e84828501612431565b91505092915050565b6000806040838503121561254a57600080fd5b600061255885828601612431565b925050602061256985828601612431565b9150509250929050565b60008060006060848603121561258857600080fd5b600061259686828701612431565b93505060206125a786828701612431565b92505060406125b8868287016124e4565b9150509250925092565b6000806000604084860312156125d757600080fd5b60006125e586828701612431565b935050602084013567ffffffffffffffff81111561260257600080fd5b61260e86828701612485565b92509250509250925092565b6000806040838503121561262d57600080fd5b600061263b85828601612431565b925050602061264c858286016124e4565b9150509250929050565b60006020828403121561266857600080fd5b600061267684828501612446565b91505092915050565b60006020828403121561269157600080fd5b600061269f8482850161245b565b91505092915050565b600080604083850312156126bb57600080fd5b60006126c98582860161245b565b92505060206126da85828601612431565b9150509250929050565b6000602082840312156126f657600080fd5b600061270484828501612470565b91505092915050565b60008060006060848603121561272257600080fd5b6000612730868287016124cf565b935050602061274186828701612431565b9250506040612752868287016124e4565b9150509250925092565b60006020828403121561276e57600080fd5b600061277c848285016124e4565b91505092915050565b60006020828403121561279757600080fd5b60006127a5848285016124f9565b91505092915050565b6127b781613118565b82525050565b6127c68161312a565b82525050565b6127d581613136565b82525050565b60006127e682612ff7565b6127f0818561300d565b93506128008185602086016131d9565b80840191505092915050565b612815816131b5565b82525050565b600061282682613002565b6128308185613018565b93506128408185602086016131d9565b612849816132c6565b840191505092915050565b600061285f82613002565b6128698185613029565b93506128798185602086016131d9565b80840191505092915050565b6000612892602083613018565b915061289d826132d7565b602082019050919050565b60006128b5602383613018565b91506128c082613300565b604082019050919050565b60006128d8602283613018565b91506128e38261334f565b604082019050919050565b60006128fb602683613018565b91506129068261339e565b604082019050919050565b600061291e602283613018565b9150612929826133ed565b604082019050919050565b6000612941602683613018565b915061294c8261343c565b604082019050919050565b6000612964602d83613018565b915061296f8261348b565b604082019050919050565b6000612987602683613018565b9150612992826134da565b604082019050919050565b60006129aa601a83613018565b91506129b582613529565b602082019050919050565b60006129cd602883613018565b91506129d882613552565b604082019050919050565b60006129f0602083613018565b91506129fb826135a1565b602082019050919050565b6000612a13602183613018565b9150612a1e826135ca565b604082019050919050565b6000612a36602883613018565b9150612a4182613619565b604082019050919050565b6000612a59602583613018565b9150612a6482613668565b604082019050919050565b6000612a7c601983613018565b9150612a87826136b7565b602082019050919050565b6000612a9f602483613018565b9150612aaa826136e0565b604082019050919050565b6000612ac2601d83613018565b9150612acd8261372f565b602082019050919050565b6000612ae5602283613018565b9150612af082613758565b604082019050919050565b6000612b08601783613029565b9150612b13826137a7565b601782019050919050565b6000612b2b602a83613018565b9150612b36826137d0565b604082019050919050565b6000612b4e602583613018565b9150612b598261381f565b604082019050919050565b6000612b71601183613029565b9150612b7c8261386e565b601182019050919050565b6000612b94602f83613018565b9150612b9f82613897565b604082019050919050565b6000612bb7601f83613018565b9150612bc2826138e6565b602082019050919050565b612bd68161319e565b82525050565b612be5816131a8565b82525050565b6000612bf782846127db565b915081905092915050565b6000612c0d82612afb565b9150612c198285612854565b9150612c2482612b64565b9150612c308284612854565b91508190509392505050565b6000602082019050612c5160008301846127ae565b92915050565b6000604082019050612c6c60008301856127ae565b612c796020830184612bcd565b9392505050565b6000602082019050612c9560008301846127bd565b92915050565b6000602082019050612cb060008301846127cc565b92915050565b6000604082019050612ccb600083018561280c565b612cd86020830184612bcd565b9392505050565b60006020820190508181036000830152612cf9818461281b565b905092915050565b60006020820190508181036000830152612d1a81612885565b9050919050565b60006020820190508181036000830152612d3a816128a8565b9050919050565b60006020820190508181036000830152612d5a816128cb565b9050919050565b60006020820190508181036000830152612d7a816128ee565b9050919050565b60006020820190508181036000830152612d9a81612911565b9050919050565b60006020820190508181036000830152612dba81612934565b9050919050565b60006020820190508181036000830152612dda81612957565b9050919050565b60006020820190508181036000830152612dfa8161297a565b9050919050565b60006020820190508181036000830152612e1a8161299d565b9050919050565b60006020820190508181036000830152612e3a816129c0565b9050919050565b60006020820190508181036000830152612e5a816129e3565b9050919050565b60006020820190508181036000830152612e7a81612a06565b9050919050565b60006020820190508181036000830152612e9a81612a29565b9050919050565b60006020820190508181036000830152612eba81612a4c565b9050919050565b60006020820190508181036000830152612eda81612a6f565b9050919050565b60006020820190508181036000830152612efa81612a92565b9050919050565b60006020820190508181036000830152612f1a81612ab5565b9050919050565b60006020820190508181036000830152612f3a81612ad8565b9050919050565b60006020820190508181036000830152612f5a81612b1e565b9050919050565b60006020820190508181036000830152612f7a81612b41565b9050919050565b60006020820190508181036000830152612f9a81612b87565b9050919050565b60006020820190508181036000830152612fba81612baa565b9050919050565b6000602082019050612fd66000830184612bcd565b92915050565b6000602082019050612ff16000830184612bdc565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061303f8261319e565b915061304a8361319e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561307f5761307e613268565b5b828201905092915050565b60006130958261319e565b91506130a08361319e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156130d9576130d8613268565b5b828202905092915050565b60006130ef8261319e565b91506130fa8361319e565b92508282101561310d5761310c613268565b5b828203905092915050565b60006131238261317e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061317782613118565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006131c0826131c7565b9050919050565b60006131d28261317e565b9050919050565b60005b838110156131f75780820151818401526020810190506131dc565b83811115613206576000848401525b50505050565b60006132178261319e565b9150600082141561322b5761322a613268565b5b600182039050919050565b6000600282049050600182168061324e57607f821691505b6020821081141561326257613261613297565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f455243323046616c6c6261636b3a2063616e6e6f74207265636f76657220746f60008201527f207a65726f206164647265737300000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f455243323046616c6c6261636b3a20616d6f756e742069732030000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243323046616c6c6261636b3a20746f6b656e20697320746865207a65726f60008201527f2061646472657373000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332304361707065643a2063617020657863656564656400000000000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f455243323046616c6c6261636b3a206e6f20746f6b656e20746f2072656c656160008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61391881613118565b811461392357600080fd5b50565b61392f8161312a565b811461393a57600080fd5b50565b61394681613136565b811461395157600080fd5b50565b61395d81613140565b811461396857600080fd5b50565b6139748161316c565b811461397f57600080fd5b50565b61398b8161319e565b811461399657600080fd5b5056fea264697066735822122073f414b870e9f1989712359659eec9a99fc868b6b7bc34356910d76e02b3c94f64736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000baa146f6ec22dcbcb56ac8f97fab62e95d5ae552000000000000000000000000000000000000000000000000000000000bebc200000000000000000000000000000000000000000000000000000000000bebc20000000000000000000000000000000000000000000000000000000000000000084d6f6f6e4564676500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064d4f4f4e45440000000000000000000000000000000000000000000000000000

Deployed ByteCode Sourcemap

46657:4568:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42151:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14365:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16532:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15485:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17183:422;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43462:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49483:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43847:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48299:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23685:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44895:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18014:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49930:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28370:361;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50052:112;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15656:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33744:148;;;:::i;:::-;;33093:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42460:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14584:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40425:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46781:68;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18732:377;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15996:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49012:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44239:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16234:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34047:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42151:217;42236:4;42275:32;42260:47;;;:11;:47;;;;:100;;;;42324:36;42348:11;42324:23;:36::i;:::-;42260:100;42253:107;;42151:217;;;:::o;14365:100::-;14419:13;14452:5;14445:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14365:100;:::o;16532:169::-;16615:4;16632:39;16641:12;:10;:12::i;:::-;16655:7;16664:6;16632:8;:39::i;:::-;16689:4;16682:11;;16532:169;;;;:::o;15485:108::-;15546:7;15573:12;;15566:19;;15485:108;:::o;17183:422::-;17289:4;17306:36;17316:6;17324:9;17335:6;17306:9;:36::i;:::-;17355:24;17382:11;:19;17394:6;17382:19;;;;;;;;;;;;;;;:33;17402:12;:10;:12::i;:::-;17382:33;;;;;;;;;;;;;;;;17355:60;;17454:6;17434:16;:26;;17426:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;17516:57;17525:6;17533:12;:10;:12::i;:::-;17566:6;17547:16;:25;;;;:::i;:::-;17516:8;:57::i;:::-;17593:4;17586:11;;;17183:422;;;;;:::o;43462:123::-;43528:7;43555:6;:12;43562:4;43555:12;;;;;;;;;;;:22;;;43548:29;;43462:123;;;:::o;49483:89::-;49537:27;49543:12;:10;:12::i;:::-;49557:6;49537:5;:27::i;:::-;49483:89;:::o;43847:147::-;43930:18;43943:4;43930:12;:18::i;:::-;42029:30;42040:4;42046:12;:10;:12::i;:::-;42029:10;:30::i;:::-;43961:25:::1;43972:4;43978:7;43961:10;:25::i;:::-;43847:147:::0;;;:::o;48299:100::-;48357:5;48382:9;48375:16;;48299:100;:::o;23685:83::-;23729:7;23756:4;;23749:11;;23685:83;:::o;44895:218::-;45002:12;:10;:12::i;:::-;44991:23;;:7;:23;;;44983:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;45079:26;45091:4;45097:7;45079:11;:26::i;:::-;44895:218;;:::o;18014:215::-;18102:4;18119:80;18128:12;:10;:12::i;:::-;18142:7;18188:10;18151:11;:25;18163:12;:10;:12::i;:::-;18151:25;;;;;;;;;;;;;;;:34;18177:7;18151:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;18119:8;:80::i;:::-;18217:4;18210:11;;18014:215;;;;:::o;49930:114::-;46822:27;42029:30;42040:4;42046:12;:10;:12::i;:::-;42029:10;:30::i;:::-;50017:19:::1;50023:4;50029:6;50017:5;:19::i;:::-;49930:114:::0;;;:::o;28370:361::-;28458:48;28485:6;28493:3;28498:7;28458:26;:48::i;:::-;28517:44;28540:6;28548:3;28553:7;28517:22;:44::i;:::-;28598:3;28575:36;;;28590:6;28603:7;28575:36;;;;;;;:::i;:::-;;;;;;;;28622:43;28644:6;28652:3;28657:7;28622:21;:43::i;:::-;28674:49;28702:6;28710:3;28715:7;28674:27;:49::i;:::-;28370:361;;;:::o;50052:112::-;50106:7;50133:23;;;;;;;;;;;50126:30;;50052:112;:::o;15656:127::-;15730:7;15757:9;:18;15767:7;15757:18;;;;;;;;;;;;;;;;15750:25;;15656:127;;;:::o;33744:148::-;33324:12;:10;:12::i;:::-;33313:23;;:7;:5;:7::i;:::-;:23;;;33305:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33851:1:::1;33814:40;;33835:6;;;;;;;;;;;33814:40;;;;;;;;;;;;33882:1;33865:6;;:19;;;;;;;;;;;;;;;;;;33744:148::o:0;33093:87::-;33139:7;33166:6;;;;;;;;;;;33159:13;;33093:87;:::o;42460:139::-;42538:4;42562:6;:12;42569:4;42562:12;;;;;;;;;;;:20;;:29;42583:7;42562:29;;;;;;;;;;;;;;;;;;;;;;;;;42555:36;;42460:139;;;;:::o;14584:104::-;14640:13;14673:7;14666:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14584:104;:::o;40425:49::-;40470:4;40425:49;;;:::o;46781:68::-;46822:27;46781:68;:::o;18732:377::-;18825:4;18842:24;18869:11;:25;18881:12;:10;:12::i;:::-;18869:25;;;;;;;;;;;;;;;:34;18895:7;18869:34;;;;;;;;;;;;;;;;18842:61;;18942:15;18922:16;:35;;18914:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;19010:67;19019:12;:10;:12::i;:::-;19033:7;19061:15;19042:16;:34;;;;:::i;:::-;19010:8;:67::i;:::-;19097:4;19090:11;;;18732:377;;;;:::o;15996:175::-;16082:4;16099:42;16109:12;:10;:12::i;:::-;16123:9;16134:6;16099:9;:42::i;:::-;16159:4;16152:11;;15996:175;;;;:::o;49012:216::-;46822:27;42029:30;42040:4;42046:12;:10;:12::i;:::-;42029:10;:30::i;:::-;49139:14:::1;49167:11;;49156:34;;;;;;;:::i;:::-;49139:51;;49201:19;49207:4;49213:6;49201:5;:19::i;:::-;42070:1;49012:216:::0;;;;:::o;44239:149::-;44323:18;44336:4;44323:12;:18::i;:::-;42029:30;42040:4;42046:12;:10;:12::i;:::-;42029:10;:30::i;:::-;44354:26:::1;44366:4;44372:7;44354:11;:26::i;:::-;44239:149:::0;;;:::o;16234:151::-;16323:7;16350:11;:18;16362:5;16350:18;;;;;;;;;;;;;;;:27;16369:7;16350:27;;;;;;;;;;;;;;;;16343:34;;16234:151;;;;:::o;34047:244::-;33324:12;:10;:12::i;:::-;33313:23;;:7;:5;:7::i;:::-;:23;;;33305:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34156:1:::1;34136:22;;:8;:22;;;;34128:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34246:8;34217:38;;34238:6;;;;;;;;;;;34217:38;;;;;;;;;;;;34275:8;34266:6;;:17;;;;;;;;;;;;;;;;;;34047:244:::0;:::o;20485:338::-;20588:1;20569:21;;:7;:21;;;;20561:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;20639:49;20668:1;20672:7;20681:6;20639:20;:49::i;:::-;20717:6;20701:12;;:22;;;;;;;:::i;:::-;;;;;;;;20756:6;20734:9;:18;20744:7;20734:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;20799:7;20778:37;;20795:1;20778:37;;;20808:6;20778:37;;;;;;:::i;:::-;;;;;;;;20485:338;;:::o;35881:157::-;35966:4;36005:25;35990:40;;;:11;:40;;;;35983:47;;35881:157;;;:::o;655:98::-;708:7;735:10;728:17;;655:98;:::o;22088:346::-;22207:1;22190:19;;:5;:19;;;;22182:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22288:1;22269:21;;:7;:21;;;;22261:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22372:6;22342:11;:18;22354:5;22342:18;;;;;;;;;;;;;;;:27;22361:7;22342:27;;;;;;;;;;;;;;;:36;;;;22410:7;22394:32;;22403:5;22394:32;;;22419:6;22394:32;;;;;;:::i;:::-;;;;;;;;22088:346;;;:::o;19599:604::-;19723:1;19705:20;;:6;:20;;;;19697:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;19807:1;19786:23;;:9;:23;;;;19778:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;19862:47;19883:6;19891:9;19902:6;19862:20;:47::i;:::-;19922:21;19946:9;:17;19956:6;19946:17;;;;;;;;;;;;;;;;19922:41;;19999:6;19982:13;:23;;19974:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20095:6;20079:13;:22;;;;:::i;:::-;20059:9;:17;20069:6;20059:17;;;;;;;;;;;;;;;:42;;;;20136:6;20112:9;:20;20122:9;20112:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;20177:9;20160:35;;20169:6;20160:35;;;20188:6;20160:35;;;;;;:::i;:::-;;;;;;;;19599:604;;;;:::o;21156:494::-;21259:1;21240:21;;:7;:21;;;;21232:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;21312:49;21333:7;21350:1;21354:6;21312:20;:49::i;:::-;21374:22;21399:9;:18;21409:7;21399:18;;;;;;;;;;;;;;;;21374:43;;21454:6;21436:14;:24;;21428:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;21548:6;21531:14;:23;;;;:::i;:::-;21510:9;:18;21520:7;21510:18;;;;;;;;;;;;;;;:44;;;;21581:6;21565:12;;:22;;;;;;;:::i;:::-;;;;;;;;21631:1;21605:37;;21614:7;21605:37;;;21635:6;21605:37;;;;;;:::i;:::-;;;;;;;;21156:494;;;:::o;42889:384::-;42969:22;42977:4;42983:7;42969;:22::i;:::-;42965:301;;43101:41;43129:7;43101:41;;43139:2;43101:19;:41::i;:::-;43199:38;43227:4;43219:13;;43234:2;43199:19;:38::i;:::-;43022:230;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43008:246;;;;;;;;;;;:::i;:::-;;;;;;;;42965:301;42889:384;;:::o;46143:229::-;46218:22;46226:4;46232:7;46218;:22::i;:::-;46213:152;;46289:4;46257:6;:12;46264:4;46257:12;;;;;;;;;;;:20;;:29;46278:7;46257:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;46340:12;:10;:12::i;:::-;46313:40;;46331:7;46313:40;;46325:4;46313:40;;;;;;;;;;46213:152;46143:229;;:::o;46380:230::-;46455:22;46463:4;46469:7;46455;:22::i;:::-;46451:152;;;46526:5;46494:6;:12;46501:4;46494:12;;;;;;;;;;;:20;;:29;46515:7;46494:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;46578:12;:10;:12::i;:::-;46551:40;;46569:7;46551:40;;46563:4;46551:40;;;;;;;;;;46451:152;46380:230;;:::o;23826:207::-;23951:5;:3;:5::i;:::-;23941:6;23919:19;:17;:19::i;:::-;:28;;;;:::i;:::-;:37;;23911:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;23997:28;24009:7;24018:6;23997:11;:28::i;:::-;23826:207;;:::o;50954:268::-;40470:4;51123:18;;42029:30;42040:4;42046:12;:10;:12::i;:::-;42029:10;:30::i;:::-;51160:54:::1;51193:6;51201:3;51206:7;51160:32;:54::i;:::-;50954:268:::0;;;;:::o;30426:146::-;30528:36;30543:6;30551:3;30556:7;30528:14;:36::i;:::-;;30426:146;;;:::o;30868:157::-;;;;:::o;31356:168::-;;;;:::o;23037:92::-;;;;:::o;37622:447::-;37697:13;37723:19;37768:1;37759:6;37755:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;37745:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37723:47;;37781:15;:6;37788:1;37781:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;37807;:6;37814:1;37807:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;37838:9;37863:1;37854:6;37850:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;37838:26;;37833:131;37870:1;37866;:5;37833:131;;;37905:8;37922:3;37914:5;:11;37905:21;;;;;;;;;;;;;;;;;;37893:6;37900:1;37893:9;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;37951:1;37941:11;;;;;37873:3;;;;:::i;:::-;;;37833:131;;;;37991:1;37982:5;:10;37974:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38054:6;38040:21;;;37622:447;;;;:::o;29498:617::-;29646:1;29619:29;;29627:6;29619:29;;;;29611:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;29725:1;29710:17;;:3;:17;;;;29702:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;29805:1;29794:7;:12;;29786:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;29854:14;29871:6;:16;;;29896:4;29871:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29854:48;;29929:7;29919:6;:17;;29911:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;29498:617;;;;:::o;31852:171::-;31947:4;31962:33;31982:3;31987:7;31962:6;:19;;;;:33;;;;;:::i;:::-;32011:4;32004:11;;31852:171;;;;;:::o;24634:177::-;24717:86;24737:5;24767:23;;;24792:2;24796:5;24744:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24717:19;:86::i;:::-;24634:177;;;:::o;27068:761::-;27492:23;27518:69;27546:4;27518:69;;;;;;;;;;;;;;;;;27526:5;27518:27;;;;:69;;;;;:::i;:::-;27492:95;;27622:1;27602:10;:17;:21;27598:224;;;27744:10;27733:30;;;;;;;;;;;;:::i;:::-;27725:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;27598:224;27068:761;;;:::o;7428:195::-;7531:12;7563:52;7585:6;7593:4;7599:1;7602:12;7563:21;:52::i;:::-;7556:59;;7428:195;;;;;:::o;8480:530::-;8607:12;8665:5;8640:21;:30;;8632:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;8732:18;8743:6;8732:10;:18::i;:::-;8724:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;8858:12;8872:23;8899:6;:11;;8919:5;8927:4;8899:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8857:75;;;;8950:52;8968:7;8977:10;8989:12;8950:17;:52::i;:::-;8943:59;;;;8480:530;;;;;;:::o;4510:422::-;4570:4;4778:12;4889:7;4877:20;4869:28;;4923:1;4916:4;:8;4909:15;;;4510:422;;;:::o;11020:742::-;11135:12;11164:7;11160:595;;;11195:10;11188:17;;;;11160:595;11329:1;11309:10;:17;:21;11305:439;;;11572:10;11566:17;11633:15;11620:10;11616:2;11612:19;11605:44;11520:148;11715:12;11708:20;;;;;;;;;;;:::i;:::-;;;;;;;;11020:742;;;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:137::-;206:5;237:6;231:13;222:22;;253:30;277:5;253:30;:::i;:::-;212:77;;;;:::o;295:139::-;341:5;379:6;366:20;357:29;;395:33;422:5;395:33;:::i;:::-;347:87;;;;:::o;440:137::-;485:5;523:6;510:20;501:29;;539:32;565:5;539:32;:::i;:::-;491:86;;;;:::o;596:351::-;653:8;663:6;713:3;706:4;698:6;694:17;690:27;680:2;;731:1;728;721:12;680:2;767:6;754:20;744:30;;797:18;789:6;786:30;783:2;;;829:1;826;819:12;783:2;866:4;858:6;854:17;842:29;;920:3;912:4;904:6;900:17;890:8;886:32;883:41;880:2;;;937:1;934;927:12;880:2;670:277;;;;;:::o;953:165::-;1012:5;1050:6;1037:20;1028:29;;1066:46;1106:5;1066:46;:::i;:::-;1018:100;;;;:::o;1124:139::-;1170:5;1208:6;1195:20;1186:29;;1224:33;1251:5;1224:33;:::i;:::-;1176:87;;;;:::o;1269:143::-;1326:5;1357:6;1351:13;1342:22;;1373:33;1400:5;1373:33;:::i;:::-;1332:80;;;;:::o;1418:262::-;1477:6;1526:2;1514:9;1505:7;1501:23;1497:32;1494:2;;;1542:1;1539;1532:12;1494:2;1585:1;1610:53;1655:7;1646:6;1635:9;1631:22;1610:53;:::i;:::-;1600:63;;1556:117;1484:196;;;;:::o;1686:407::-;1754:6;1762;1811:2;1799:9;1790:7;1786:23;1782:32;1779:2;;;1827:1;1824;1817:12;1779:2;1870:1;1895:53;1940:7;1931:6;1920:9;1916:22;1895:53;:::i;:::-;1885:63;;1841:117;1997:2;2023:53;2068:7;2059:6;2048:9;2044:22;2023:53;:::i;:::-;2013:63;;1968:118;1769:324;;;;;:::o;2099:552::-;2176:6;2184;2192;2241:2;2229:9;2220:7;2216:23;2212:32;2209:2;;;2257:1;2254;2247:12;2209:2;2300:1;2325:53;2370:7;2361:6;2350:9;2346:22;2325:53;:::i;:::-;2315:63;;2271:117;2427:2;2453:53;2498:7;2489:6;2478:9;2474:22;2453:53;:::i;:::-;2443:63;;2398:118;2555:2;2581:53;2626:7;2617:6;2606:9;2602:22;2581:53;:::i;:::-;2571:63;;2526:118;2199:452;;;;;:::o;2657:538::-;2736:6;2744;2752;2801:2;2789:9;2780:7;2776:23;2772:32;2769:2;;;2817:1;2814;2807:12;2769:2;2860:1;2885:53;2930:7;2921:6;2910:9;2906:22;2885:53;:::i;:::-;2875:63;;2831:117;3015:2;3004:9;3000:18;2987:32;3046:18;3038:6;3035:30;3032:2;;;3078:1;3075;3068:12;3032:2;3114:64;3170:7;3161:6;3150:9;3146:22;3114:64;:::i;:::-;3096:82;;;;2958:230;2759:436;;;;;:::o;3201:407::-;3269:6;3277;3326:2;3314:9;3305:7;3301:23;3297:32;3294:2;;;3342:1;3339;3332:12;3294:2;3385:1;3410:53;3455:7;3446:6;3435:9;3431:22;3410:53;:::i;:::-;3400:63;;3356:117;3512:2;3538:53;3583:7;3574:6;3563:9;3559:22;3538:53;:::i;:::-;3528:63;;3483:118;3284:324;;;;;:::o;3614:278::-;3681:6;3730:2;3718:9;3709:7;3705:23;3701:32;3698:2;;;3746:1;3743;3736:12;3698:2;3789:1;3814:61;3867:7;3858:6;3847:9;3843:22;3814:61;:::i;:::-;3804:71;;3760:125;3688:204;;;;:::o;3898:262::-;3957:6;4006:2;3994:9;3985:7;3981:23;3977:32;3974:2;;;4022:1;4019;4012:12;3974:2;4065:1;4090:53;4135:7;4126:6;4115:9;4111:22;4090:53;:::i;:::-;4080:63;;4036:117;3964:196;;;;:::o;4166:407::-;4234:6;4242;4291:2;4279:9;4270:7;4266:23;4262:32;4259:2;;;4307:1;4304;4297:12;4259:2;4350:1;4375:53;4420:7;4411:6;4400:9;4396:22;4375:53;:::i;:::-;4365:63;;4321:117;4477:2;4503:53;4548:7;4539:6;4528:9;4524:22;4503:53;:::i;:::-;4493:63;;4448:118;4249:324;;;;;:::o;4579:260::-;4637:6;4686:2;4674:9;4665:7;4661:23;4657:32;4654:2;;;4702:1;4699;4692:12;4654:2;4745:1;4770:52;4814:7;4805:6;4794:9;4790:22;4770:52;:::i;:::-;4760:62;;4716:116;4644:195;;;;:::o;4845:578::-;4935:6;4943;4951;5000:2;4988:9;4979:7;4975:23;4971:32;4968:2;;;5016:1;5013;5006:12;4968:2;5059:1;5084:66;5142:7;5133:6;5122:9;5118:22;5084:66;:::i;:::-;5074:76;;5030:130;5199:2;5225:53;5270:7;5261:6;5250:9;5246:22;5225:53;:::i;:::-;5215:63;;5170:118;5327:2;5353:53;5398:7;5389:6;5378:9;5374:22;5353:53;:::i;:::-;5343:63;;5298:118;4958:465;;;;;:::o;5429:262::-;5488:6;5537:2;5525:9;5516:7;5512:23;5508:32;5505:2;;;5553:1;5550;5543:12;5505:2;5596:1;5621:53;5666:7;5657:6;5646:9;5642:22;5621:53;:::i;:::-;5611:63;;5567:117;5495:196;;;;:::o;5697:284::-;5767:6;5816:2;5804:9;5795:7;5791:23;5787:32;5784:2;;;5832:1;5829;5822:12;5784:2;5875:1;5900:64;5956:7;5947:6;5936:9;5932:22;5900:64;:::i;:::-;5890:74;;5846:128;5774:207;;;;:::o;5987:118::-;6074:24;6092:5;6074:24;:::i;:::-;6069:3;6062:37;6052:53;;:::o;6111:109::-;6192:21;6207:5;6192:21;:::i;:::-;6187:3;6180:34;6170:50;;:::o;6226:118::-;6313:24;6331:5;6313:24;:::i;:::-;6308:3;6301:37;6291:53;;:::o;6350:373::-;6454:3;6482:38;6514:5;6482:38;:::i;:::-;6536:88;6617:6;6612:3;6536:88;:::i;:::-;6529:95;;6633:52;6678:6;6673:3;6666:4;6659:5;6655:16;6633:52;:::i;:::-;6710:6;6705:3;6701:16;6694:23;;6458:265;;;;;:::o;6729:157::-;6829:50;6873:5;6829:50;:::i;:::-;6824:3;6817:63;6807:79;;:::o;6892:364::-;6980:3;7008:39;7041:5;7008:39;:::i;:::-;7063:71;7127:6;7122:3;7063:71;:::i;:::-;7056:78;;7143:52;7188:6;7183:3;7176:4;7169:5;7165:16;7143:52;:::i;:::-;7220:29;7242:6;7220:29;:::i;:::-;7215:3;7211:39;7204:46;;6984:272;;;;;:::o;7262:377::-;7368:3;7396:39;7429:5;7396:39;:::i;:::-;7451:89;7533:6;7528:3;7451:89;:::i;:::-;7444:96;;7549:52;7594:6;7589:3;7582:4;7575:5;7571:16;7549:52;:::i;:::-;7626:6;7621:3;7617:16;7610:23;;7372:267;;;;;:::o;7645:366::-;7787:3;7808:67;7872:2;7867:3;7808:67;:::i;:::-;7801:74;;7884:93;7973:3;7884:93;:::i;:::-;8002:2;7997:3;7993:12;7986:19;;7791:220;;;:::o;8017:366::-;8159:3;8180:67;8244:2;8239:3;8180:67;:::i;:::-;8173:74;;8256:93;8345:3;8256:93;:::i;:::-;8374:2;8369:3;8365:12;8358:19;;8163:220;;;:::o;8389:366::-;8531:3;8552:67;8616:2;8611:3;8552:67;:::i;:::-;8545:74;;8628:93;8717:3;8628:93;:::i;:::-;8746:2;8741:3;8737:12;8730:19;;8535:220;;;:::o;8761:366::-;8903:3;8924:67;8988:2;8983:3;8924:67;:::i;:::-;8917:74;;9000:93;9089:3;9000:93;:::i;:::-;9118:2;9113:3;9109:12;9102:19;;8907:220;;;:::o;9133:366::-;9275:3;9296:67;9360:2;9355:3;9296:67;:::i;:::-;9289:74;;9372:93;9461:3;9372:93;:::i;:::-;9490:2;9485:3;9481:12;9474:19;;9279:220;;;:::o;9505:366::-;9647:3;9668:67;9732:2;9727:3;9668:67;:::i;:::-;9661:74;;9744:93;9833:3;9744:93;:::i;:::-;9862:2;9857:3;9853:12;9846:19;;9651:220;;;:::o;9877:366::-;10019:3;10040:67;10104:2;10099:3;10040:67;:::i;:::-;10033:74;;10116:93;10205:3;10116:93;:::i;:::-;10234:2;10229:3;10225:12;10218:19;;10023:220;;;:::o;10249:366::-;10391:3;10412:67;10476:2;10471:3;10412:67;:::i;:::-;10405:74;;10488:93;10577:3;10488:93;:::i;:::-;10606:2;10601:3;10597:12;10590:19;;10395:220;;;:::o;10621:366::-;10763:3;10784:67;10848:2;10843:3;10784:67;:::i;:::-;10777:74;;10860:93;10949:3;10860:93;:::i;:::-;10978:2;10973:3;10969:12;10962:19;;10767:220;;;:::o;10993:366::-;11135:3;11156:67;11220:2;11215:3;11156:67;:::i;:::-;11149:74;;11232:93;11321:3;11232:93;:::i;:::-;11350:2;11345:3;11341:12;11334:19;;11139:220;;;:::o;11365:366::-;11507:3;11528:67;11592:2;11587:3;11528:67;:::i;:::-;11521:74;;11604:93;11693:3;11604:93;:::i;:::-;11722:2;11717:3;11713:12;11706:19;;11511:220;;;:::o;11737:366::-;11879:3;11900:67;11964:2;11959:3;11900:67;:::i;:::-;11893:74;;11976:93;12065:3;11976:93;:::i;:::-;12094:2;12089:3;12085:12;12078:19;;11883:220;;;:::o;12109:366::-;12251:3;12272:67;12336:2;12331:3;12272:67;:::i;:::-;12265:74;;12348:93;12437:3;12348:93;:::i;:::-;12466:2;12461:3;12457:12;12450:19;;12255:220;;;:::o;12481:366::-;12623:3;12644:67;12708:2;12703:3;12644:67;:::i;:::-;12637:74;;12720:93;12809:3;12720:93;:::i;:::-;12838:2;12833:3;12829:12;12822:19;;12627:220;;;:::o;12853:366::-;12995:3;13016:67;13080:2;13075:3;13016:67;:::i;:::-;13009:74;;13092:93;13181:3;13092:93;:::i;:::-;13210:2;13205:3;13201:12;13194:19;;12999:220;;;:::o;13225:366::-;13367:3;13388:67;13452:2;13447:3;13388:67;:::i;:::-;13381:74;;13464:93;13553:3;13464:93;:::i;:::-;13582:2;13577:3;13573:12;13566:19;;13371:220;;;:::o;13597:366::-;13739:3;13760:67;13824:2;13819:3;13760:67;:::i;:::-;13753:74;;13836:93;13925:3;13836:93;:::i;:::-;13954:2;13949:3;13945:12;13938:19;;13743:220;;;:::o;13969:366::-;14111:3;14132:67;14196:2;14191:3;14132:67;:::i;:::-;14125:74;;14208:93;14297:3;14208:93;:::i;:::-;14326:2;14321:3;14317:12;14310:19;;14115:220;;;:::o;14341:402::-;14501:3;14522:85;14604:2;14599:3;14522:85;:::i;:::-;14515:92;;14616:93;14705:3;14616:93;:::i;:::-;14734:2;14729:3;14725:12;14718:19;;14505:238;;;:::o;14749:366::-;14891:3;14912:67;14976:2;14971:3;14912:67;:::i;:::-;14905:74;;14988:93;15077:3;14988:93;:::i;:::-;15106:2;15101:3;15097:12;15090:19;;14895:220;;;:::o;15121:366::-;15263:3;15284:67;15348:2;15343:3;15284:67;:::i;:::-;15277:74;;15360:93;15449:3;15360:93;:::i;:::-;15478:2;15473:3;15469:12;15462:19;;15267:220;;;:::o;15493:402::-;15653:3;15674:85;15756:2;15751:3;15674:85;:::i;:::-;15667:92;;15768:93;15857:3;15768:93;:::i;:::-;15886:2;15881:3;15877:12;15870:19;;15657:238;;;:::o;15901:366::-;16043:3;16064:67;16128:2;16123:3;16064:67;:::i;:::-;16057:74;;16140:93;16229:3;16140:93;:::i;:::-;16258:2;16253:3;16249:12;16242:19;;16047:220;;;:::o;16273:366::-;16415:3;16436:67;16500:2;16495:3;16436:67;:::i;:::-;16429:74;;16512:93;16601:3;16512:93;:::i;:::-;16630:2;16625:3;16621:12;16614:19;;16419:220;;;:::o;16645:118::-;16732:24;16750:5;16732:24;:::i;:::-;16727:3;16720:37;16710:53;;:::o;16769:112::-;16852:22;16868:5;16852:22;:::i;:::-;16847:3;16840:35;16830:51;;:::o;16887:271::-;17017:3;17039:93;17128:3;17119:6;17039:93;:::i;:::-;17032:100;;17149:3;17142:10;;17021:137;;;;:::o;17164:967::-;17546:3;17568:148;17712:3;17568:148;:::i;:::-;17561:155;;17733:95;17824:3;17815:6;17733:95;:::i;:::-;17726:102;;17845:148;17989:3;17845:148;:::i;:::-;17838:155;;18010:95;18101:3;18092:6;18010:95;:::i;:::-;18003:102;;18122:3;18115:10;;17550:581;;;;;:::o;18137:222::-;18230:4;18268:2;18257:9;18253:18;18245:26;;18281:71;18349:1;18338:9;18334:17;18325:6;18281:71;:::i;:::-;18235:124;;;;:::o;18365:332::-;18486:4;18524:2;18513:9;18509:18;18501:26;;18537:71;18605:1;18594:9;18590:17;18581:6;18537:71;:::i;:::-;18618:72;18686:2;18675:9;18671:18;18662:6;18618:72;:::i;:::-;18491:206;;;;;:::o;18703:210::-;18790:4;18828:2;18817:9;18813:18;18805:26;;18841:65;18903:1;18892:9;18888:17;18879:6;18841:65;:::i;:::-;18795:118;;;;:::o;18919:222::-;19012:4;19050:2;19039:9;19035:18;19027:26;;19063:71;19131:1;19120:9;19116:17;19107:6;19063:71;:::i;:::-;19017:124;;;;:::o;19147:358::-;19281:4;19319:2;19308:9;19304:18;19296:26;;19332:84;19413:1;19402:9;19398:17;19389:6;19332:84;:::i;:::-;19426:72;19494:2;19483:9;19479:18;19470:6;19426:72;:::i;:::-;19286:219;;;;;:::o;19511:313::-;19624:4;19662:2;19651:9;19647:18;19639:26;;19711:9;19705:4;19701:20;19697:1;19686:9;19682:17;19675:47;19739:78;19812:4;19803:6;19739:78;:::i;:::-;19731:86;;19629:195;;;;:::o;19830:419::-;19996:4;20034:2;20023:9;20019:18;20011:26;;20083:9;20077:4;20073:20;20069:1;20058:9;20054:17;20047:47;20111:131;20237:4;20111:131;:::i;:::-;20103:139;;20001:248;;;:::o;20255:419::-;20421:4;20459:2;20448:9;20444:18;20436:26;;20508:9;20502:4;20498:20;20494:1;20483:9;20479:17;20472:47;20536:131;20662:4;20536:131;:::i;:::-;20528:139;;20426:248;;;:::o;20680:419::-;20846:4;20884:2;20873:9;20869:18;20861:26;;20933:9;20927:4;20923:20;20919:1;20908:9;20904:17;20897:47;20961:131;21087:4;20961:131;:::i;:::-;20953:139;;20851:248;;;:::o;21105:419::-;21271:4;21309:2;21298:9;21294:18;21286:26;;21358:9;21352:4;21348:20;21344:1;21333:9;21329:17;21322:47;21386:131;21512:4;21386:131;:::i;:::-;21378:139;;21276:248;;;:::o;21530:419::-;21696:4;21734:2;21723:9;21719:18;21711:26;;21783:9;21777:4;21773:20;21769:1;21758:9;21754:17;21747:47;21811:131;21937:4;21811:131;:::i;:::-;21803:139;;21701:248;;;:::o;21955:419::-;22121:4;22159:2;22148:9;22144:18;22136:26;;22208:9;22202:4;22198:20;22194:1;22183:9;22179:17;22172:47;22236:131;22362:4;22236:131;:::i;:::-;22228:139;;22126:248;;;:::o;22380:419::-;22546:4;22584:2;22573:9;22569:18;22561:26;;22633:9;22627:4;22623:20;22619:1;22608:9;22604:17;22597:47;22661:131;22787:4;22661:131;:::i;:::-;22653:139;;22551:248;;;:::o;22805:419::-;22971:4;23009:2;22998:9;22994:18;22986:26;;23058:9;23052:4;23048:20;23044:1;23033:9;23029:17;23022:47;23086:131;23212:4;23086:131;:::i;:::-;23078:139;;22976:248;;;:::o;23230:419::-;23396:4;23434:2;23423:9;23419:18;23411:26;;23483:9;23477:4;23473:20;23469:1;23458:9;23454:17;23447:47;23511:131;23637:4;23511:131;:::i;:::-;23503:139;;23401:248;;;:::o;23655:419::-;23821:4;23859:2;23848:9;23844:18;23836:26;;23908:9;23902:4;23898:20;23894:1;23883:9;23879:17;23872:47;23936:131;24062:4;23936:131;:::i;:::-;23928:139;;23826:248;;;:::o;24080:419::-;24246:4;24284:2;24273:9;24269:18;24261:26;;24333:9;24327:4;24323:20;24319:1;24308:9;24304:17;24297:47;24361:131;24487:4;24361:131;:::i;:::-;24353:139;;24251:248;;;:::o;24505:419::-;24671:4;24709:2;24698:9;24694:18;24686:26;;24758:9;24752:4;24748:20;24744:1;24733:9;24729:17;24722:47;24786:131;24912:4;24786:131;:::i;:::-;24778:139;;24676:248;;;:::o;24930:419::-;25096:4;25134:2;25123:9;25119:18;25111:26;;25183:9;25177:4;25173:20;25169:1;25158:9;25154:17;25147:47;25211:131;25337:4;25211:131;:::i;:::-;25203:139;;25101:248;;;:::o;25355:419::-;25521:4;25559:2;25548:9;25544:18;25536:26;;25608:9;25602:4;25598:20;25594:1;25583:9;25579:17;25572:47;25636:131;25762:4;25636:131;:::i;:::-;25628:139;;25526:248;;;:::o;25780:419::-;25946:4;25984:2;25973:9;25969:18;25961:26;;26033:9;26027:4;26023:20;26019:1;26008:9;26004:17;25997:47;26061:131;26187:4;26061:131;:::i;:::-;26053:139;;25951:248;;;:::o;26205:419::-;26371:4;26409:2;26398:9;26394:18;26386:26;;26458:9;26452:4;26448:20;26444:1;26433:9;26429:17;26422:47;26486:131;26612:4;26486:131;:::i;:::-;26478:139;;26376:248;;;:::o;26630:419::-;26796:4;26834:2;26823:9;26819:18;26811:26;;26883:9;26877:4;26873:20;26869:1;26858:9;26854:17;26847:47;26911:131;27037:4;26911:131;:::i;:::-;26903:139;;26801:248;;;:::o;27055:419::-;27221:4;27259:2;27248:9;27244:18;27236:26;;27308:9;27302:4;27298:20;27294:1;27283:9;27279:17;27272:47;27336:131;27462:4;27336:131;:::i;:::-;27328:139;;27226:248;;;:::o;27480:419::-;27646:4;27684:2;27673:9;27669:18;27661:26;;27733:9;27727:4;27723:20;27719:1;27708:9;27704:17;27697:47;27761:131;27887:4;27761:131;:::i;:::-;27753:139;;27651:248;;;:::o;27905:419::-;28071:4;28109:2;28098:9;28094:18;28086:26;;28158:9;28152:4;28148:20;28144:1;28133:9;28129:17;28122:47;28186:131;28312:4;28186:131;:::i;:::-;28178:139;;28076:248;;;:::o;28330:419::-;28496:4;28534:2;28523:9;28519:18;28511:26;;28583:9;28577:4;28573:20;28569:1;28558:9;28554:17;28547:47;28611:131;28737:4;28611:131;:::i;:::-;28603:139;;28501:248;;;:::o;28755:419::-;28921:4;28959:2;28948:9;28944:18;28936:26;;29008:9;29002:4;28998:20;28994:1;28983:9;28979:17;28972:47;29036:131;29162:4;29036:131;:::i;:::-;29028:139;;28926:248;;;:::o;29180:222::-;29273:4;29311:2;29300:9;29296:18;29288:26;;29324:71;29392:1;29381:9;29377:17;29368:6;29324:71;:::i;:::-;29278:124;;;;:::o;29408:214::-;29497:4;29535:2;29524:9;29520:18;29512:26;;29548:67;29612:1;29601:9;29597:17;29588:6;29548:67;:::i;:::-;29502:120;;;;:::o;29628:98::-;29679:6;29713:5;29707:12;29697:22;;29686:40;;;:::o;29732:99::-;29784:6;29818:5;29812:12;29802:22;;29791:40;;;:::o;29837:147::-;29938:11;29975:3;29960:18;;29950:34;;;;:::o;29990:169::-;30074:11;30108:6;30103:3;30096:19;30148:4;30143:3;30139:14;30124:29;;30086:73;;;;:::o;30165:148::-;30267:11;30304:3;30289:18;;30279:34;;;;:::o;30319:305::-;30359:3;30378:20;30396:1;30378:20;:::i;:::-;30373:25;;30412:20;30430:1;30412:20;:::i;:::-;30407:25;;30566:1;30498:66;30494:74;30491:1;30488:81;30485:2;;;30572:18;;:::i;:::-;30485:2;30616:1;30613;30609:9;30602:16;;30363:261;;;;:::o;30630:348::-;30670:7;30693:20;30711:1;30693:20;:::i;:::-;30688:25;;30727:20;30745:1;30727:20;:::i;:::-;30722:25;;30915:1;30847:66;30843:74;30840:1;30837:81;30832:1;30825:9;30818:17;30814:105;30811:2;;;30922:18;;:::i;:::-;30811:2;30970:1;30967;30963:9;30952:20;;30678:300;;;;:::o;30984:191::-;31024:4;31044:20;31062:1;31044:20;:::i;:::-;31039:25;;31078:20;31096:1;31078:20;:::i;:::-;31073:25;;31117:1;31114;31111:8;31108:2;;;31122:18;;:::i;:::-;31108:2;31167:1;31164;31160:9;31152:17;;31029:146;;;;:::o;31181:96::-;31218:7;31247:24;31265:5;31247:24;:::i;:::-;31236:35;;31226:51;;;:::o;31283:90::-;31317:7;31360:5;31353:13;31346:21;31335:32;;31325:48;;;:::o;31379:77::-;31416:7;31445:5;31434:16;;31424:32;;;:::o;31462:149::-;31498:7;31538:66;31531:5;31527:78;31516:89;;31506:105;;;:::o;31617:109::-;31667:7;31696:24;31714:5;31696:24;:::i;:::-;31685:35;;31675:51;;;:::o;31732:126::-;31769:7;31809:42;31802:5;31798:54;31787:65;;31777:81;;;:::o;31864:77::-;31901:7;31930:5;31919:16;;31909:32;;;:::o;31947:86::-;31982:7;32022:4;32015:5;32011:16;32000:27;;31990:43;;;:::o;32039:152::-;32102:9;32135:50;32179:5;32135:50;:::i;:::-;32122:63;;32112:79;;;:::o;32197:126::-;32260:9;32293:24;32311:5;32293:24;:::i;:::-;32280:37;;32270:53;;;:::o;32329:307::-;32397:1;32407:113;32421:6;32418:1;32415:13;32407:113;;;32506:1;32501:3;32497:11;32491:18;32487:1;32482:3;32478:11;32471:39;32443:2;32440:1;32436:10;32431:15;;32407:113;;;32538:6;32535:1;32532:13;32529:2;;;32618:1;32609:6;32604:3;32600:16;32593:27;32529:2;32378:258;;;;:::o;32642:171::-;32681:3;32704:24;32722:5;32704:24;:::i;:::-;32695:33;;32750:4;32743:5;32740:15;32737:2;;;32758:18;;:::i;:::-;32737:2;32805:1;32798:5;32794:13;32787:20;;32685:128;;;:::o;32819:320::-;32863:6;32900:1;32894:4;32890:12;32880:22;;32947:1;32941:4;32937:12;32968:18;32958:2;;33024:4;33016:6;33012:17;33002:27;;32958:2;33086;33078:6;33075:14;33055:18;33052:38;33049:2;;;33105:18;;:::i;:::-;33049:2;32870:269;;;;:::o;33145:180::-;33193:77;33190:1;33183:88;33290:4;33287:1;33280:15;33314:4;33311:1;33304:15;33331:180;33379:77;33376:1;33369:88;33476:4;33473:1;33466:15;33500:4;33497:1;33490:15;33517:102;33558:6;33609:2;33605:7;33600:2;33593:5;33589:14;33585:28;33575:38;;33565:54;;;:::o;33625:182::-;33765:34;33761:1;33753:6;33749:14;33742:58;33731:76;:::o;33813:222::-;33953:34;33949:1;33941:6;33937:14;33930:58;34022:5;34017:2;34009:6;34005:15;33998:30;33919:116;:::o;34041:221::-;34181:34;34177:1;34169:6;34165:14;34158:58;34250:4;34245:2;34237:6;34233:15;34226:29;34147:115;:::o;34268:225::-;34408:34;34404:1;34396:6;34392:14;34385:58;34477:8;34472:2;34464:6;34460:15;34453:33;34374:119;:::o;34499:221::-;34639:34;34635:1;34627:6;34623:14;34616:58;34708:4;34703:2;34695:6;34691:15;34684:29;34605:115;:::o;34726:225::-;34866:34;34862:1;34854:6;34850:14;34843:58;34935:8;34930:2;34922:6;34918:15;34911:33;34832:119;:::o;34957:232::-;35097:34;35093:1;35085:6;35081:14;35074:58;35166:15;35161:2;35153:6;35149:15;35142:40;35063:126;:::o;35195:225::-;35335:34;35331:1;35323:6;35319:14;35312:58;35404:8;35399:2;35391:6;35387:15;35380:33;35301:119;:::o;35426:176::-;35566:28;35562:1;35554:6;35550:14;35543:52;35532:70;:::o;35608:227::-;35748:34;35744:1;35736:6;35732:14;35725:58;35817:10;35812:2;35804:6;35800:15;35793:35;35714:121;:::o;35841:182::-;35981:34;35977:1;35969:6;35965:14;35958:58;35947:76;:::o;36029:220::-;36169:34;36165:1;36157:6;36153:14;36146:58;36238:3;36233:2;36225:6;36221:15;36214:28;36135:114;:::o;36255:227::-;36395:34;36391:1;36383:6;36379:14;36372:58;36464:10;36459:2;36451:6;36447:15;36440:35;36361:121;:::o;36488:224::-;36628:34;36624:1;36616:6;36612:14;36605:58;36697:7;36692:2;36684:6;36680:15;36673:32;36594:118;:::o;36718:175::-;36858:27;36854:1;36846:6;36842:14;36835:51;36824:69;:::o;36899:223::-;37039:34;37035:1;37027:6;37023:14;37016:58;37108:6;37103:2;37095:6;37091:15;37084:31;37005:117;:::o;37128:179::-;37268:31;37264:1;37256:6;37252:14;37245:55;37234:73;:::o;37313:221::-;37453:34;37449:1;37441:6;37437:14;37430:58;37522:4;37517:2;37509:6;37505:15;37498:29;37419:115;:::o;37540:173::-;37680:25;37676:1;37668:6;37664:14;37657:49;37646:67;:::o;37719:229::-;37859:34;37855:1;37847:6;37843:14;37836:58;37928:12;37923:2;37915:6;37911:15;37904:37;37825:123;:::o;37954:224::-;38094:34;38090:1;38082:6;38078:14;38071:58;38163:7;38158:2;38150:6;38146:15;38139:32;38060:118;:::o;38184:167::-;38324:19;38320:1;38312:6;38308:14;38301:43;38290:61;:::o;38357:234::-;38497:34;38493:1;38485:6;38481:14;38474:58;38566:17;38561:2;38553:6;38549:15;38542:42;38463:128;:::o;38597:181::-;38737:33;38733:1;38725:6;38721:14;38714:57;38703:75;:::o;38784:122::-;38857:24;38875:5;38857:24;:::i;:::-;38850:5;38847:35;38837:2;;38896:1;38893;38886:12;38837:2;38827:79;:::o;38912:116::-;38982:21;38997:5;38982:21;:::i;:::-;38975:5;38972:32;38962:2;;39018:1;39015;39008:12;38962:2;38952:76;:::o;39034:122::-;39107:24;39125:5;39107:24;:::i;:::-;39100:5;39097:35;39087:2;;39146:1;39143;39136:12;39087:2;39077:79;:::o;39162:120::-;39234:23;39251:5;39234:23;:::i;:::-;39227:5;39224:34;39214:2;;39272:1;39269;39262:12;39214:2;39204:78;:::o;39288:148::-;39374:37;39405:5;39374:37;:::i;:::-;39367:5;39364:48;39354:2;;39426:1;39423;39416:12;39354:2;39344:92;:::o;39442:122::-;39515:24;39533:5;39515:24;:::i;:::-;39508:5;39505:35;39495:2;;39554:1;39551;39544:12;39495:2;39485:79;:::o

Swarm Source

ipfs://73f414b870e9f1989712359659eec9a99fc868b6b7bc34356910d76e02b3c94f
Loading