Contract 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754

Contract Overview

Balance:
0.04 BNB

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xea02d33b20b53c03e59732dbd94161d30d867c31702035f535ce2aaaaa214e64Attack112176622021-08-05 15:09:2249 days 23 hrs ago0x05d39629e253b1ced02dd5efd197fa8623664118 IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.0061716
0x13a2c3fd0cc0e8aaf62713a039e0c2e46c02875b773e676f36f712afe3e38aa9Join111409522021-08-02 23:06:1052 days 15 hrs ago0x05d39629e253b1ced02dd5efd197fa8623664118 IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540.01 BNB0.00034447
0x96c523ad5cda567b5a705b134dd0e134b2bed378c58b1ed6b3b2e9574a0b0237Open Season111409382021-08-02 23:05:2852 days 15 hrs ago0x4bf8dd175b3f67dae7c2b17b3c8f5aef0d07130e IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.00065141
0xf0d374ea33ac28b9a33b17f741cc898c7053a2b2b1b90ccc16707c28f608c395Close Season111408662021-08-02 23:01:5252 days 16 hrs ago0x4bf8dd175b3f67dae7c2b17b3c8f5aef0d07130e IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.00037117
0x6cebb8398dcf7ff238b0dd0474a72fb5d3643fca4c505015c8cbe48f556c660eForge Legendary111403642021-08-02 22:36:4652 days 16 hrs ago0x4bf8dd175b3f67dae7c2b17b3c8f5aef0d07130e IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.00317046
0x2d19684db8e3dafc9b7795e4264fb3a263534f3be434ac08a03589c91ebad605Unpack Booster P...111402472021-08-02 22:30:5552 days 16 hrs ago0x4bf8dd175b3f67dae7c2b17b3c8f5aef0d07130e IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.00178898
0x66e9eaca9478b3f93baa02146e9bfd7781dcdbea5ad35b8c8a91b43570940363Unpack Booster P...111402462021-08-02 22:30:5252 days 16 hrs ago0x05d39629e253b1ced02dd5efd197fa8623664118 IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.00159698
0x839a8d20deb416579fcdf3d58efb80f64dcb9e8037a1ad8cc6b2a7f07224565cUnpack Booster P...111402452021-08-02 22:30:4952 days 16 hrs ago0x4c39521405bab79aa4523f72c532995de0f9e7d9 IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.00159698
0xba932a0c150264673578d70322b713d0bdbe67dd3688a77f57cd0dfe12fcd26fAttack111400422021-08-02 22:20:4052 days 16 hrs ago0x05d39629e253b1ced02dd5efd197fa8623664118 IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.0064716
0xfc1746b4a7fd3351366e7e08bf0d2d5e4948e25ceca506fecfb5c903ba0c9bddAttack111400392021-08-02 22:20:3152 days 16 hrs ago0x4bf8dd175b3f67dae7c2b17b3c8f5aef0d07130e IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.0060216
0xb64d0dc0ffb92b71b32777f474558c859e0a75522fdef0b62d9a13b92558f875Attack111400172021-08-02 22:19:2552 days 16 hrs ago0x4c39521405bab79aa4523f72c532995de0f9e7d9 IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.0063216
0x8694e9eac82d163af6d778950a7a18c509a8168dfc714be4081b0a163176f94aDeposit111399382021-08-02 22:15:2852 days 16 hrs ago0x05d39629e253b1ced02dd5efd197fa8623664118 IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.00034011
0x709b8f5efc2d8d5066b212e4e90fe615a8aa8bbf0b10f9c5ae13eccc36688ef6Deposit111399272021-08-02 22:14:5552 days 16 hrs ago0x05d39629e253b1ced02dd5efd197fa8623664118 IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.00125877
0x02b2cf30b188d210c6891a2305aeddb061dc09ff0e41579ec5d619f74bb2ddb1Deposit111398232021-08-02 22:09:4352 days 16 hrs ago0x4c39521405bab79aa4523f72c532995de0f9e7d9 IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.00125877
0xa2c1ac0d13aa40a40326ddf84a8d48c81a172c27d52b31e9786dd05a9c320ca9Join111398002021-08-02 22:08:3452 days 16 hrs ago0x4c39521405bab79aa4523f72c532995de0f9e7d9 IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540.01 BNB0.00165062
0x6e8304a1a51ed0f81502ee3250d7f707676107ff39dc93c2ab879cb475735664Join111397992021-08-02 22:08:3152 days 16 hrs ago0x05d39629e253b1ced02dd5efd197fa8623664118 IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540.01 BNB0.00165062
0xe61afd12e221bd93d52098493d95e69d38a9200feef60dd7e27de3cb5df4c630Unpack Booster P...111393732021-08-02 21:47:1352 days 17 hrs ago0x4bf8dd175b3f67dae7c2b17b3c8f5aef0d07130e IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.00147098
0xcc43baca2c8c8aa437de6cd7eada1899ead9ad5b63ae28dd686e3b4018c82b0fAttack111386082021-08-02 21:08:5852 days 17 hrs ago0x4bf8dd175b3f67dae7c2b17b3c8f5aef0d07130e IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.0063216
0x190212c97892a33121123fb1075a24833b649627e91e43c79d3920265d2e9f0aDeposit111385982021-08-02 21:08:2852 days 17 hrs ago0x4bf8dd175b3f67dae7c2b17b3c8f5aef0d07130e IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.00157861
0xc3d0616493521b7b674c85502d2586ce59c05db43a67d6f8c349aadbeeb174a5Attack111383552021-08-02 20:56:1952 days 18 hrs ago0x4bf8dd175b3f67dae7c2b17b3c8f5aef0d07130e IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.00653482
0xae4329330cd14382d17a3275a6dbe6d57e02cdd0a5e37c517fd58b3c1b2284e5Deposit111383352021-08-02 20:55:1952 days 18 hrs ago0x4bf8dd175b3f67dae7c2b17b3c8f5aef0d07130e IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.00145449
0x00cab40b856058d2aa83969fd9fb63d01aca4cad44239d45982c594848c20ca2Join111381922021-08-02 20:48:1052 days 18 hrs ago0x4bf8dd175b3f67dae7c2b17b3c8f5aef0d07130e IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540.01 BNB0.00195062
0x61db80cd0289c5d764832341ac9809e3a8ec1ccfac45bd79c7ebe0cd9016e05aAdd Team111381422021-08-02 20:45:4052 days 18 hrs ago0x4bf8dd175b3f67dae7c2b17b3c8f5aef0d07130e IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.00065542
0x1ff3a0aecaeb9094f4dd409dd1c881276344ab181f96e046297af746b447c3d7Add Team111381402021-08-02 20:45:3452 days 18 hrs ago0x4bf8dd175b3f67dae7c2b17b3c8f5aef0d07130e IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.00110492
0x934720cd966ab7115eac914606beaa72358b0d9533a9d6916d57e8bd4b393698Open Season111381332021-08-02 20:45:1352 days 18 hrs ago0x4bf8dd175b3f67dae7c2b17b3c8f5aef0d07130e IN  0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB0.00080141
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xc404291ac670e6289606f538c285e8b4c1216c86dd2c2e8eaecbc6c61881c780112176782021-08-05 15:10:1049 days 23 hrs ago 0xa555fc018435bef5a13c6c6870a9d4c11dec329c 0xdeca5d023ff6bcecd6a6a3ab24462884167e97540 BNB
0xea02d33b20b53c03e59732dbd94161d30d867c31702035f535ce2aaaaa214e64112176622021-08-05 15:09:2249 days 23 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0xd610e8523b335e6f3cebf1bd564800b755eafdfe0 BNB
0xea02d33b20b53c03e59732dbd94161d30d867c31702035f535ce2aaaaa214e64112176622021-08-05 15:09:2249 days 23 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0x84b9b910527ad5c03a9ca831909e21e236ea7b060 BNB
0xea02d33b20b53c03e59732dbd94161d30d867c31702035f535ce2aaaaa214e64112176622021-08-05 15:09:2249 days 23 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0x84b9b910527ad5c03a9ca831909e21e236ea7b060 BNB
0xea02d33b20b53c03e59732dbd94161d30d867c31702035f535ce2aaaaa214e64112176622021-08-05 15:09:2249 days 23 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0xd610e8523b335e6f3cebf1bd564800b755eafdfe0 BNB
0xea02d33b20b53c03e59732dbd94161d30d867c31702035f535ce2aaaaa214e64112176622021-08-05 15:09:2249 days 23 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0xd610e8523b335e6f3cebf1bd564800b755eafdfe0 BNB
0xea02d33b20b53c03e59732dbd94161d30d867c31702035f535ce2aaaaa214e64112176622021-08-05 15:09:2249 days 23 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0xd610e8523b335e6f3cebf1bd564800b755eafdfe0 BNB
0xea02d33b20b53c03e59732dbd94161d30d867c31702035f535ce2aaaaa214e64112176622021-08-05 15:09:2249 days 23 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0xd610e8523b335e6f3cebf1bd564800b755eafdfe0 BNB
0xea02d33b20b53c03e59732dbd94161d30d867c31702035f535ce2aaaaa214e64112176622021-08-05 15:09:2249 days 23 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0xd610e8523b335e6f3cebf1bd564800b755eafdfe0 BNB
0xea02d33b20b53c03e59732dbd94161d30d867c31702035f535ce2aaaaa214e64112176622021-08-05 15:09:2249 days 23 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0x9ac64cc6e4415144c455bd8e4837fea55603e5c30.016783707132313411 BNB
0xea02d33b20b53c03e59732dbd94161d30d867c31702035f535ce2aaaaa214e64112176622021-08-05 15:09:2249 days 23 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0x9ac64cc6e4415144c455bd8e4837fea55603e5c30 BNB
0xea02d33b20b53c03e59732dbd94161d30d867c31702035f535ce2aaaaa214e64112176622021-08-05 15:09:2249 days 23 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0xd610e8523b335e6f3cebf1bd564800b755eafdfe0 BNB
0xea02d33b20b53c03e59732dbd94161d30d867c31702035f535ce2aaaaa214e64112176622021-08-05 15:09:2249 days 23 hrs ago 0x9ac64cc6e4415144c455bd8e4837fea55603e5c3 0xdeca5d023ff6bcecd6a6a3ab24462884167e97540.016783707132313411 BNB
0xea02d33b20b53c03e59732dbd94161d30d867c31702035f535ce2aaaaa214e64112176622021-08-05 15:09:2249 days 23 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0x9ac64cc6e4415144c455bd8e4837fea55603e5c30 BNB
0xea02d33b20b53c03e59732dbd94161d30d867c31702035f535ce2aaaaa214e64112176622021-08-05 15:09:2249 days 23 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0xd610e8523b335e6f3cebf1bd564800b755eafdfe0 BNB
0xea02d33b20b53c03e59732dbd94161d30d867c31702035f535ce2aaaaa214e64112176622021-08-05 15:09:2249 days 23 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0x9ac64cc6e4415144c455bd8e4837fea55603e5c30 BNB
0xea02d33b20b53c03e59732dbd94161d30d867c31702035f535ce2aaaaa214e64112176622021-08-05 15:09:2249 days 23 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0xd610e8523b335e6f3cebf1bd564800b755eafdfe0 BNB
0x96c523ad5cda567b5a705b134dd0e134b2bed378c58b1ed6b3b2e9574a0b0237111409382021-08-02 23:05:2852 days 15 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0xbf470d9b7db538af78bb4c343df020b95e404cf50 BNB
0x6cebb8398dcf7ff238b0dd0474a72fb5d3643fca4c505015c8cbe48f556c660e111403642021-08-02 22:36:4652 days 16 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0xbf470d9b7db538af78bb4c343df020b95e404cf50 BNB
0x6cebb8398dcf7ff238b0dd0474a72fb5d3643fca4c505015c8cbe48f556c660e111403642021-08-02 22:36:4652 days 16 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0xbf470d9b7db538af78bb4c343df020b95e404cf50 BNB
0x6cebb8398dcf7ff238b0dd0474a72fb5d3643fca4c505015c8cbe48f556c660e111403642021-08-02 22:36:4652 days 16 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0xbf470d9b7db538af78bb4c343df020b95e404cf50 BNB
0x6cebb8398dcf7ff238b0dd0474a72fb5d3643fca4c505015c8cbe48f556c660e111403642021-08-02 22:36:4652 days 16 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0xbf470d9b7db538af78bb4c343df020b95e404cf50 BNB
0x6cebb8398dcf7ff238b0dd0474a72fb5d3643fca4c505015c8cbe48f556c660e111403642021-08-02 22:36:4652 days 16 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0xbf470d9b7db538af78bb4c343df020b95e404cf50 BNB
0x6cebb8398dcf7ff238b0dd0474a72fb5d3643fca4c505015c8cbe48f556c660e111403642021-08-02 22:36:4652 days 16 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0xbf470d9b7db538af78bb4c343df020b95e404cf50 BNB
0x6cebb8398dcf7ff238b0dd0474a72fb5d3643fca4c505015c8cbe48f556c660e111403642021-08-02 22:36:4652 days 16 hrs ago 0xdeca5d023ff6bcecd6a6a3ab24462884167e9754 0xbf470d9b7db538af78bb4c343df020b95e404cf50 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
piggyGame

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 10 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-08-02
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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




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

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




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




/**
 * @dev 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;
        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");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}



interface LinkTokenInterface {

  function allowance(
    address owner,
    address spender
  )
    external
    view
    returns (
      uint256 remaining
    );

  function approve(
    address spender,
    uint256 value
  )
    external
    returns (
      bool success
    );

  function balanceOf(
    address owner
  )
    external
    view
    returns (
      uint256 balance
    );

  function decimals()
    external
    view
    returns (
      uint8 decimalPlaces
    );

  function decreaseApproval(
    address spender,
    uint256 addedValue
  )
    external
    returns (
      bool success
    );

  function increaseApproval(
    address spender,
    uint256 subtractedValue
  ) external;

  function name()
    external
    view
    returns (
      string memory tokenName
    );

  function symbol()
    external
    view
    returns (
      string memory tokenSymbol
    );

  function totalSupply()
    external
    view
    returns (
      uint256 totalTokensIssued
    );

  function transfer(
    address to,
    uint256 value
  )
    external
    returns (
      bool success
    );

  function transferAndCall(
    address to,
    uint256 value,
    bytes calldata data
  )
    external
    returns (
      bool success
    );

  function transferFrom(
    address from,
    address to,
    uint256 value
  )
    external
    returns (
      bool success
    );

}


interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}














/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}





/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}







/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}










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


/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    ) internal virtual {}
}












/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}








/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}












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

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

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

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

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

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

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

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


/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}













/**
 * @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());
        }
    }
}





/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}


/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IAccessControlEnumerable {
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);

    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}

/**
 * @dev Extension of {AccessControl} that allows enumerating the members of each role.
 */
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;

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

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view override returns (address) {
        return _roleMembers[role].at(index);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view override returns (uint256) {
        return _roleMembers[role].length();
    }

    /**
     * @dev Overload {grantRole} to track enumerable memberships
     */
    function grantRole(bytes32 role, address account) public virtual override {
        super.grantRole(role, account);
        _roleMembers[role].add(account);
    }

    /**
     * @dev Overload {revokeRole} to track enumerable memberships
     */
    function revokeRole(bytes32 role, address account) public virtual override {
        super.revokeRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {renounceRole} to track enumerable memberships
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        super.renounceRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {_setupRole} to track enumerable memberships
     */
    function _setupRole(bytes32 role, address account) internal virtual override {
        super._setupRole(role, account);
        _roleMembers[role].add(account);
    }
}






/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


/**
 * @dev {ERC721} token, including:
 *
 *  - ability for holders to burn (destroy) their tokens
 *  - a minter role that allows for token minting (creation)
 *  - a pauser role that allows to stop all token transfers
 *  - token ID and URI autogeneration
 *
 * This contract uses {AccessControl} to lock permissioned functions using the
 * different roles - head to its documentation for details.
 *
 * The account that deploys the contract will be granted the minter and pauser
 * roles, as well as the default admin role, which will let it grant both minter
 * and pauser roles to other accounts.
 */
contract ERC721PresetMinterPauserAutoId is
    Context,
    AccessControlEnumerable,
    ERC721Enumerable,
    ERC721Burnable,
    ERC721Pausable
{
    using Counters for Counters.Counter;

    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

    Counters.Counter private _tokenIdTracker;

    string private _baseTokenURI;

    /**
     * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the
     * account that deploys the contract.
     *
     * Token URIs will be autogenerated based on `baseURI` and their token IDs.
     * See {ERC721-tokenURI}.
     */
    constructor(
        string memory name,
        string memory symbol,
        string memory baseTokenURI
    ) ERC721(name, symbol) {
        _baseTokenURI = baseTokenURI;

        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());

        _setupRole(MINTER_ROLE, _msgSender());
        _setupRole(PAUSER_ROLE, _msgSender());
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    /**
     * @dev Creates a new token for `to`. Its token ID will be automatically
     * assigned (and available on the emitted {IERC721-Transfer} event), and the token
     * URI autogenerated based on the base URI passed at construction.
     *
     * See {ERC721-_mint}.
     *
     * Requirements:
     *
     * - the caller must have the `MINTER_ROLE`.
     */
    function mint(address to) public virtual {
        require(hasRole(MINTER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have minter role to mint");

        // We cannot just use balanceOf to create the new tokenId because tokens
        // can be burned (destroyed), so we need a separate counter.
        _mint(to, _tokenIdTracker.current());
        _tokenIdTracker.increment();
    }

    /**
     * @dev Pauses all token transfers.
     *
     * See {ERC721Pausable} and {Pausable-_pause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function pause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to pause");
        _pause();
    }

    /**
     * @dev Unpauses all token transfers.
     *
     * See {ERC721Pausable} and {Pausable-_unpause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function unpause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to unpause");
        _unpause();
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(AccessControlEnumerable, ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}


interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}










interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}








/**
 * @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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}










contract VRFRequestIDBase {

  /**
   * @notice returns the seed which is actually input to the VRF coordinator
   *
   * @dev To prevent repetition of VRF output due to repetition of the
   * @dev user-supplied seed, that seed is combined in a hash with the
   * @dev user-specific nonce, and the address of the consuming contract. The
   * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in
   * @dev the final seed, but the nonce does protect against repetition in
   * @dev requests which are included in a single block.
   *
   * @param _userSeed VRF seed input provided by user
   * @param _requester Address of the requesting contract
   * @param _nonce User-specific nonce at the time of the request
   */
  function makeVRFInputSeed(
    bytes32 _keyHash,
    uint256 _userSeed,
    address _requester,
    uint256 _nonce
  )
    internal
    pure
    returns (
      uint256
    )
  {
    return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce)));
  }

  /**
   * @notice Returns the id for this request
   * @param _keyHash The serviceAgreement ID to be used for this request
   * @param _vRFInputSeed The seed to be passed directly to the VRF
   * @return The id for this request
   *
   * @dev Note that _vRFInputSeed is not the seed passed by the consuming
   * @dev contract, but the one generated by makeVRFInputSeed
   */
  function makeRequestId(
    bytes32 _keyHash,
    uint256 _vRFInputSeed
  )
    internal
    pure
    returns (
      bytes32
    )
  {
    return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed));
  }
}

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constuctor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator, _link) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash), and have told you the minimum LINK
 * @dev price for VRF service. Make sure your contract has sufficient LINK, and
 * @dev call requestRandomness(keyHash, fee, seed), where seed is the input you
 * @dev want to generate randomness from.
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomness method.
 *
 * @dev The randomness argument to fulfillRandomness is the actual random value
 * @dev generated from your seed.
 *
 * @dev The requestId argument is generated from the keyHash and the seed by
 * @dev makeRequestId(keyHash, seed). If your contract could have concurrent
 * @dev requests open, you can use the requestId to track which seed is
 * @dev associated with which randomness. See VRFRequestIDBase.sol for more
 * @dev details. (See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.)
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ. (Which is critical to making unpredictable randomness! See the
 * @dev next section.)
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the ultimate input to the VRF is mixed with the block hash of the
 * @dev block in which the request is made, user-provided seeds have no impact
 * @dev on its economic security properties. They are only included for API
 * @dev compatability with previous versions of this contract.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request.
 */
abstract contract VRFConsumerBase is VRFRequestIDBase {

  /**
   * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBase expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomness the VRF output
   */
  function fulfillRandomness(
    bytes32 requestId,
    uint256 randomness
  )
    internal
    virtual;

  /**
   * @dev In order to keep backwards compatibility we have kept the user
   * seed field around. We remove the use of it because given that the blockhash
   * enters later, it overrides whatever randomness the used seed provides.
   * Given that it adds no security, and can easily lead to misunderstandings,
   * we have removed it from usage and can now provide a simpler API.
   */
  uint256 constant private USER_SEED_PLACEHOLDER = 0;

  /**
   * @notice requestRandomness initiates a request for VRF output given _seed
   *
   * @dev The fulfillRandomness method receives the output, once it's provided
   * @dev by the Oracle, and verified by the vrfCoordinator.
   *
   * @dev The _keyHash must already be registered with the VRFCoordinator, and
   * @dev the _fee must exceed the fee specified during registration of the
   * @dev _keyHash.
   *
   * @dev The _seed parameter is vestigial, and is kept only for API
   * @dev compatibility with older versions. It can't *hurt* to mix in some of
   * @dev your own randomness, here, but it's not necessary because the VRF
   * @dev oracle will mix the hash of the block containing your request into the
   * @dev VRF seed it ultimately uses.
   *
   * @param _keyHash ID of public key against which randomness is generated
   * @param _fee The amount of LINK to send with the request
   *
   * @return requestId unique ID for this request
   *
   * @dev The returned requestId can be used to distinguish responses to
   * @dev concurrent requests. It is passed as the first argument to
   * @dev fulfillRandomness.
   */
  function requestRandomness(
    bytes32 _keyHash,
    uint256 _fee
  )
    internal
    returns (
      bytes32 requestId
    )
  {
    LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER));
    // This is the seed passed to VRFCoordinator. The oracle will mix this with
    // the hash of the block containing this request to obtain the seed/input
    // which is finally passed to the VRF cryptographic machinery.
    uint256 vRFSeed  = makeVRFInputSeed(_keyHash, USER_SEED_PLACEHOLDER, address(this), nonces[_keyHash]);
    // nonces[_keyHash] must stay in sync with
    // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above
    // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest).
    // This provides protection against the user repeating their input seed,
    // which would result in a predictable/duplicate output, if multiple such
    // requests appeared in the same block.
    nonces[_keyHash] = nonces[_keyHash] + 1;
    return makeRequestId(_keyHash, vRFSeed);
  }

  LinkTokenInterface immutable internal LINK;
  address immutable private vrfCoordinator;

  // Nonces for each VRF key from which randomness has been requested.
  //
  // Must stay in sync with VRFCoordinator[_keyHash][this]
  mapping(bytes32 /* keyHash */ => uint256 /* nonce */) private nonces;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   * @param _link address of LINK token contract
   *
   * @dev https://docs.chain.link/docs/link-token-contracts
   */
  constructor(
    address _vrfCoordinator,
    address _link
  ) {
    vrfCoordinator = _vrfCoordinator;
    LINK = LinkTokenInterface(_link);
  }

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomness(
    bytes32 requestId,
    uint256 randomness
  )
    external
  {
    require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill");
    fulfillRandomness(requestId, randomness);
  }
}




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

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

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

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

    /**
     * @dev Returns the bep token owner.
     */
    function getOwner() external view returns (address);

    /**
     * @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);
}

interface IRewardNFT is IERC721 {
    function mint(address to, uint16 set, uint8 number) external;
    function metadataOf(uint256 id) external returns (uint16, uint8);
    function totalCardsOf(uint16 id) external returns (uint8);
    function forgeBurn(uint256 id) external;
    function addSet(uint16 set, uint8 number) external;
}

contract piggyGame is Ownable, VRFConsumerBase  {
    using Address for address;

    // Reward NFT address
    IRewardNFT public rewardNFT;
    
    // The swap router, modifiable.
    IUniswapV2Router02 public pancakeSwapRouter;
    
    // The trading pair
    address public pancakeSwapPair;
    
    //piggy token interface
    IBEP20 private piggyToken;
    address public piggyAddress;

    // Chainlink randomness requests
    struct ChainlinkRequest {
        address requester;
        bool fulfilled;
        uint8 rtype;
        uint8 grade;
    }

    mapping(bytes32 => ChainlinkRequest) requests;

    struct BoosterPack {
        uint256 seed;
        uint8 grade;
    }

    struct Player {
        uint256 gamesPlayed;
        uint16 season;
        uint32 team;
        uint32 winsBeforeJoin;
        uint256 experience;
        BoosterPack[] boosterPacks;
    }
    // Players
    mapping(address => Player) public players;

    struct Team {
        bool enabled;
        uint32 wins;
        uint256 damagePoints;
    }

    // Teams
    mapping(uint32 => Team) public teams;

    uint32 public latestTeam = 0;

    uint32[] public activeTeams;

    // User Piggy Balance
    mapping(address => uint256) public balances;
    
    // Thresholds for different booster pack grades
    struct Thresholds {
        uint256 grade1;
        uint256 grade2;
        uint256 grade3;
        uint256 grade4;
    }

    Thresholds public thresholds = Thresholds({
        grade1: 10   * 10**8 * 10**9,
        grade2: 1   * 10**9 * 10**9,
        grade3: 3  * 10**9 * 10**9,
        grade4: 5  * 10**9 * 10**9
    });
    struct RareChance {
        uint8 grade2;
        uint8 grade3;
        uint8 grade4;
    }
    RareChance public rareChance = RareChance({
        grade2: 30, // 1 in 30 Chance
        grade3: 10, // 1 in 10 Chance
        grade4: 5   // 1 in 5 Chance
    });

    uint256 latestRID = 0;
    
    bool public open = false;

    uint16 public season = 0;

    uint256 public joinFee = 10000000000000000; // 0.01 BNB

    // Chainlink
    bytes32 internal keyHash;
    uint256 internal fee;

    constructor(IBEP20 _piggyToken, address _router, address _coordinator, address _linkToken, bytes32 _hash, uint256 _fee)
        VRFConsumerBase(
            _coordinator,
            _linkToken
        )
     {
        keyHash = _hash;
        fee = _fee;
        piggyToken = _piggyToken;
        piggyAddress = address(piggyToken);
        pancakeSwapRouter = IUniswapV2Router02(_router);
        pancakeSwapPair = IUniswapV2Factory(pancakeSwapRouter.factory()).getPair(address(piggyToken), pancakeSwapRouter.WETH());
        require(pancakeSwapPair != address(0), "TEST::updatepancakeSwapRouter: Invalid pair address.");
    }

    event pancakeSwapRouterUpdated(address indexed operator, address indexed router, address indexed pair);
    event SetOpen(address indexed owner, bool indexed open);
    event SetSeason(address indexed owner, uint32 indexed season);
    event SetJoinFee(address indexed owner, uint256 fee);
    event SeasonClose(address indexed owner, uint32 indexed season, uint32 indexed winner);
    event SeasonOpen(address indexed owner, uint32 indexed season);
    event TeamAdded(address indexed owner, uint32 indexed team);
    event OwnerWithdrawal(address indexed owner, address indexed to, uint256 amount);
    event JoinedGame(address indexed player, uint256 indexed season);
    event TokensPurchased(address indexed player, uint256 amount, uint256 minAmount, uint256 BNBSent);
    event Deposit(address indexed player, uint256 amount);
    event Withdrawal(address indexed player, uint256 amount);
    event Attack(address indexed player, uint32 indexed team, uint256 amount, uint256 ethAmount, uint256 tokensReturned, uint256 BalanceChange);
    event RandomNumberRequest(address indexed requester, bytes32 id);
    event RandomNumberFulfilled(address indexed requester, uint8 indexed rtype, bytes32 id, uint256 randomness);
    event ReceivedBoosterBack(address indexed requester, uint8 indexed grade, uint256 randomness);
    event TeamAssigned(address indexed requester, uint32 indexed team, uint256 randomness);
    event BoosterPackOpened(address indexed player, uint8 indexed grade, uint256 seed);
    event NFTAwarded(address indexed player, uint16 indexed set, uint8 indexed number, bool rare);
    event LegendaryForged(address indexed player, uint16 indexed set);
    event ThresholdsSet(address indexed owner, uint256 grade1, uint256 grade2, uint256 grade3, uint256 grade4);
    event RareChanceSet(address indexed owner, uint256 grade2, uint256 grade3, uint256 grade4);

    // To receive BNB from pancakeSwapRouter when swapping
    receive() external payable {}

    /**
    * @dev Returns the address of the current operator.
    */
    function totalBalance() public view returns (uint256) {
        return piggyToken.balanceOf(address(this));
    }
    function getJoinFee() public view returns (uint256) {
        return joinFee;
    }
    function isGameOpen() public view returns (bool) {
        return open;
    }
    function currentSeason() public view returns (uint16) {
        return season;
    }
    function balanceOf(address _player) public view returns (uint256) {
        return balances[_player];
    }
    function boosterPackBalanceOf(address _player) public view returns(uint256){
        return players[_player].boosterPacks.length;
    }
    function totalGamesPlayedOf(address _player) public view returns(uint256){
        return players[_player].gamesPlayed;
    }
    function teamOf(address _player) public view returns(uint256){
        return players[_player].team;
    }
    function getThresholds() public view returns(uint256, uint256, uint256, uint256) {
        return (thresholds.grade1, thresholds.grade2, thresholds.grade3, thresholds.grade4);
    }
    function hasPlayerJoined(address _player) public view returns(bool) {
        return players[_player].season == season;
    }
    function getRareChances() public view returns(uint8, uint8, uint8) {
        return (rareChance.grade2, rareChance.grade3, rareChance.grade4);
    }
    function teamDamageOf(uint32 teamId) public view returns(uint256) {
        return teams[teamId].damagePoints;
    }
    function teamWinsOf(uint32 teamId) public view returns(uint32) {
        return teams[teamId].wins;
    }
    function getActiveTeams() public view returns(uint32[] memory) {
        return activeTeams;
    }
    function playerWins(address _player) public view returns(uint32){
        uint32 team = players[_player].team;
        uint32 winsBeforeJoin = players[_player].winsBeforeJoin;
        require(teams[team].wins >= winsBeforeJoin, "Wins before join higher than total wins");
        return teams[team].wins - winsBeforeJoin;
    }
    function setOpen(bool isOpen) public onlyOwner {
        open = isOpen;
        emit SetOpen(msg.sender, open);
    }
    function setSeason(uint16 _season) public onlyOwner {
        season = _season;
        emit SetSeason(msg.sender, season);
    }
    function openSeason() public onlyOwner {
        require(open == false, "Season currently open");
        season += 1;
        open = true;
        rewardNFT.addSet(season, 7);
        emit SetSeason(msg.sender, season);
        emit SeasonOpen(msg.sender, season);
        emit SetOpen(msg.sender, open);
    }
    function closeSeason() public onlyOwner {
        open = false;
        uint256 lowestDamagePoints = teams[activeTeams[0]].damagePoints;
        uint32 winningTeam = activeTeams[0];
        for (uint32 i = 0; i < activeTeams.length; i++) {
            uint256 teamDamagePoints = teams[activeTeams[i]].damagePoints;
            if (teamDamagePoints < lowestDamagePoints){
                lowestDamagePoints = teamDamagePoints;
                winningTeam = activeTeams[i];
            }
            teams[activeTeams[i]].damagePoints = 0;
        }
        teams[winningTeam].wins += 1;
        emit SeasonClose(msg.sender, season, winningTeam);
        emit SetOpen(msg.sender, open);
    }

    function addTeam() public onlyOwner {
        latestTeam += 1;
        teams[latestTeam].enabled = true;
        activeTeams.push(latestTeam);
        emit TeamAdded(msg.sender, latestTeam);
    }
    function withdrawETH(uint256 amount, address payable _to) public onlyOwner {
        _to.transfer(amount);
        emit OwnerWithdrawal(msg.sender, _to, amount);
    }
    function withdrawAllETH(address payable _to) public onlyOwner {
        _to.transfer(address(this).balance);
        emit OwnerWithdrawal(msg.sender, _to, address(this).balance);
    }
    function setJoinFee(uint256 _fee) public onlyOwner {
        joinFee = _fee;
        emit SetJoinFee(msg.sender, _fee);
    }
    /**
     * @dev Update the swap router.
     * Can only be called by the current operator.
     */
    function updatePancakeSwapRouter(address _router, address _piggyAddress) public onlyOwner {
        piggyAddress = _piggyAddress;
        piggyToken = IBEP20(_piggyAddress);
        pancakeSwapRouter = IUniswapV2Router02(_router);
        pancakeSwapPair = IUniswapV2Factory(pancakeSwapRouter.factory()).getPair(_piggyAddress , pancakeSwapRouter.WETH());
        require(pancakeSwapPair != address(0), "TEST::updatepancakeSwapRouter: Invalid pair address.");
        emit pancakeSwapRouterUpdated(msg.sender, address(pancakeSwapRouter), pancakeSwapPair);
    }
    function updateNFTAddress(IRewardNFT _rewardNFTAddress) public onlyOwner {
        rewardNFT = _rewardNFTAddress;
    }

    function join() public payable {
        require(open, "Game is closed");
        require(msg.value == joinFee, "BNB provided must equal the fee");
        require(players[msg.sender].season != season, "Player has already joined season");
        players[msg.sender].season = season;
        if (players[msg.sender].team == 0) {
            bytes32 requestId = getRandomNumber();
            requests[requestId].requester = msg.sender;
            requests[requestId].rtype = 2;
            requests[requestId].fulfilled = false;
        }
        emit JoinedGame(msg.sender, season);
    }
    function buyTokens(uint256 minTokens) public payable {
        require(open, "Game is closed");
        require(msg.value > 0, "No BNB provided");
        uint256 initialTokenBalance = piggyToken.balanceOf(address(this));
        swapEthForExactTokens(msg.value, minTokens);
        uint256 finalTokenBalance = piggyToken.balanceOf(address(this));
        require(finalTokenBalance > initialTokenBalance, "No Tokens provided");
        balances[msg.sender] = balances[msg.sender] + finalTokenBalance - initialTokenBalance;
        emit TokensPurchased(msg.sender, finalTokenBalance - initialTokenBalance, minTokens, msg.value);
    }
    function deposit(uint256 amount) public {
        require(open, "Game is closed");
        uint256 tokenbalance = piggyToken.balanceOf(msg.sender);
        require(tokenbalance >= amount, "Insufficient funds");
        uint256 previousBalance = piggyToken.balanceOf(address(this));
        // Transfer tokens to the game contract
        piggyToken.transferFrom(msg.sender, address(this), amount);
        uint256 currentBalance = piggyToken.balanceOf(address(this));
        require(currentBalance > previousBalance, "Negative Balance Increase");
        balances[msg.sender] = balances[msg.sender] + (currentBalance - previousBalance);
        emit Deposit(msg.sender, amount);
    }

    function withdraw(uint256 amount) public {
        require(balances[msg.sender] >= amount, "Insufficient token balance");
        uint256 previousBalance = piggyToken.balanceOf(address(this));
        piggyToken.transfer(msg.sender, amount);
        balances[msg.sender] = balances[msg.sender] - amount;
        require((previousBalance - piggyToken.balanceOf(address(this))) <= amount, "Contract balance decrease greater than amount");
        emit Withdrawal(msg.sender, amount);
    }

    function attack(uint256 amount, uint32 team) public {
        require(open, "Game is closed");
        require(season > 0, "Season not set");
        require(players[msg.sender].season == season, "Player has not entered season");
        require(players[msg.sender].team != team, "Cannot attack own team");
        require(players[msg.sender].team != 0, "Player is not on any team");
        require(teams[team].enabled, "Team is not enabled");
        require(balances[msg.sender] >= amount, "Insufficient balance");

        uint256 initialBalance = piggyToken.balanceOf(address(this));
        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amount); // Sell tokens for ETH

        uint256 afterBalance = piggyToken.balanceOf(address(this));
        uint256 afterETHBalance = address(this).balance;

        uint256 tokensSold = initialBalance - afterBalance; // Tokens sold in the first swap
        require(tokensSold <= amount, "Contract balance decrease greater than amount"); // Fails on ==, why?

        uint256 ETHReceived = afterETHBalance - initialETHBalance; // ETH Received from token sale
        require(afterETHBalance > initialETHBalance, "Negative BNB from selling tokens");

        swapEthForTokens(ETHReceived); // Buy tokens for ETH

        require(address(this).balance == initialETHBalance, "BNB Balance of contract changed");

        uint256 tokensReceived = piggyToken.balanceOf(address(this)) - afterBalance;
        require(piggyToken.balanceOf(address(this)) > afterBalance, "Tokens lost in purchase");
        require(tokensReceived < amount, "Tokens increased after charge and attack");
        require(initialBalance > piggyToken.balanceOf(address(this)), "Piggy balance did not decrease");
        require((initialBalance - piggyToken.balanceOf(address(this))) < balances[msg.sender], "Player cannot pay for balance decrease");

        // Change in piggy balance is charged to the player
        balances[msg.sender] -= initialBalance - piggyToken.balanceOf(address(this));

        requestReward(amount);
        players[msg.sender].gamesPlayed += 1;
        players[msg.sender].experience += amount;
        teams[team].damagePoints += amount;
        emit Attack(
        msg.sender, 
        team,
        amount, 
        ETHReceived,
        tokensReceived,
        initialBalance - piggyToken.balanceOf(address(this)));
    }

    function getRandomNumber() private returns (bytes32 requestId) {
        emit RandomNumberRequest(msg.sender, bytes32(abi.encodePacked(latestRID)));
        require(LINK.balanceOf(address(this)) >= fee, "Not enough LINK - fill contract with faucet");
        return requestRandomness(keyHash, fee);
    }

    function requestReward(uint256 amount) private {
        if (amount < thresholds.grade1) {
            return;
        }
        bytes32 requestId = getRandomNumber();
        requests[requestId].requester = msg.sender;
        requests[requestId].rtype = 1;
        requests[requestId].fulfilled = false;

        if (amount < thresholds.grade2) {
            requests[requestId].grade = 1;
        } else if (amount < thresholds.grade3) {
            requests[requestId].grade = 2;
        } else if (amount < thresholds.grade4) {
            requests[requestId].grade = 3;
        } else if (amount > thresholds.grade4) {
            requests[requestId].grade = 4;
        }
    }

    function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
        if (requests[requestId].fulfilled) {
            return;
        }
        emit RandomNumberFulfilled(requests[requestId].requester, requests[requestId].rtype, requestId, randomness);
        requests[requestId].fulfilled = true;

        // rtype 1: Booster pack
        if (requests[requestId].rtype == 1) {
            players[requests[requestId].requester].boosterPacks.push(BoosterPack({
                grade: requests[requestId].grade,
                seed: randomness
            }));
            emit ReceivedBoosterBack(requests[requestId].requester, requests[requestId].grade, randomness);
        }
        // rtype 1: Team Assignment
        if (requests[requestId].rtype == 2) {
            uint32 teamIndex = uint32(randomness % activeTeams.length);
            players[requests[requestId].requester].team = activeTeams[teamIndex];
            players[requests[requestId].requester].winsBeforeJoin = teams[activeTeams[teamIndex]].wins;
            emit TeamAssigned(requests[requestId].requester, activeTeams[teamIndex], randomness);
        }
    }

    function unpackBoosterPack() public {
        uint numPacks = players[msg.sender].boosterPacks.length;
        require(numPacks > 0, "No booster packs to unpack");
        uint256 seed = players[msg.sender].boosterPacks[numPacks-1].seed;
        uint8 grade = players[msg.sender].boosterPacks[numPacks-1].grade;
        (uint8 numCommon, bool getRare) = getNumRewards(seed, grade, rareChance.grade2-1, rareChance.grade3-1, rareChance.grade4-1);
        assignNFTs(numCommon, getRare, seed);
        players[msg.sender].boosterPacks.pop();
        emit BoosterPackOpened(msg.sender, grade, seed);
    }
    function getNumRewards(uint256 seed, uint8 grade, uint8 grade2RareChance, uint8 grade3RareChance, uint8 grade4RareChance) public pure returns(uint8, bool) { // Common, Rare
        require(grade > 0, "Grade too low");
        require(grade <= 4, "Grade too high");
        if (grade == 1) { // Grade 1: 1 in 3 chance of Common NFT, No Rare
            // Common, 1 in 3 chance
            if (getRandomInt(2, seed, 0) == 0) {
                return (1, false);
            }
        } else if (grade == 2) { // Grade 2: 0 to 1 Common NFTs, 1 in grade2RareChance Chance of Rare
            // Rare
            if (getRandomInt(grade2RareChance, seed, 0) == 0) {
                return (0, true);
            }
            // Common
            return (getRandomInt(1, seed, 1), false);
        } else if (grade == 3) { // Grade 2: 0 to 2 Common NFTs, 1 in grade3RareChance Chance of Rare
            // Rare
            if (getRandomInt(grade3RareChance, seed, 0) == 0) {
                return (0, true);
            }
            // Common
            return (getRandomInt(2, seed, 1), false);

        } else if (grade == 4) { // Grade 2: 1 to 3 Common NFTs, 1 in grade4RareChance Chance of Rare
            // Rare
            if (getRandomInt(grade4RareChance, seed, 0) == 0) {
                return (0, true);
            }
            // Common
            return (getRandomInt(2, seed, 1) + 1, false);
        }
        return (0, false);
    }

    function assignNFTs(uint8 numCommon, bool getRare, uint256 seed) private {
        uint8 nonce = 10;
        require(numCommon <= 3, "Too many common NFTs generated");
        if (getRare) {
            nonce +=1;
            // Mint Rare NFT
            uint8 number = getRandomInt(2, seed, nonce) + 5; // 0-2 + 5 = 5-7
            rewardNFT.mint(msg.sender, season, number);
            emit NFTAwarded(msg.sender, season, number, true);
            return;
        }
        for (uint8 i = 0 ; i < numCommon; i++) {
            nonce += 1;
            // Mint Common NFT
            uint8 number = getRandomInt(3, seed, nonce) + 1; // 0-3 + 1 = 1-4
            rewardNFT.mint(msg.sender, season, number);
            emit NFTAwarded(msg.sender, season, number, false);
        }
    }

    function getRandomInt(uint8 max, uint256 seed, uint8 nonce) pure private returns(uint8) {
        return uint8(uint256(keccak256(abi.encodePacked(seed, nonce))) % (max+1));
    }

    function forgeLegendary(uint256[] calldata ids) public {
        (uint16 cardSet, uint8 _number) = rewardNFT.metadataOf(ids[0]);
        require(_number == 1, "First card must be 1");
        uint8 totalCards = rewardNFT.totalCardsOf(cardSet);
        require(totalCards == ids.length, "Wrong amount of cards to complete the set");

        for (uint8 i = 0 ; i < totalCards; i++) {
            require(rewardNFT.ownerOf(ids[i]) == msg.sender, "Sender does not own the NFT");
            (uint16 set, uint8 number) = rewardNFT.metadataOf(ids[i]);
            require(set == cardSet, "Card from wrong set");
            require(number == (i+1), "Wrong card number or order"); // Cards are from 1 to totalCards, i is from 0 to totalCards - 1
            rewardNFT.forgeBurn(ids[i]); // Burn NFT
        }
        rewardNFT.mint(msg.sender, cardSet, 0); // Card 0 of set is Legendary
        emit LegendaryForged(msg.sender, cardSet);
    }
    
    function setThresholds(uint256 grade1, uint256 grade2, uint256 grade3, uint256 grade4) public onlyOwner {
        thresholds = Thresholds({
            grade1: grade1, 
            grade2: grade2,
            grade3: grade3,
            grade4: grade4
        });
        emit ThresholdsSet(msg.sender, grade1, grade2, grade3, grade4);
    }

    function setRareChance(uint8 grade2, uint8 grade3, uint8 grade4) public onlyOwner {
        rareChance = RareChance({
            grade2: grade2,
            grade3: grade3,
            grade4: grade4
        });
        emit RareChanceSet(msg.sender, grade2, grade3, grade4);
    }

    /// @dev Swap tokens for eth
    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the testSwap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = piggyAddress;
        path[1] = pancakeSwapRouter.WETH();

        piggyToken.approve(address(pancakeSwapRouter), tokenAmount*2);
        
        // make the swap
        pancakeSwapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
           tokenAmount,
            0, // get anything we can
            path,
            address(this),
            block.timestamp
        );
    }
    
    // @dev Swap tokens for eth
    function swapEthForTokens(uint256 EthAmount ) private {
        // generate the testSwap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = pancakeSwapRouter.WETH();
        path[1] = piggyAddress;

        // make the swap
        pancakeSwapRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: EthAmount}(
           0 ,// get anything we can
            path,
             address(this),
            block.timestamp
        );
    }
    // @dev Swap tokens for eth
    function swapEthForExactTokens(uint256 EthAmount, uint256 minTokens) private {
        // generate the testSwap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = pancakeSwapRouter.WETH();
        path[1] = piggyAddress;

        // Make the swap
        pancakeSwapRouter.swapETHForExactTokens{value: EthAmount}(
            minTokens,// get anything we can
            path,
            address(this),
            block.timestamp
        );
    }

    function inRange(uint256 lowerLimit, uint256 upperLimit, uint256 value) internal pure returns(bool){
        if(value >= lowerLimit && value <= upperLimit) {
            return true;
        }
        return false;
    }
    function mintNFT(address to, uint16 set, uint8 number) public onlyOwner {
        rewardNFT.mint(to, set, number);
    }
}

Contract ABI

[{"inputs":[{"internalType":"contract IBEP20","name":"_piggyToken","type":"address"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_coordinator","type":"address"},{"internalType":"address","name":"_linkToken","type":"address"},{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"uint32","name":"team","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensReturned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"BalanceChange","type":"uint256"}],"name":"Attack","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"uint8","name":"grade","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"seed","type":"uint256"}],"name":"BoosterPackOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"uint256","name":"season","type":"uint256"}],"name":"JoinedGame","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"uint16","name":"set","type":"uint16"}],"name":"LegendaryForged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"uint16","name":"set","type":"uint16"},{"indexed":true,"internalType":"uint8","name":"number","type":"uint8"},{"indexed":false,"internalType":"bool","name":"rare","type":"bool"}],"name":"NFTAwarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OwnerWithdrawal","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":"address","name":"requester","type":"address"},{"indexed":true,"internalType":"uint8","name":"rtype","type":"uint8"},{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"RandomNumberFulfilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requester","type":"address"},{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"RandomNumberRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"grade2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"grade3","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"grade4","type":"uint256"}],"name":"RareChanceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requester","type":"address"},{"indexed":true,"internalType":"uint8","name":"grade","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"ReceivedBoosterBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint32","name":"season","type":"uint32"},{"indexed":true,"internalType":"uint32","name":"winner","type":"uint32"}],"name":"SeasonClose","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint32","name":"season","type":"uint32"}],"name":"SeasonOpen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SetJoinFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"bool","name":"open","type":"bool"}],"name":"SetOpen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint32","name":"season","type":"uint32"}],"name":"SetSeason","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint32","name":"team","type":"uint32"}],"name":"TeamAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requester","type":"address"},{"indexed":true,"internalType":"uint32","name":"team","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"TeamAssigned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"grade1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"grade2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"grade3","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"grade4","type":"uint256"}],"name":"ThresholdsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"BNBSent","type":"uint256"}],"name":"TokensPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"router","type":"address"},{"indexed":true,"internalType":"address","name":"pair","type":"address"}],"name":"pancakeSwapRouterUpdated","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"activeTeams","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint32","name":"team","type":"uint32"}],"name":"attack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_player","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_player","type":"address"}],"name":"boosterPackBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"minTokens","type":"uint256"}],"name":"buyTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"closeSeason","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentSeason","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"forgeLegendary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getActiveTeams","outputs":[{"internalType":"uint32[]","name":"","type":"uint32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getJoinFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint8","name":"grade","type":"uint8"},{"internalType":"uint8","name":"grade2RareChance","type":"uint8"},{"internalType":"uint8","name":"grade3RareChance","type":"uint8"},{"internalType":"uint8","name":"grade4RareChance","type":"uint8"}],"name":"getNumRewards","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getRareChances","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getThresholds","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_player","type":"address"}],"name":"hasPlayerJoined","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGameOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"join","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"joinFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestTeam","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"set","type":"uint16"},{"internalType":"uint8","name":"number","type":"uint8"}],"name":"mintNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openSeason","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pancakeSwapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pancakeSwapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"piggyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_player","type":"address"}],"name":"playerWins","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"players","outputs":[{"internalType":"uint256","name":"gamesPlayed","type":"uint256"},{"internalType":"uint16","name":"season","type":"uint16"},{"internalType":"uint32","name":"team","type":"uint32"},{"internalType":"uint32","name":"winsBeforeJoin","type":"uint32"},{"internalType":"uint256","name":"experience","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rareChance","outputs":[{"internalType":"uint8","name":"grade2","type":"uint8"},{"internalType":"uint8","name":"grade3","type":"uint8"},{"internalType":"uint8","name":"grade4","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardNFT","outputs":[{"internalType":"contract IRewardNFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"season","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setJoinFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isOpen","type":"bool"}],"name":"setOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"grade2","type":"uint8"},{"internalType":"uint8","name":"grade3","type":"uint8"},{"internalType":"uint8","name":"grade4","type":"uint8"}],"name":"setRareChance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_season","type":"uint16"}],"name":"setSeason","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"grade1","type":"uint256"},{"internalType":"uint256","name":"grade2","type":"uint256"},{"internalType":"uint256","name":"grade3","type":"uint256"},{"internalType":"uint256","name":"grade4","type":"uint256"}],"name":"setThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"teamId","type":"uint32"}],"name":"teamDamageOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_player","type":"address"}],"name":"teamOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"teamId","type":"uint32"}],"name":"teamWinsOf","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"teams","outputs":[{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"uint32","name":"wins","type":"uint32"},{"internalType":"uint256","name":"damagePoints","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thresholds","outputs":[{"internalType":"uint256","name":"grade1","type":"uint256"},{"internalType":"uint256","name":"grade2","type":"uint256"},{"internalType":"uint256","name":"grade3","type":"uint256"},{"internalType":"uint256","name":"grade4","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_player","type":"address"}],"name":"totalGamesPlayedOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpackBoosterPack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IRewardNFT","name":"_rewardNFTAddress","type":"address"}],"name":"updateNFTAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_piggyAddress","type":"address"}],"name":"updatePancakeSwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdrawAllETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600a805463ffffffff19168155670de0b6b3a764000060c081905260e08190526729a2241af62c0000610100819052674563918244f40000610120819052600d839055600e92909255600f556010556101a0604052601e61014052610160526005610180526011805462050a1e62ffffff19918216179091556000601255601380549091169055662386f26fc100006014553480156200009e57600080fd5b506040516200546138038062005461833981016040819052620000c191620003c7565b8383620000ce3362000350565b6001600160601b0319606092831b811660a052911b1660805260158290556016819055600580546001600160a01b038881166001600160a01b031992831681179093556006805483169093179092556003805492881692909116821790556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b1580156200016357600080fd5b505afa15801562000178573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019e9190620003a0565b600554600354604080516315ab88c960e31b815290516001600160a01b039485169463e6a4390594811693169163ad5c4648916004808301926020929190829003018186803b158015620001f157600080fd5b505afa15801562000206573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022c9190620003a0565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b1580156200027357600080fd5b505afa15801562000288573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ae9190620003a0565b600480546001600160a01b0319166001600160a01b03929092169182179055620003445760405162461bcd60e51b815260206004820152603460248201527f544553543a3a75706461746570616e63616b6553776170526f757465723a204960448201527f6e76616c6964207061697220616464726573732e000000000000000000000000606482015260840160405180910390fd5b5050505050506200045c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215620003b357600080fd5b8151620003c08162000443565b9392505050565b60008060008060008060c08789031215620003e157600080fd5b8651620003ee8162000443565b6020880151909650620004018162000443565b6040880151909550620004148162000443565b6060880151909450620004278162000443565b809350506080870151915060a087015190509295509295509295565b6001600160a01b03811681146200045957600080fd5b50565b60805160601c60a05160601c614fcb6200049660003960008181611afe01526144b201526000818161438f01526144830152614fcb6000f3fe6080604052600436106102695760003560e01c806301485a86146102755780630284a8d0146102b3578063144b6ae1146102ca5780631fb04b1014610326578063245589951461036a57806327e235e3146103975780632b1335e2146103c45780632e1a7d4d146103d957806330a18b06146103f957806332bed7661461046057806334513d4f146104805780633610724e146104b657806336118b52146104c957806338bca748146104e95780633b4ba03a14610509578063429494f2146105295780635cc8edeb146105495780635d7484091461055e5780636fdca5e01461057e57806370a082311461059e578063715018a6146105d4578063839d22b9146105e9578063874b79911461060957806387e4be4c1461063e5780638833c9891461065e57806389be06651461067b5780638b31fb89146106b45780638da5cb5b146106d457806394985ddd146106e95780639c3977b5146107095780639ebd911514610733578063a382da0c14610753578063a8c737b01461078f578063ad7a672f146107b1578063ada1b8b4146107c6578063b3f72662146107e6578063b688a3631461082b578063b6b55f2514610833578063b7194d7c14610853578063bbc673951461086b578063bcb3962114610880578063c360d55d146108ad578063c50b0fb0146108cd578063c8ea4dd6146108ed578063cda43b3a1461090d578063ceeb706614610930578063de5a5de414610950578063e2eb41ff1461097b578063e638f2d314610a07578063e6de41ec14610a1c578063f2fde38b14610a57578063f691771f14610a77578063fbf7c7df14610a97578063fcfff16f14610aad57600080fd5b3661027057005b600080fd5b34801561028157600080fd5b5061029561029036600461497c565b610ac7565b6040805160ff90931683529015156020830152015b60405180910390f35b3480156102bf57600080fd5b506102c8610c57565b005b3480156102d657600080fd5b506103166102e5366004614622565b6013546001600160a01b0390911660009081526008602052604090206001015461ffff908116610100909204161490565b60405190151581526020016102aa565b34801561033257600080fd5b5061035c610341366004614622565b6001600160a01b031660009081526008602052604090205490565b6040519081526020016102aa565b34801561037657600080fd5b5060035461038a906001600160a01b031681565b6040516102aa9190614a90565b3480156103a357600080fd5b5061035c6103b2366004614622565b600c6020526000908152604090205481565b3480156103d057600080fd5b506102c8610d66565b3480156103e557600080fd5b506102c86103f43660046148c7565b610f30565b34801561040557600080fd5b5061043e6104143660046149e4565b6009602052600090815260409020805460019091015460ff821691610100900463ffffffff169083565b60408051931515845263ffffffff9092166020840152908201526060016102aa565b34801561046c57600080fd5b506102c861047b36600461487b565b6111a3565b34801561048c57600080fd5b5061035c61049b3660046149e4565b63ffffffff1660009081526009602052604090206001015490565b6102c86104c43660046148c7565b61120f565b3480156104d557600080fd5b506102c86104e43660046148f9565b611450565b3480156104f557600080fd5b506102c8610504366004614663565b6114e8565b34801561051557600080fd5b5060065461038a906001600160a01b031681565b34801561053557600080fd5b5060045461038a906001600160a01b031681565b34801561055557600080fd5b5060145461035c565b34801561056a57600080fd5b506102c861057936600461469c565b6117a0565b34801561058a57600080fd5b506102c861059936600461481f565b61183a565b3480156105aa57600080fd5b5061035c6105b9366004614622565b6001600160a01b03166000908152600c602052604090205490565b3480156105e057600080fd5b506102c861189e565b3480156105f557600080fd5b506102c861060436600461491e565b6118d9565b34801561061557600080fd5b506106296106243660046148c7565b611980565b60405163ffffffff90911681526020016102aa565b34801561064a57600080fd5b506102c8610659366004614622565b6119ba565b34801561066a57600080fd5b50600a546106299063ffffffff1681565b34801561068757600080fd5b5061035c610696366004614622565b6001600160a01b031660009081526008602052604090206003015490565b3480156106c057600080fd5b506106296106cf366004614622565b611a0b565b3480156106e057600080fd5b5061038a611ae4565b3480156106f557600080fd5b506102c8610704366004614859565b611af3565b34801561071557600080fd5b50600d54600e54600f546010545b6040516102aa9493929190614cb6565b34801561073f57600080fd5b506102c861074e366004614622565b611b79565b34801561075f57600080fd5b506011546107809060ff808216916101008104821691620100009091041683565b6040516102aa93929190614cd1565b34801561079b57600080fd5b506107a4611c0f565b6040516102aa9190614b51565b3480156107bd57600080fd5b5061035c611c93565b3480156107d257600080fd5b506102c86107e1366004614950565b611d19565b3480156107f257600080fd5b5061035c610801366004614622565b6001600160a01b031660009081526008602052604090206001015462010000900463ffffffff1690565b6102c86126fa565b34801561083f57600080fd5b506102c861084e3660046148c7565b612898565b34801561085f57600080fd5b5060135460ff16610316565b34801561087757600080fd5b506102c8612bc7565b34801561088c57600080fd5b50601354610100900461ffff165b60405161ffff90911681526020016102aa565b3480156108b957600080fd5b506102c86108c8366004614a1c565b612e76565b3480156108d957600080fd5b5060135461089a90610100900461ffff1681565b3480156108f957600080fd5b5060025461038a906001600160a01b031681565b34801561091957600080fd5b50600d54600e54600f546010546107239392919084565b34801561093c57600080fd5b506102c861094b3660046148c7565b612f27565b34801561095c57600080fd5b5060115460ff8082169161010081048216916201000090910416610780565b34801561098757600080fd5b506109d3610996366004614622565b600860205260009081526040902080546001820154600290920154909161ffff81169163ffffffff620100008304811692600160301b9004169085565b6040805195865261ffff909416602086015263ffffffff92831693850193909352166060830152608082015260a0016102aa565b348015610a1357600080fd5b506102c8612f93565b348015610a2857600080fd5b50610629610a373660046149e4565b63ffffffff90811660009081526009602052604090205461010090041690565b348015610a6357600080fd5b506102c8610a72366004614622565b613149565b348015610a8357600080fd5b506102c8610a923660046146e7565b6131e9565b348015610aa357600080fd5b5061035c60145481565b348015610ab957600080fd5b506013546103169060ff1681565b60008060008660ff1611610b125760405162461bcd60e51b815260206004820152600d60248201526c477261646520746f6f206c6f7760981b60448201526064015b60405180910390fd5b60048660ff161115610b575760405162461bcd60e51b815260206004820152600e60248201526d08ee4c2c8ca40e8dede40d0d2ced60931b6044820152606401610b09565b8560ff1660011415610b8857610b70600288600061373d565b60ff16610b835750600190506000610c4d565b610c46565b8560ff1660021415610bcb57610ba08588600061373d565b60ff16610bb35750600090506001610c4d565b610bc0600188600161373d565b600091509150610c4d565b8560ff1660031415610c0357610be38488600061373d565b60ff16610bf65750600090506001610c4d565b610bc0600288600161373d565b8560ff1660041415610c4657610c1b8388600061373d565b60ff16610c2e5750600090506001610c4d565b610c3b600288600161373d565b610bc0906001614d4b565b5060009050805b9550959350505050565b33610c60611ae4565b6001600160a01b031614610c865760405162461bcd60e51b8152600401610b0990614c45565b600a805460019190600090610ca290849063ffffffff16614d2c565b825461010092830a63ffffffff818102199092169282160291909117909255600a80548316600090815260096020526040808220805460ff191660019081179091558354600b8054928301815584527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db960088304018054600790931660040290960a80880219909216908716909102179093559054915191909216925033917fe1b55aea8861ee3614cc89fefd1300481f2154872e1b969bea36f1046a383c2e91a3565b3360009081526008602052604090206003015480610dc35760405162461bcd60e51b815260206004820152601a6024820152794e6f20626f6f73746572207061636b7320746f20756e7061636b60301b6044820152606401610b09565b336000908152600860205260408120600301610de0600184614d8f565b81548110610df057610df0614ea7565b60009182526020808320600290920290910154338352600890915260408220909250600301610e20600185614d8f565b81548110610e3057610e30614ea7565b600091825260208220600160029092020181015460115460ff91821694508392610e939287928792610e6492909116614dcb565b601154610e7b90600190610100900460ff16614dcb565b6011546102909060019062010000900460ff16614dcb565b91509150610ea2828286613799565b336000908152600860205260409020600301805480610ec357610ec3614e91565b600082815260208120600260001990930192830201908155600101805460ff19169055905560405160ff84169033907f5d4cc5a431d132160f228cd6d6536eba930fbac7ac9aa219f434d8964254365590610f219088815260200190565b60405180910390a35050505050565b336000908152600c6020526040902054811115610f8c5760405162461bcd60e51b815260206004820152601a602482015279496e73756666696369656e7420746f6b656e2062616c616e636560301b6044820152606401610b09565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610fbd903090600401614a90565b60206040518083038186803b158015610fd557600080fd5b505afa158015610fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100d91906148e0565b60055460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb906110409033908690600401614acc565b602060405180830381600087803b15801561105a57600080fd5b505af115801561106e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611092919061483c565b50336000908152600c60205260409020546110ae908390614d8f565b336000908152600c6020526040908190209190915560055490516370a0823160e01b815283916001600160a01b0316906370a08231906110f2903090600401614a90565b60206040518083038186803b15801561110a57600080fd5b505afa15801561111e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114291906148e0565b61114c9083614d8f565b111561116a5760405162461bcd60e51b8152600401610b0990614bd0565b60405182815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a25050565b336111ac611ae4565b6001600160a01b0316146111d25760405162461bcd60e51b8152600401610b0990614c45565b6013805462ffff00191661010061ffff84811682029290921792839055604051920416903390600080516020614f1683398151915290600090a350565b60135460ff166112315760405162461bcd60e51b8152600401610b0990614c1d565b600034116112735760405162461bcd60e51b815260206004820152600f60248201526e139bc8109390881c1c9bdd9a591959608a1b6044820152606401610b09565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a08231906112a4903090600401614a90565b60206040518083038186803b1580156112bc57600080fd5b505afa1580156112d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f491906148e0565b905061130034836139c9565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611331903090600401614a90565b60206040518083038186803b15801561134957600080fd5b505afa15801561135d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138191906148e0565b90508181116113c75760405162461bcd60e51b8152602060048201526012602482015271139bc8151bdad95b9cc81c1c9bdd9a59195960721b6044820152606401610b09565b336000908152600c602052604090205482906113e4908390614d14565b6113ee9190614d8f565b336000818152600c60205260409020919091557f0d1a0d5e3d583a0e92588799dd06e50fd78c07daf05f0cc06d7b848b1ca445f161142c8484614d8f565b604080519182526020820187905234908201526060015b60405180910390a2505050565b33611459611ae4565b6001600160a01b03161461147f5760405162461bcd60e51b8152600401610b0990614c45565b6040516001600160a01b0382169083156108fc029084906000818181858888f193505050501580156114b5573d6000803e3d6000fd5b506040518281526001600160a01b038216903390600080516020614f768339815191529060200160405180910390a35050565b336114f1611ae4565b6001600160a01b0316146115175760405162461bcd60e51b8152600401610b0990614c45565b600680546001600160a01b038084166001600160a01b031992831681179093556005805483169093179092556003805492851692909116821790556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b15801561158857600080fd5b505afa15801561159c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c09190614646565b6001600160a01b031663e6a4390582600360009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561161d57600080fd5b505afa158015611631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116559190614646565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b15801561169b57600080fd5b505afa1580156116af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d39190614646565b600480546001600160a01b0319166001600160a01b0392909216918217905561175b5760405162461bcd60e51b815260206004820152603460248201527f544553543a3a75706461746570616e63616b6553776170526f757465723a2049604482015273373b30b634b2103830b4b91030b2323932b9b99760611b6064820152608401610b09565b6004546003546040516001600160a01b03928316929091169033907f9fe3d07545e3958d796eab15a329f937659629d54f9322dc213f5625b3ddb1ce90600090a45050565b336117a9611ae4565b6001600160a01b0316146117cf5760405162461bcd60e51b8152600401610b0990614c45565b600254604051633c47200760e21b81526001600160a01b039091169063f11c801c9061180390869086908690600401614aa4565b600060405180830381600087803b15801561181d57600080fd5b505af1158015611831573d6000803e3d6000fd5b50505050505050565b33611843611ae4565b6001600160a01b0316146118695760405162461bcd60e51b8152600401610b0990614c45565b6013805460ff191682151590811790915560405160ff9091161515903390600080516020614f5683398151915290600090a350565b336118a7611ae4565b6001600160a01b0316146118cd5760405162461bcd60e51b8152600401610b0990614c45565b6118d76000613b4b565b565b336118e2611ae4565b6001600160a01b0316146119085760405162461bcd60e51b8152600401610b0990614c45565b6040805160808101825285815260208101859052808201849052606001829052600d859055600e849055600f83905560108290555133907fbec35960c6b3caa7ac07f7d546d3f533515d5876c65ea78d0eb8bbf164efd33590611972908790879087908790614cb6565b60405180910390a250505050565b600b818154811061199057600080fd5b9060005260206000209060089182820401919006600402915054906101000a900463ffffffff1681565b336119c3611ae4565b6001600160a01b0316146119e95760405162461bcd60e51b8152600401610b0990614c45565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526008602090815260408083206001015463ffffffff6201000082048116808652600990945291842054600160301b90910482169161010090910416811115611ab45760405162461bcd60e51b815260206004820152602760248201527f57696e73206265666f7265206a6f696e20686967686572207468616e20746f74604482015266616c2077696e7360c81b6064820152608401610b09565b63ffffffff808316600090815260096020526040902054611adc918391610100900416614da6565b949350505050565b6000546001600160a01b031690565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611b6b5760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c006044820152606401610b09565b611b758282613b9b565b5050565b33611b82611ae4565b6001600160a01b031614611ba85760405162461bcd60e51b8152600401610b0990614c45565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015611bdd573d6000803e3d6000fd5b506040514781526001600160a01b038216903390600080516020614f768339815191529060200160405180910390a350565b6060600b805480602002602001604051908101604052809291908181526020018280548015611c8957602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411611c4c5790505b5050505050905090565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611cc4903090600401614a90565b60206040518083038186803b158015611cdc57600080fd5b505afa158015611cf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1491906148e0565b905090565b60135460ff16611d3b5760405162461bcd60e51b8152600401610b0990614c1d565b601354610100900461ffff16611d845760405162461bcd60e51b815260206004820152600e60248201526d14d9585cdbdb881b9bdd081cd95d60921b6044820152606401610b09565b6013543360009081526008602052604090206001015461ffff9081166101009092041614611df45760405162461bcd60e51b815260206004820152601d60248201527f506c6179657220686173206e6f7420656e746572656420736561736f6e0000006044820152606401610b09565b3360009081526008602052604090206001015463ffffffff82811662010000909204161415611e5e5760405162461bcd60e51b815260206004820152601660248201527543616e6e6f742061747461636b206f776e207465616d60501b6044820152606401610b09565b3360009081526008602052604090206001015462010000900463ffffffff16611ec55760405162461bcd60e51b8152602060048201526019602482015278506c61796572206973206e6f74206f6e20616e79207465616d60381b6044820152606401610b09565b63ffffffff811660009081526009602052604090205460ff16611f205760405162461bcd60e51b81526020600482015260136024820152721519585b481a5cc81b9bdd08195b98589b1959606a1b6044820152606401610b09565b336000908152600c6020526040902054821115611f765760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610b09565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611fa7903090600401614a90565b60206040518083038186803b158015611fbf57600080fd5b505afa158015611fd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff791906148e0565b90504761200384613ed9565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612034903090600401614a90565b60206040518083038186803b15801561204c57600080fd5b505afa158015612060573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208491906148e0565b90504760006120938386614d8f565b9050868111156120b55760405162461bcd60e51b8152600401610b0990614bd0565b60006120c18584614d8f565b90508483116121125760405162461bcd60e51b815260206004820181905260248201527f4e6567617469766520424e422066726f6d2073656c6c696e6720746f6b656e736044820152606401610b09565b61211b816140ca565b84471461216a5760405162461bcd60e51b815260206004820152601f60248201527f424e422042616c616e6365206f6620636f6e7472616374206368616e676564006044820152606401610b09565b6005546040516370a0823160e01b815260009186916001600160a01b03909116906370a082319061219f903090600401614a90565b60206040518083038186803b1580156121b757600080fd5b505afa1580156121cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ef91906148e0565b6121f99190614d8f565b6005546040516370a0823160e01b815291925086916001600160a01b03909116906370a082319061222e903090600401614a90565b60206040518083038186803b15801561224657600080fd5b505afa15801561225a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227e91906148e0565b116122c55760405162461bcd60e51b8152602060048201526017602482015276546f6b656e73206c6f737420696e20707572636861736560481b6044820152606401610b09565b8881106123255760405162461bcd60e51b815260206004820152602860248201527f546f6b656e7320696e637265617365642061667465722063686172676520616e604482015267642061747461636b60c01b6064820152608401610b09565b6005546040516370a0823160e01b81526001600160a01b03909116906370a0823190612355903090600401614a90565b60206040518083038186803b15801561236d57600080fd5b505afa158015612381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a591906148e0565b87116123f35760405162461bcd60e51b815260206004820152601e60248201527f50696767792062616c616e636520646964206e6f7420646563726561736500006044820152606401610b09565b336000908152600c6020526040908190205460055491516370a0823160e01b815290916001600160a01b0316906370a0823190612434903090600401614a90565b60206040518083038186803b15801561244c57600080fd5b505afa158015612460573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248491906148e0565b61248e9089614d8f565b106124ea5760405162461bcd60e51b815260206004820152602660248201527f506c617965722063616e6e6f742070617920666f722062616c616e636520646560448201526563726561736560d01b6064820152608401610b09565b6005546040516370a0823160e01b81526001600160a01b03909116906370a082319061251a903090600401614a90565b60206040518083038186803b15801561253257600080fd5b505afa158015612546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256a91906148e0565b6125749088614d8f565b336000908152600c602052604081208054909190612593908490614d8f565b909155506125a290508961420a565b3360009081526008602052604081208054600192906125c2908490614d14565b909155505033600090815260086020526040812060020180548b92906125e9908490614d14565b909155505063ffffffff8816600090815260096020526040812060010180548b9290612616908490614d14565b90915550506005546040516370a0823160e01b815263ffffffff8a169133917f55252bb770185d49e48a996b6d4b370a3934ad86ae2f8cfc14e14a777bc9a057918d91879187916001600160a01b03909116906370a082319061267d903090600401614a90565b60206040518083038186803b15801561269557600080fd5b505afa1580156126a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126cd91906148e0565b6126d7908e614d8f565b6040516126e79493929190614cb6565b60405180910390a3505050505050505050565b60135460ff1661271c5760405162461bcd60e51b8152600401610b0990614c1d565b601454341461276d5760405162461bcd60e51b815260206004820152601f60248201527f424e422070726f7669646564206d75737420657175616c2074686520666565006044820152606401610b09565b6013543360009081526008602052604090206001015461ffff9081166101009092041614156127de5760405162461bcd60e51b815260206004820181905260248201527f506c617965722068617320616c7265616479206a6f696e656420736561736f6e6044820152606401610b09565b601354336000908152600860205260409020600101805461010090920461ffff1661ffff19909216919091179081905562010000900463ffffffff1661285d57600061282861430a565b60009081526007602052604090208054600161ff0160a01b0319163360ff60a81b191617600160a91b1760ff60a01b19169055505b60135460405161010090910461ffff169033907f485fd86c2a7d2d9ca3bf02e2ba776ea24271bc62274265b0bd5f478b3b7a1ca490600090a3565b60135460ff166128ba5760405162461bcd60e51b8152600401610b0990614c1d565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a08231906128eb903390600401614a90565b60206040518083038186803b15801561290357600080fd5b505afa158015612917573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293b91906148e0565b9050818110156129825760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b6044820152606401610b09565b6005546040516370a0823160e01b81526000916001600160a01b0316906370a08231906129b3903090600401614a90565b60206040518083038186803b1580156129cb57600080fd5b505afa1580156129df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0391906148e0565b6005546040516323b872dd60e01b8152336004820152306024820152604481018690529192506001600160a01b0316906323b872dd90606401602060405180830381600087803b158015612a5657600080fd5b505af1158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e919061483c565b506005546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612ac0903090600401614a90565b60206040518083038186803b158015612ad857600080fd5b505afa158015612aec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1091906148e0565b9050818111612b5d5760405162461bcd60e51b81526020600482015260196024820152784e656761746976652042616c616e636520496e63726561736560381b6044820152606401610b09565b612b678282614d8f565b336000908152600c6020526040902054612b819190614d14565b336000818152600c6020526040908190209290925590517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c906119729087815260200190565b33612bd0611ae4565b6001600160a01b031614612bf65760405162461bcd60e51b8152600401610b0990614c45565b6013805460ff19169055600b80546000916009918391908290612c1b57612c1b614ea7565b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020019081526020016000206001015490506000600b600081548110612c7757612c77614ea7565b60009182526020822060088204015460079091166004026101000a900463ffffffff1691505b600b5463ffffffff82161015612dc757600060096000600b8463ffffffff1681548110612ccc57612ccc614ea7565b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060010154905083811015612d5f57809350600b8263ffffffff1681548110612d3657612d36614ea7565b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1692505b600060096000600b8563ffffffff1681548110612d7e57612d7e614ea7565b6000918252602080832060088304015460079092166004026101000a90910463ffffffff1683528201929092526040019020600101555080612dbf81614e15565b915050612c9d565b5063ffffffff808216600090815260096020526040902080546001928391612df6918391610100900416614d2c565b825461010092830a63ffffffff81810219909216928216029190911790925560135460405192851693500461ffff169033907faed0d6345cb4c5533f56ed9c9985c76c9d9b3bf5d8f982bb41e37eb6b951c02590600090a460135460405160ff9091161515903390600080516020614f5683398151915290600090a35050565b33612e7f611ae4565b6001600160a01b031614612ea55760405162461bcd60e51b8152600401610b0990614c45565b6040805160608101825260ff858116808352858216602084018190529185169284018390526011805461ffff19169091176101009092029190911762ff00001916620100009092029190911790555133907f4ae22a5b9d78e2b0d3fb8eea9f5f2694f34cf97e80c1344298cbbb5ec02e58df9061144390869086908690614cd1565b33612f30611ae4565b6001600160a01b031614612f565760405162461bcd60e51b8152600401610b0990614c45565b601481905560405181815233907fc533115b9f93488c8c9d7347ce77d644bc8373bcf0c979e0302bfb212c4a3cdc9060200160405180910390a250565b33612f9c611ae4565b6001600160a01b031614612fc25760405162461bcd60e51b8152600401610b0990614c45565b60135460ff161561300d5760405162461bcd60e51b815260206004820152601560248201527429b2b0b9b7b71031bab93932b73a363c9037b832b760591b6044820152606401610b09565b6001601360018282829054906101000a900461ffff1661302d9190614cee565b825461ffff91821661010093840a90810290830219909116179092556013805460ff19166001179081905560025460405163f33f523360e01b8152929091049092166004820152600760248201526001600160a01b03909116915063f33f523390604401600060405180830381600087803b1580156130ab57600080fd5b505af11580156130bf573d6000803e3d6000fd5b505060135460405161010090910461ffff169250339150600080516020614f1683398151915290600090a360135460405161010090910461ffff169033907f5a50928cc9965b99c403a9f54c05589bf0acb2208356788f730a70d05df5253e90600090a360135460405160ff9091161515903390600080516020614f5683398151915290600090a3565b33613152611ae4565b6001600160a01b0316146131785760405162461bcd60e51b8152600401610b0990614c45565b6001600160a01b0381166131dd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b09565b6131e681613b4b565b50565b60025460009081906001600160a01b0316630ef7cc8e8585848161320f5761320f614ea7565b905060200201356040518263ffffffff1660e01b815260040161323491815260200190565b6040805180830381600087803b15801561324d57600080fd5b505af1158015613261573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132859190614898565b915091508060ff166001146132d35760405162461bcd60e51b815260206004820152601460248201527346697273742063617264206d757374206265203160601b6044820152606401610b09565b600254604051631b24783f60e21b815261ffff841660048201526000916001600160a01b031690636c91e0fc90602401602060405180830381600087803b15801561331d57600080fd5b505af1158015613331573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335591906149ff565b905060ff811684146133bb5760405162461bcd60e51b815260206004820152602960248201527f57726f6e6720616d6f756e74206f6620636172647320746f20636f6d706c657460448201526819481d1a19481cd95d60ba1b6064820152608401610b09565b60005b8160ff168160ff16101561369d5760025433906001600160a01b0316636352211e888860ff86168181106133f4576133f4614ea7565b905060200201356040518263ffffffff1660e01b815260040161341991815260200190565b60206040518083038186803b15801561343157600080fd5b505afa158015613445573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134699190614646565b6001600160a01b0316146134bd5760405162461bcd60e51b815260206004820152601b60248201527a14d95b99195c88191bd95cc81b9bdd081bdddb881d1a1948139195602a1b6044820152606401610b09565b60025460009081906001600160a01b0316630ef7cc8e898960ff87168181106134e8576134e8614ea7565b905060200201356040518263ffffffff1660e01b815260040161350d91815260200190565b6040805180830381600087803b15801561352657600080fd5b505af115801561353a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355e9190614898565b915091508561ffff168261ffff16146135af5760405162461bcd60e51b815260206004820152601360248201527210d85c9908199c9bdb481ddc9bdb99c81cd95d606a1b6044820152606401610b09565b6135ba836001614d4b565b60ff168160ff161461360b5760405162461bcd60e51b815260206004820152601a6024820152792bb937b7339031b0b93210373ab6b132b91037b91037b93232b960311b6044820152606401610b09565b6002546001600160a01b031663bbfb2ac3898960ff871681811061363157613631614ea7565b905060200201356040518263ffffffff1660e01b815260040161365691815260200190565b600060405180830381600087803b15801561367057600080fd5b505af1158015613684573d6000803e3d6000fd5b505050505050808061369590614e39565b9150506133be565b50600254604051633c47200760e21b81526001600160a01b039091169063f11c801c906136d39033908790600090600401614aa4565b600060405180830381600087803b1580156136ed57600080fd5b505af1158015613701573d6000803e3d6000fd5b505060405161ffff861692503391507f054d4834ab43b4965f47bab5adcf41a1afde5d2fb732d0cb6de1b2a1fd48492090600090a35050505050565b600061374a846001614d4b565b60ff16838360405160200161377692919091825260f81b6001600160f81b031916602082015260210190565b6040516020818303038152906040528051906020012060001c611adc9190614e59565b600a600360ff851611156137ef5760405162461bcd60e51b815260206004820152601e60248201527f546f6f206d616e7920636f6d6d6f6e204e4654732067656e65726174656400006044820152606401610b09565b82156138cd57613800600182614d4b565b905060006138106002848461373d565b61381b906005614d4b565b600254601354604051633c47200760e21b81529293506001600160a01b039091169163f11c801c9161385d913391610100900461ffff16908690600401614aa4565b600060405180830381600087803b15801561387757600080fd5b505af115801561388b573d6000803e3d6000fd5b50506013546040516001815260ff8516935061010090910461ffff1691503390600080516020614f368339815191529060200160405180910390a45050505050565b60005b8460ff168160ff1610156139c2576138e9600183614d4b565b915060006138f96003858561373d565b613904906001614d4b565b600254601354604051633c47200760e21b81529293506001600160a01b039091169163f11c801c91613946913391610100900461ffff16908690600401614aa4565b600060405180830381600087803b15801561396057600080fd5b505af1158015613974573d6000803e3d6000fd5b50506013546040516000815260ff8516935061010090910461ffff1691503390600080516020614f368339815191529060200160405180910390a450806139ba81614e39565b9150506138d0565b5050505050565b6040805160028082526060820183526000926020830190803683375050600354604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015613a2e57600080fd5b505afa158015613a42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a669190614646565b81600081518110613a7957613a79614ea7565b6001600160a01b039283166020918202929092010152600654825191169082906001908110613aaa57613aaa614ea7565b6001600160a01b03928316602091820292909201015260035460405163fb3bdb4160e01b815291169063fb3bdb41908590613aef908690869030904290600401614b9b565b6000604051808303818588803b158015613b0857600080fd5b505af1158015613b1c573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052613b45919081019061475b565b50505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082815260076020526040902054600160a01b900460ff1615613bbd575050565b600082815260076020908152604091829020548251858152918201849052600160a81b810460ff16926001600160a01b03909116917f20d1ca5dbbb2f39cc7b0251ad053a1a5d809af19a2b84b36a55eb4c0f67f0bfd910160405180910390a36000828152600760205260409020805460ff60a01b1916600160a01b1790819055600160a81b900460ff1660011415613d1257600082815260076020818152604080842080546001600160a01b0380821687526008855283872084518086018652898152878752600160b01b9384900460ff9081168289019081526003909301805460018082018355918c52898c2093516002909102909301928355925191909201805460ff19169183169190911790559689905294845290549151868152908204909416939216917f5fa1b5be9f75ea850e0d61199cfdafe2939b7b9d42ac27d2c65997a155b79e05910160405180910390a35b600082815260076020526040902054600160a81b900460ff1660021415611b7557600b54600090613d439083614e59565b9050600b8163ffffffff1681548110613d5e57613d5e614ea7565b6000918252602080832060088084049091015487855260078084526040808720546001600160a01b0316875292909352908420600101805465ffffffff00001916929093166004026101000a900463ffffffff908116620100000291909117909155600b8054600993928516908110613dd957613dd9614ea7565b60009182526020808320600880840490910154600793841660040261010090810a90910463ffffffff90811687528684019790975260409586018520548a8652938352858520546001600160a01b03168552915292909120600101805463ffffffff60301b1916929091048316600160301b02919091179055600b805490918316908110613e6957613e69614ea7565b60009182526020808320600883040154868452600780835260409485902054945187815293166004026101000a900463ffffffff16926001600160a01b0316917f69a36584af49fb418c5b7fd9413e047845ca787e479381d9e192879e37dcafe1910160405180910390a3505050565b604080516002808252606082018352600092602083019080368337505060065482519293506001600160a01b031691839150600090613f1a57613f1a614ea7565b6001600160a01b03928316602091820292909201810191909152600354604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015613f6e57600080fd5b505afa158015613f82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fa69190614646565b81600181518110613fb957613fb9614ea7565b6001600160a01b0392831660209182029290920101526005546003549082169163095ea7b39116613feb856002614d70565b6040518363ffffffff1660e01b8152600401614008929190614acc565b602060405180830381600087803b15801561402257600080fd5b505af1158015614036573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061405a919061483c565b5060035460405163791ac94760e01b81526001600160a01b039091169063791ac94790614094908590600090869030904290600401614c7a565b600060405180830381600087803b1580156140ae57600080fd5b505af11580156140c2573d6000803e3d6000fd5b505050505050565b6040805160028082526060820183526000926020830190803683375050600354604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b15801561412f57600080fd5b505afa158015614143573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141679190614646565b8160008151811061417a5761417a614ea7565b6001600160a01b0392831660209182029290920101526006548251911690829060019081106141ab576141ab614ea7565b6001600160a01b03928316602091820292909201015260035460405163b6f9de9560e01b815291169063b6f9de959084906141f190600090869030904290600401614b9b565b6000604051808303818588803b15801561181d57600080fd5b600d548110156142175750565b600061422161430a565b60008181526007602052604090208054600160a81b600161ff0160a01b03199091163360ff60a81b1916171760ff60a01b19169055600e54909150821015614286576000818152600760205260409020805460ff60b01b1916600160b01b1790555050565b600f548210156142b2576000908152600760205260409020805460ff60b01b1916600160b11b17905550565b6010548210156142de576000908152600760205260409020805460ff60b01b1916600360b01b17905550565b601054821115611b75576000908152600760205260409020805460ff60b01b1916600160b21b17905550565b6000336001600160a01b03167f6a3ed4873a42ec1cb81e59f48d49acba7a232cc500451fd7f664e8d6f8d77c0c60125460405160200161434c91815260200190565b60405160208183030381529060405261436490614dee565b60405190815260200160405180910390a26016546040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906143c4903090600401614a90565b60206040518083038186803b1580156143dc57600080fd5b505afa1580156143f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061441491906148e0565b10156144765760405162461bcd60e51b815260206004820152602b60248201527f4e6f7420656e6f756768204c494e4b202d2066696c6c20636f6e74726163742060448201526a1dda5d1a0819985d58d95d60aa1b6064820152608401610b09565b611d1460155460165460007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634000aea07f0000000000000000000000000000000000000000000000000000000000000000848660006040516020016144ef929190918252602082015260400190565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161451c93929190614ae5565b602060405180830381600087803b15801561453657600080fd5b505af115801561454a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061456e919061483c565b50600083815260016020818152604080842054815180840189905280830186905230606082015260808082018390528351808303909101815260a090910190925281519183019190912093879052908290526145c991614d14565b600085815260016020526040902055611adc8482604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b803563ffffffff8116811461461d57600080fd5b919050565b60006020828403121561463457600080fd5b813561463f81614ed3565b9392505050565b60006020828403121561465857600080fd5b815161463f81614ed3565b6000806040838503121561467657600080fd5b823561468181614ed3565b9150602083013561469181614ed3565b809150509250929050565b6000806000606084860312156146b157600080fd5b83356146bc81614ed3565b925060208401356146cc81614ef6565b915060408401356146dc81614f06565b809150509250925092565b600080602083850312156146fa57600080fd5b82356001600160401b038082111561471157600080fd5b818501915085601f83011261472557600080fd5b81358181111561473457600080fd5b8660208260051b850101111561474957600080fd5b60209290920196919550909350505050565b6000602080838503121561476e57600080fd5b82516001600160401b038082111561478557600080fd5b818501915085601f83011261479957600080fd5b8151818111156147ab576147ab614ebd565b8060051b604051601f19603f830116810181811085821117156147d0576147d0614ebd565b604052828152858101935084860182860187018a10156147ef57600080fd5b600095505b838610156148125780518552600195909501949386019386016147f4565b5098975050505050505050565b60006020828403121561483157600080fd5b813561463f81614ee8565b60006020828403121561484e57600080fd5b815161463f81614ee8565b6000806040838503121561486c57600080fd5b50508035926020909101359150565b60006020828403121561488d57600080fd5b813561463f81614ef6565b600080604083850312156148ab57600080fd5b82516148b681614ef6565b602084015190925061469181614f06565b6000602082840312156148d957600080fd5b5035919050565b6000602082840312156148f257600080fd5b5051919050565b6000806040838503121561490c57600080fd5b82359150602083013561469181614ed3565b6000806000806080858703121561493457600080fd5b5050823594602084013594506040840135936060013592509050565b6000806040838503121561496357600080fd5b8235915061497360208401614609565b90509250929050565b600080600080600060a0868803121561499457600080fd5b8535945060208601356149a681614f06565b935060408601356149b681614f06565b925060608601356149c681614f06565b915060808601356149d681614f06565b809150509295509295909350565b6000602082840312156149f657600080fd5b61463f82614609565b600060208284031215614a1157600080fd5b815161463f81614f06565b600080600060608486031215614a3157600080fd5b8335614a3c81614f06565b925060208401356146cc81614f06565b600081518084526020808501945080840160005b83811015614a855781516001600160a01b031687529582019590820190600101614a60565b509495945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0393909316835261ffff91909116602083015260ff16604082015260600190565b6001600160a01b03929092168252602082015260400190565b60018060a01b038416815260006020848184015260606040840152835180606085015260005b81811015614b2757858101830151858201608001528201614b0b565b81811115614b39576000608083870101525b50601f01601f19169290920160800195945050505050565b6020808252825182820181905260009190848201906040850190845b81811015614b8f57835163ffffffff1683529284019291840191600101614b6d565b50909695505050505050565b848152608060208201526000614bb46080830186614a4c565b6001600160a01b03949094166040830152506060015292915050565b6020808252602d908201527f436f6e74726163742062616c616e63652064656372656173652067726561746560408201526c1c881d1a185b88185b5bdd5b9d609a1b606082015260800190565b6020808252600e908201526d11d85b59481a5cc818db1bdcd95960921b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b85815284602082015260a060408201526000614c9960a0830186614a4c565b6001600160a01b0394909416606083015250608001529392505050565b93845260208401929092526040830152606082015260800190565b60ff93841681529183166020830152909116604082015260600190565b600061ffff808316818516808303821115614d0b57614d0b614e7b565b01949350505050565b60008219821115614d2757614d27614e7b565b500190565b600063ffffffff808316818516808303821115614d0b57614d0b614e7b565b600060ff821660ff84168060ff03821115614d6857614d68614e7b565b019392505050565b6000816000190483118215151615614d8a57614d8a614e7b565b500290565b600082821015614da157614da1614e7b565b500390565b600063ffffffff83811690831681811015614dc357614dc3614e7b565b039392505050565b600060ff821660ff841680821015614de557614de5614e7b565b90039392505050565b80516020808301519190811015614e0f576000198160200360031b1b821691505b50919050565b600063ffffffff80831681811415614e2f57614e2f614e7b565b6001019392505050565b600060ff821660ff811415614e5057614e50614e7b565b60010192915050565b600082614e7657634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146131e657600080fd5b80151581146131e657600080fd5b61ffff811681146131e657600080fd5b60ff811681146131e657600080fdfe7a172277b094c4acc15853b0cd975c02bc34d94d7eeff554414443e73c50d18bae2aeeb4e80ee6199a75aa22a8a5023976e2e0e225f2eb79c0e81a3bca20ef4176c44eafd40df56df5a86a7681438428d3a62e0d19e9c73ee5600e486a908aed81bb8ab873c357dc0a1bc0671f71a0184e75a780388618f11b67a9504bf766f8a26469706673582212206c03a0213afb66df2754ec5a259808dddb5542d3e9eb916bd9842d222f6160e464736f6c63430008060033000000000000000000000000d610e8523b335e6f3cebf1bd564800b755eafdfe0000000000000000000000009ac64cc6e4415144c455bd8e4837fea55603e5c3000000000000000000000000a555fc018435bef5a13c6c6870a9d4c11dec329c00000000000000000000000084b9b910527ad5c03a9ca831909e21e236ea7b06caf3c3727e033261d383b315559476f48034c13b18f8cafed4d871abe5049186000000000000000000000000000000000000000000000000016345785d8a0000

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

000000000000000000000000d610e8523b335e6f3cebf1bd564800b755eafdfe0000000000000000000000009ac64cc6e4415144c455bd8e4837fea55603e5c3000000000000000000000000a555fc018435bef5a13c6c6870a9d4c11dec329c00000000000000000000000084b9b910527ad5c03a9ca831909e21e236ea7b06caf3c3727e033261d383b315559476f48034c13b18f8cafed4d871abe5049186000000000000000000000000000000000000000000000000016345785d8a0000
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000d610e8523b335e6f3cebf1bd564800b755eafdfe
Arg [1] : 0000000000000000000000009ac64cc6e4415144c455bd8e4837fea55603e5c3
Arg [2] : 000000000000000000000000a555fc018435bef5a13c6c6870a9d4c11dec329c
Arg [3] : 00000000000000000000000084b9b910527ad5c03a9ca831909e21e236ea7b06
Arg [4] : caf3c3727e033261d383b315559476f48034c13b18f8cafed4d871abe5049186
Arg [5] : 000000000000000000000000000000000000000000000000016345785d8a0000


Deployed ByteCode Sourcemap

96399:23768:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113971:1484;;;;;;;;;;-1:-1:-1;113971:1484:0;;;;;:::i;:::-;;:::i;:::-;;;;32105:4:1;32093:17;;;32075:36;;32154:14;;32147:22;32142:2;32127:18;;32120:50;32048:18;113971:1484:0;;;;;;;;104706:201;;;;;;;;;;;;;:::i;:::-;;102434:127;;;;;;;;;;-1:-1:-1;102434:127:0;;;;;:::i;:::-;102547:6;;-1:-1:-1;;;;;102520:16:0;;;102496:4;102520:16;;;:7;:16;;;;;102547:6;102520:23;;102547:6;102520:23;;;102547:6;;;;;102520:33;;102434:127;;;;13000:14:1;;12993:22;12975:41;;12963:2;12948:18;102434:127:0;12930:92:1;101998:127:0;;;;;;;;;;-1:-1:-1;101998:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;102089:16:0;102063:7;102089:16;;;:7;:16;;;;;:28;;101998:127;;;;13522:25:1;;;13510:2;13495:18;101998:127:0;13477:76:1;96592:43:0;;;;;;;;;;-1:-1:-1;96592:43:0;;;;-1:-1:-1;;;;;96592:43:0;;;;;;;;;;:::i;97653:::-;;;;;;;;;;-1:-1:-1;97653:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;113355:610;;;;;;;;;;;;;:::i;108185:494::-;;;;;;;;;;-1:-1:-1;108185:494:0;;;;;:::i;:::-;;:::i;97508:36::-;;;;;;;;;;-1:-1:-1;97508:36:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13246:14:1;;13239:22;13221:41;;13310:10;13298:23;;;13293:2;13278:18;;13271:51;13338:18;;;13331:34;13209:2;13194:18;97508:36:0;13176:195:1;103530:132:0;;;;;;;;;;-1:-1:-1;103530:132:0;;;;;:::i;:::-;;:::i;102723:118::-;;;;;;;;;;-1:-1:-1;102723:118:0;;;;;:::i;:::-;102807:13;;102780:7;102807:13;;;:5;:13;;;;;:26;;;;102723:118;106833:642;;;;;;:::i;:::-;;:::i;104913:170::-;;;;;;;;;;-1:-1:-1;104913:170:0;;;;;:::i;:::-;;:::i;105523:567::-;;;;;;;;;;-1:-1:-1;105523:567:0;;;;;:::i;:::-;;:::i;96777:27::-;;;;;;;;;;-1:-1:-1;96777:27:0;;;;-1:-1:-1;;;;;96777:27:0;;;96673:30;;;;;;;;;;-1:-1:-1;96673:30:0;;;;-1:-1:-1;;;;;96673:30:0;;;101472:85;;;;;;;;;;-1:-1:-1;101542:7:0;;101472:85;;120042:122;;;;;;;;;;-1:-1:-1;120042:122:0;;;;;:::i;:::-;;:::i;103404:120::-;;;;;;;;;;-1:-1:-1;103404:120:0;;;;;:::i;:::-;;:::i;101740:109::-;;;;;;;;;;-1:-1:-1;101740:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;101824:17:0;101797:7;101824:17;;;:8;:17;;;;;;;101740:109;80698:94;;;;;;;;;;;;;:::i;117428:349::-;;;;;;;;;;-1:-1:-1;117428:349:0;;;;;:::i;:::-;;:::i;97590:27::-;;;;;;;;;;-1:-1:-1;97590:27:0;;;;;:::i;:::-;;:::i;:::-;;;31888:10:1;31876:23;;;31858:42;;31846:2;31831:18;97590:27:0;31813:93:1;106096:121:0;;;;;;;;;;-1:-1:-1;106096:121:0;;;;;:::i;:::-;;:::i;97553:28::-;;;;;;;;;;-1:-1:-1;97553:28:0;;;;;;;;101855:137;;;;;;;;;;-1:-1:-1;101855:137:0;;;;;:::i;:::-;-1:-1:-1;;;;;101948:16:0;101922:7;101948:16;;;:7;:16;;;;;:29;;:36;;101855:137;103066:332;;;;;;;;;;-1:-1:-1;103066:332:0;;;;;:::i;:::-;;:::i;80047:87::-;;;;;;;;;;;;;:::i;92693:233::-;;;;;;;;;;-1:-1:-1;92693:233:0;;;;;:::i;:::-;;:::i;102245:183::-;;;;;;;;;;-1:-1:-1;102345:10:0;:17;102364;;102383;;102402;;102245:183;;;;;;;;;;:::i;105089:187::-;;;;;;;;;;-1:-1:-1;105089:187:0;;;;;:::i;:::-;;:::i;98205:167::-;;;;;;;;;;-1:-1:-1;98205:167:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;102960:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;101351:115::-;;;;;;;;;;;;;:::i;108687:2447::-;;;;;;;;;;-1:-1:-1;108687:2447:0;;;;;:::i;:::-;;:::i;102131:108::-;;;;;;;;;;-1:-1:-1;102131:108:0;;;;;:::i;:::-;-1:-1:-1;;;;;102210:16:0;102184:7;102210:16;;;:7;:16;;;;;:21;;;;;;;;;102131:108;106225:602;;;:::i;107481:696::-;;;;;;;;;;-1:-1:-1;107481:696:0;;;;;:::i;:::-;;:::i;101563:79::-;;;;;;;;;;-1:-1:-1;101630:4:0;;;;101563:79;;103993:705;;;;;;;;;;;;;:::i;101648:86::-;;;;;;;;;;-1:-1:-1;101720:6:0;;;;;;;101648:86;;;28896:6:1;28884:19;;;28866:38;;28854:2;28839:18;101648:86:0;28821:89:1;117785:289:0;;;;;;;;;;-1:-1:-1;117785:289:0;;;;;:::i;:::-;;:::i;98448:24::-;;;;;;;;;;-1:-1:-1;98448:24:0;;;;;;;;;;;96515:27;;;;;;;;;;-1:-1:-1;96515:27:0;;;;-1:-1:-1;;;;;96515:27:0;;;97896:201;;;;;;;;;;-1:-1:-1;97896:201:0;;;;;;;;;;;;;;;105282:128;;;;;;;;;;-1:-1:-1;105282:128:0;;;;;:::i;:::-;;:::i;102567:150::-;;;;;;;;;;-1:-1:-1;102653:10:0;:17;;;;;;;102672;;;;;102691;;;;;102567:150;;97340:41;;;;;;;;;;-1:-1:-1;97340:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;97340:41:0;;;;;;;;;;30725:25:1;;;30798:6;30786:19;;;30781:2;30766:18;;30759:47;30825:10;30871:15;;;30851:18;;;30844:43;;;;30923:15;30918:2;30903:18;;30896:43;30970:3;30955:19;;30948:35;30712:3;30697:19;97340:41:0;30679:310:1;103668:319:0;;;;;;;;;;;;;:::i;102847:107::-;;;;;;;;;;-1:-1:-1;102847:107:0;;;;;:::i;:::-;102928:13;;;;102902:6;102928:13;;;:5;:13;;;;;:18;;;;;;102847:107;80947:192;;;;;;;;;;-1:-1:-1;80947:192:0;;;;;:::i;:::-;;:::i;116464:952::-;;;;;;;;;;-1:-1:-1;116464:952:0;;;;;:::i;:::-;;:::i;98481:42::-;;;;;;;;;;;;;;;;98415:24;;;;;;;;;;-1:-1:-1;98415:24:0;;;;;;;;113971:1484;114113:5;114120:4;114169:1;114161:5;:9;;;114153:35;;;;-1:-1:-1;;;114153:35:0;;24217:2:1;114153:35:0;;;24199:21:1;24256:2;24236:18;;;24229:30;-1:-1:-1;;;24275:18:1;;;24268:43;24328:18;;114153:35:0;;;;;;;;;114216:1;114207:5;:10;;;;114199:37;;;;-1:-1:-1;;;114199:37:0;;15771:2:1;114199:37:0;;;15753:21:1;15810:2;15790:18;;;15783:30;-1:-1:-1;;;15829:18:1;;;15822:44;15883:18;;114199:37:0;15743:164:1;114199:37:0;114251:5;:10;;114260:1;114251:10;114247:1173;;;114369:24;114382:1;114385:4;114391:1;114369:12;:24::i;:::-;:29;;114365:87;;-1:-1:-1;114427:1:0;;-1:-1:-1;114430:5:0;114419:17;;114365:87;114247:1173;;;114473:5;:10;;114482:1;114473:10;114469:951;;;114594:39;114607:16;114625:4;114631:1;114594:12;:39::i;:::-;:44;;114590:101;;-1:-1:-1;114667:1:0;;-1:-1:-1;114670:4:0;114659:16;;114590:101;114736:24;114749:1;114752:4;114758:1;114736:12;:24::i;:::-;114762:5;114728:40;;;;;;114469:951;114790:5;:10;;114799:1;114790:10;114786:634;;;114911:39;114924:16;114942:4;114948:1;114911:12;:39::i;:::-;:44;;114907:101;;-1:-1:-1;114984:1:0;;-1:-1:-1;114987:4:0;114976:16;;114907:101;115053:24;115066:1;115069:4;115075:1;115053:12;:24::i;114786:634::-;115109:5;:10;;115118:1;115109:10;115105:315;;;115230:39;115243:16;115261:4;115267:1;115230:12;:39::i;:::-;:44;;115226:101;;-1:-1:-1;115303:1:0;;-1:-1:-1;115306:4:0;115295:16;;115226:101;115372:24;115385:1;115388:4;115394:1;115372:12;:24::i;:::-;:28;;115399:1;115372:28;:::i;115105:315::-;-1:-1:-1;115438:1:0;;-1:-1:-1;115438:1:0;113971:1484;;;;;;;;;:::o;104706:201::-;2672:10;80267:7;:5;:7::i;:::-;-1:-1:-1;;;;;80267:23:0;;80259:68;;;;-1:-1:-1;;;80259:68:0;;;;;;;:::i;:::-;104753:10:::1;:15:::0;;104767:1:::1;::::0;104753:10;::::1;::::0;:15:::1;::::0;104767:1;;104753:15:::1;;;:::i;:::-;::::0;;::::1;::::0;;::::1;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;;104785:10:::1;::::0;;;::::1;-1:-1:-1::0;104779:17:0;;;:5:::1;:17;::::0;;;;;:32;;-1:-1:-1;;104779:32:0::1;-1:-1:-1::0;104779:32:0;;::::1;::::0;;;104839:10;;104822:11:::1;:28:::0;;;;::::1;::::0;;;;;::::1;::::0;::::1;;::::0;;;;;;::::1;;::::0;;::::1;::::0;;::::1;;::::0;;::::1;104839:10:::0;;::::1;104822:28:::0;;::::1;;::::0;;;104888:10;;104866:33;;104888:10;;;::::1;::::0;-1:-1:-1;104876:10:0::1;::::0;104866:33:::1;::::0;::::1;104706:201::o:0;113355:610::-;113426:10;113402:13;113418:19;;;:7;:19;;;;;:32;;:39;113476:12;113468:51;;;;-1:-1:-1;;;113468:51:0;;17970:2:1;113468:51:0;;;17952:21:1;18009:2;17989:18;;;17982:30;-1:-1:-1;;;18028:18:1;;;18021:56;18094:18;;113468:51:0;17942:176:1;113468:51:0;113553:10;113530:12;113545:19;;;:7;:19;;;;;:32;;113578:10;113587:1;113578:8;:10;:::i;:::-;113545:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:49;113627:10;113619:19;;:7;:19;;;;;;113545:49;;-1:-1:-1;113619:32:0;;113652:10;113661:1;113652:8;:10;:::i;:::-;113619:44;;;;;;;;:::i;:::-;;;;;;;;:50;:44;;;;;:50;;;113741:10;:17;113619:50;;;;;-1:-1:-1;113619:44:0;;113714:89;;113728:4;;113619:50;;113741:19;;113619:50;;113741:17;:19;:::i;:::-;113762:10;:17;:19;;113780:1;;113762:17;;;;;:19;:::i;:::-;113783:10;:17;:19;;113801:1;;113783:17;;;;;:19;:::i;113714:89::-;113680:123;;;;113814:36;113825:9;113836:7;113845:4;113814:10;:36::i;:::-;113869:10;113861:19;;;;:7;:19;;;;;:32;;:38;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;113861:38:0;;;;;;;;;;;;;;-1:-1:-1;;113861:38:0;;;;;113915:42;;113861:38;113915:42;;;113933:10;;113915:42;;;;113952:4;13522:25:1;;13510:2;13495:18;;13477:76;113915:42:0;;;;;;;;113391:574;;;;;113355:610::o;108185:494::-;108254:10;108245:20;;;;:8;:20;;;;;;:30;-1:-1:-1;108245:30:0;108237:69;;;;-1:-1:-1;;;108237:69:0;;26391:2:1;108237:69:0;;;26373:21:1;26430:2;26410:18;;;26403:30;-1:-1:-1;;;26449:18:1;;;26442:56;26515:18;;108237:69:0;26363:176:1;108237:69:0;108343:10;;:35;;-1:-1:-1;;;108343:35:0;;108317:23;;-1:-1:-1;;;;;108343:10:0;;:20;;:35;;108372:4;;108343:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;108389:10;;:39;;-1:-1:-1;;;108389:39:0;;108317:61;;-1:-1:-1;;;;;;108389:10:0;;:19;;:39;;108409:10;;108421:6;;108389:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;108471:10:0;108462:20;;;;:8;:20;;;;;;:29;;108485:6;;108462:29;:::i;:::-;108448:10;108439:20;;;;:8;:20;;;;;;;:52;;;;108529:10;;:35;;-1:-1:-1;;;108529:35:0;;108569:6;;-1:-1:-1;;;;;108529:10:0;;:20;;:35;;108558:4;;108529:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;108511:53;;:15;:53;:::i;:::-;108510:65;;108502:123;;;;-1:-1:-1;;;108502:123:0;;;;;;;:::i;:::-;108641:30;;13522:25:1;;;108652:10:0;;108641:30;;13510:2:1;13495:18;108641:30:0;;;;;;;108226:453;108185:494;:::o;103530:132::-;2672:10;80267:7;:5;:7::i;:::-;-1:-1:-1;;;;;80267:23:0;;80259:68;;;;-1:-1:-1;;;80259:68:0;;;;;;;:::i;:::-;103593:6:::1;:16:::0;;-1:-1:-1;;103593:16:0::1;;;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;103625:29:::1;::::0;103647:6;::::1;;::::0;103635:10:::1;::::0;-1:-1:-1;;;;;;;;;;;103625:29:0;-1:-1:-1;;103625:29:0::1;103530:132:::0;:::o;106833:642::-;106905:4;;;;106897:31;;;;-1:-1:-1;;;106897:31:0;;;;;;;:::i;:::-;106959:1;106947:9;:13;106939:41;;;;-1:-1:-1;;;106939:41:0;;17626:2:1;106939:41:0;;;17608:21:1;17665:2;17645:18;;;17638:30;-1:-1:-1;;;17684:18:1;;;17677:45;17739:18;;106939:41:0;17598:165:1;106939:41:0;107021:10;;:35;;-1:-1:-1;;;107021:35:0;;106991:27;;-1:-1:-1;;;;;107021:10:0;;:20;;:35;;107050:4;;107021:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106991:65;;107067:43;107089:9;107100;107067:21;:43::i;:::-;107149:10;;:35;;-1:-1:-1;;;107149:35:0;;107121:25;;-1:-1:-1;;;;;107149:10:0;;:20;;:35;;107178:4;;107149:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;107121:63;;107223:19;107203:17;:39;107195:70;;;;-1:-1:-1;;;107195:70:0;;28577:2:1;107195:70:0;;;28559:21:1;28616:2;28596:18;;;28589:30;-1:-1:-1;;;28635:18:1;;;28628:48;28693:18;;107195:70:0;28549:168:1;107195:70:0;107308:10;107299:20;;;;:8;:20;;;;;;107342:19;;107299:40;;107322:17;;107299:40;:::i;:::-;:62;;;;:::i;:::-;107285:10;107276:20;;;;:8;:20;;;;;:85;;;;107377:90;107405:39;107425:19;107405:17;:39;:::i;:::-;107377:90;;;31196:25:1;;;31252:2;31237:18;;31230:34;;;107457:9:0;31280:18:1;;;31273:34;31184:2;31169:18;107377:90:0;;;;;;;;106886:589;;106833:642;:::o;104913:170::-;2672:10;80267:7;:5;:7::i;:::-;-1:-1:-1;;;;;80267:23:0;;80259:68;;;;-1:-1:-1;;;80259:68:0;;;;;;;:::i;:::-;104999:20:::1;::::0;-1:-1:-1;;;;;104999:12:0;::::1;::::0;:20;::::1;;;::::0;105012:6;;104999:20:::1;::::0;;;105012:6;104999:12;:20;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;105035:40:0::1;::::0;13522:25:1;;;-1:-1:-1;;;;;105035:40:0;::::1;::::0;105051:10:::1;::::0;-1:-1:-1;;;;;;;;;;;105035:40:0;13510:2:1;13495:18;105035:40:0::1;;;;;;;104913:170:::0;;:::o;105523:567::-;2672:10;80267:7;:5;:7::i;:::-;-1:-1:-1;;;;;80267:23:0;;80259:68;;;;-1:-1:-1;;;80259:68:0;;;;;;;:::i;:::-;105624:12:::1;:28:::0;;-1:-1:-1;;;;;105624:28:0;;::::1;-1:-1:-1::0;;;;;;105624:28:0;;::::1;::::0;::::1;::::0;;;105663:10:::1;:34:::0;;;::::1;::::0;;::::1;::::0;;;105708:17:::1;:47:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;105802:27:::1;::::0;;-1:-1:-1;;;105802:27:0;;;;:25:::1;::::0;:27:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;105708:47;105802:27;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;105784:54:0::1;;105839:13;105855:17;;;;;;;;;-1:-1:-1::0;;;;;105855:17:0::1;-1:-1:-1::0;;;;;105855:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;105784:96;::::0;-1:-1:-1;;;;;;105784:96:0::1;::::0;;;;;;-1:-1:-1;;;;;9928:15:1;;;105784:96:0::1;::::0;::::1;9910:34:1::0;9980:15;;9960:18;;;9953:43;9845:18;;105784:96:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;105766:15;:114:::0;;-1:-1:-1;;;;;;105766:114:0::1;-1:-1:-1::0;;;;;105766:114:0;;;::::1;::::0;;::::1;::::0;;105891:94:::1;;;::::0;-1:-1:-1;;;105891:94:0;;20504:2:1;105891:94:0::1;::::0;::::1;20486:21:1::0;20543:2;20523:18;;;20516:30;20582:34;20562:18;;;20555:62;-1:-1:-1;;;20633:18:1;;;20626:50;20693:19;;105891:94:0::1;20476:242:1::0;105891:94:0::1;106066:15;::::0;106046:17:::1;::::0;106001:81:::1;::::0;-1:-1:-1;;;;;106066:15:0;;::::1;::::0;106046:17;;::::1;::::0;106026:10:::1;::::0;106001:81:::1;::::0;106066:15:::1;::::0;106001:81:::1;105523:567:::0;;:::o;120042:122::-;2672:10;80267:7;:5;:7::i;:::-;-1:-1:-1;;;;;80267:23:0;;80259:68;;;;-1:-1:-1;;;80259:68:0;;;;;;;:::i;:::-;120125:9:::1;::::0;:31:::1;::::0;-1:-1:-1;;;120125:31:0;;-1:-1:-1;;;;;120125:9:0;;::::1;::::0;:14:::1;::::0;:31:::1;::::0;120140:2;;120144:3;;120149:6;;120125:31:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;120042:122:::0;;;:::o;103404:120::-;2672:10;80267:7;:5;:7::i;:::-;-1:-1:-1;;;;;80267:23:0;;80259:68;;;;-1:-1:-1;;;80259:68:0;;;;;;;:::i;:::-;103462:4:::1;:13:::0;;-1:-1:-1;;103462:13:0::1;::::0;::::1;;::::0;;::::1;::::0;;;103491:25:::1;::::0;103462:13:::1;103511:4:::0;;;103491:25:::1;;::::0;103499:10:::1;::::0;-1:-1:-1;;;;;;;;;;;103491:25:0;-1:-1:-1;;103491:25:0::1;103404:120:::0;:::o;80698:94::-;2672:10;80267:7;:5;:7::i;:::-;-1:-1:-1;;;;;80267:23:0;;80259:68;;;;-1:-1:-1;;;80259:68:0;;;;;;;:::i;:::-;80763:21:::1;80781:1;80763:9;:21::i;:::-;80698:94::o:0;117428:349::-;2672:10;80267:7;:5;:7::i;:::-;-1:-1:-1;;;;;80267:23:0;;80259:68;;;;-1:-1:-1;;;80259:68:0;;;;;;;:::i;:::-;117556:140:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;117543:10:::1;:153:::0;;;;;;;;;;;;;;;117712:57;117726:10:::1;::::0;117712:57:::1;::::0;::::1;::::0;117590:6;;117620;;117649;;117678;;117712:57:::1;:::i;:::-;;;;;;;;117428:349:::0;;;;:::o;97590:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;106096:121::-;2672:10;80267:7;:5;:7::i;:::-;-1:-1:-1;;;;;80267:23:0;;80259:68;;;;-1:-1:-1;;;80259:68:0;;;;;;;:::i;:::-;106180:9:::1;:29:::0;;-1:-1:-1;;;;;;106180:29:0::1;-1:-1:-1::0;;;;;106180:29:0;;;::::1;::::0;;;::::1;::::0;;106096:121::o;103066:332::-;-1:-1:-1;;;;;103155:16:0;;103123:6;103155:16;;;:7;:16;;;;;;;;:21;;;;;;;;;103261:11;;;:5;:11;;;;;;:16;-1:-1:-1;;;103211:31:0;;;;;;103155:21;103261:16;;;;:34;-1:-1:-1;103261:34:0;103253:86;;;;-1:-1:-1;;;103253:86:0;;25629:2:1;103253:86:0;;;25611:21:1;25668:2;25648:18;;;25641:30;25707:34;25687:18;;;25680:62;-1:-1:-1;;;25758:18:1;;;25751:37;25805:19;;103253:86:0;25601:229:1;103253:86:0;103357:11;;;;;;;;:5;:11;;;;;:16;:33;;103376:14;;103357:16;;;;:33;:::i;:::-;103350:40;103066:332;-1:-1:-1;;;;103066:332:0:o;80047:87::-;80093:7;80120:6;-1:-1:-1;;;;;80120:6:0;;80047:87::o;92693:233::-;92809:10;-1:-1:-1;;;;;92823:14:0;92809:28;;92801:72;;;;-1:-1:-1;;;92801:72:0;;26746:2:1;92801:72:0;;;26728:21:1;26785:2;26765:18;;;26758:30;26824:33;26804:18;;;26797:61;26875:18;;92801:72:0;26718:181:1;92801:72:0;92880:40;92898:9;92909:10;92880:17;:40::i;:::-;92693:233;;:::o;105089:187::-;2672:10;80267:7;:5;:7::i;:::-;-1:-1:-1;;;;;80267:23:0;;80259:68;;;;-1:-1:-1;;;80259:68:0;;;;;;;:::i;:::-;105162:35:::1;::::0;-1:-1:-1;;;;;105162:12:0;::::1;::::0;105175:21:::1;105162:35:::0;::::1;;;::::0;::::1;::::0;;;105175:21;105162:12;:35;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;105213:55:0::1;::::0;105246:21:::1;13522:25:1::0;;-1:-1:-1;;;;;105213:55:0;::::1;::::0;105229:10:::1;::::0;-1:-1:-1;;;;;;;;;;;105213:55:0;13510:2:1;13495:18;105213:55:0::1;;;;;;;105089:187:::0;:::o;102960:100::-;103006:15;103041:11;103034:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102960:100;:::o;101351:115::-;101423:10;;:35;;-1:-1:-1;;;101423:35:0;;101396:7;;-1:-1:-1;;;;;101423:10:0;;:20;;:35;;101452:4;;101423:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;101416:42;;101351:115;:::o;108687:2447::-;108758:4;;;;108750:31;;;;-1:-1:-1;;;108750:31:0;;;;;;;:::i;:::-;108800:6;;;;;;;108792:37;;;;-1:-1:-1;;;108792:37:0;;19452:2:1;108792:37:0;;;19434:21:1;19491:2;19471:18;;;19464:30;-1:-1:-1;;;19510:18:1;;;19503:44;19564:18;;108792:37:0;19424:164:1;108792:37:0;108878:6;;108856:10;108848:19;;;;:7;:19;;;;;108878:6;108848:26;;108878:6;108848:26;;;108878:6;;;;;108848:36;108840:78;;;;-1:-1:-1;;;108840:78:0;;23859:2:1;108840:78:0;;;23841:21:1;23898:2;23878:18;;;23871:30;23937:31;23917:18;;;23910:59;23986:18;;108840:78:0;23831:179:1;108840:78:0;108945:10;108937:19;;;;:7;:19;;;;;:24;;;:32;;;;:24;;;;;:32;;108929:67;;;;-1:-1:-1;;;108929:67:0;;28226:2:1;108929:67:0;;;28208:21:1;28265:2;28245:18;;;28238:30;-1:-1:-1;;;28284:18:1;;;28277:52;28346:18;;108929:67:0;28198:172:1;108929:67:0;109023:10;109015:19;;;;:7;:19;;;;;:24;;;;;;;;109007:67;;;;-1:-1:-1;;;109007:67:0;;23505:2:1;109007:67:0;;;23487:21:1;23544:2;23524:18;;;23517:30;-1:-1:-1;;;23563:18:1;;;23556:55;23628:18;;109007:67:0;23477:175:1;109007:67:0;109093:11;;;;;;;:5;:11;;;;;:19;;;109085:51;;;;-1:-1:-1;;;109085:51:0;;25281:2:1;109085:51:0;;;25263:21:1;25320:2;25300:18;;;25293:30;-1:-1:-1;;;25339:18:1;;;25332:49;25398:18;;109085:51:0;25253:169:1;109085:51:0;109164:10;109155:20;;;;:8;:20;;;;;;:30;-1:-1:-1;109155:30:0;109147:63;;;;-1:-1:-1;;;109147:63:0;;19795:2:1;109147:63:0;;;19777:21:1;19834:2;19814:18;;;19807:30;-1:-1:-1;;;19853:18:1;;;19846:50;19913:18;;109147:63:0;19767:170:1;109147:63:0;109248:10;;:35;;-1:-1:-1;;;109248:35:0;;109223:22;;-1:-1:-1;;;;;109248:10:0;;:20;;:35;;109277:4;;109248:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;109223:60;-1:-1:-1;109322:21:0;109356:24;109373:6;109356:16;:24::i;:::-;109439:10;;:35;;-1:-1:-1;;;109439:35:0;;109416:20;;-1:-1:-1;;;;;109439:10:0;;:20;;:35;;109468:4;;109439:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;109416:58;-1:-1:-1;109511:21:0;109485:23;109566:29;109416:58;109566:14;:29;:::i;:::-;109545:50;;109661:6;109647:10;:20;;109639:78;;;;-1:-1:-1;;;109639:78:0;;;;;;;:::i;:::-;109751:19;109773:35;109791:17;109773:15;:35;:::i;:::-;109751:57;;109877:17;109859:15;:35;109851:80;;;;-1:-1:-1;;;109851:80:0;;24559:2:1;109851:80:0;;;24541:21:1;;;24578:18;;;24571:30;24637:34;24617:18;;;24610:62;24689:18;;109851:80:0;24531:182:1;109851:80:0;109944:29;109961:11;109944:16;:29::i;:::-;110041:17;110016:21;:42;110008:86;;;;-1:-1:-1;;;110008:86:0;;20144:2:1;110008:86:0;;;20126:21:1;20183:2;20163:18;;;20156:30;20222:33;20202:18;;;20195:61;20273:18;;110008:86:0;20116:181:1;110008:86:0;110132:10;;:35;;-1:-1:-1;;;110132:35:0;;110107:22;;110170:12;;-1:-1:-1;;;;;110132:10:0;;;;:20;;:35;;110161:4;;110132:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;110201:10;;:35;;-1:-1:-1;;;110201:35:0;;110107:75;;-1:-1:-1;110239:12:0;;-1:-1:-1;;;;;110201:10:0;;;;:20;;:35;;110230:4;;110201:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;110193:86;;;;-1:-1:-1;;;110193:86:0;;22042:2:1;110193:86:0;;;22024:21:1;22081:2;22061:18;;;22054:30;-1:-1:-1;;;22100:18:1;;;22093:53;22163:18;;110193:86:0;22014:173:1;110193:86:0;110315:6;110298:14;:23;110290:76;;;;-1:-1:-1;;;110290:76:0;;22749:2:1;110290:76:0;;;22731:21:1;22788:2;22768:18;;;22761:30;22827:34;22807:18;;;22800:62;-1:-1:-1;;;22878:18:1;;;22871:38;22926:19;;110290:76:0;22721:230:1;110290:76:0;110402:10;;:35;;-1:-1:-1;;;110402:35:0;;-1:-1:-1;;;;;110402:10:0;;;;:20;;:35;;110431:4;;110402:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;110385:14;:52;110377:95;;;;-1:-1:-1;;;110377:95:0;;18732:2:1;110377:95:0;;;18714:21:1;18771:2;18751:18;;;18744:30;18810:32;18790:18;;;18783:60;18860:18;;110377:95:0;18704:180:1;110377:95:0;110557:10;110548:20;;;;:8;:20;;;;;;;;110509:10;;:35;;-1:-1:-1;;;110509:35:0;;110548:20;;-1:-1:-1;;;;;110509:10:0;;:20;;:35;;110538:4;;110509:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;110492:52;;:14;:52;:::i;:::-;110491:77;110483:128;;;;-1:-1:-1;;;110483:128:0;;18325:2:1;110483:128:0;;;18307:21:1;18364:2;18344:18;;;18337:30;18403:34;18383:18;;;18376:62;-1:-1:-1;;;18454:18:1;;;18447:36;18500:19;;110483:128:0;18297:228:1;110483:128:0;110726:10;;:35;;-1:-1:-1;;;110726:35:0;;-1:-1:-1;;;;;110726:10:0;;;;:20;;:35;;110755:4;;110726:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;110709:52;;:14;:52;:::i;:::-;110694:10;110685:20;;;;:8;:20;;;;;:76;;:20;;;:76;;;;;:::i;:::-;;;;-1:-1:-1;110774:21:0;;-1:-1:-1;110788:6:0;110774:13;:21::i;:::-;110814:10;110806:19;;;;:7;:19;;;;;:36;;110841:1;;110806:19;:36;;110841:1;;110806:36;:::i;:::-;;;;-1:-1:-1;;110861:10:0;110853:19;;;;:7;:19;;;;;:30;;:40;;110887:6;;110853:19;:40;;110887:6;;110853:40;:::i;:::-;;;;-1:-1:-1;;110904:11:0;;;;;;;:5;:11;;;;;:24;;:34;;110932:6;;110904:11;:34;;110932:6;;110904:34;:::i;:::-;;;;-1:-1:-1;;111090:10:0;;:35;;-1:-1:-1;;;111090:35:0;;110954:172;;;;110971:10;;110954:172;;111008:6;;111026:11;;111048:14;;-1:-1:-1;;;;;111090:10:0;;;;:20;;:35;;111119:4;;111090:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;111073:52;;:14;:52;:::i;:::-;110954:172;;;;;;;;;:::i;:::-;;;;;;;;108739:2395;;;;;;;108687:2447;;:::o;106225:602::-;106275:4;;;;106267:31;;;;-1:-1:-1;;;106267:31:0;;;;;;;:::i;:::-;106330:7;;106317:9;:20;106309:64;;;;-1:-1:-1;;;106309:64:0;;27106:2:1;106309:64:0;;;27088:21:1;27145:2;27125:18;;;27118:30;27184:33;27164:18;;;27157:61;27235:18;;106309:64:0;27078:181:1;106309:64:0;106422:6;;106400:10;106392:19;;;;:7;:19;;;;;106422:6;106392:26;;106422:6;106392:26;;;106422:6;;;;;106392:36;;106384:81;;;;-1:-1:-1;;;106384:81:0;;19091:2:1;106384:81:0;;;19073:21:1;;;19110:18;;;19103:30;19169:34;19149:18;;;19142:62;19221:18;;106384:81:0;19063:182:1;106384:81:0;106505:6;;106484:10;106476:19;;;;:7;:19;;;;;106505:6;106476:26;:35;;106505:6;;;;;;-1:-1:-1;;106476:35:0;;;;;;;;;;;106526:24;;;;;106522:252;;106572:17;106592;:15;:17::i;:::-;106624:19;;;;:8;:19;;;;;:42;;-1:-1:-1;;;;;;106681:29:0;106656:10;-1:-1:-1;;;;106681:29:0;;-1:-1:-1;;;106681:29:0;-1:-1:-1;;;;106725:37:0;;;-1:-1:-1;106522:252:0;106812:6;;106789:30;;106812:6;;;;;;;106800:10;;106789:30;;;;;106225:602::o;107481:696::-;107540:4;;;;107532:31;;;;-1:-1:-1;;;107532:31:0;;;;;;;:::i;:::-;107597:10;;:32;;-1:-1:-1;;;107597:32:0;;107574:20;;-1:-1:-1;;;;;107597:10:0;;:20;;:32;;107618:10;;107597:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;107574:55;;107664:6;107648:12;:22;;107640:53;;;;-1:-1:-1;;;107640:53:0;;23158:2:1;107640:53:0;;;23140:21:1;23197:2;23177:18;;;23170:30;-1:-1:-1;;;23216:18:1;;;23209:48;23274:18;;107640:53:0;23130:168:1;107640:53:0;107730:10;;:35;;-1:-1:-1;;;107730:35:0;;107704:23;;-1:-1:-1;;;;;107730:10:0;;:20;;:35;;107759:4;;107730:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;107825:10;;:58;;-1:-1:-1;;;107825:58:0;;107849:10;107825:58;;;10247:34:1;107869:4:0;10297:18:1;;;10290:43;10349:18;;;10342:34;;;107704:61:0;;-1:-1:-1;;;;;;107825:10:0;;:23;;10182:18:1;;107825:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;107919:10:0;;:35;;-1:-1:-1;;;107919:35:0;;107894:22;;-1:-1:-1;;;;;107919:10:0;;:20;;:35;;107948:4;;107919:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;107894:60;;107990:15;107973:14;:32;107965:70;;;;-1:-1:-1;;;107965:70:0;;26037:2:1;107965:70:0;;;26019:21:1;26076:2;26056:18;;;26049:30;-1:-1:-1;;;26095:18:1;;;26088:55;26160:18;;107965:70:0;26009:175:1;107965:70:0;108093:32;108110:15;108093:14;:32;:::i;:::-;108078:10;108069:20;;;;:8;:20;;;;;;:57;;;;:::i;:::-;108055:10;108046:20;;;;:8;:20;;;;;;;:80;;;;108142:27;;;;;;108162:6;13522:25:1;;13510:2;13495:18;;13477:76;103993:705:0;2672:10;80267:7;:5;:7::i;:::-;-1:-1:-1;;;;;80267:23:0;;80259:68;;;;-1:-1:-1;;;80259:68:0;;;;;;;:::i;:::-;104044:4:::1;:12:::0;;-1:-1:-1;;104044:12:0::1;::::0;;104102:11:::1;:14:::0;;104051:5:::1;::::0;104096::::1;::::0;104051;;104102:11;104051:5;;104102:14:::1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;104096:21;;;;;;;;;;;;;;;:34;;;104067:63;;104141:18;104162:11;104174:1;104162:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;;;::::1;;;;::::0;::::1;;;::::0;-1:-1:-1;104187:364:0::1;104210:11;:18:::0;104206:22:::1;::::0;::::1;;104187:364;;;104250:24;104277:5;:21;104283:11;104295:1;104283:14;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;104277:21;;;;;;;;;;;;;;;:34;;;104250:61;;104349:18;104330:16;:37;104326:161;;;104408:16;104387:37;;104457:11;104469:1;104457:14;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;104443:28;;104326:161;104538:1;104501:5;:21;104507:11;104519:1;104507:14;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;;;;;::::1;;;;::::0;;::::1;;;104501:21:::0;;;::::1;::::0;;;;;;;;:34:::1;;:38:::0;-1:-1:-1;104230:3:0;::::1;::::0;::::1;:::i;:::-;;;;104187:364;;;-1:-1:-1::0;104561:18:0::1;::::0;;::::1;;::::0;;;:5:::1;:18;::::0;;;;:28;;104588:1:::1;::::0;;;104561:28:::1;::::0;104588:1;;104561:28:::1;::::0;::::1;;;:::i;:::-;::::0;;::::1;::::0;;::::1;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;;104629:6:::1;::::0;104605:44:::1;::::0;;;::::1;::::0;-1:-1:-1;104629:6:0::1;;;::::0;104617:10:::1;::::0;104605:44:::1;::::0;-1:-1:-1;;104605:44:0::1;104685:4;::::0;104665:25:::1;::::0;104685:4:::1;::::0;;::::1;104665:25;;::::0;104673:10:::1;::::0;-1:-1:-1;;;;;;;;;;;104665:25:0;104685:4:::1;::::0;104665:25:::1;104033:665;;103993:705::o:0;117785:289::-;2672:10;80267:7;:5;:7::i;:::-;-1:-1:-1;;;;;80267:23:0;;80259:68;;;;-1:-1:-1;;;80259:68:0;;;;;;;:::i;:::-;117891:110:::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;117878:10:::1;:123:::0;;-1:-1:-1;;117878:123:0;;;;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;117878:123:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;118017:49;118031:10:::1;::::0;118017:49:::1;::::0;::::1;::::0;117891:110;;;;;;118017:49:::1;:::i;105282:128::-:0;2672:10;80267:7;:5;:7::i;:::-;-1:-1:-1;;;;;80267:23:0;;80259:68;;;;-1:-1:-1;;;80259:68:0;;;;;;;:::i;:::-;105344:7:::1;:14:::0;;;105374:28:::1;::::0;13522:25:1;;;105385:10:0::1;::::0;105374:28:::1;::::0;13510:2:1;13495:18;105374:28:0::1;;;;;;;105282:128:::0;:::o;103668:319::-;2672:10;80267:7;:5;:7::i;:::-;-1:-1:-1;;;;;80267:23:0;;80259:68;;;;-1:-1:-1;;;80259:68:0;;;;;;;:::i;:::-;103726:4:::1;::::0;::::1;;:13;103718:47;;;::::0;-1:-1:-1;;;103718:47:0;;27466:2:1;103718:47:0::1;::::0;::::1;27448:21:1::0;27505:2;27485:18;;;27478:30;-1:-1:-1;;;27524:18:1;;;27517:51;27585:18;;103718:47:0::1;27438:171:1::0;103718:47:0::1;103786:1;103776:6;;:11;;;;;;;;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;::::1;::::0;;::::1;;::::0;;::::1;;::::0;;;103798:4:::1;:11:::0;;-1:-1:-1;;103798:11:0::1;-1:-1:-1::0;103798:11:0::1;::::0;;;;103820:9:::1;::::0;:27:::1;::::0;-1:-1:-1;;;103820:27:0;;103837:6;;;::::1;::::0;;::::1;103820:27;::::0;::::1;29093:38:1::0;103845:1:0::1;29147:18:1::0;;;29140:45;-1:-1:-1;;;;;103820:9:0;;::::1;::::0;-1:-1:-1;103820:16:0::1;::::0;29066:18:1;;103820:27:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;103885:6:0::1;::::0;103863:29:::1;::::0;103885:6:::1;::::0;;::::1;;;::::0;-1:-1:-1;103873:10:0::1;::::0;-1:-1:-1;;;;;;;;;;;;103863:29:0;;;::::1;103931:6;::::0;103908:30:::1;::::0;103931:6:::1;::::0;;::::1;;;::::0;103919:10:::1;::::0;103908:30:::1;::::0;;;::::1;103974:4;::::0;103954:25:::1;::::0;103974:4:::1;::::0;;::::1;103954:25;;::::0;103962:10:::1;::::0;-1:-1:-1;;;;;;;;;;;103954:25:0;103974:4:::1;::::0;103954:25:::1;103668:319::o:0;80947:192::-;2672:10;80267:7;:5;:7::i;:::-;-1:-1:-1;;;;;80267:23:0;;80259:68;;;;-1:-1:-1;;;80259:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;81036:22:0;::::1;81028:73;;;::::0;-1:-1:-1;;;81028:73:0;;17219:2:1;81028:73:0::1;::::0;::::1;17201:21:1::0;17258:2;17238:18;;;17231:30;17297:34;17277:18;;;17270:62;-1:-1:-1;;;17348:18:1;;;17341:36;17394:19;;81028:73:0::1;17191:228:1::0;81028:73:0::1;81112:19;81122:8;81112:9;:19::i;:::-;80947:192:::0;:::o;116464:952::-;116564:9;;116531:14;;;;-1:-1:-1;;;;;116564:9:0;:20;116585:3;;116531:14;116585:6;;;;;:::i;:::-;;;;;;;116564:28;;;;;;;;;;;;;13522:25:1;;13510:2;13495:18;;13477:76;116564:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;116530:62;;;;116611:7;:12;;116622:1;116611:12;116603:45;;;;-1:-1:-1;;;116603:45:0;;21693:2:1;116603:45:0;;;21675:21:1;21732:2;21712:18;;;21705:30;-1:-1:-1;;;21751:18:1;;;21744:50;21811:18;;116603:45:0;21665:170:1;116603:45:0;116678:9;;:31;;-1:-1:-1;;;116678:31:0;;28896:6:1;28884:19;;116678:31:0;;;28866:38:1;116659:16:0;;-1:-1:-1;;;;;116678:9:0;;:22;;28839:18:1;;116678:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;116659:50;-1:-1:-1;116728:24:0;;;;;116720:78;;;;-1:-1:-1;;;116720:78:0;;27816:2:1;116720:78:0;;;27798:21:1;27855:2;27835:18;;;27828:30;27894:34;27874:18;;;27867:62;-1:-1:-1;;;27945:18:1;;;27938:39;27994:19;;116720:78:0;27788:231:1;116720:78:0;116816:7;116811:467;116834:10;116830:14;;:1;:14;;;116811:467;;;116874:9;;116903:10;;-1:-1:-1;;;;;116874:9:0;:17;116892:3;;:6;;;;;;;;;;:::i;:::-;;;;;;;116874:25;;;;;;;;;;;;;13522::1;;13510:2;13495:18;;13477:76;116874:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;116874:39:0;;116866:79;;;;-1:-1:-1;;;116866:79:0;;21337:2:1;116866:79:0;;;21319:21:1;21376:2;21356:18;;;21349:30;-1:-1:-1;;;21395:18:1;;;21388:57;21462:18;;116866:79:0;21309:177:1;116866:79:0;116989:9;;116961:10;;;;-1:-1:-1;;;;;116989:9:0;:20;117010:3;;:6;;;;;;;;;;:::i;:::-;;;;;;;116989:28;;;;;;;;;;;;;13522:25:1;;13510:2;13495:18;;13477:76;116989:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;116960:57;;;;117047:7;117040:14;;:3;:14;;;117032:46;;;;-1:-1:-1;;;117032:46:0;;16528:2:1;117032:46:0;;;16510:21:1;16567:2;16547:18;;;16540:30;-1:-1:-1;;;16586:18:1;;;16579:49;16645:18;;117032:46:0;16500:169:1;117032:46:0;117112:3;:1;117114;117112:3;:::i;:::-;117101:15;;:6;:15;;;117093:54;;;;-1:-1:-1;;;117093:54:0;;22394:2:1;117093:54:0;;;22376:21:1;22433:2;22413:18;;;22406:30;-1:-1:-1;;;22452:18:1;;;22445:56;22518:18;;117093:54:0;22366:176:1;117093:54:0;117227:9;;-1:-1:-1;;;;;117227:9:0;:19;117247:3;;:6;;;;;;;;;;:::i;:::-;;;;;;;117227:27;;;;;;;;;;;;;13522:25:1;;13510:2;13495:18;;13477:76;117227:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;116851:427;;116846:3;;;;;:::i;:::-;;;;116811:467;;;-1:-1:-1;117288:9:0;;:38;;-1:-1:-1;;;117288:38:0;;-1:-1:-1;;;;;117288:9:0;;;;:14;;:38;;117303:10;;117315:7;;117288:9;;:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;117372:36:0;;;;;;-1:-1:-1;117388:10:0;;-1:-1:-1;117372:36:0;;;;;116519:897;;;116464:952;;:::o;116276:180::-;116357:5;116441;:3;116445:1;116441:5;:::i;:::-;116388:59;;116423:4;116429:5;116406:29;;;;;;;;9365:19:1;;;9440:3;9418:16;-1:-1:-1;;;;;;9414:36:1;9409:2;9400:12;;9393:58;9476:2;9467:12;;9355:130;116406:29:0;;;;;;;;;;;;;116396:40;;;;;;116388:49;;:59;;;;:::i;115463:805::-;115561:2;115595:1;115582:14;;;;;115574:57;;;;-1:-1:-1;;;115574:57:0;;15412:2:1;115574:57:0;;;15394:21:1;15451:2;15431:18;;;15424:30;15490:32;15470:18;;;15463:60;15540:18;;115574:57:0;15384:180:1;115574:57:0;115646:7;115642:300;;;115670:9;115678:1;115670:9;;:::i;:::-;;;115724:12;115739:28;115752:1;115755:4;115761:5;115739:12;:28::i;:::-;:32;;115770:1;115739:32;:::i;:::-;115803:9;;115830:6;;115803:42;;-1:-1:-1;;;115803:42:0;;115724:47;;-1:-1:-1;;;;;;115803:9:0;;;;:14;;:42;;115818:10;;115803:9;115830:6;;;;;115724:47;;115803:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;115888:6:0;;115865:44;;115888:6;12975:41:1;;115865:44:0;;;;-1:-1:-1;115888:6:0;;;;;;;-1:-1:-1;115876:10:0;;-1:-1:-1;;;;;;;;;;;115865:44:0;12963:2:1;12948:18;115865:44:0;;;;;;;115924:7;;115463:805;;;:::o;115642:300::-;115957:7;115952:309;115975:9;115971:13;;:1;:13;;;115952:309;;;116006:10;116015:1;116006:10;;:::i;:::-;;;116063:12;116078:28;116091:1;116094:4;116100:5;116078:12;:28::i;:::-;:32;;116109:1;116078:32;:::i;:::-;116142:9;;116169:6;;116142:42;;-1:-1:-1;;;116142:42:0;;116063:47;;-1:-1:-1;;;;;;116142:9:0;;;;:14;;:42;;116157:10;;116142:9;116169:6;;;;;116063:47;;116142:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;116227:6:0;;116204:45;;116243:5;12975:41:1;;116204:45:0;;;;-1:-1:-1;116227:6:0;;;;;;;-1:-1:-1;116215:10:0;;-1:-1:-1;;;;;;;;;;;116204:45:0;12963:2:1;12948:18;116204:45:0;;;;;;;-1:-1:-1;115986:3:0;;;;:::i;:::-;;;;115952:309;;;;115536:732;115463:805;;;:::o;119298:505::-;119471:16;;;119485:1;119471:16;;;;;;;;119447:21;;119471:16;;;;;;;;-1:-1:-1;;119508:17:0;;:24;;;-1:-1:-1;;;119508:24:0;;;;119447:40;;-1:-1:-1;;;;;;119508:17:0;;;;:22;;-1:-1:-1;119508:24:0;;;;;;;;;;;;;;:17;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;119498:4;119503:1;119498:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;119498:34:0;;;:7;;;;;;;;;:34;119553:12;;119543:7;;119553:12;;;119543:4;;119553:12;;119543:7;;;;;;:::i;:::-;-1:-1:-1;;;;;119543:22:0;;;:7;;;;;;;;;:22;119604:17;;:191;;-1:-1:-1;;;119604:191:0;;:17;;;:39;;119651:9;;119604:191;;119676:9;;119722:4;;119749;;119769:15;;119604:191;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;119604:191:0;;;;;;;;;;;;:::i;:::-;;119375:428;119298:505;;:::o;81147:173::-;81203:16;81222:6;;-1:-1:-1;;;;;81239:17:0;;;-1:-1:-1;;;;;;81239:17:0;;;;;;81272:40;;81222:6;;;;;;;81272:40;;81203:16;81272:40;81192:128;81147:173;:::o;112167:1180::-;112266:19;;;;:8;:19;;;;;:29;-1:-1:-1;;;112266:29:0;;;;112262:68;;;112167:1180;;:::o;112262:68::-;112398:19;;;;:8;:19;;;;;;;;;:25;112345:102;;13732:25:1;;;13773:18;;;13766:34;;;-1:-1:-1;;;112398:25:0;;;;;-1:-1:-1;;;;;112367:29:0;;;;112345:102;;13705:18:1;112345:102:0;;;;;;;112458:19;;;;:8;:19;;;;;:36;;-1:-1:-1;;;;112458:36:0;-1:-1:-1;;;112458:36:0;;;;;-1:-1:-1;;;112545:25:0;;112458:36;112545:25;112490:4;112545:30;112541:344;;;112592:38;112600:19;;;:8;:19;;;;;;;;:29;;-1:-1:-1;;;;;112600:29:0;;;112592:38;;:7;:38;;;;;112649:114;;;;;;;;;;112687:19;;;-1:-1:-1;;;112687:25:0;;;;;;;;112649:114;;;;;;112592:51;;;;:172;;112600:29;112592:172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;112592:172:0;;;;;;;;;;112835:19;;;;;;;:25;;112784:89;;13522:25:1;;;112835::0;;;;;;;112804:29;;;112784:89;;13495:18:1;112784:89:0;;;;;;;112541:344;112936:19;;;;:8;:19;;;;;:25;-1:-1:-1;;;112936:25:0;;;;112965:1;112936:30;112932:408;;;113022:11;:18;112983:16;;113009:31;;:10;:31;:::i;:::-;112983:58;;113102:11;113114:9;113102:22;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;113064:19;;;113102:22;113064:19;;;;;;;:29;-1:-1:-1;;;;;113064:29:0;113056:38;;;;;;;;;113064:29;113056:43;:68;;-1:-1:-1;;113056:68:0;113102:22;;;;;;;;;;;;;;113056:68;;;;;;;;;113201:11;:22;;113195:5;;113102:22;113201;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113195:29;;;;;;;;;;;;;;;:34;113147:19;;;;;;;;;:29;-1:-1:-1;;;;;113147:29:0;113139:38;;;;;;;;113195:34;113139:53;:90;;-1:-1:-1;;;;113139:90:0;113195:34;;;;;;-1:-1:-1;;;113139:90:0;;;;;;;113293:11;:22;;:11;;:22;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;113262:19;;;113293:22;113262:19;;;;;;;;:29;113249:79;;13522:25:1;;;113293:22:0;;;;;;;;;;;-1:-1:-1;;;;;113262:29:0;;113249:79;;13495:18:1;113249:79:0;;;;;;;112968:372;112167:1180;;:::o;118116:594::-;118267:16;;;118281:1;118267:16;;;;;;;;118243:21;;118267:16;;;;;;;;-1:-1:-1;;118304:12:0;;118294:7;;;;-1:-1:-1;;;;;;118304:12:0;;118294:7;;-1:-1:-1;118304:12:0;;118294:7;;;;:::i;:::-;-1:-1:-1;;;;;118294:22:0;;;:7;;;;;;;;;;:22;;;;118337:17;;:24;;;-1:-1:-1;;;118337:24:0;;;;:17;;;;;:22;;:24;;;;;118294:7;;118337:24;;;;;:17;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;118327:4;118332:1;118327:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;118327:34:0;;;:7;;;;;;;;;:34;118374:10;;118401:17;;118374:10;;;;:18;;118401:17;118421:13;:11;118433:1;118421:13;:::i;:::-;118374:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;118482:17:0;;:220;;-1:-1:-1;;;118482:220:0;;-1:-1:-1;;;;;118482:17:0;;;;:68;;:220;;118564:11;;118482:17;;118629:4;;118656;;118676:15;;118482:220;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118171:539;118116:594;:::o;118755:504::-;118905:16;;;118919:1;118905:16;;;;;;;;118881:21;;118905:16;;;;;;;;-1:-1:-1;;118942:17:0;;:24;;;-1:-1:-1;;;118942:24:0;;;;118881:40;;-1:-1:-1;;;;;;118942:17:0;;;;:22;;-1:-1:-1;118942:24:0;;;;;;;;;;;;;;:17;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;118932:4;118937:1;118932:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;118932:34:0;;;:7;;;;;;;;;:34;118987:12;;118977:7;;118987:12;;;118977:4;;118987:12;;118977:7;;;;;;:::i;:::-;-1:-1:-1;;;;;118977:22:0;;;:7;;;;;;;;;:22;119038:17;;:213;;-1:-1:-1;;;119038:213:0;;:17;;;:68;;119114:9;;119038:213;;:17;;119177:4;;119205;;119225:15;;119038:213;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;111458:701;111529:10;:17;111520:26;;111516:65;;;111458:701;:::o;111516:65::-;111591:17;111611;:15;:17::i;:::-;111639:19;;;;:8;:19;;;;;:42;;-1:-1:-1;;;;;;;;;111692:29:0;;;111671:10;-1:-1:-1;;;;111692:29:0;;;-1:-1:-1;;;;111732:37:0;;;111795:17;;111639:19;;-1:-1:-1;111786:26:0;;111782:370;;;111829:19;;;;:8;:19;;;;;:29;;-1:-1:-1;;;;111829:29:0;-1:-1:-1;;;111829:29:0;;;92693:233;;:::o;111782:370::-;111889:17;;111880:26;;111876:276;;;111923:19;;;;:8;:19;;;;;:29;;-1:-1:-1;;;;111923:29:0;-1:-1:-1;;;111923:29:0;;;-1:-1:-1;92693:233:0:o;111876:276::-;111983:17;;111974:26;;111970:182;;;112017:19;;;;:8;:19;;;;;:29;;-1:-1:-1;;;;112017:29:0;-1:-1:-1;;;112017:29:0;;;-1:-1:-1;92693:233:0:o;111970:182::-;112077:17;;112068:26;;112064:88;;;112111:19;;;;:8;:19;;;;;:29;;-1:-1:-1;;;;112111:29:0;-1:-1:-1;;;112111:29:0;;;-1:-1:-1;111458:701:0:o;111142:308::-;111186:17;111241:10;-1:-1:-1;;;;;111221:69:0;;111278:9;;111261:27;;;;;;9154:19:1;;9198:2;9189:12;;9144:63;111261:27:0;;;;;;;;;;;;;111253:36;;;:::i;:::-;111221:69;;13522:25:1;;;13510:2;13495:18;111221:69:0;;;;;;;111342:3;;111309:29;;-1:-1:-1;;;111309:29:0;;-1:-1:-1;;;;;111309:4:0;:14;;;;:29;;111332:4;;111309:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;111301:92;;;;-1:-1:-1;;;111301:92:0;;20925:2:1;111301:92:0;;;20907:21:1;20964:2;20944:18;;;20937:30;21003:34;20983:18;;;20976:62;-1:-1:-1;;;21054:18:1;;;21047:41;21105:19;;111301:92:0;20897:233:1;111301:92:0;111411:31;111429:7;;111438:3;;90867:17;90902:4;-1:-1:-1;;;;;90902:20:0;;90923:14;90939:4;90956:8;89587:1;90945:43;;;;;;;;13732:25:1;;;13788:2;13773:18;;13766:34;13720:2;13705:18;;13687:119;90945:43:0;;;;;;;;;;;;;90902:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;91224:15:0;91308:16;;;:6;:16;;;;;;;;;82321:51;;;;;14042:25:1;;;14083:18;;;14076:34;;;91301:4:0;14126:18:1;;;14119:60;14195:18;;;;14188:34;;;82321:51:0;;;;;;;;;;14014:19:1;;;;82321:51:0;;;82311:62;;;;;;;;;91762:16;;;;;;;;:20;;;:::i;:::-;91743:16;;;;:6;:16;;;;;:39;91796:32;91750:8;91820:7;82938:41;;;;;;;8930:19:1;;;;8965:12;;;8958:28;;;;82938:41:0;;;;;;;;;9002:12:1;;;;82938:41:0;;82928:52;;;;;;82771:215;14:163:1;81:20;;141:10;130:22;;120:33;;110:2;;167:1;164;157:12;110:2;62:115;;;:::o;182:247::-;241:6;294:2;282:9;273:7;269:23;265:32;262:2;;;310:1;307;300:12;262:2;349:9;336:23;368:31;393:5;368:31;:::i;:::-;418:5;252:177;-1:-1:-1;;;252:177:1:o;434:251::-;504:6;557:2;545:9;536:7;532:23;528:32;525:2;;;573:1;570;563:12;525:2;605:9;599:16;624:31;649:5;624:31;:::i;950:388::-;1018:6;1026;1079:2;1067:9;1058:7;1054:23;1050:32;1047:2;;;1095:1;1092;1085:12;1047:2;1134:9;1121:23;1153:31;1178:5;1153:31;:::i;:::-;1203:5;-1:-1:-1;1260:2:1;1245:18;;1232:32;1273:33;1232:32;1273:33;:::i;:::-;1325:7;1315:17;;;1037:301;;;;;:::o;1343:523::-;1417:6;1425;1433;1486:2;1474:9;1465:7;1461:23;1457:32;1454:2;;;1502:1;1499;1492:12;1454:2;1541:9;1528:23;1560:31;1585:5;1560:31;:::i;:::-;1610:5;-1:-1:-1;1667:2:1;1652:18;;1639:32;1680;1639;1680;:::i;:::-;1731:7;-1:-1:-1;1790:2:1;1775:18;;1762:32;1803:31;1762:32;1803:31;:::i;:::-;1853:7;1843:17;;;1444:422;;;;;:::o;1871:615::-;1957:6;1965;2018:2;2006:9;1997:7;1993:23;1989:32;1986:2;;;2034:1;2031;2024:12;1986:2;2061:23;;-1:-1:-1;;;;;2133:14:1;;;2130:2;;;2160:1;2157;2150:12;2130:2;2198:6;2187:9;2183:22;2173:32;;2243:7;2236:4;2232:2;2228:13;2224:27;2214:2;;2265:1;2262;2255:12;2214:2;2305;2292:16;2331:2;2323:6;2320:14;2317:2;;;2347:1;2344;2337:12;2317:2;2400:7;2395:2;2385:6;2382:1;2378:14;2374:2;2370:23;2366:32;2363:45;2360:2;;;2421:1;2418;2411:12;2360:2;2452;2444:11;;;;;2474:6;;-1:-1:-1;1976:510:1;;-1:-1:-1;;;;1976:510:1:o;2491:1116::-;2586:6;2617:2;2660;2648:9;2639:7;2635:23;2631:32;2628:2;;;2676:1;2673;2666:12;2628:2;2703:16;;-1:-1:-1;;;;;2768:14:1;;;2765:2;;;2795:1;2792;2785:12;2765:2;2833:6;2822:9;2818:22;2808:32;;2878:7;2871:4;2867:2;2863:13;2859:27;2849:2;;2900:1;2897;2890:12;2849:2;2929;2923:9;2951:2;2947;2944:10;2941:2;;;2957:18;;:::i;:::-;3003:2;3000:1;2996:10;3035:2;3029:9;3098:2;3094:7;3089:2;3085;3081:11;3077:25;3069:6;3065:38;3153:6;3141:10;3138:22;3133:2;3121:10;3118:18;3115:46;3112:2;;;3164:18;;:::i;:::-;3200:2;3193:22;3250:18;;;3284:15;;;;-1:-1:-1;3319:11:1;;;3349;;;3345:20;;3342:33;-1:-1:-1;3339:2:1;;;3388:1;3385;3378:12;3339:2;3410:1;3401:10;;3420:156;3434:2;3431:1;3428:9;3420:156;;;3491:10;;3479:23;;3452:1;3445:9;;;;;3522:12;;;;3554;;3420:156;;;-1:-1:-1;3595:6:1;2597:1010;-1:-1:-1;;;;;;;;2597:1010:1:o;3612:241::-;3668:6;3721:2;3709:9;3700:7;3696:23;3692:32;3689:2;;;3737:1;3734;3727:12;3689:2;3776:9;3763:23;3795:28;3817:5;3795:28;:::i;3858:245::-;3925:6;3978:2;3966:9;3957:7;3953:23;3949:32;3946:2;;;3994:1;3991;3984:12;3946:2;4026:9;4020:16;4045:28;4067:5;4045:28;:::i;4108:248::-;4176:6;4184;4237:2;4225:9;4216:7;4212:23;4208:32;4205:2;;;4253:1;4250;4243:12;4205:2;-1:-1:-1;;4276:23:1;;;4346:2;4331:18;;;4318:32;;-1:-1:-1;4195:161:1:o;4632:245::-;4690:6;4743:2;4731:9;4722:7;4718:23;4714:32;4711:2;;;4759:1;4756;4749:12;4711:2;4798:9;4785:23;4817:30;4841:5;4817:30;:::i;4882:379::-;4958:6;4966;5019:2;5007:9;4998:7;4994:23;4990:32;4987:2;;;5035:1;5032;5025:12;4987:2;5067:9;5061:16;5086:30;5110:5;5086:30;:::i;:::-;5185:2;5170:18;;5164:25;5135:5;;-1:-1:-1;5198:31:1;5164:25;5198:31;:::i;5266:180::-;5325:6;5378:2;5366:9;5357:7;5353:23;5349:32;5346:2;;;5394:1;5391;5384:12;5346:2;-1:-1:-1;5417:23:1;;5336:110;-1:-1:-1;5336:110:1:o;5451:184::-;5521:6;5574:2;5562:9;5553:7;5549:23;5545:32;5542:2;;;5590:1;5587;5580:12;5542:2;-1:-1:-1;5613:16:1;;5532:103;-1:-1:-1;5532:103:1:o;5640:323::-;5716:6;5724;5777:2;5765:9;5756:7;5752:23;5748:32;5745:2;;;5793:1;5790;5783:12;5745:2;5829:9;5816:23;5806:33;;5889:2;5878:9;5874:18;5861:32;5902:31;5927:5;5902:31;:::i;5968:385::-;6054:6;6062;6070;6078;6131:3;6119:9;6110:7;6106:23;6102:33;6099:2;;;6148:1;6145;6138:12;6099:2;-1:-1:-1;;6171:23:1;;;6241:2;6226:18;;6213:32;;-1:-1:-1;6292:2:1;6277:18;;6264:32;;6343:2;6328:18;6315:32;;-1:-1:-1;6089:264:1;-1:-1:-1;6089:264:1:o;6358:252::-;6425:6;6433;6486:2;6474:9;6465:7;6461:23;6457:32;6454:2;;;6502:1;6499;6492:12;6454:2;6538:9;6525:23;6515:33;;6567:37;6600:2;6589:9;6585:18;6567:37;:::i;:::-;6557:47;;6444:166;;;;;:::o;6615:724::-;6702:6;6710;6718;6726;6734;6787:3;6775:9;6766:7;6762:23;6758:33;6755:2;;;6804:1;6801;6794:12;6755:2;6840:9;6827:23;6817:33;;6900:2;6889:9;6885:18;6872:32;6913:29;6936:5;6913:29;:::i;:::-;6961:5;-1:-1:-1;7018:2:1;7003:18;;6990:32;7031:31;6990:32;7031:31;:::i;:::-;7081:7;-1:-1:-1;7140:2:1;7125:18;;7112:32;7153:31;7112:32;7153:31;:::i;:::-;7203:7;-1:-1:-1;7262:3:1;7247:19;;7234:33;7276:31;7234:33;7276:31;:::i;:::-;7326:7;7316:17;;;6745:594;;;;;;;;:::o;7344:184::-;7402:6;7455:2;7443:9;7434:7;7430:23;7426:32;7423:2;;;7471:1;7468;7461:12;7423:2;7494:28;7512:9;7494:28;:::i;7533:247::-;7601:6;7654:2;7642:9;7633:7;7629:23;7625:32;7622:2;;;7670:1;7667;7660:12;7622:2;7702:9;7696:16;7721:29;7744:5;7721:29;:::i;7785:517::-;7856:6;7864;7872;7925:2;7913:9;7904:7;7900:23;7896:32;7893:2;;;7941:1;7938;7931:12;7893:2;7980:9;7967:23;7999:29;8022:5;7999:29;:::i;:::-;8047:5;-1:-1:-1;8104:2:1;8089:18;;8076:32;8117:31;8076:32;8117:31;:::i;8307:461::-;8360:3;8398:5;8392:12;8425:6;8420:3;8413:19;8451:4;8480:2;8475:3;8471:12;8464:19;;8517:2;8510:5;8506:14;8538:1;8548:195;8562:6;8559:1;8556:13;8548:195;;;8627:13;;-1:-1:-1;;;;;8623:39:1;8611:52;;8683:12;;;;8718:15;;;;8659:1;8577:9;8548:195;;;-1:-1:-1;8759:3:1;;8368:400;-1:-1:-1;;;;;8368:400:1:o;9490:203::-;-1:-1:-1;;;;;9654:32:1;;;;9636:51;;9624:2;9609:18;;9591:102::o;10387:373::-;-1:-1:-1;;;;;10611:32:1;;;;10593:51;;10692:6;10680:19;;;;10675:2;10660:18;;10653:47;10748:4;10736:17;10731:2;10716:18;;10709:45;10581:2;10566:18;;10548:212::o;11133:274::-;-1:-1:-1;;;;;11325:32:1;;;;11307:51;;11389:2;11374:18;;11367:34;11295:2;11280:18;;11262:145::o;11412:766::-;11644:1;11640;11635:3;11631:11;11627:19;11619:6;11615:32;11604:9;11597:51;11578:4;11667:2;11705:6;11700:2;11689:9;11685:18;11678:34;11748:2;11743;11732:9;11728:18;11721:30;11780:6;11774:13;11823:6;11818:2;11807:9;11803:18;11796:34;11848:1;11858:141;11872:6;11869:1;11866:13;11858:141;;;11968:14;;;11964:23;;11958:30;11933:17;;;11952:3;11929:27;11922:67;11887:10;;11858:141;;;12017:6;12014:1;12011:13;12008:2;;;12088:1;12082:3;12073:6;12062:9;12058:22;12054:32;12047:43;12008:2;-1:-1:-1;12161:2:1;12140:15;-1:-1:-1;;12136:29:1;12121:45;;;;12168:3;12117:55;;11587:591;-1:-1:-1;;;;;11587:591:1:o;12183:647::-;12352:2;12404:21;;;12474:13;;12377:18;;;12496:22;;;12323:4;;12352:2;12575:15;;;;12549:2;12534:18;;;12323:4;12618:186;12632:6;12629:1;12626:13;12618:186;;;12697:13;;12712:10;12693:30;12681:43;;12779:15;;;;12744:12;;;;12654:1;12647:9;12618:186;;;-1:-1:-1;12821:3:1;;12332:498;-1:-1:-1;;;;;;12332:498:1:o;14695:510::-;14966:6;14955:9;14948:25;15009:3;15004:2;14993:9;14989:18;14982:31;14929:4;15030:57;15082:3;15071:9;15067:19;15059:6;15030:57;:::i;:::-;-1:-1:-1;;;;;15123:32:1;;;;15118:2;15103:18;;15096:60;-1:-1:-1;15187:2:1;15172:18;15165:34;15022:65;14938:267;-1:-1:-1;;14938:267:1:o;15912:409::-;16114:2;16096:21;;;16153:2;16133:18;;;16126:30;16192:34;16187:2;16172:18;;16165:62;-1:-1:-1;;;16258:2:1;16243:18;;16236:43;16311:3;16296:19;;16086:235::o;16674:338::-;16876:2;16858:21;;;16915:2;16895:18;;;16888:30;-1:-1:-1;;;16949:2:1;16934:18;;16927:44;17003:2;16988:18;;16848:164::o;24718:356::-;24920:2;24902:21;;;24939:18;;;24932:30;24998:34;24993:2;24978:18;;24971:62;25065:2;25050:18;;24892:182::o;29885:582::-;30184:6;30173:9;30166:25;30227:6;30222:2;30211:9;30207:18;30200:34;30270:3;30265:2;30254:9;30250:18;30243:31;30147:4;30291:57;30343:3;30332:9;30328:19;30320:6;30291:57;:::i;:::-;-1:-1:-1;;;;;30384:32:1;;;;30379:2;30364:18;;30357:60;-1:-1:-1;30448:3:1;30433:19;30426:35;30283:65;30156:311;-1:-1:-1;;;30156:311:1:o;31318:391::-;31549:25;;;31605:2;31590:18;;31583:34;;;;31648:2;31633:18;;31626:34;31691:2;31676:18;;31669:34;31536:3;31521:19;;31503:206::o;32181:346::-;32407:4;32395:17;;;32377:36;;32449:17;;;32444:2;32429:18;;32422:45;32503:17;;;32498:2;32483:18;;32476:45;32365:2;32350:18;;32332:195::o;32877:224::-;32916:3;32944:6;32977:2;32974:1;32970:10;33007:2;33004:1;33000:10;33038:3;33034:2;33030:12;33025:3;33022:21;33019:2;;;33046:18;;:::i;:::-;33082:13;;32924:177;-1:-1:-1;;;;32924:177:1:o;33106:128::-;33146:3;33177:1;33173:6;33170:1;33167:13;33164:2;;;33183:18;;:::i;:::-;-1:-1:-1;33219:9:1;;33154:80::o;33239:228::-;33278:3;33306:10;33343:2;33340:1;33336:10;33373:2;33370:1;33366:10;33404:3;33400:2;33396:12;33391:3;33388:21;33385:2;;;33412:18;;:::i;33472:204::-;33510:3;33546:4;33543:1;33539:12;33578:4;33575:1;33571:12;33613:3;33607:4;33603:14;33598:3;33595:23;33592:2;;;33621:18;;:::i;:::-;33657:13;;33518:158;-1:-1:-1;;;33518:158:1:o;33681:168::-;33721:7;33787:1;33783;33779:6;33775:14;33772:1;33769:21;33764:1;33757:9;33750:17;33746:45;33743:2;;;33794:18;;:::i;:::-;-1:-1:-1;33834:9:1;;33733:116::o;33854:125::-;33894:4;33922:1;33919;33916:8;33913:2;;;33927:18;;:::i;:::-;-1:-1:-1;33964:9:1;;33903:76::o;33984:221::-;34023:4;34052:10;34112;;;;34082;;34134:12;;;34131:2;;;34149:18;;:::i;:::-;34186:13;;34032:173;-1:-1:-1;;;34032:173:1:o;34210:195::-;34248:4;34285;34282:1;34278:12;34317:4;34314:1;34310:12;34342:3;34337;34334:12;34331:2;;;34349:18;;:::i;:::-;34386:13;;;34257:148;-1:-1:-1;;;34257:148:1:o;34410:297::-;34528:12;;34575:4;34564:16;;;34558:23;;34528:12;34593:16;;34590:2;;;34687:1;34683:6;34673;34667:4;34663:17;34660:1;34656:25;34652:38;34645:5;34641:50;34632:59;;34590:2;;34504:203;;;:::o;34712:201::-;34750:3;34778:10;34823:2;34816:5;34812:14;34850:2;34841:7;34838:15;34835:2;;;34856:18;;:::i;:::-;34905:1;34892:15;;34758:155;-1:-1:-1;;;34758:155:1:o;34918:175::-;34955:3;34999:4;34992:5;34988:16;35028:4;35019:7;35016:17;35013:2;;;35036:18;;:::i;:::-;35085:1;35072:15;;34963:130;-1:-1:-1;;34963:130:1:o;35098:209::-;35130:1;35156;35146:2;;35200:10;35195:3;35191:20;35188:1;35181:31;35235:4;35232:1;35225:15;35263:4;35260:1;35253:15;35146:2;-1:-1:-1;35292:9:1;;35136:171::o;35312:127::-;35373:10;35368:3;35364:20;35361:1;35354:31;35404:4;35401:1;35394:15;35428:4;35425:1;35418:15;35444:127;35505:10;35500:3;35496:20;35493:1;35486:31;35536:4;35533:1;35526:15;35560:4;35557:1;35550:15;35576:127;35637:10;35632:3;35628:20;35625:1;35618:31;35668:4;35665:1;35658:15;35692:4;35689:1;35682:15;35708:127;35769:10;35764:3;35760:20;35757:1;35750:31;35800:4;35797:1;35790:15;35824:4;35821:1;35814:15;35840:131;-1:-1:-1;;;;;35915:31:1;;35905:42;;35895:2;;35961:1;35958;35951:12;35976:118;36062:5;36055:13;36048:21;36041:5;36038:32;36028:2;;36084:1;36081;36074:12;36099:117;36184:6;36177:5;36173:18;36166:5;36163:29;36153:2;;36206:1;36203;36196:12;36221:114;36305:4;36298:5;36294:16;36287:5;36284:27;36274:2;;36325:1;36322;36315:12

Swarm Source

ipfs://6c03a0213afb66df2754ec5a259808dddb5542d3e9eb916bd9842d222f6160e4
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading