ETH Price: $2,489.57 (+0.37%)
Gas: 0.67 Gwei

Token

Console NFT Cyber Upgrades (Cnsl-NFT-U)
 

Overview

Max Total Supply

23 Cnsl-NFT-U

Holders

22

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
septem.eth
Balance
1 Cnsl-NFT-U
0x5d39a207C9eb7fbeaaF90C7433c09f0edb41cAf9
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ConsoleNFT_Cyber_Upgrades

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-30
*/

// SPDX-License-Identifier: GPL-3.0

/*
      ::::::::   ::::::::  ::::    :::  ::::::::   ::::::::  :::        ::::::::::          ::::    ::: :::::::::: ::::::::::: 
    :+:    :+: :+:    :+: :+:+:   :+: :+:    :+: :+:    :+: :+:        :+:                 :+:+:   :+: :+:            :+:      
   +:+        +:+    +:+ :+:+:+  +:+ +:+        +:+    +:+ +:+        +:+                 :+:+:+  +:+ +:+            +:+       
  +#+        +#+    +:+ +#+ +:+ +#+ +#++:++#++ +#+    +:+ +#+        +#++:++#            +#+ +:+ +#+ :#::+::#       +#+        
 +#+        +#+    +#+ +#+  +#+#+#        +#+ +#+    +#+ +#+        +#+                 +#+  +#+#+# +#+            +#+         
#+#    #+# #+#    #+# #+#   #+#+# #+#    #+# #+#    #+# #+#        #+#                 #+#   #+#+# #+#            #+#          
########   ########  ###    ####  ########   ########  ########## ##########          ###    #### ###            ###           
*/

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

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

// File: https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/interfaces/LinkTokenInterface.sol

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

// File: https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/VRFConsumerBase.sol



/** ****************************************************************************
 * @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 private constant 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 internal immutable LINK;
  address private immutable vrfCoordinator;

  // Nonces for each VRF key from which randomness has been requested.
  //
  // Must stay in sync with VRFCoordinator[_keyHash][this]
  mapping(bytes32 => uint256) /* keyHash */ /* 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);
  }
}

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



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


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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}



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




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

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

abstract contract PercentageGenerator {
	function calculatePercentage(bool hasVault, uint rarity, uint tokens) public view virtual returns (uint[] memory);
}

abstract contract SourceData {
	function getVaultRarity(uint token_id) public view virtual returns(uint8);
    function getFirstStat(uint token_id, uint rarity) public view virtual returns(uint8);
    function getFirstStatValue(uint token_id, uint rarity) public view virtual returns(uint8);
    function getSecondStat(uint token_id, uint rarity) public view virtual returns(uint8);
    function getSecondStatValue(uint token_id, uint rarity) public view virtual returns(uint8);
    function getFirstAugment(uint token_id, uint rarity) public view virtual returns(uint8);
    function getSecondAugment(uint token_id, uint rarity) public view virtual returns(uint8);
    function getAirdrops(uint token_id, uint rarity) public view virtual returns(uint8);
}

contract ConsoleNFT_Cyber_Upgrades is ERC721Enumerable, ReentrancyGuard, Ownable, VRFConsumerBase {

	address dataContract;
    address percentageContract;
    address vaultContract;
    address levelUpContract;

    mapping(uint => bool) private _usedVaults;

    // Mapping for wallet addresses that have previously minted
    mapping(address => uint) private _whitelistMinters;

    // Merkle Proof Hashes for tokens
    bytes32[] public rootHashes;

	uint public constant maxTokens = 5000;

    uint public vaultHolderReserves = 500;

    uint[] public rarities; // mapping of pool rarities in constructor

    uint public total = 0;

	uint mintCost = 0.05 ether;
    uint publicMintCost = 0.1 ether;

    uint public whitelistMintStart;
    uint public publicMintStart;

	bool sysAdminMinted;
	bool error404Minted;
	bool code200Minted;
	bool giveawaysMinted;
	
	address error404Address;
	address code200Address;
	address giveawaysAddress;

    mapping(uint => uint) public levels; // tokenID -> level
    mapping(uint => uint) public rarity; // tokenID -> rarity

    function setMerkleHashes(bytes32[] memory _rootHash) external onlyOwner {
        rootHashes = new bytes32[](0);
        for (uint i=0; i < _rootHash.length; i++) {
            rootHashes.push(_rootHash[i]);
        }
    }

    function setVaultContractAddress(address _vaultContract) external onlyOwner {
        vaultContract = _vaultContract;
    }

    function setPercentageContractAddress(address _percentageContract) external onlyOwner {
        percentageContract = _percentageContract;
    }

    function setWhitelistMintStart(uint _timestamp) external onlyOwner {
        whitelistMintStart = _timestamp;
    }
	
    function setPublicMintStart(uint _timestamp) external onlyOwner {
        publicMintStart = _timestamp;
    }

	function setSourceData(address _dataContract) external onlyOwner {
        dataContract = _dataContract;
    }

    function setLevelUpContract(address _levelUpContract) external onlyOwner {
        levelUpContract = _levelUpContract;
    }

	string[] private rarityText = [
        "Common",
        "Uncommon",
        "Rare",
        "Epic",
        "Legendary"
    ];

    function getRarity(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "Nonexistent token");
		
        string memory output;
		
        output = rarityText[rarity[tokenId]];
		
        return output;
    }

    string[] private firstStat = [
        "Health",
        "Strength",
        "Speed",
        "Accuracy",
        "Intelligence",
        "Tech",
        "Hack speed",
        "SQL skill",
        "Network",
        "DNA",
        "De-auth",
        "Pwd cracking",
        "XSS forgery",
        "Decrypt",
        "Cryptography"
    ];

    function getFirstStat(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "Nonexistent token");
		
        string memory output;
		
		SourceData source_data = SourceData(dataContract);
		
        output = firstStat[source_data.getFirstStat(tokenId, rarity[tokenId])];
		
        return output;
    }

    function getFirstStatValue(uint256 tokenId) public view returns (uint) {
        require(_exists(tokenId), "Nonexistent token");
		
        uint output;
		
		SourceData source_data = SourceData(dataContract);
		
		uint firstStatValue = source_data.getFirstStatValue(tokenId, rarity[tokenId]);
		
        output = (firstStatValue * getItemLevel(tokenId)) + 1;
		
        return output;
    }

    string[] private secondStat = [
        "Lockpicking",
        "Regeneration",
        "Armor",
        "Backpack",
        "Intelligence",
        "Charge",
        "Damage boost",
        "Reflexes",
        "Radar",
        "Keymaster",
        "Pickpocket",
        "EMP shield",
        "EMP power",
        "Run silent",
        "Nanotech"
    ];

    function getSecondStat(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "Nonexistent token");
		
        string memory output;
		
		SourceData source_data = SourceData(dataContract);
		
        output = secondStat[source_data.getSecondStat(tokenId, rarity[tokenId])];
		
        return output;
    }

    function getSecondStatValue(uint256 tokenId) public view returns (uint) {
        require(_exists(tokenId), "Nonexistent token");
		
        uint output;
		
		SourceData source_data = SourceData(dataContract);
		
		uint secondStatValue = source_data.getSecondStatValue(tokenId, rarity[tokenId]);
		
        output = (secondStatValue * getItemLevel(tokenId)) + 1;
		
        return output;
    }

    // second stat bude daco viac advanced v hre
    string[] private firstAugment = [
        "Scrapper",
        "Bionic Arms",
        "Detoxifier",
        "Bionic Lungs",
        "Hardened Bones",
        "Berserk",
        "Blood pump",
        "Edge runner",
        "Adrenaline Pump",
        "Bloodware",
        "Cyber Joints",
        "Cloaking",
        "Nanobots",
        "Synthetic Heart",
        "?"
    ];

    function getFirstAugment(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "Nonexistent token");
		
        string memory output;
		
		SourceData source_data = SourceData(dataContract);
		
        output = firstAugment[source_data.getFirstAugment(tokenId, rarity[tokenId])];
		
        return output;
    }

    // second stat bude daco viac advanced v hre
    string[] private secondAugment = [
        "Nightvision",
        "Titan Knuckles",
        "Cyber Legs",
        "Cyber Arms",
        "Reflex Boost",
        "Lizard skin",
        "Titanium Bones",
        "Echolocation",
        "Thermal vision",
        "X-ray Vision",
        "Shapeshifter",
        "Exoskeleton",
        "Stealth kit",
        "Double Heart",
        "?"
    ];

    function getSecondAugment(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "Nonexistent token");
		
        string memory output;
		
		SourceData source_data = SourceData(dataContract);
		
        output = secondAugment[source_data.getSecondAugment(tokenId, rarity[tokenId])];
		
        return output;
    }

    function getAirdrops(uint256 tokenId) public view returns (uint) {
        require(_exists(tokenId), "Nonexistent token");
		
        uint output;
		
		SourceData source_data = SourceData(dataContract);
		
        output = source_data.getAirdrops(tokenId, rarity[tokenId]) + getItemLevel(tokenId);
		
        return output;
    }
	
    // Funkcia final
    string internal baseTokenURI;

	function setBaseTokenURI(string memory _uri) external onlyOwner {
        baseTokenURI = _uri;
    }

    // Funkcia final
    string internal externalURI;

	function setExternalURI(string memory _uri) external onlyOwner {
        externalURI = _uri;
    }

	function tokenURI(uint _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), "Query for non-existent token!");

        string[7] memory json;

        json[0] = string(
			abi.encodePacked('{',
                '"name": "Cyber Upgrade #', t(_tokenId), ' (Level: ', t(getItemLevel(_tokenId)), ')",',
                '"image": "', baseTokenURI, t(rarity[_tokenId]), '.jpg",',
                '"external_url": "', externalURI, '?dna=', getDna(_tokenId) ,'&id=', t(_tokenId) ,'",',  
                '"description": "Upgrades waiting to be connected to players.",',
                '"attributes": ['
            )
		);

        json[1] = string(
			abi.encodePacked(
				'{',
					'"trait_type": "Rarity",',
					'"value": "', getRarity(_tokenId) ,'"',
                '},',
                '{',
                    '"trait_type": "Level",',
                    '"value": "', t(getItemLevel(_tokenId)) ,'"',
                '},'
            )
		);
        json[2] = string(
			abi.encodePacked(
				'{',
                    '"trait_type": "Upgrade #1",',
                    '"value": "', getFirstStat(_tokenId) , " +", t(getFirstStatValue(_tokenId)) ,'"',
                '},'
            )
		);

        json[3] = string(
			abi.encodePacked(
				'{',
                    '"trait_type": "Upgrade #2",',
                    '"value": "', getSecondStat(_tokenId) ," +", t(getSecondStatValue(_tokenId)) ,'"',
                '},'
            )
		);
        json[4] = string(
			abi.encodePacked(
				'{',
                    '"trait_type": "Augmentation #1",',
                    '"value": "', getFirstAugment(_tokenId) ,'"',
                '},'
            )
		);
        json[5] = string(
			abi.encodePacked(
                '{',
                    '"trait_type": "Augmentation #2",',
                    '"value": "', getSecondAugment(_tokenId) ,'"',
                '},',
                '{',
                    '"trait_type": "Airdrops",',
					'"value": "x', t(getAirdrops(_tokenId)) ,'"',
                '}'
            )
		);
        json[6] = string(
			abi.encodePacked('],',
                '"animation_url": "', externalURI, '?dna=', getDna(_tokenId) , '&id=', t(_tokenId) , '",',
                '"iframe_url": "', externalURI, '?dna=', getDna(_tokenId) , '&id=', t(_tokenId) , '"',
            '}')
		);

        string memory result = Base64.encode(
            bytes(
                string(
                    abi.encodePacked(
                        json[0],
                        json[1],
                        json[2],
                        json[3],
                        json[4],
                        json[5],
                        json[6]
                    )
                )
            )
        );

        return string(abi.encodePacked("data:application/json;base64,", result));
    }


	
	// helper
	function t(uint _tokenId) public pure returns (string memory) {
		return Strings.toString(_tokenId);
	}


    // Getters
    function getDna(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "Query for non-existent token!");

        SourceData source_data = SourceData(dataContract);

        // First stat index
        uint firstStatIndex = source_data.getFirstStat(tokenId, rarity[tokenId]);

        // First stat index
        uint secondStatIndex = source_data.getSecondStat(tokenId, rarity[tokenId]);

        string[2] memory dna;

        dna[0] = string(
            abi.encodePacked(
                t(rarity[tokenId]),
                t(levels[tokenId]),
                t(firstStatIndex),
                t(getFirstStatValue(tokenId))
            )
        );
        
        dna[1] = string(
			abi.encodePacked(
                t(secondStatIndex),
                t(getSecondStatValue(tokenId)),
                t(source_data.getFirstAugment(tokenId, rarity[tokenId])),
                t(source_data.getSecondAugment(tokenId, rarity[tokenId])),
                t(getAirdrops(tokenId))
            )
		);

        string memory result = string(
                    abi.encodePacked(
                        dna[0],
                        dna[1]
                    )
                );

        return string(abi.encodePacked(result));
    }

    function getItemLevel(uint256 tokenId) public view returns (uint) {
        return levels[tokenId];
    }

    function setItemLevel(uint tokenId, uint level) external {
        require(msg.sender == levelUpContract, "You can not call this");
        levels[tokenId] = level;
    }

	function whitelistClaim(bytes32[] memory proof) public nonReentrant payable {
        require(whitelistMintStart < block.timestamp, "The whitelist mint did not start yet");
        require(maxTokens - total > vaultHolderReserves, "Minting over vault holder limit");
        require(total < maxTokens, "All tokens have been already minted");
		require(msg.value == mintCost, "Incorrect mint cost value");
        require(_whitelistMinters[_msgSender()] < 1, "You've already minted");
		
		// Merkle tree validation
		bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        bool notWhitelisted;

        for (uint i=0; i < rootHashes.length; i++) {

            if (MerkleProof.verify(proof, rootHashes[i], leaf)) {

                uint userTokens = i * 1000;
                
                // Proceed in minting process
                uint tokenId = getVRFRandomIndex(false, 0, userTokens);
                total++;

                // Set the _whitelistMinters value to tokenId for this address as it has minted
                _whitelistMinters[_msgSender()] = tokenId;

                _safeMint(_msgSender(), tokenId);

                notWhitelisted = false;
                break;

            }
            else {
                notWhitelisted = true;
            }
        }

        if (notWhitelisted) {
            // Sorry, not whitelisted
            revert("Invalid proof");
        }

    }

    function publicClaim(uint numberOfTokens) public nonReentrant payable {
        require(publicMintStart < block.timestamp, "The public mint did not start yet");
        require(maxTokens - total > vaultHolderReserves, "Minting over vault holder limit");
        require(total + numberOfTokens < maxTokens, "All tokens have been already minted");
        require(numberOfTokens > 0, "Can not mint zero tokens");
        require(numberOfTokens < 11, "Request exceeds max tokens");
		require(msg.value == publicMintCost * numberOfTokens, "Incorrect mint cost value");

        for (uint i=1; i < numberOfTokens; i++) {
            uint tokenId = getVRFRandomIndex(false, 0, 0);
            total++;
            _safeMint(_msgSender(), tokenId);
        }

    }

    function vaultHolderClaim(bytes32[] memory proof, uint[] memory vaultIds) public nonReentrant {
        require(whitelistMintStart < block.timestamp, "The whitelist mint did not start yet");
        require(total + vaultIds.length < maxTokens, "Minting over the max tokens limit");

        for (uint i=0; i < vaultIds.length; i++) {
            require(validateVaultOwnership(vaultIds[i]), "Vault ownership validation failed");
            require(!checkUsedVault(vaultIds[i]), "Vault was already used");
        }

        uint userTokens = 0;

        // Merkle tree for getting tokens
		bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        for (uint i=0; i < rootHashes.length; i++) {

            if (MerkleProof.verify(proof, rootHashes[i], leaf) ) {

                userTokens = i * 1000;

            }

        }

        for (uint i=0; i < vaultIds.length; i++) {

            // get vault rarity
            uint tokenId = getVRFRandomIndex(true, getVaultRarity(vaultIds[i]), userTokens);
            _usedVaults[vaultIds[i]] = true;

            total++;
            vaultHolderReserves--;
            _safeMint(_msgSender(), tokenId);
        }

    }
    
    function vaultHolderClaimCombined(bytes32[] memory proof, uint[] memory vaultIds) public nonReentrant payable {
        require(whitelistMintStart < block.timestamp, "The whitelist mint did not start yet");
        require(total + 1 + vaultIds.length < maxTokens, "Minting over the max tokens limit");
        require(msg.value == mintCost, "Incorrect mint cost value");
        require(_whitelistMinters[_msgSender()] < 1, "You've already minted");

        for (uint i=0; i < vaultIds.length; i++) {
            require(validateVaultOwnership(vaultIds[i]), "Vault ownership validation failed");
            require(!checkUsedVault(vaultIds[i]), "Vault was already used");
        }

        uint userTokens = 0;

        // Merkle tree for getting tokens
		bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        for (uint i=0; i < rootHashes.length; i++) {

            if (MerkleProof.verify(proof, rootHashes[i], leaf) ) {

                userTokens = i * 1000;

            }

        }

        // Continue minting process
        for (uint i=0; i < vaultIds.length; i++) {
            uint tokenId = getVRFRandomIndex(true, getVaultRarity(vaultIds[i]), userTokens);
            _usedVaults[vaultIds[i]] = true;

            total++;
            vaultHolderReserves--;
            _safeMint(_msgSender(), tokenId);
        }

        // + 1 for whitelist
        uint additionalTokenId = getVRFRandomIndex(false, 0, userTokens);
        total++;
        _whitelistMinters[_msgSender()] = additionalTokenId;
        _safeMint(_msgSender(), additionalTokenId);

    }

    function validateVaultOwnership(uint _vaultID) internal view returns(bool) {
        ERC721 vaultContractData = ERC721(vaultContract);
        if(vaultContractData.ownerOf(_vaultID) == msg.sender) {
            return true;
        }
        return false;
    }

    function checkUsedVault(uint _vaultID) internal view returns(bool) {
        if (_usedVaults[_vaultID] == true) {
            return true;
        }
        return false;
    }

    function vaultCheck(uint _vaultID) public view returns (bool) {
        if (_usedVaults[_vaultID] == true) {
            return true;
        }
        return false;
    }
	
    function getVaultRarity(uint _vaultID) public view returns (uint) {

		uint output;
		
		SourceData source_data = SourceData(dataContract);
		
        output = source_data.getVaultRarity(_vaultID);
		
        return output;

    }

	function sysAdminClaim() public onlyOwner nonReentrant {
		require(sysAdminMinted == false, "Already minted!");
		
		sysAdminMinted = true;
		uint tokenId = getVRFRandomIndex(false, 0, 0);
        total++;
        _safeMint(owner(), tokenId);
    }

	function error404Claim() public nonReentrant {
		require(msg.sender == error404Address, "Not Error 404");
		require(error404Minted == false, "Already minted!");
		
		error404Minted = true;
		uint tokenId = getVRFRandomIndex(false, 0, 0);
        total++;
        _safeMint(msg.sender, tokenId);
    }
	
	function code200Claim() public nonReentrant {
		require(msg.sender == code200Address, "Not Code 200");
		require(code200Minted == false, "Already minted!");
		
		code200Minted = true;
		uint tokenId = getVRFRandomIndex(false, 0, 0);
        total++;
        _safeMint(msg.sender, tokenId);
    }
	
	function giveawaysClaim() public nonReentrant {
		require(msg.sender == giveawaysAddress, "Not Giveaways wallet");
		require(giveawaysMinted == false, "Already minted!");
		
		giveawaysMinted = true;

        for (uint i=0; i < 15; i++) {
            uint tokenId = getVRFRandomIndex(false, 0, 0);
            total++;
            _safeMint(msg.sender, tokenId);
        }
		
    }

    constructor() ERC721("Console NFT Cyber Upgrades", "Cnsl-NFT-U") VRFConsumerBase(
        0xf0d54349aDdcf704F77AE15b96510dEA15cb7952,
        0x514910771AF9Ca656af840dff83E8264EcF986CA
    ) 
	Ownable() {
        keyHash = 0xAA77729D3466CA35AE8D28B3BBAC7CC36A5031EFDC430821C02BC31A238AF445;
        fee = 2 * (10**18);
		
		error404Address = 0x24Db9e45f6aC29175030A083B985C184A02c2d64;
		code200Address = 0x1C0d3B190B18b4452BD4d0928D7f425eA9A0B3F9;
		giveawaysAddress = 0x7e95c71bDF0E0526eA534Fb5191ceD999190c117;

        whitelistMintStart = 1643554800; // 30. January 2022 - 15:00 UTC
        publicMintStart = 1643576400; // 30. January 2022 - 21:00 UTC (+6 hours)
        
        rarities.push(3250); // Common - 65%
        rarities.push(1000); // Uncommon - 20%
        rarities.push(475); // Rare - 9.5%
        rarities.push(225); // Epic - 4.5%
        rarities.push(50); // Legendary - 1%

    }


	////////////////////////// VRF /////////////////////////////
	
    bytes32 internal keyHash;
    uint internal fee;
    uint internal randomResult;
    
    // VRF Functions
    function getRandomNumber() public onlyOwner returns (bytes32 requestId) {
        require(LINK.balanceOf(address(this)) >= fee, "Not enough LINK!");
        return requestRandomness(keyHash, fee);
    }
    function fulfillRandomness(bytes32 requestId, uint randomness) internal override {
        randomResult = randomness;
    }
    function getRandomResult() public view onlyOwner returns (uint) {
        return randomResult;
    }

    // >>> Now, the VRF is stored in [uint internal randomResult]
    ////////////////////////// VRF /////////////////////////////

    /////////////////////// Token ID Generator ////////////////////////

    uint[maxTokens] internal indices;
    uint32 internal nonce;

    function getVRFRandomIndex(bool hasVault, uint vaultRarity, uint _userTokens) internal returns (uint) {
        require(randomResult != 0, "VRF Random Result has not been set!");

        // Get the random token ID
        uint _tokensRemaining = maxTokens - total; // require that this calculation is possible from all caller functions
        uint _maxIndex = _tokensRemaining == 0 ? 0 : _tokensRemaining - 1; // shorthand if for safety
        uint _rand = uint(keccak256(abi.encodePacked(randomResult, nonce, msg.sender, block.difficulty, block.timestamp))) % _tokensRemaining;
    
        uint _output = 0;

        _output = indices[_rand] != 0 ? indices[_rand] :_rand;
        indices[_rand] = indices[_maxIndex] == 0 ? _maxIndex : indices[_maxIndex];

        uint32 _nonceAdd = uint32(uint256(keccak256(abi.encodePacked(randomResult, nonce, msg.sender, block.difficulty, block.timestamp)))) % 10;
        nonce += _nonceAdd; 


        // Get the data from Percentage Contract
        PercentageGenerator percentage = PercentageGenerator(percentageContract);
        uint[] memory percentageArray = percentage.calculatePercentage(hasVault, vaultRarity, _userTokens);

        // Construct view array of 10k items to pick from
        // Because of rounding errors there might be close but not exactly 10k items, this should be safe
        uint totalItems;
        uint[] memory percentageNumbers = new uint[](5);
        for (uint i=0; i < percentageArray.length; i++) {
            totalItems += percentageArray[i];
            percentageNumbers[i] = totalItems;
        }

        // VRF guess the number in 10k items to get the rarity
        uint _randRarity = uint(keccak256(abi.encodePacked(randomResult, nonce, msg.sender, block.difficulty, block.timestamp))) % totalItems;

        uint rarityResult = 0; // Common as base

        // Get the rarity based on the VRF result
        if (_randRarity >= percentageNumbers[0] && _randRarity < percentageNumbers[1]) {
            rarityResult = 1; // Uncommon
        }
        if (_randRarity >= percentageNumbers[1] && _randRarity < percentageNumbers[2]) {
            rarityResult = 2; // Rare
        }
        if (_randRarity >= percentageNumbers[2] && _randRarity < percentageNumbers[3]) {
            rarityResult = 3; // Rpic
        }
        if (_randRarity >= percentageNumbers[3] && _randRarity <= percentageNumbers[4]) {
            rarityResult = 4; // Legendary
        }

        // If rarity no longer exist in the pool, give lower rarity
        if (rarities[rarityResult] > 0) {
            
            rarities[rarityResult]--;

            // There is still enough in the rarity pool
            // Assign rarity to this token ID
            rarity[_output] = rarityResult;

            // Assign starting level
            levels[_output] = 1;
        }
        else {
            // give other rarity, up or down
            rarity[_output] = pickOtherRarity(rarityResult);
        }

        return _output;
    }

    // tu budem asi potrebovat pomoct lebo je tu bug
    function pickOtherRarity(uint rarityResult) internal returns (uint) {
        if (rarityResult > 0) {
            return pickRarityDown(rarityResult);
        }
        else {
            return pickRarityUp(rarityResult);
        }
    }
    function pickRarityDown(uint rarityResult) internal returns (uint) {
        if (rarities[rarityResult-1] > 0) {
            return rarityResult-1;
        }
        else {
            return pickRarityDown(rarityResult-1);
        }
    }
    function pickRarityUp(uint rarityResult) internal returns (uint) {
        if (rarities[rarityResult+1] > 0) {
            return rarityResult+1;
        }
        else {
            return pickRarityUp(rarityResult+1);
        }
    }

    /////////////////////// Token ID Generator ////////////////////////
	
	// Withdraw Ether
    function withdrawEther() public onlyOwner {
        payable(msg.sender).transfer(address(this).balance); 
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"code200Claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"error404Claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAirdrops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDna","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFirstAugment","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFirstStat","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFirstStatValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getItemLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRandomNumber","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRandomResult","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRarity","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSecondAugment","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSecondStat","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSecondStatValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultID","type":"uint256"}],"name":"getVaultRarity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveawaysClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"levels","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"publicClaim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rarities","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rarity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rootHashes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setExternalURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"}],"name":"setItemLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_levelUpContract","type":"address"}],"name":"setLevelUpContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_rootHash","type":"bytes32[]"}],"name":"setMerkleHashes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_percentageContract","type":"address"}],"name":"setPercentageContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setPublicMintStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dataContract","type":"address"}],"name":"setSourceData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultContract","type":"address"}],"name":"setVaultContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setWhitelistMintStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sysAdminClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"t","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultID","type":"uint256"}],"name":"vaultCheck","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256[]","name":"vaultIds","type":"uint256[]"}],"name":"vaultHolderClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256[]","name":"vaultIds","type":"uint256[]"}],"name":"vaultHolderClaimCombined","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"vaultHolderReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistClaim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101f4601455600060165566b1a2bc2ec5000060175567016345785d8a000060185560066101609081526521b7b6b6b7b760d11b6101805260c090815260086101a0908152672ab731b7b6b6b7b760c11b6101c05260e05260046101e0818152635261726560e01b6102005261010052610220908152634570696360e01b61024052610120526102a06040526009610260908152684c6567656e6461727960b81b6102805261014052620000b890602090600562000c08565b50604080516102208101825260066101e0820190815265090cac2d8e8d60d31b6102008301528152815180830183526008808252670a6e8e4cadccee8d60c31b6020838101919091528084019290925283518085018552600581526414dc19595960da1b81840152838501528351808501855290815267416363757261637960c01b81830152606083015282518084018452600c8082526b496e74656c6c6967656e636560a01b8284015260808401919091528351808501855260048152630a8cac6d60e31b8184015260a084015283518085018552600a815269121858dac81cdc19595960b21b8184015260c084015283518085018552600981526814d453081cdada5b1b60ba1b8184015260e0840152835180850185526007808252664e6574776f726b60c81b82850152610100850191909152845180860186526003815262444e4160e81b818501526101208501528451808601865281815266088ca5ac2eae8d60cb1b81850152610140850152845180860186528281526b50776420637261636b696e6760a01b8185015261016085015284518086018652600b81526a58535320666f726765727960a81b818501526101808501528451808601865290815266111958dc9e5c1d60ca1b818401526101a0840152835180850190945283526b43727970746f67726170687960a01b908301526101c0810191909152620002c790602190600f62000c6c565b506040805161022081018252600b6101e082019081526a4c6f636b7069636b696e6760a81b610200830152815281518083018352600c8082526b2932b3b2b732b930ba34b7b760a11b602083810191909152808401929092528351808501855260058082526420b936b7b960d91b8285015284860191909152845180860186526008808252674261636b7061636b60c01b828601526060860191909152855180870187528381526b496e74656c6c6967656e636560a01b81860152608086015285518087018752600681526543686172676560d01b8186015260a0860152855180870187529283526b11185b5859d948189bdbdcdd60a21b8385015260c085019290925284518086018652828152675265666c6578657360c01b8185015260e085015284518086018652908152642930b230b960d91b818401526101008401528351808501855260098082526825b2bcb6b0b9ba32b960b91b8285015261012085019190915284518086018652600a80825269141a58dadc1bd8dad95d60b21b828601526101408601919091528551808701875281815269115354081cda1a595b1960b21b81860152610160860152855180870187529182526822a6a8103837bbb2b960b91b828501526101808501919091528451808601865290815269149d5b881cda5b195b9d60b21b818401526101a0840152835180850190945283526709cc2dcdee8cac6d60c31b908301526101c0810191909152620004ef90602290600f62000c6c565b50604051806101e001604052806040518060400160405280600881526020016729b1b930b83832b960c11b81525081526020016040518060400160405280600b81526020016a42696f6e69632041726d7360a81b81525081526020016040518060400160405280600a8152602001692232ba37bc34b334b2b960b11b81525081526020016040518060400160405280600c81526020016b42696f6e6963204c756e677360a01b81525081526020016040518060400160405280600e81526020016d48617264656e656420426f6e657360901b8152508152602001604051806040016040528060078152602001664265727365726b60c81b81525081526020016040518060400160405280600a8152602001690426c6f6f642070756d760b41b81525081526020016040518060400160405280600b81526020016a22b233b290393ab73732b960a91b81525081526020016040518060400160405280600f81526020016e0416472656e616c696e652050756d7608c1b815250815260200160405180604001604052806009815260200168426c6f6f647761726560b81b81525081526020016040518060400160405280600c81526020016b4379626572204a6f696e747360a01b815250815260200160405180604001604052806008815260200167436c6f616b696e6760c01b8152508152602001604051806040016040528060088152602001674e616e6f626f747360c01b81525081526020016040518060400160405280600f81526020016e14de5b9d1a195d1a58c81219585c9d608a1b8152508152602001604051806040016040528060018152602001603f60f81b815250815250602390600f6200076592919062000c6c565b506040805161022081018252600b6101e082018181526a2734b3b43a3b34b9b4b7b760a91b610200840152825282518084018452600e8082526d546974616e204b6e75636b6c657360901b6020838101919091528085019290925284518086018652600a808252694379626572204c65677360b01b8285015285870191909152855180870187529081526943796265722041726d7360b01b81840152606085015284518086018652600c8082526b1499599b195e08109bdbdcdd60a21b828501526080860191909152855180870187528481526a2634bd30b9321039b5b4b760a91b8185015260a0860152855180870187528281526d546974616e69756d20426f6e657360901b8185015260c0860152855180870187528181526b22b1b437b637b1b0ba34b7b760a11b8185015260e0860152855180870187529182526d2a3432b936b0b6103b34b9b4b7b760911b82840152610100850191909152845180860186528181526b2c16b930bc902b34b9b4b7b760a11b81840152610120850152845180860186528181526b29b430b832b9b434b33a32b960a11b81840152610140850152845180860186528381526a22bc37b9b5b2b632ba37b760a91b81840152610160850152845180860186529283526a14dd19585b1d1a081ada5d60aa1b83830152610180840192909252835180850185529182526b111bdd589b19481219585c9d60a21b828201526101a0830191909152825180840190935260018352603f60f81b908301526101c0810191909152620009a790602490600f62000c6c565b50348015620009b557600080fd5b50604080518082018252601a81527f436f6e736f6c65204e465420437962657220557067726164657300000000000060208083019182528351808501909452600a845269436e736c2d4e46542d5560b01b90840152815173f0d54349addcf704f77ae15b96510dea15cb79529373514910771af9ca656af840dff83e8264ecf986ca9392909162000a499160009162000cbe565b50805162000a5f90600190602084019062000cbe565b50506001600a555062000a723362000bb6565b6001600160601b0319606092831b811660a052911b166080527faa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445602755671bc16d674ec80000602855601b80547724db9e45f6ac29175030a083b985c184a02c2d6400000000600160201b600160c01b0319909116179055601c80546001600160a01b0319908116731c0d3b190b18b4452bd4d0928d7f425ea9a0b3f917909155601d8054909116737e95c71bdf0e0526ea534fb5191ced999190c1171790556361f6a7f06019556361f6fc50601a5560158054600181810183556000839052610cb27f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47592830155825480820184556103e890830155825480820184556101db908301558254808201845560e1908301558254908101909255603291015562000e00565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090810192821562000c5a579160200282015b8281111562000c5a578251805162000c4991849160209091019062000cbe565b509160200191906001019062000c29565b5062000c6892915062000d49565b5090565b82805482825590600052602060002090810192821562000c5a579160200282015b8281111562000c5a578251805162000cad91849160209091019062000cbe565b509160200191906001019062000c8d565b82805462000ccc9062000dc3565b90600052602060002090601f01602090048101928262000cf0576000855562000d3b565b82601f1062000d0b57805160ff191683800117855562000d3b565b8280016001018555821562000d3b579182015b8281111562000d3b57825182559160200191906001019062000d1e565b5062000c6892915062000d6a565b8082111562000c6857600062000d60828262000d81565b5060010162000d49565b5b8082111562000c68576000815560010162000d6b565b50805462000d8f9062000dc3565b6000825580601f1062000da0575050565b601f01602090049060005260206000209081019062000dc0919062000d6a565b50565b600181811c9082168062000dd857607f821691505b6020821081141562000dfa57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c60a05160601c615b5e62000e3a6000396000818161253d0152613f100152600081816130040152613ee10152615b5e6000f3fe6080604052600436106103b85760003560e01c806370a08231116101f2578063aeceadbf1161010d578063d08b4add116100a0578063e985e9c51161006f578063e985e9c514610acf578063f2fde38b14610b18578063fc59d96214610b38578063fdda339114610b4d57600080fd5b8063d08b4add14610a64578063d5a10a1514610a84578063dbdff2c114610aa4578063e831574214610ab957600080fd5b8063b88d4fde116100dc578063b88d4fde146109f1578063c87b56dd14610a11578063caf7c44514610a31578063cfde96a914610a5157600080fd5b8063aeceadbf1461097a578063afe29f711461098f578063b102b6bc146109af578063b2596a67146109c457600080fd5b80638da5cb5b1161018557806394985ddd1161015457806394985ddd1461090557806395d89b4114610925578063a22cb4651461093a578063a272fbae1461095a57600080fd5b80638da5cb5b146108945780638eb8c81c146108b25780638ebb25ca146108d25780638f5dac6e146108f257600080fd5b80637d91b7b2116101c15780637d91b7b214610811578063871105cc146108315780638b58c569146108515780638cfec4c01461087e57600080fd5b806370a08231146107b2578063715018a6146107d25780637362377b146107e75780637390c786146107fc57600080fd5b806330176e13116102e257806353b93557116102755780635d41c19c116102445780635d41c19c14610730578063601fb175146107455780636352211e14610772578063666c27d41461079257600080fd5b806353b93557146106bd57806354703d0c146106dd578063556b5dd4146106f05780635aa287421461071057600080fd5b80634336316c116102b15780634336316c1461063d578063434b3c121461065d578063487586971461067d5780634f6ccce71461069d57600080fd5b806330176e13146105bd578063422627c3146105dd5780634233429c146105fd57806342842e0e1461061d57600080fd5b806317fc39351161035a57806323b872dd1161032957806323b872dd14610547578063276aeac1146105675780632ddbd13a146105875780632f745c591461059d57600080fd5b806317fc3935146104d257806318160ddd146104f2578063216c3019146105075780632374c9241461052757600080fd5b8063081812fc11610396578063081812fc14610438578063095ea7b3146104705780631710fef81461049257806317b8e1cf146104b257600080fd5b806301de34f8146103bd57806301ffc9a7146103e657806306fdde0314610416575b600080fd5b3480156103c957600080fd5b506103d360145481565b6040519081526020015b60405180910390f35b3480156103f257600080fd5b50610406610401366004614bd4565b610b63565b60405190151581526020016103dd565b34801561042257600080fd5b5061042b610b8e565b6040516103dd91906155e5565b34801561044457600080fd5b50610458610453366004614c57565b610c20565b6040516001600160a01b0390911681526020016103dd565b34801561047c57600080fd5b5061049061048b3660046149da565b610cad565b005b34801561049e57600080fd5b506104906104ad366004614871565b610dc3565b3480156104be57600080fd5b506103d36104cd366004614c57565b610e0f565b3480156104de57600080fd5b506104906104ed366004614a3b565b610e30565b3480156104fe57600080fd5b506008546103d3565b34801561051357600080fd5b50610406610522366004614c57565b6110dd565b34801561053357600080fd5b5061042b610542366004614c57565b611109565b34801561055357600080fd5b506104906105623660046148eb565b61127e565b34801561057357600080fd5b5061042b610582366004614c57565b6112af565b34801561059357600080fd5b506103d360165481565b3480156105a957600080fd5b506103d36105b83660046149da565b611325565b3480156105c957600080fd5b506104906105d8366004614c0e565b6113bb565b3480156105e957600080fd5b5061042b6105f8366004614c57565b6113fc565b34801561060957600080fd5b50610490610618366004614c57565b611780565b34801561062957600080fd5b506104906106383660046148eb565b6117af565b34801561064957600080fd5b50610490610658366004614871565b6117ca565b34801561066957600080fd5b50610490610678366004614871565b611816565b34801561068957600080fd5b5061042b610698366004614c57565b611862565b3480156106a957600080fd5b506103d36106b8366004614c57565b61194c565b3480156106c957600080fd5b506103d36106d8366004614c57565b6119df565b6104906106eb366004614a06565b6119ef565b3480156106fc57600080fd5b506103d361070b366004614c57565b611c71565b34801561071c57600080fd5b506103d361072b366004614c57565b611d69565b34801561073c57600080fd5b50610490611e45565b34801561075157600080fd5b506103d3610760366004614c57565b6000908152601e602052604090205490565b34801561077e57600080fd5b5061045861078d366004614c57565b611f26565b34801561079e57600080fd5b5061042b6107ad366004614c57565b611f9d565b3480156107be57600080fd5b506103d36107cd366004614871565b612013565b3480156107de57600080fd5b5061049061209a565b3480156107f357600080fd5b506104906120d0565b34801561080857600080fd5b506103d3612129565b34801561081d57600080fd5b5061049061082c366004614a06565b61215d565b34801561083d57600080fd5b5061049061084c366004614871565b6121f6565b34801561085d57600080fd5b506103d361086c366004614c57565b601f6020526000908152604090205481565b34801561088a57600080fd5b506103d3601a5481565b3480156108a057600080fd5b50600b546001600160a01b0316610458565b3480156108be57600080fd5b506103d36108cd366004614c57565b612242565b3480156108de57600080fd5b506104906108ed366004614c57565b6122d0565b610490610900366004614c57565b6122ff565b34801561091157600080fd5b50610490610920366004614bb2565b612532565b34801561093157600080fd5b5061042b6125b0565b34801561094657600080fd5b506104906109553660046149ac565b6125bf565b34801561096657600080fd5b5061042b610975366004614c57565b612684565b34801561098657600080fd5b506104906126fa565b34801561099b57600080fd5b5061042b6109aa366004614c57565b6127b5565b3480156109bb57600080fd5b506104906127c0565b3480156109d057600080fd5b506103d36109df366004614c57565b601e6020526000908152604090205481565b3480156109fd57600080fd5b50610490610a0c36600461492c565b61287e565b348015610a1d57600080fd5b5061042b610a2c366004614c57565b6128b6565b348015610a3d57600080fd5b50610490610a4c366004614bb2565b612b75565b610490610a5f366004614a3b565b612bd9565b348015610a7057600080fd5b50610490610a7f366004614c0e565b612f0f565b348015610a9057600080fd5b506103d3610a9f366004614c57565b612f4c565b348015610ab057600080fd5b506103d3612fbf565b348015610ac557600080fd5b506103d361138881565b348015610adb57600080fd5b50610406610aea3660046148b2565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610b2457600080fd5b50610490610b33366004614871565b6130da565b348015610b4457600080fd5b50610490613172565b348015610b5957600080fd5b506103d360195481565b60006001600160e01b0319821663780e9d6360e01b1480610b885750610b8882613277565b92915050565b606060008054610b9d906159b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc9906159b4565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b5050505050905090565b6000610c2b826132c7565b610c915760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610cb882611f26565b9050806001600160a01b0316836001600160a01b03161415610d265760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c88565b336001600160a01b0382161480610d425750610d428133610aea565b610db45760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c88565b610dbe83836132e4565b505050565b600b546001600160a01b03163314610ded5760405162461bcd60e51b8152600401610c8890615730565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60158181548110610e1f57600080fd5b600091825260209091200154905081565b6002600a541415610e535760405162461bcd60e51b8152600401610c889061583b565b6002600a556019544211610e795760405162461bcd60e51b8152600401610c8890615765565b6113888151601654610e8b91906158f0565b10610ea85760405162461bcd60e51b8152600401610c88906157a9565b60005b8151811015610f6c57610ed6828281518110610ec957610ec9615a83565b6020026020010151613352565b610ef25760405162461bcd60e51b8152600401610c88906156ef565b610f14828281518110610f0757610f07615a83565b60200260200101516110dd565b15610f5a5760405162461bcd60e51b815260206004820152601660248201527515985d5b1d081dd85cc8185b1c9958591e481d5cd95960521b6044820152606401610c88565b80610f64816159ef565b915050610eab565b506040516001600160601b03193360601b166020820152600090819060340160405160208183030381529060405280519060200120905060005b601354811015610ffe57610fd88560138381548110610fc757610fc7615a83565b9060005260206000200154846133f4565b15610fec57610fe9816103e861593b565b92505b80610ff6816159ef565b915050610fa6565b5060005b83518110156110d157600061103a600161103487858151811061102757611027615a83565b6020026020010151612242565b8661340a565b905060016011600087858151811061105457611054615a83565b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555060166000815480929190611094906159ef565b9091555050601480549060006110a98361599d565b91905055506110be6110b83390565b82613949565b50806110c9816159ef565b915050611002565b50506001600a55505050565b60008181526011602052604081205460ff1615156001141561110157506001919050565b506000919050565b6060611114826132c7565b6111305760405162461bcd60e51b8152600401610c8890615681565b600d546000838152601f602052604090819020549051631ef2f77160e01b81526060926001600160a01b0316916022918391631ef2f7719161117f918991600401918252602082015260400190565b60206040518083038186803b15801561119757600080fd5b505afa1580156111ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111cf9190614c89565b60ff16815481106111e2576111e2615a83565b9060005260206000200180546111f7906159b4565b80601f0160208091040260200160405190810160405280929190818152602001828054611223906159b4565b80156112705780601f1061124557610100808354040283529160200191611270565b820191906000526020600020905b81548152906001019060200180831161125357829003601f168201915b509398975050505050505050565b6112883382613963565b6112a45760405162461bcd60e51b8152600401610c88906157ea565b610dbe838383613a49565b60606112ba826132c7565b6112d65760405162461bcd60e51b8152600401610c8890615681565b600d546000838152601f602052604090819020549051632311963b60e01b81526060926001600160a01b0316916021918391632311963b9161117f918991600401918252602082015260400190565b600061133083612013565b82106113925760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c88565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b031633146113e55760405162461bcd60e51b8152600401610c8890615730565b80516113f8906025906020840190614693565b5050565b6060611407826132c7565b6114535760405162461bcd60e51b815260206004820152601d60248201527f517565727920666f72206e6f6e2d6578697374656e7420746f6b656e210000006044820152606401610c88565b600d546000838152601f6020526040808220549051632311963b60e01b81526001600160a01b03909316928391632311963b9161149d918891600401918252602082015260400190565b60206040518083038186803b1580156114b557600080fd5b505afa1580156114c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ed9190614c89565b6000858152601f6020526040808220549051631ef2f77160e01b815260048101889052602481019190915260ff929092169250906001600160a01b03841690631ef2f7719060440160206040518083038186803b15801561154d57600080fd5b505afa158015611561573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115859190614c89565b60ff169050611592614717565b6000868152601f60205260409020546115aa906127b5565b6000878152601e60205260409020546115c2906127b5565b6115cb856127b5565b6115d76109aa8a611c71565b6040516020016115ea9493929190614dd9565b60408051808303601f190181529190528152611605826127b5565b6116116109aa88612f4c565b6000888152601f6020526040908190205490516307568f4b60e01b8152600481018a905260248101919091526116ae906001600160a01b038816906307568f4b906044015b60206040518083038186803b15801561166e57600080fd5b505afa158015611682573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a69190614c89565b60ff166127b5565b6000898152601f602052604090819020549051637c9cead360e01b8152600481018b905260248101919091526116f7906001600160a01b03891690637c9cead390604401611656565b6117036109aa8b611d69565b604051602001611717959493929190614e30565b60408051808303601f190181529181526020808401839052835191516000936117439392909101614daa565b6040516020818303038152906040529050806040516020016117659190614d8e565b60405160208183030381529060405295505050505050919050565b600b546001600160a01b031633146117aa5760405162461bcd60e51b8152600401610c8890615730565b601955565b610dbe8383836040518060200160405280600081525061287e565b600b546001600160a01b031633146117f45760405162461bcd60e51b8152600401610c8890615730565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b031633146118405760405162461bcd60e51b8152600401610c8890615730565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b606061186d826132c7565b6118895760405162461bcd60e51b8152600401610c8890615681565b60606020601f600085815260200190815260200160002054815481106118b1576118b1615a83565b9060005260206000200180546118c6906159b4565b80601f01602080910402602001604051908101604052809291908181526020018280546118f2906159b4565b801561193f5780601f106119145761010080835404028352916020019161193f565b820191906000526020600020905b81548152906001019060200180831161192257829003601f168201915b5093979650505050505050565b600061195760085490565b82106119ba5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c88565b600882815481106119cd576119cd615a83565b90600052602060002001549050919050565b60138181548110610e1f57600080fd5b6002600a541415611a125760405162461bcd60e51b8152600401610c889061583b565b6002600a556019544211611a385760405162461bcd60e51b8152600401610c8890615765565b601454601654611a4a9061138861595a565b11611a975760405162461bcd60e51b815260206004820152601f60248201527f4d696e74696e67206f766572207661756c7420686f6c646572206c696d6974006044820152606401610c88565b61138860165410611aba5760405162461bcd60e51b8152600401610c88906156ac565b6017543414611adb5760405162461bcd60e51b8152600401610c889061564a565b33600090815260126020526040902054600111611b325760405162461bcd60e51b8152602060048201526015602482015274165bdd49dd9948185b1c9958591e481b5a5b9d1959605a1b6044820152606401610c88565b6040516001600160601b03193360601b16602082015260009060340160408051601f19818403018152919052805160209091012090506000805b601354811015611c2857611b9e8460138381548110611b8d57611b8d615a83565b9060005260206000200154856133f4565b15611c12576000611bb1826103e861593b565b90506000611bc16000808461340a565b601680549192506000611bd3836159ef565b91905055508060126000611be43390565b6001600160a01b03168152602081019190915260400160002055611c07336110b8565b600093505050611c28565b6001915080611c20816159ef565b915050611b6c565b508015611c675760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610c88565b50506001600a5550565b6000611c7c826132c7565b611c985760405162461bcd60e51b8152600401610c8890615681565b600d546000838152601f602052604080822054905163d913a56760e01b815260048101869052602481019190915290916001600160a01b0316908290829063d913a567906044015b60206040518083038186803b158015611cf857600080fd5b505afa158015611d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d309190614c89565b60ff169050611d4b856000908152601e602052604090205490565b611d55908261593b565b611d609060016158f0565b95945050505050565b6000611d74826132c7565b611d905760405162461bcd60e51b8152600401610c8890615681565b600d546000838152601e6020908152604080832054601f909252808320549051633570d40760e11b815260048101879052602481019190915291926001600160a01b0316918290636ae1a80e9060440160206040518083038186803b158015611df857600080fd5b505afa158015611e0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e309190614c89565b60ff16611e3d91906158f0565b949350505050565b6002600a541415611e685760405162461bcd60e51b8152600401610c889061583b565b6002600a55601c546001600160a01b03163314611eb65760405162461bcd60e51b815260206004820152600c60248201526b04e6f7420436f6465203230360a41b6044820152606401610c88565b601b5462010000900460ff1615611edf5760405162461bcd60e51b8152600401610c8890615872565b601b805462ff00001916620100001790556000611efd81808061340a565b601680549192506000611f0f836159ef565b9190505550611f1e3382613949565b506001600a55565b6000818152600260205260408120546001600160a01b031680610b885760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c88565b6060611fa8826132c7565b611fc45760405162461bcd60e51b8152600401610c8890615681565b600d546000838152601f602052604090819020549051637c9cead360e01b81526060926001600160a01b0316916024918391637c9cead39161117f918991600401918252602082015260400190565b60006001600160a01b03821661207e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c88565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146120c45760405162461bcd60e51b8152600401610c8890615730565b6120ce6000613bf4565b565b600b546001600160a01b031633146120fa5760405162461bcd60e51b8152600401610c8890615730565b60405133904780156108fc02916000818181858888f19350505050158015612126573d6000803e3d6000fd5b50565b600b546000906001600160a01b031633146121565760405162461bcd60e51b8152600401610c8890615730565b5060295490565b600b546001600160a01b031633146121875760405162461bcd60e51b8152600401610c8890615730565b60408051600081526020810191829052516121a49160139161473e565b5060005b81518110156113f85760138282815181106121c5576121c5615a83565b60209081029190910181015182546001810184556000938452919092200155806121ee816159ef565b9150506121a8565b600b546001600160a01b031633146122205760405162461bcd60e51b8152600401610c8890615730565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600d546040516323ae320760e21b81526004810183905260009182916001600160a01b03909116908190638eb8c81c9060240160206040518083038186803b15801561228d57600080fd5b505afa1580156122a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c59190614c89565b60ff16949350505050565b600b546001600160a01b031633146122fa5760405162461bcd60e51b8152600401610c8890615730565b601a55565b6002600a5414156123225760405162461bcd60e51b8152600401610c889061583b565b6002600a55601a5442116123825760405162461bcd60e51b815260206004820152602160248201527f546865207075626c6963206d696e7420646964206e6f742073746172742079656044820152601d60fa1b6064820152608401610c88565b6014546016546123949061138861595a565b116123e15760405162461bcd60e51b815260206004820152601f60248201527f4d696e74696e67206f766572207661756c7420686f6c646572206c696d6974006044820152606401610c88565b611388816016546123f291906158f0565b1061240f5760405162461bcd60e51b8152600401610c88906156ac565b6000811161245f5760405162461bcd60e51b815260206004820152601860248201527f43616e206e6f74206d696e74207a65726f20746f6b656e7300000000000000006044820152606401610c88565b600b81106124af5760405162461bcd60e51b815260206004820152601a60248201527f526571756573742065786365656473206d617820746f6b656e730000000000006044820152606401610c88565b806018546124bd919061593b565b34146124db5760405162461bcd60e51b8152600401610c889061564a565b60015b818110156125295760006124f5600080600061340a565b601680549192506000612507836159ef565b91905055506125166110b83390565b5080612521816159ef565b9150506124de565b50506001600a55565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146125aa5760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c006044820152606401610c88565b60295550565b606060018054610b9d906159b4565b6001600160a01b0382163314156126185760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c88565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b606061268f826132c7565b6126ab5760405162461bcd60e51b8152600401610c8890615681565b600d546000838152601f6020526040908190205490516307568f4b60e01b81526060926001600160a01b03169160239183916307568f4b9161117f918991600401918252602082015260400190565b600b546001600160a01b031633146127245760405162461bcd60e51b8152600401610c8890615730565b6002600a5414156127475760405162461bcd60e51b8152600401610c889061583b565b6002600a55601b5460ff161561276f5760405162461bcd60e51b8152600401610c8890615872565b601b805460ff19166001179055600061278981808061340a565b60168054919250600061279b836159ef565b9190505550611f1e6110b8600b546001600160a01b031690565b6060610b8882613c46565b6002600a5414156127e35760405162461bcd60e51b8152600401610c889061583b565b6002600a55601b5464010000000090046001600160a01b0316331461283a5760405162461bcd60e51b815260206004820152600d60248201526c139bdd08115c9c9bdc880d0c0d609a1b6044820152606401610c88565b601b54610100900460ff16156128625760405162461bcd60e51b8152600401610c8890615872565b601b805461ff0019166101001790556000611efd81808061340a565b6128883383613963565b6128a45760405162461bcd60e51b8152600401610c88906157ea565b6128b084848484613d44565b50505050565b60606128c1826132c7565b61290d5760405162461bcd60e51b815260206004820152601d60248201527f517565727920666f72206e6f6e2d6578697374656e7420746f6b656e210000006044820152606401610c88565b612915614778565b61291e836127b5565b6000848152601e6020526040902054612936906127b5565b6000858152601f6020526040902054602590612951906127b5565b602661295c886113fc565b612965896127b5565b60405160200161297b97969594939291906150d0565b60408051808303601f19018152919052815261299683611862565b6000848152601e60205260409020546129ae906127b5565b6040516020016129bf9291906153d5565b60408051808303601f1901815291905260208201526129dd836112af565b6129e96109aa85611c71565b6040516020016129fa9291906154a9565b60408051808303601f19018152918152820152612a1683611109565b612a226109aa85612f4c565b604051602001612a33929190615033565b60408051808303601f190181529190526060820152612a5183612684565b604051602001612a619190615278565b60408051808303601f190181529190526080820152612a7f83611f9d565b612a8b6109aa85611d69565b604051602001612a9c9291906152f1565b60408051808303601f1901815291905260a08201526026612abc846113fc565b612ac5856127b5565b6026612ad0876113fc565b612ad9886127b5565b604051602001612aee96959493929190614f2d565b60408051808303601f1901815291815260c083018290528251602080850151858401516060870151608088015160a08901519651600098612b4a98612b369897909201614e9b565b604051602081830303815290604052613d77565b905080604051602001612b5d91906154ff565b60405160208183030381529060405292505050919050565b6010546001600160a01b03163314612bc75760405162461bcd60e51b8152602060048201526015602482015274596f752063616e206e6f742063616c6c207468697360581b6044820152606401610c88565b6000918252601e602052604090912055565b6002600a541415612bfc5760405162461bcd60e51b8152600401610c889061583b565b6002600a556019544211612c225760405162461bcd60e51b8152600401610c8890615765565b61138881516016546001612c3691906158f0565b612c4091906158f0565b10612c5d5760405162461bcd60e51b8152600401610c88906157a9565b6017543414612c7e5760405162461bcd60e51b8152600401610c889061564a565b33600090815260126020526040902054600111612cd55760405162461bcd60e51b8152602060048201526015602482015274165bdd49dd9948185b1c9958591e481b5a5b9d1959605a1b6044820152606401610c88565b60005b8151811015612d7f57612cf6828281518110610ec957610ec9615a83565b612d125760405162461bcd60e51b8152600401610c88906156ef565b612d27828281518110610f0757610f07615a83565b15612d6d5760405162461bcd60e51b815260206004820152601660248201527515985d5b1d081dd85cc8185b1c9958591e481d5cd95960521b6044820152606401610c88565b80612d77816159ef565b915050612cd8565b506040516001600160601b03193360601b166020820152600090819060340160405160208183030381529060405280519060200120905060005b601354811015612e0057612dda8560138381548110610fc757610fc7615a83565b15612dee57612deb816103e861593b565b92505b80612df8816159ef565b915050612db9565b5060005b8351811015612eba576000612e29600161103487858151811061102757611027615a83565b9050600160116000878581518110612e4357612e43615a83565b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555060166000815480929190612e83906159ef565b909155505060148054906000612e988361599d565b9190505550612ea76110b83390565b5080612eb2816159ef565b915050612e04565b506000612ec96000808561340a565b601680549192506000612edb836159ef565b91905055508060126000612eec3390565b6001600160a01b031681526020810191909152604001600020556110d1336110b8565b600b546001600160a01b03163314612f395760405162461bcd60e51b8152600401610c8890615730565b80516113f8906026906020840190614693565b6000612f57826132c7565b612f735760405162461bcd60e51b8152600401610c8890615681565b600d546000838152601f60205260408082205490516349ec3c7160e11b815260048101869052602481019190915290916001600160a01b031690829082906393d878e290604401611ce0565b600b546000906001600160a01b03163314612fec5760405162461bcd60e51b8152600401610c8890615730565b6028546040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561304e57600080fd5b505afa158015613062573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130869190614c70565b10156130c75760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f756768204c494e4b2160801b6044820152606401610c88565b6130d5602754602854613edd565b905090565b600b546001600160a01b031633146131045760405162461bcd60e51b8152600401610c8890615730565b6001600160a01b0381166131695760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c88565b61212681613bf4565b6002600a5414156131955760405162461bcd60e51b8152600401610c889061583b565b6002600a55601d546001600160a01b031633146131eb5760405162461bcd60e51b8152602060048201526014602482015273139bdd0811da5d99585dd85e5cc81dd85b1b195d60621b6044820152606401610c88565b601b546301000000900460ff16156132155760405162461bcd60e51b8152600401610c8890615872565b601b805463ff0000001916630100000017905560005b600f811015611f1e576000613243600080600061340a565b601680549192506000613255836159ef565b91905055506132643382613949565b508061326f816159ef565b91505061322b565b60006001600160e01b031982166380ac58cd60e01b14806132a857506001600160e01b03198216635b5e139f60e01b145b80610b8857506301ffc9a760e01b6001600160e01b0319831614610b88565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061331982611f26565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600f546040516331a9108f60e11b8152600481018390526000916001600160a01b03169033908290636352211e9060240160206040518083038186803b15801561339b57600080fd5b505afa1580156133af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133d39190614895565b6001600160a01b031614156133eb5750600192915050565b50600092915050565b6000826134018584614068565b14949350505050565b60006029546000141561346b5760405162461bcd60e51b815260206004820152602360248201527f5652462052616e646f6d20526573756c7420686173206e6f74206265656e207360448201526265742160e81b6064820152608401610c88565b600060165461138861347d919061595a565b9050600081156134975761349260018361595a565b61349a565b60005b6029546113b25460405192935060009285926134c992909163ffffffff90911690339044904290602001615544565b6040516020818303038152906040528051906020012060001c6134ec9190615a0a565b90506000602a82611388811061350457613504615a83565b01546135105781613527565b602a82611388811061352457613524615a83565b01545b9050602a83611388811061353d5761353d615a83565b01541561355f57602a83611388811061355857613558615a83565b0154613561565b825b602a83611388811061357557613575615a83565b01556029546113b254604051600092600a926135a29263ffffffff90911690339044904290602001615544565b6040516020818303038152906040528051906020012060001c6135c59190615a1e565b6113b2805491925082916000906135e390849063ffffffff16615908565b825463ffffffff9182166101009390930a928302919092021990911617905550600e546040516375cf69f960e01b81528a15156004820152602481018a9052604481018990526001600160a01b039091169060009082906375cf69f99060640160006040518083038186803b15801561365b57600080fd5b505afa15801561366f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526136979190810190614afd565b60408051600580825260c0820190925291925060009182916020820160a08036833701905050905060005b8351811015613722578381815181106136dd576136dd615a83565b6020026020010151836136f091906158f0565b92508282828151811061370557613705615a83565b60209081029190910101528061371a816159ef565b9150506136c2565b506029546113b254604051600092859261374d9263ffffffff90911690339044904290602001615544565b6040516020818303038152906040528051906020012060001c6137709190615a0a565b905060008260008151811061378757613787615a83565b602002602001015182101580156137b75750826001815181106137ac576137ac615a83565b602002602001015182105b156137c0575060015b826001815181106137d3576137d3615a83565b602002602001015182101580156138035750826002815181106137f8576137f8615a83565b602002602001015182105b1561380c575060025b8260028151811061381f5761381f615a83565b6020026020010151821015801561384f57508260038151811061384457613844615a83565b602002602001015182105b15613858575060035b8260038151811061386b5761386b615a83565b6020026020010151821015801561389c57508260048151811061389057613890615a83565b60200260200101518211155b156138a5575060045b6000601582815481106138ba576138ba615a83565b9060005260206000200154111561391d57601581815481106138de576138de615a83565b600091825260208220018054916138f48361599d565b90915550506000888152601f60209081526040808320849055601e909152902060019055613936565b61392681614114565b6000898152601f60205260409020555b50959d9c50505050505050505050505050565b6113f882826040518060200160405280600081525061412e565b600061396e826132c7565b6139cf5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c88565b60006139da83611f26565b9050806001600160a01b0316846001600160a01b03161480613a155750836001600160a01b0316613a0a84610c20565b6001600160a01b0316145b80611e3d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611e3d565b826001600160a01b0316613a5c82611f26565b6001600160a01b031614613ac45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610c88565b6001600160a01b038216613b265760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c88565b613b31838383614161565b613b3c6000826132e4565b6001600160a01b0383166000908152600360205260408120805460019290613b6590849061595a565b90915550506001600160a01b0382166000908152600360205260408120805460019290613b939084906158f0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606081613c6a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613c945780613c7e816159ef565b9150613c8d9050600a83615927565b9150613c6e565b60008167ffffffffffffffff811115613caf57613caf615a99565b6040519080825280601f01601f191660200182016040528015613cd9576020820181803683370190505b5090505b8415611e3d57613cee60018361595a565b9150613cfb600a86615a0a565b613d069060306158f0565b60f81b818381518110613d1b57613d1b615a83565b60200101906001600160f81b031916908160001a905350613d3d600a86615927565b9450613cdd565b613d4f848484613a49565b613d5b84848484614219565b6128b05760405162461bcd60e51b8152600401610c88906155f8565b805160609080613d97575050604080516020810190915260008152919050565b60006003613da68360026158f0565b613db09190615927565b613dbb90600461593b565b90506000613dca8260206158f0565b67ffffffffffffffff811115613de257613de2615a99565b6040519080825280601f01601f191660200182016040528015613e0c576020820181803683370190505b5090506000604051806060016040528060408152602001615ae9604091399050600181016020830160005b86811015613e98576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101613e37565b506003860660018114613eb25760028114613ec357613ecf565b613d3d60f01b600119830152613ecf565b603d60f81b6000198301525b505050918152949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634000aea07f000000000000000000000000000000000000000000000000000000000000000084866000604051602001613f4d929190918252602082015260400190565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401613f7a939291906155be565b602060405180830381600087803b158015613f9457600080fd5b505af1158015613fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fcc9190614b95565b506000838152600c6020818152604080842054815180840189905280830186905230606082015260808082018390528351808303909101815260a0909101909252815191830191909120938790529190526140289060016158f0565b6000858152600c6020526040902055611e3d8482604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b600081815b845181101561410c57600085828151811061408a5761408a615a83565b602002602001015190508083116140cc5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506140f9565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080614104816159ef565b91505061406d565b509392505050565b6000811561412557610b8882614326565b610b8882614375565b61413883836143c4565b6141456000848484614219565b610dbe5760405162461bcd60e51b8152600401610c88906155f8565b6001600160a01b0383166141bc576141b781600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6141df565b816001600160a01b0316836001600160a01b0316146141df576141df8382614503565b6001600160a01b0382166141f657610dbe816145a0565b826001600160a01b0316826001600160a01b031614610dbe57610dbe828261464f565b60006001600160a01b0384163b1561431b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061425d903390899088908890600401615581565b602060405180830381600087803b15801561427757600080fd5b505af19250505080156142a7575060408051601f3d908101601f191682019092526142a491810190614bf1565b60015b614301573d8080156142d5576040519150601f19603f3d011682016040523d82523d6000602084013e6142da565b606091505b5080516142f95760405162461bcd60e51b8152600401610c88906155f8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e3d565b506001949350505050565b600080601561433660018561595a565b8154811061434657614346615a83565b9060005260206000200154111561436257610b8860018361595a565b610b8861437060018461595a565b614326565b60008060156143858460016158f0565b8154811061439557614395615a83565b906000526020600020015411156143b157610b888260016158f0565b610b886143bf8360016158f0565b614375565b6001600160a01b03821661441a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c88565b614423816132c7565b156144705760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c88565b61447c60008383614161565b6001600160a01b03821660009081526003602052604081208054600192906144a59084906158f0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161451084612013565b61451a919061595a565b60008381526007602052604090205490915080821461456d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906145b29060019061595a565b600083815260096020526040812054600880549394509092849081106145da576145da615a83565b9060005260206000200154905080600883815481106145fb576145fb615a83565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061463357614633615a6d565b6001900381819060005260206000200160009055905550505050565b600061465a83612013565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461469f906159b4565b90600052602060002090601f0160209004810192826146c15760008555614707565b82601f106146da57805160ff1916838001178555614707565b82800160010185558215614707579182015b828111156147075782518255916020019190600101906146ec565b50614713929150614792565b5090565b60405180604001604052806002905b60608152602001906001900390816147265790505090565b82805482825590600052602060002090810192821561470757916020028201828111156147075782518255916020019190600101906146ec565b6040805160e0810190915260608152600660208201614726565b5b808211156147135760008155600101614793565b600067ffffffffffffffff8311156147c1576147c1615a99565b6147d4601f8401601f191660200161589b565b90508281528383830111156147e857600080fd5b828260208301376000602084830101529392505050565b600082601f83011261481057600080fd5b81356020614825614820836158cc565b61589b565b80838252828201915082860187848660051b890101111561484557600080fd5b60005b8581101561486457813584529284019290840190600101614848565b5090979650505050505050565b60006020828403121561488357600080fd5b813561488e81615aaf565b9392505050565b6000602082840312156148a757600080fd5b815161488e81615aaf565b600080604083850312156148c557600080fd5b82356148d081615aaf565b915060208301356148e081615aaf565b809150509250929050565b60008060006060848603121561490057600080fd5b833561490b81615aaf565b9250602084013561491b81615aaf565b929592945050506040919091013590565b6000806000806080858703121561494257600080fd5b843561494d81615aaf565b9350602085013561495d81615aaf565b925060408501359150606085013567ffffffffffffffff81111561498057600080fd5b8501601f8101871361499157600080fd5b6149a0878235602084016147a7565b91505092959194509250565b600080604083850312156149bf57600080fd5b82356149ca81615aaf565b915060208301356148e081615ac4565b600080604083850312156149ed57600080fd5b82356149f881615aaf565b946020939093013593505050565b600060208284031215614a1857600080fd5b813567ffffffffffffffff811115614a2f57600080fd5b611e3d848285016147ff565b60008060408385031215614a4e57600080fd5b823567ffffffffffffffff80821115614a6657600080fd5b614a72868387016147ff565b9350602091508185013581811115614a8957600080fd5b85019050601f81018613614a9c57600080fd5b8035614aaa614820826158cc565b80828252848201915084840189868560051b8701011115614aca57600080fd5b600094505b83851015614aed578035835260019490940193918501918501614acf565b5080955050505050509250929050565b60006020808385031215614b1057600080fd5b825167ffffffffffffffff811115614b2757600080fd5b8301601f81018513614b3857600080fd5b8051614b46614820826158cc565b80828252848201915084840188868560051b8701011115614b6657600080fd5b600094505b83851015614b89578051835260019490940193918501918501614b6b565b50979650505050505050565b600060208284031215614ba757600080fd5b815161488e81615ac4565b60008060408385031215614bc557600080fd5b50508035926020909101359150565b600060208284031215614be657600080fd5b813561488e81615ad2565b600060208284031215614c0357600080fd5b815161488e81615ad2565b600060208284031215614c2057600080fd5b813567ffffffffffffffff811115614c3757600080fd5b8201601f81018413614c4857600080fd5b611e3d848235602084016147a7565b600060208284031215614c6957600080fd5b5035919050565b600060208284031215614c8257600080fd5b5051919050565b600060208284031215614c9b57600080fd5b815160ff8116811461488e57600080fd5b60008151808452614cc4816020860160208601615971565b601f01601f19169290920160200192915050565b60008151614cea818560208601615971565b9290920192915050565b8054600090600181811c9080831680614d0e57607f831692505b6020808410821415614d3057634e487b7160e01b600052602260045260246000fd5b818015614d445760018114614d5557614d82565b60ff19861689528489019650614d82565b60008881526020902060005b86811015614d7a5781548b820152908501908301614d61565b505084890196505b50505050505092915050565b60008251614da0818460208701615971565b9190910192915050565b60008351614dbc818460208801615971565b835190830190614dd0818360208801615971565b01949350505050565b60008551614deb818460208a01615971565b855190830190614dff818360208a01615971565b8551910190614e12818360208901615971565b8451910190614e25818360208801615971565b019695505050505050565b60008651614e42818460208b01615971565b865190830190614e56818360208b01615971565b8651910190614e69818360208a01615971565b8551910190614e7c818360208901615971565b8451910190614e8f818360208801615971565b01979650505050505050565b600088516020614eae8285838e01615971565b895191840191614ec18184848e01615971565b8951920191614ed38184848d01615971565b8851920191614ee58184848c01615971565b8751920191614ef78184848b01615971565b8651920191614f098184848a01615971565b8551920191614f1b8184848901615971565b919091019a9950505050505050505050565b61174b60f21b8152711130b734b6b0ba34b7b72fbab936111d101160711b60028201526000614f5f6014830189614cf4565b643f646e613d60d81b8082528851614f7e816005850160208d01615971565b632669643d60e01b600593909101928301528751614fa3816009850160208c01615971565b61088b60f21b600993909101928301526e1134b33930b6b2afbab936111d101160891b600b830152614fd8601a830188614cf4565b908152905061502661501961500c615006614ff6600586018a614cd8565b632669643d60e01b815260040190565b87614cd8565b601160f91b815260010190565b607d60f81b815260010190565b9998505050505050505050565b607b60f81b81527f2274726169745f74797065223a202255706772616465202332222c0000000000600182015269113b30b63ab2911d101160b11b601c8201528251600090615089816026850160208801615971565b61202b60f01b60269184019182015283516150ab816028840160208801615971565b601160f91b60289290910191820152611f4b60f21b6029820152602b01949350505050565b607b60f81b81527f226e616d65223a20224379626572205570677261646520230000000000000000600182015260008851615112816019850160208d01615971565b68010142632bb32b61d160bd1b601991840191820152885161513b816022840160208d01615971565b620a488b60ea1b60229290910191820152691134b6b0b3b2911d101160b11b602582015261516c602f820189614cf4565b9050865161517e818360208b01615971565b61526961524e6151ff6151f16151eb614ff66151e56151d46151ce6151b18a8c01650b9a9c19c88b60d21b815260060190565b701132bc3a32b93730b62fbab936111d101160791b815260110190565b8f614cf4565b643f646e613d60d81b815260050190565b8c614cd8565b89614cd8565b61088b60f21b815260020190565b7f226465736372697074696f6e223a202255706772616465732077616974696e6781527f20746f20626520636f6e6e656374656420746f20706c61796572732e222c00006020820152603e0190565b6e2261747472696275746573223a205b60881b8152600f0190565b9b9a5050505050505050505050565b607b60f81b81527f2274726169745f74797065223a20224175676d656e746174696f6e202331222c600182015269113b30b63ab2911d101160b11b602182015281516000906152ce81602b850160208701615971565b601160f91b602b939091019283015250611f4b60f21b602c820152602e01919050565b6000607b60f81b8083527f2274726169745f74797065223a20224175676d656e746174696f6e202332222c600184015269113b30b63ab2911d101160b11b6021840152845161534781602b860160208901615971565b601160f91b602b918501918201819052611f4b60f21b602c830152602e8201929092527f2274726169745f74797065223a202241697264726f7073222c00000000000000602f8201526a044ecc2d8eaca44744044f60ab1b60488201528451916153b8836053840160208901615971565b91016053810191909152607d60f81b605482015260558101611d60565b6000607b60f81b8083527f2274726169745f74797065223a2022526172697479222c000000000000000000600184015269113b30b63ab2911d101160b11b806018850152855161542c816022870160208a01615971565b601160f91b6022918601918201819052611f4b60f21b60238301819052602583019490945275089d1c985a5d17dd1e5c19488e880893195d995b088b60521b6026830152603c820183905286519361548b856046850160208b01615971565b60469290940191820152604781019290925250604901949350505050565b607b60f81b81527f2274726169745f74797065223a202255706772616465202331222c0000000000600182015269113b30b63ab2911d101160b11b601c8201528251600090615089816026850160208801615971565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161553781601d850160208701615971565b91909101601d0192915050565b94855260e09390931b6001600160e01b031916602085015260609190911b6001600160601b03191660248401526038830152605882015260780190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906155b490830184614cac565b9695505050505050565b60018060a01b0384168152826020820152606060408201526000611d606060830184614cac565b60208152600061488e6020830184614cac565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526019908201527f496e636f7272656374206d696e7420636f73742076616c756500000000000000604082015260600190565b6020808252601190820152702737b732bc34b9ba32b73a103a37b5b2b760791b604082015260600190565b60208082526023908201527f416c6c20746f6b656e732068617665206265656e20616c7265616479206d696e6040820152621d195960ea1b606082015260800190565b60208082526021908201527f5661756c74206f776e6572736869702076616c69646174696f6e206661696c656040820152601960fa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f5468652077686974656c697374206d696e7420646964206e6f74207374617274604082015263081e595d60e21b606082015260800190565b60208082526021908201527f4d696e74696e67206f76657220746865206d617820746f6b656e73206c696d696040820152601d60fa1b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600f908201526e416c7265616479206d696e7465642160881b604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156158c4576158c4615a99565b604052919050565b600067ffffffffffffffff8211156158e6576158e6615a99565b5060051b60200190565b6000821982111561590357615903615a41565b500190565b600063ffffffff808316818516808303821115614dd057614dd0615a41565b60008261593657615936615a57565b500490565b600081600019048311821515161561595557615955615a41565b500290565b60008282101561596c5761596c615a41565b500390565b60005b8381101561598c578181015183820152602001615974565b838111156128b05750506000910152565b6000816159ac576159ac615a41565b506000190190565b600181811c908216806159c857607f821691505b602082108114156159e957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615a0357615a03615a41565b5060010190565b600082615a1957615a19615a57565b500690565b600063ffffffff80841680615a3557615a35615a57565b92169190910692915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461212657600080fd5b801515811461212657600080fd5b6001600160e01b03198116811461212657600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220c226395b10bafba145ba7816ae597a33a7683d2fa0977284e951d49a758f3a7e64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106103b85760003560e01c806370a08231116101f2578063aeceadbf1161010d578063d08b4add116100a0578063e985e9c51161006f578063e985e9c514610acf578063f2fde38b14610b18578063fc59d96214610b38578063fdda339114610b4d57600080fd5b8063d08b4add14610a64578063d5a10a1514610a84578063dbdff2c114610aa4578063e831574214610ab957600080fd5b8063b88d4fde116100dc578063b88d4fde146109f1578063c87b56dd14610a11578063caf7c44514610a31578063cfde96a914610a5157600080fd5b8063aeceadbf1461097a578063afe29f711461098f578063b102b6bc146109af578063b2596a67146109c457600080fd5b80638da5cb5b1161018557806394985ddd1161015457806394985ddd1461090557806395d89b4114610925578063a22cb4651461093a578063a272fbae1461095a57600080fd5b80638da5cb5b146108945780638eb8c81c146108b25780638ebb25ca146108d25780638f5dac6e146108f257600080fd5b80637d91b7b2116101c15780637d91b7b214610811578063871105cc146108315780638b58c569146108515780638cfec4c01461087e57600080fd5b806370a08231146107b2578063715018a6146107d25780637362377b146107e75780637390c786146107fc57600080fd5b806330176e13116102e257806353b93557116102755780635d41c19c116102445780635d41c19c14610730578063601fb175146107455780636352211e14610772578063666c27d41461079257600080fd5b806353b93557146106bd57806354703d0c146106dd578063556b5dd4146106f05780635aa287421461071057600080fd5b80634336316c116102b15780634336316c1461063d578063434b3c121461065d578063487586971461067d5780634f6ccce71461069d57600080fd5b806330176e13146105bd578063422627c3146105dd5780634233429c146105fd57806342842e0e1461061d57600080fd5b806317fc39351161035a57806323b872dd1161032957806323b872dd14610547578063276aeac1146105675780632ddbd13a146105875780632f745c591461059d57600080fd5b806317fc3935146104d257806318160ddd146104f2578063216c3019146105075780632374c9241461052757600080fd5b8063081812fc11610396578063081812fc14610438578063095ea7b3146104705780631710fef81461049257806317b8e1cf146104b257600080fd5b806301de34f8146103bd57806301ffc9a7146103e657806306fdde0314610416575b600080fd5b3480156103c957600080fd5b506103d360145481565b6040519081526020015b60405180910390f35b3480156103f257600080fd5b50610406610401366004614bd4565b610b63565b60405190151581526020016103dd565b34801561042257600080fd5b5061042b610b8e565b6040516103dd91906155e5565b34801561044457600080fd5b50610458610453366004614c57565b610c20565b6040516001600160a01b0390911681526020016103dd565b34801561047c57600080fd5b5061049061048b3660046149da565b610cad565b005b34801561049e57600080fd5b506104906104ad366004614871565b610dc3565b3480156104be57600080fd5b506103d36104cd366004614c57565b610e0f565b3480156104de57600080fd5b506104906104ed366004614a3b565b610e30565b3480156104fe57600080fd5b506008546103d3565b34801561051357600080fd5b50610406610522366004614c57565b6110dd565b34801561053357600080fd5b5061042b610542366004614c57565b611109565b34801561055357600080fd5b506104906105623660046148eb565b61127e565b34801561057357600080fd5b5061042b610582366004614c57565b6112af565b34801561059357600080fd5b506103d360165481565b3480156105a957600080fd5b506103d36105b83660046149da565b611325565b3480156105c957600080fd5b506104906105d8366004614c0e565b6113bb565b3480156105e957600080fd5b5061042b6105f8366004614c57565b6113fc565b34801561060957600080fd5b50610490610618366004614c57565b611780565b34801561062957600080fd5b506104906106383660046148eb565b6117af565b34801561064957600080fd5b50610490610658366004614871565b6117ca565b34801561066957600080fd5b50610490610678366004614871565b611816565b34801561068957600080fd5b5061042b610698366004614c57565b611862565b3480156106a957600080fd5b506103d36106b8366004614c57565b61194c565b3480156106c957600080fd5b506103d36106d8366004614c57565b6119df565b6104906106eb366004614a06565b6119ef565b3480156106fc57600080fd5b506103d361070b366004614c57565b611c71565b34801561071c57600080fd5b506103d361072b366004614c57565b611d69565b34801561073c57600080fd5b50610490611e45565b34801561075157600080fd5b506103d3610760366004614c57565b6000908152601e602052604090205490565b34801561077e57600080fd5b5061045861078d366004614c57565b611f26565b34801561079e57600080fd5b5061042b6107ad366004614c57565b611f9d565b3480156107be57600080fd5b506103d36107cd366004614871565b612013565b3480156107de57600080fd5b5061049061209a565b3480156107f357600080fd5b506104906120d0565b34801561080857600080fd5b506103d3612129565b34801561081d57600080fd5b5061049061082c366004614a06565b61215d565b34801561083d57600080fd5b5061049061084c366004614871565b6121f6565b34801561085d57600080fd5b506103d361086c366004614c57565b601f6020526000908152604090205481565b34801561088a57600080fd5b506103d3601a5481565b3480156108a057600080fd5b50600b546001600160a01b0316610458565b3480156108be57600080fd5b506103d36108cd366004614c57565b612242565b3480156108de57600080fd5b506104906108ed366004614c57565b6122d0565b610490610900366004614c57565b6122ff565b34801561091157600080fd5b50610490610920366004614bb2565b612532565b34801561093157600080fd5b5061042b6125b0565b34801561094657600080fd5b506104906109553660046149ac565b6125bf565b34801561096657600080fd5b5061042b610975366004614c57565b612684565b34801561098657600080fd5b506104906126fa565b34801561099b57600080fd5b5061042b6109aa366004614c57565b6127b5565b3480156109bb57600080fd5b506104906127c0565b3480156109d057600080fd5b506103d36109df366004614c57565b601e6020526000908152604090205481565b3480156109fd57600080fd5b50610490610a0c36600461492c565b61287e565b348015610a1d57600080fd5b5061042b610a2c366004614c57565b6128b6565b348015610a3d57600080fd5b50610490610a4c366004614bb2565b612b75565b610490610a5f366004614a3b565b612bd9565b348015610a7057600080fd5b50610490610a7f366004614c0e565b612f0f565b348015610a9057600080fd5b506103d3610a9f366004614c57565b612f4c565b348015610ab057600080fd5b506103d3612fbf565b348015610ac557600080fd5b506103d361138881565b348015610adb57600080fd5b50610406610aea3660046148b2565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610b2457600080fd5b50610490610b33366004614871565b6130da565b348015610b4457600080fd5b50610490613172565b348015610b5957600080fd5b506103d360195481565b60006001600160e01b0319821663780e9d6360e01b1480610b885750610b8882613277565b92915050565b606060008054610b9d906159b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc9906159b4565b8015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b5050505050905090565b6000610c2b826132c7565b610c915760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610cb882611f26565b9050806001600160a01b0316836001600160a01b03161415610d265760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c88565b336001600160a01b0382161480610d425750610d428133610aea565b610db45760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c88565b610dbe83836132e4565b505050565b600b546001600160a01b03163314610ded5760405162461bcd60e51b8152600401610c8890615730565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60158181548110610e1f57600080fd5b600091825260209091200154905081565b6002600a541415610e535760405162461bcd60e51b8152600401610c889061583b565b6002600a556019544211610e795760405162461bcd60e51b8152600401610c8890615765565b6113888151601654610e8b91906158f0565b10610ea85760405162461bcd60e51b8152600401610c88906157a9565b60005b8151811015610f6c57610ed6828281518110610ec957610ec9615a83565b6020026020010151613352565b610ef25760405162461bcd60e51b8152600401610c88906156ef565b610f14828281518110610f0757610f07615a83565b60200260200101516110dd565b15610f5a5760405162461bcd60e51b815260206004820152601660248201527515985d5b1d081dd85cc8185b1c9958591e481d5cd95960521b6044820152606401610c88565b80610f64816159ef565b915050610eab565b506040516001600160601b03193360601b166020820152600090819060340160405160208183030381529060405280519060200120905060005b601354811015610ffe57610fd88560138381548110610fc757610fc7615a83565b9060005260206000200154846133f4565b15610fec57610fe9816103e861593b565b92505b80610ff6816159ef565b915050610fa6565b5060005b83518110156110d157600061103a600161103487858151811061102757611027615a83565b6020026020010151612242565b8661340a565b905060016011600087858151811061105457611054615a83565b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555060166000815480929190611094906159ef565b9091555050601480549060006110a98361599d565b91905055506110be6110b83390565b82613949565b50806110c9816159ef565b915050611002565b50506001600a55505050565b60008181526011602052604081205460ff1615156001141561110157506001919050565b506000919050565b6060611114826132c7565b6111305760405162461bcd60e51b8152600401610c8890615681565b600d546000838152601f602052604090819020549051631ef2f77160e01b81526060926001600160a01b0316916022918391631ef2f7719161117f918991600401918252602082015260400190565b60206040518083038186803b15801561119757600080fd5b505afa1580156111ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111cf9190614c89565b60ff16815481106111e2576111e2615a83565b9060005260206000200180546111f7906159b4565b80601f0160208091040260200160405190810160405280929190818152602001828054611223906159b4565b80156112705780601f1061124557610100808354040283529160200191611270565b820191906000526020600020905b81548152906001019060200180831161125357829003601f168201915b509398975050505050505050565b6112883382613963565b6112a45760405162461bcd60e51b8152600401610c88906157ea565b610dbe838383613a49565b60606112ba826132c7565b6112d65760405162461bcd60e51b8152600401610c8890615681565b600d546000838152601f602052604090819020549051632311963b60e01b81526060926001600160a01b0316916021918391632311963b9161117f918991600401918252602082015260400190565b600061133083612013565b82106113925760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c88565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b031633146113e55760405162461bcd60e51b8152600401610c8890615730565b80516113f8906025906020840190614693565b5050565b6060611407826132c7565b6114535760405162461bcd60e51b815260206004820152601d60248201527f517565727920666f72206e6f6e2d6578697374656e7420746f6b656e210000006044820152606401610c88565b600d546000838152601f6020526040808220549051632311963b60e01b81526001600160a01b03909316928391632311963b9161149d918891600401918252602082015260400190565b60206040518083038186803b1580156114b557600080fd5b505afa1580156114c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ed9190614c89565b6000858152601f6020526040808220549051631ef2f77160e01b815260048101889052602481019190915260ff929092169250906001600160a01b03841690631ef2f7719060440160206040518083038186803b15801561154d57600080fd5b505afa158015611561573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115859190614c89565b60ff169050611592614717565b6000868152601f60205260409020546115aa906127b5565b6000878152601e60205260409020546115c2906127b5565b6115cb856127b5565b6115d76109aa8a611c71565b6040516020016115ea9493929190614dd9565b60408051808303601f190181529190528152611605826127b5565b6116116109aa88612f4c565b6000888152601f6020526040908190205490516307568f4b60e01b8152600481018a905260248101919091526116ae906001600160a01b038816906307568f4b906044015b60206040518083038186803b15801561166e57600080fd5b505afa158015611682573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a69190614c89565b60ff166127b5565b6000898152601f602052604090819020549051637c9cead360e01b8152600481018b905260248101919091526116f7906001600160a01b03891690637c9cead390604401611656565b6117036109aa8b611d69565b604051602001611717959493929190614e30565b60408051808303601f190181529181526020808401839052835191516000936117439392909101614daa565b6040516020818303038152906040529050806040516020016117659190614d8e565b60405160208183030381529060405295505050505050919050565b600b546001600160a01b031633146117aa5760405162461bcd60e51b8152600401610c8890615730565b601955565b610dbe8383836040518060200160405280600081525061287e565b600b546001600160a01b031633146117f45760405162461bcd60e51b8152600401610c8890615730565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b031633146118405760405162461bcd60e51b8152600401610c8890615730565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b606061186d826132c7565b6118895760405162461bcd60e51b8152600401610c8890615681565b60606020601f600085815260200190815260200160002054815481106118b1576118b1615a83565b9060005260206000200180546118c6906159b4565b80601f01602080910402602001604051908101604052809291908181526020018280546118f2906159b4565b801561193f5780601f106119145761010080835404028352916020019161193f565b820191906000526020600020905b81548152906001019060200180831161192257829003601f168201915b5093979650505050505050565b600061195760085490565b82106119ba5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c88565b600882815481106119cd576119cd615a83565b90600052602060002001549050919050565b60138181548110610e1f57600080fd5b6002600a541415611a125760405162461bcd60e51b8152600401610c889061583b565b6002600a556019544211611a385760405162461bcd60e51b8152600401610c8890615765565b601454601654611a4a9061138861595a565b11611a975760405162461bcd60e51b815260206004820152601f60248201527f4d696e74696e67206f766572207661756c7420686f6c646572206c696d6974006044820152606401610c88565b61138860165410611aba5760405162461bcd60e51b8152600401610c88906156ac565b6017543414611adb5760405162461bcd60e51b8152600401610c889061564a565b33600090815260126020526040902054600111611b325760405162461bcd60e51b8152602060048201526015602482015274165bdd49dd9948185b1c9958591e481b5a5b9d1959605a1b6044820152606401610c88565b6040516001600160601b03193360601b16602082015260009060340160408051601f19818403018152919052805160209091012090506000805b601354811015611c2857611b9e8460138381548110611b8d57611b8d615a83565b9060005260206000200154856133f4565b15611c12576000611bb1826103e861593b565b90506000611bc16000808461340a565b601680549192506000611bd3836159ef565b91905055508060126000611be43390565b6001600160a01b03168152602081019190915260400160002055611c07336110b8565b600093505050611c28565b6001915080611c20816159ef565b915050611b6c565b508015611c675760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610c88565b50506001600a5550565b6000611c7c826132c7565b611c985760405162461bcd60e51b8152600401610c8890615681565b600d546000838152601f602052604080822054905163d913a56760e01b815260048101869052602481019190915290916001600160a01b0316908290829063d913a567906044015b60206040518083038186803b158015611cf857600080fd5b505afa158015611d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d309190614c89565b60ff169050611d4b856000908152601e602052604090205490565b611d55908261593b565b611d609060016158f0565b95945050505050565b6000611d74826132c7565b611d905760405162461bcd60e51b8152600401610c8890615681565b600d546000838152601e6020908152604080832054601f909252808320549051633570d40760e11b815260048101879052602481019190915291926001600160a01b0316918290636ae1a80e9060440160206040518083038186803b158015611df857600080fd5b505afa158015611e0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e309190614c89565b60ff16611e3d91906158f0565b949350505050565b6002600a541415611e685760405162461bcd60e51b8152600401610c889061583b565b6002600a55601c546001600160a01b03163314611eb65760405162461bcd60e51b815260206004820152600c60248201526b04e6f7420436f6465203230360a41b6044820152606401610c88565b601b5462010000900460ff1615611edf5760405162461bcd60e51b8152600401610c8890615872565b601b805462ff00001916620100001790556000611efd81808061340a565b601680549192506000611f0f836159ef565b9190505550611f1e3382613949565b506001600a55565b6000818152600260205260408120546001600160a01b031680610b885760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c88565b6060611fa8826132c7565b611fc45760405162461bcd60e51b8152600401610c8890615681565b600d546000838152601f602052604090819020549051637c9cead360e01b81526060926001600160a01b0316916024918391637c9cead39161117f918991600401918252602082015260400190565b60006001600160a01b03821661207e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c88565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146120c45760405162461bcd60e51b8152600401610c8890615730565b6120ce6000613bf4565b565b600b546001600160a01b031633146120fa5760405162461bcd60e51b8152600401610c8890615730565b60405133904780156108fc02916000818181858888f19350505050158015612126573d6000803e3d6000fd5b50565b600b546000906001600160a01b031633146121565760405162461bcd60e51b8152600401610c8890615730565b5060295490565b600b546001600160a01b031633146121875760405162461bcd60e51b8152600401610c8890615730565b60408051600081526020810191829052516121a49160139161473e565b5060005b81518110156113f85760138282815181106121c5576121c5615a83565b60209081029190910181015182546001810184556000938452919092200155806121ee816159ef565b9150506121a8565b600b546001600160a01b031633146122205760405162461bcd60e51b8152600401610c8890615730565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600d546040516323ae320760e21b81526004810183905260009182916001600160a01b03909116908190638eb8c81c9060240160206040518083038186803b15801561228d57600080fd5b505afa1580156122a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c59190614c89565b60ff16949350505050565b600b546001600160a01b031633146122fa5760405162461bcd60e51b8152600401610c8890615730565b601a55565b6002600a5414156123225760405162461bcd60e51b8152600401610c889061583b565b6002600a55601a5442116123825760405162461bcd60e51b815260206004820152602160248201527f546865207075626c6963206d696e7420646964206e6f742073746172742079656044820152601d60fa1b6064820152608401610c88565b6014546016546123949061138861595a565b116123e15760405162461bcd60e51b815260206004820152601f60248201527f4d696e74696e67206f766572207661756c7420686f6c646572206c696d6974006044820152606401610c88565b611388816016546123f291906158f0565b1061240f5760405162461bcd60e51b8152600401610c88906156ac565b6000811161245f5760405162461bcd60e51b815260206004820152601860248201527f43616e206e6f74206d696e74207a65726f20746f6b656e7300000000000000006044820152606401610c88565b600b81106124af5760405162461bcd60e51b815260206004820152601a60248201527f526571756573742065786365656473206d617820746f6b656e730000000000006044820152606401610c88565b806018546124bd919061593b565b34146124db5760405162461bcd60e51b8152600401610c889061564a565b60015b818110156125295760006124f5600080600061340a565b601680549192506000612507836159ef565b91905055506125166110b83390565b5080612521816159ef565b9150506124de565b50506001600a55565b336001600160a01b037f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795216146125aa5760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c006044820152606401610c88565b60295550565b606060018054610b9d906159b4565b6001600160a01b0382163314156126185760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c88565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b606061268f826132c7565b6126ab5760405162461bcd60e51b8152600401610c8890615681565b600d546000838152601f6020526040908190205490516307568f4b60e01b81526060926001600160a01b03169160239183916307568f4b9161117f918991600401918252602082015260400190565b600b546001600160a01b031633146127245760405162461bcd60e51b8152600401610c8890615730565b6002600a5414156127475760405162461bcd60e51b8152600401610c889061583b565b6002600a55601b5460ff161561276f5760405162461bcd60e51b8152600401610c8890615872565b601b805460ff19166001179055600061278981808061340a565b60168054919250600061279b836159ef565b9190505550611f1e6110b8600b546001600160a01b031690565b6060610b8882613c46565b6002600a5414156127e35760405162461bcd60e51b8152600401610c889061583b565b6002600a55601b5464010000000090046001600160a01b0316331461283a5760405162461bcd60e51b815260206004820152600d60248201526c139bdd08115c9c9bdc880d0c0d609a1b6044820152606401610c88565b601b54610100900460ff16156128625760405162461bcd60e51b8152600401610c8890615872565b601b805461ff0019166101001790556000611efd81808061340a565b6128883383613963565b6128a45760405162461bcd60e51b8152600401610c88906157ea565b6128b084848484613d44565b50505050565b60606128c1826132c7565b61290d5760405162461bcd60e51b815260206004820152601d60248201527f517565727920666f72206e6f6e2d6578697374656e7420746f6b656e210000006044820152606401610c88565b612915614778565b61291e836127b5565b6000848152601e6020526040902054612936906127b5565b6000858152601f6020526040902054602590612951906127b5565b602661295c886113fc565b612965896127b5565b60405160200161297b97969594939291906150d0565b60408051808303601f19018152919052815261299683611862565b6000848152601e60205260409020546129ae906127b5565b6040516020016129bf9291906153d5565b60408051808303601f1901815291905260208201526129dd836112af565b6129e96109aa85611c71565b6040516020016129fa9291906154a9565b60408051808303601f19018152918152820152612a1683611109565b612a226109aa85612f4c565b604051602001612a33929190615033565b60408051808303601f190181529190526060820152612a5183612684565b604051602001612a619190615278565b60408051808303601f190181529190526080820152612a7f83611f9d565b612a8b6109aa85611d69565b604051602001612a9c9291906152f1565b60408051808303601f1901815291905260a08201526026612abc846113fc565b612ac5856127b5565b6026612ad0876113fc565b612ad9886127b5565b604051602001612aee96959493929190614f2d565b60408051808303601f1901815291815260c083018290528251602080850151858401516060870151608088015160a08901519651600098612b4a98612b369897909201614e9b565b604051602081830303815290604052613d77565b905080604051602001612b5d91906154ff565b60405160208183030381529060405292505050919050565b6010546001600160a01b03163314612bc75760405162461bcd60e51b8152602060048201526015602482015274596f752063616e206e6f742063616c6c207468697360581b6044820152606401610c88565b6000918252601e602052604090912055565b6002600a541415612bfc5760405162461bcd60e51b8152600401610c889061583b565b6002600a556019544211612c225760405162461bcd60e51b8152600401610c8890615765565b61138881516016546001612c3691906158f0565b612c4091906158f0565b10612c5d5760405162461bcd60e51b8152600401610c88906157a9565b6017543414612c7e5760405162461bcd60e51b8152600401610c889061564a565b33600090815260126020526040902054600111612cd55760405162461bcd60e51b8152602060048201526015602482015274165bdd49dd9948185b1c9958591e481b5a5b9d1959605a1b6044820152606401610c88565b60005b8151811015612d7f57612cf6828281518110610ec957610ec9615a83565b612d125760405162461bcd60e51b8152600401610c88906156ef565b612d27828281518110610f0757610f07615a83565b15612d6d5760405162461bcd60e51b815260206004820152601660248201527515985d5b1d081dd85cc8185b1c9958591e481d5cd95960521b6044820152606401610c88565b80612d77816159ef565b915050612cd8565b506040516001600160601b03193360601b166020820152600090819060340160405160208183030381529060405280519060200120905060005b601354811015612e0057612dda8560138381548110610fc757610fc7615a83565b15612dee57612deb816103e861593b565b92505b80612df8816159ef565b915050612db9565b5060005b8351811015612eba576000612e29600161103487858151811061102757611027615a83565b9050600160116000878581518110612e4357612e43615a83565b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555060166000815480929190612e83906159ef565b909155505060148054906000612e988361599d565b9190505550612ea76110b83390565b5080612eb2816159ef565b915050612e04565b506000612ec96000808561340a565b601680549192506000612edb836159ef565b91905055508060126000612eec3390565b6001600160a01b031681526020810191909152604001600020556110d1336110b8565b600b546001600160a01b03163314612f395760405162461bcd60e51b8152600401610c8890615730565b80516113f8906026906020840190614693565b6000612f57826132c7565b612f735760405162461bcd60e51b8152600401610c8890615681565b600d546000838152601f60205260408082205490516349ec3c7160e11b815260048101869052602481019190915290916001600160a01b031690829082906393d878e290604401611ce0565b600b546000906001600160a01b03163314612fec5760405162461bcd60e51b8152600401610c8890615730565b6028546040516370a0823160e01b81523060048201527f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca6001600160a01b0316906370a082319060240160206040518083038186803b15801561304e57600080fd5b505afa158015613062573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130869190614c70565b10156130c75760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f756768204c494e4b2160801b6044820152606401610c88565b6130d5602754602854613edd565b905090565b600b546001600160a01b031633146131045760405162461bcd60e51b8152600401610c8890615730565b6001600160a01b0381166131695760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c88565b61212681613bf4565b6002600a5414156131955760405162461bcd60e51b8152600401610c889061583b565b6002600a55601d546001600160a01b031633146131eb5760405162461bcd60e51b8152602060048201526014602482015273139bdd0811da5d99585dd85e5cc81dd85b1b195d60621b6044820152606401610c88565b601b546301000000900460ff16156132155760405162461bcd60e51b8152600401610c8890615872565b601b805463ff0000001916630100000017905560005b600f811015611f1e576000613243600080600061340a565b601680549192506000613255836159ef565b91905055506132643382613949565b508061326f816159ef565b91505061322b565b60006001600160e01b031982166380ac58cd60e01b14806132a857506001600160e01b03198216635b5e139f60e01b145b80610b8857506301ffc9a760e01b6001600160e01b0319831614610b88565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061331982611f26565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600f546040516331a9108f60e11b8152600481018390526000916001600160a01b03169033908290636352211e9060240160206040518083038186803b15801561339b57600080fd5b505afa1580156133af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133d39190614895565b6001600160a01b031614156133eb5750600192915050565b50600092915050565b6000826134018584614068565b14949350505050565b60006029546000141561346b5760405162461bcd60e51b815260206004820152602360248201527f5652462052616e646f6d20526573756c7420686173206e6f74206265656e207360448201526265742160e81b6064820152608401610c88565b600060165461138861347d919061595a565b9050600081156134975761349260018361595a565b61349a565b60005b6029546113b25460405192935060009285926134c992909163ffffffff90911690339044904290602001615544565b6040516020818303038152906040528051906020012060001c6134ec9190615a0a565b90506000602a82611388811061350457613504615a83565b01546135105781613527565b602a82611388811061352457613524615a83565b01545b9050602a83611388811061353d5761353d615a83565b01541561355f57602a83611388811061355857613558615a83565b0154613561565b825b602a83611388811061357557613575615a83565b01556029546113b254604051600092600a926135a29263ffffffff90911690339044904290602001615544565b6040516020818303038152906040528051906020012060001c6135c59190615a1e565b6113b2805491925082916000906135e390849063ffffffff16615908565b825463ffffffff9182166101009390930a928302919092021990911617905550600e546040516375cf69f960e01b81528a15156004820152602481018a9052604481018990526001600160a01b039091169060009082906375cf69f99060640160006040518083038186803b15801561365b57600080fd5b505afa15801561366f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526136979190810190614afd565b60408051600580825260c0820190925291925060009182916020820160a08036833701905050905060005b8351811015613722578381815181106136dd576136dd615a83565b6020026020010151836136f091906158f0565b92508282828151811061370557613705615a83565b60209081029190910101528061371a816159ef565b9150506136c2565b506029546113b254604051600092859261374d9263ffffffff90911690339044904290602001615544565b6040516020818303038152906040528051906020012060001c6137709190615a0a565b905060008260008151811061378757613787615a83565b602002602001015182101580156137b75750826001815181106137ac576137ac615a83565b602002602001015182105b156137c0575060015b826001815181106137d3576137d3615a83565b602002602001015182101580156138035750826002815181106137f8576137f8615a83565b602002602001015182105b1561380c575060025b8260028151811061381f5761381f615a83565b6020026020010151821015801561384f57508260038151811061384457613844615a83565b602002602001015182105b15613858575060035b8260038151811061386b5761386b615a83565b6020026020010151821015801561389c57508260048151811061389057613890615a83565b60200260200101518211155b156138a5575060045b6000601582815481106138ba576138ba615a83565b9060005260206000200154111561391d57601581815481106138de576138de615a83565b600091825260208220018054916138f48361599d565b90915550506000888152601f60209081526040808320849055601e909152902060019055613936565b61392681614114565b6000898152601f60205260409020555b50959d9c50505050505050505050505050565b6113f882826040518060200160405280600081525061412e565b600061396e826132c7565b6139cf5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c88565b60006139da83611f26565b9050806001600160a01b0316846001600160a01b03161480613a155750836001600160a01b0316613a0a84610c20565b6001600160a01b0316145b80611e3d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611e3d565b826001600160a01b0316613a5c82611f26565b6001600160a01b031614613ac45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610c88565b6001600160a01b038216613b265760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c88565b613b31838383614161565b613b3c6000826132e4565b6001600160a01b0383166000908152600360205260408120805460019290613b6590849061595a565b90915550506001600160a01b0382166000908152600360205260408120805460019290613b939084906158f0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606081613c6a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613c945780613c7e816159ef565b9150613c8d9050600a83615927565b9150613c6e565b60008167ffffffffffffffff811115613caf57613caf615a99565b6040519080825280601f01601f191660200182016040528015613cd9576020820181803683370190505b5090505b8415611e3d57613cee60018361595a565b9150613cfb600a86615a0a565b613d069060306158f0565b60f81b818381518110613d1b57613d1b615a83565b60200101906001600160f81b031916908160001a905350613d3d600a86615927565b9450613cdd565b613d4f848484613a49565b613d5b84848484614219565b6128b05760405162461bcd60e51b8152600401610c88906155f8565b805160609080613d97575050604080516020810190915260008152919050565b60006003613da68360026158f0565b613db09190615927565b613dbb90600461593b565b90506000613dca8260206158f0565b67ffffffffffffffff811115613de257613de2615a99565b6040519080825280601f01601f191660200182016040528015613e0c576020820181803683370190505b5090506000604051806060016040528060408152602001615ae9604091399050600181016020830160005b86811015613e98576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101613e37565b506003860660018114613eb25760028114613ec357613ecf565b613d3d60f01b600119830152613ecf565b603d60f81b6000198301525b505050918152949350505050565b60007f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca6001600160a01b0316634000aea07f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795284866000604051602001613f4d929190918252602082015260400190565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401613f7a939291906155be565b602060405180830381600087803b158015613f9457600080fd5b505af1158015613fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fcc9190614b95565b506000838152600c6020818152604080842054815180840189905280830186905230606082015260808082018390528351808303909101815260a0909101909252815191830191909120938790529190526140289060016158f0565b6000858152600c6020526040902055611e3d8482604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b600081815b845181101561410c57600085828151811061408a5761408a615a83565b602002602001015190508083116140cc5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506140f9565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080614104816159ef565b91505061406d565b509392505050565b6000811561412557610b8882614326565b610b8882614375565b61413883836143c4565b6141456000848484614219565b610dbe5760405162461bcd60e51b8152600401610c88906155f8565b6001600160a01b0383166141bc576141b781600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6141df565b816001600160a01b0316836001600160a01b0316146141df576141df8382614503565b6001600160a01b0382166141f657610dbe816145a0565b826001600160a01b0316826001600160a01b031614610dbe57610dbe828261464f565b60006001600160a01b0384163b1561431b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061425d903390899088908890600401615581565b602060405180830381600087803b15801561427757600080fd5b505af19250505080156142a7575060408051601f3d908101601f191682019092526142a491810190614bf1565b60015b614301573d8080156142d5576040519150601f19603f3d011682016040523d82523d6000602084013e6142da565b606091505b5080516142f95760405162461bcd60e51b8152600401610c88906155f8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e3d565b506001949350505050565b600080601561433660018561595a565b8154811061434657614346615a83565b9060005260206000200154111561436257610b8860018361595a565b610b8861437060018461595a565b614326565b60008060156143858460016158f0565b8154811061439557614395615a83565b906000526020600020015411156143b157610b888260016158f0565b610b886143bf8360016158f0565b614375565b6001600160a01b03821661441a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c88565b614423816132c7565b156144705760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c88565b61447c60008383614161565b6001600160a01b03821660009081526003602052604081208054600192906144a59084906158f0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161451084612013565b61451a919061595a565b60008381526007602052604090205490915080821461456d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906145b29060019061595a565b600083815260096020526040812054600880549394509092849081106145da576145da615a83565b9060005260206000200154905080600883815481106145fb576145fb615a83565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061463357614633615a6d565b6001900381819060005260206000200160009055905550505050565b600061465a83612013565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461469f906159b4565b90600052602060002090601f0160209004810192826146c15760008555614707565b82601f106146da57805160ff1916838001178555614707565b82800160010185558215614707579182015b828111156147075782518255916020019190600101906146ec565b50614713929150614792565b5090565b60405180604001604052806002905b60608152602001906001900390816147265790505090565b82805482825590600052602060002090810192821561470757916020028201828111156147075782518255916020019190600101906146ec565b6040805160e0810190915260608152600660208201614726565b5b808211156147135760008155600101614793565b600067ffffffffffffffff8311156147c1576147c1615a99565b6147d4601f8401601f191660200161589b565b90508281528383830111156147e857600080fd5b828260208301376000602084830101529392505050565b600082601f83011261481057600080fd5b81356020614825614820836158cc565b61589b565b80838252828201915082860187848660051b890101111561484557600080fd5b60005b8581101561486457813584529284019290840190600101614848565b5090979650505050505050565b60006020828403121561488357600080fd5b813561488e81615aaf565b9392505050565b6000602082840312156148a757600080fd5b815161488e81615aaf565b600080604083850312156148c557600080fd5b82356148d081615aaf565b915060208301356148e081615aaf565b809150509250929050565b60008060006060848603121561490057600080fd5b833561490b81615aaf565b9250602084013561491b81615aaf565b929592945050506040919091013590565b6000806000806080858703121561494257600080fd5b843561494d81615aaf565b9350602085013561495d81615aaf565b925060408501359150606085013567ffffffffffffffff81111561498057600080fd5b8501601f8101871361499157600080fd5b6149a0878235602084016147a7565b91505092959194509250565b600080604083850312156149bf57600080fd5b82356149ca81615aaf565b915060208301356148e081615ac4565b600080604083850312156149ed57600080fd5b82356149f881615aaf565b946020939093013593505050565b600060208284031215614a1857600080fd5b813567ffffffffffffffff811115614a2f57600080fd5b611e3d848285016147ff565b60008060408385031215614a4e57600080fd5b823567ffffffffffffffff80821115614a6657600080fd5b614a72868387016147ff565b9350602091508185013581811115614a8957600080fd5b85019050601f81018613614a9c57600080fd5b8035614aaa614820826158cc565b80828252848201915084840189868560051b8701011115614aca57600080fd5b600094505b83851015614aed578035835260019490940193918501918501614acf565b5080955050505050509250929050565b60006020808385031215614b1057600080fd5b825167ffffffffffffffff811115614b2757600080fd5b8301601f81018513614b3857600080fd5b8051614b46614820826158cc565b80828252848201915084840188868560051b8701011115614b6657600080fd5b600094505b83851015614b89578051835260019490940193918501918501614b6b565b50979650505050505050565b600060208284031215614ba757600080fd5b815161488e81615ac4565b60008060408385031215614bc557600080fd5b50508035926020909101359150565b600060208284031215614be657600080fd5b813561488e81615ad2565b600060208284031215614c0357600080fd5b815161488e81615ad2565b600060208284031215614c2057600080fd5b813567ffffffffffffffff811115614c3757600080fd5b8201601f81018413614c4857600080fd5b611e3d848235602084016147a7565b600060208284031215614c6957600080fd5b5035919050565b600060208284031215614c8257600080fd5b5051919050565b600060208284031215614c9b57600080fd5b815160ff8116811461488e57600080fd5b60008151808452614cc4816020860160208601615971565b601f01601f19169290920160200192915050565b60008151614cea818560208601615971565b9290920192915050565b8054600090600181811c9080831680614d0e57607f831692505b6020808410821415614d3057634e487b7160e01b600052602260045260246000fd5b818015614d445760018114614d5557614d82565b60ff19861689528489019650614d82565b60008881526020902060005b86811015614d7a5781548b820152908501908301614d61565b505084890196505b50505050505092915050565b60008251614da0818460208701615971565b9190910192915050565b60008351614dbc818460208801615971565b835190830190614dd0818360208801615971565b01949350505050565b60008551614deb818460208a01615971565b855190830190614dff818360208a01615971565b8551910190614e12818360208901615971565b8451910190614e25818360208801615971565b019695505050505050565b60008651614e42818460208b01615971565b865190830190614e56818360208b01615971565b8651910190614e69818360208a01615971565b8551910190614e7c818360208901615971565b8451910190614e8f818360208801615971565b01979650505050505050565b600088516020614eae8285838e01615971565b895191840191614ec18184848e01615971565b8951920191614ed38184848d01615971565b8851920191614ee58184848c01615971565b8751920191614ef78184848b01615971565b8651920191614f098184848a01615971565b8551920191614f1b8184848901615971565b919091019a9950505050505050505050565b61174b60f21b8152711130b734b6b0ba34b7b72fbab936111d101160711b60028201526000614f5f6014830189614cf4565b643f646e613d60d81b8082528851614f7e816005850160208d01615971565b632669643d60e01b600593909101928301528751614fa3816009850160208c01615971565b61088b60f21b600993909101928301526e1134b33930b6b2afbab936111d101160891b600b830152614fd8601a830188614cf4565b908152905061502661501961500c615006614ff6600586018a614cd8565b632669643d60e01b815260040190565b87614cd8565b601160f91b815260010190565b607d60f81b815260010190565b9998505050505050505050565b607b60f81b81527f2274726169745f74797065223a202255706772616465202332222c0000000000600182015269113b30b63ab2911d101160b11b601c8201528251600090615089816026850160208801615971565b61202b60f01b60269184019182015283516150ab816028840160208801615971565b601160f91b60289290910191820152611f4b60f21b6029820152602b01949350505050565b607b60f81b81527f226e616d65223a20224379626572205570677261646520230000000000000000600182015260008851615112816019850160208d01615971565b68010142632bb32b61d160bd1b601991840191820152885161513b816022840160208d01615971565b620a488b60ea1b60229290910191820152691134b6b0b3b2911d101160b11b602582015261516c602f820189614cf4565b9050865161517e818360208b01615971565b61526961524e6151ff6151f16151eb614ff66151e56151d46151ce6151b18a8c01650b9a9c19c88b60d21b815260060190565b701132bc3a32b93730b62fbab936111d101160791b815260110190565b8f614cf4565b643f646e613d60d81b815260050190565b8c614cd8565b89614cd8565b61088b60f21b815260020190565b7f226465736372697074696f6e223a202255706772616465732077616974696e6781527f20746f20626520636f6e6e656374656420746f20706c61796572732e222c00006020820152603e0190565b6e2261747472696275746573223a205b60881b8152600f0190565b9b9a5050505050505050505050565b607b60f81b81527f2274726169745f74797065223a20224175676d656e746174696f6e202331222c600182015269113b30b63ab2911d101160b11b602182015281516000906152ce81602b850160208701615971565b601160f91b602b939091019283015250611f4b60f21b602c820152602e01919050565b6000607b60f81b8083527f2274726169745f74797065223a20224175676d656e746174696f6e202332222c600184015269113b30b63ab2911d101160b11b6021840152845161534781602b860160208901615971565b601160f91b602b918501918201819052611f4b60f21b602c830152602e8201929092527f2274726169745f74797065223a202241697264726f7073222c00000000000000602f8201526a044ecc2d8eaca44744044f60ab1b60488201528451916153b8836053840160208901615971565b91016053810191909152607d60f81b605482015260558101611d60565b6000607b60f81b8083527f2274726169745f74797065223a2022526172697479222c000000000000000000600184015269113b30b63ab2911d101160b11b806018850152855161542c816022870160208a01615971565b601160f91b6022918601918201819052611f4b60f21b60238301819052602583019490945275089d1c985a5d17dd1e5c19488e880893195d995b088b60521b6026830152603c820183905286519361548b856046850160208b01615971565b60469290940191820152604781019290925250604901949350505050565b607b60f81b81527f2274726169745f74797065223a202255706772616465202331222c0000000000600182015269113b30b63ab2911d101160b11b601c8201528251600090615089816026850160208801615971565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161553781601d850160208701615971565b91909101601d0192915050565b94855260e09390931b6001600160e01b031916602085015260609190911b6001600160601b03191660248401526038830152605882015260780190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906155b490830184614cac565b9695505050505050565b60018060a01b0384168152826020820152606060408201526000611d606060830184614cac565b60208152600061488e6020830184614cac565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526019908201527f496e636f7272656374206d696e7420636f73742076616c756500000000000000604082015260600190565b6020808252601190820152702737b732bc34b9ba32b73a103a37b5b2b760791b604082015260600190565b60208082526023908201527f416c6c20746f6b656e732068617665206265656e20616c7265616479206d696e6040820152621d195960ea1b606082015260800190565b60208082526021908201527f5661756c74206f776e6572736869702076616c69646174696f6e206661696c656040820152601960fa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f5468652077686974656c697374206d696e7420646964206e6f74207374617274604082015263081e595d60e21b606082015260800190565b60208082526021908201527f4d696e74696e67206f76657220746865206d617820746f6b656e73206c696d696040820152601d60fa1b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600f908201526e416c7265616479206d696e7465642160881b604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156158c4576158c4615a99565b604052919050565b600067ffffffffffffffff8211156158e6576158e6615a99565b5060051b60200190565b6000821982111561590357615903615a41565b500190565b600063ffffffff808316818516808303821115614dd057614dd0615a41565b60008261593657615936615a57565b500490565b600081600019048311821515161561595557615955615a41565b500290565b60008282101561596c5761596c615a41565b500390565b60005b8381101561598c578181015183820152602001615974565b838111156128b05750506000910152565b6000816159ac576159ac615a41565b506000190190565b600181811c908216806159c857607f821691505b602082108114156159e957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615a0357615a03615a41565b5060010190565b600082615a1957615a19615a57565b500690565b600063ffffffff80841680615a3557615a35615a57565b92169190910692915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461212657600080fd5b801515811461212657600080fd5b6001600160e01b03198116811461212657600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220c226395b10bafba145ba7816ae597a33a7683d2fa0977284e951d49a758f3a7e64736f6c63430008070033

Deployed Bytecode Sourcemap

62941:25062:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63457:37;;;;;;;;;;;;;;;;;;;32226:25:1;;;32214:2;32199:18;63457:37:0;;;;;;;;53900:224;;;;;;;;;;-1:-1:-1;53900:224:0;;;;;:::i;:::-;;:::i;:::-;;;31719:14:1;;31712:22;31694:41;;31682:2;31667:18;53900:224:0;31554:187:1;41052:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42581:221::-;;;;;;;;;;-1:-1:-1;42581:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;30627:32:1;;;30609:51;;30597:2;30582:18;42581:221:0;30463:203:1;42104:411:0;;;;;;;;;;-1:-1:-1;42104:411:0;;;;;:::i;:::-;;:::i;:::-;;64939:126;;;;;;;;;;-1:-1:-1;64939:126:0;;;;;:::i;:::-;;:::i;63503:22::-;;;;;;;;;;-1:-1:-1;63503:22:0;;;;;:::i;:::-;;:::i;77020:1212::-;;;;;;;;;;-1:-1:-1;77020:1212:0;;;;;:::i;:::-;;:::i;54540:113::-;;;;;;;;;;-1:-1:-1;54628:10:0;:17;54540:113;;80340:176;;;;;;;;;;-1:-1:-1;80340:176:0;;;;;:::i;:::-;;:::i;66972:349::-;;;;;;;;;;-1:-1:-1;66972:349:0;;;;;:::i;:::-;;:::i;43471:339::-;;;;;;;;;;-1:-1:-1;43471:339:0;;;;;:::i;:::-;;:::i;65832:346::-;;;;;;;;;;-1:-1:-1;65832:346:0;;;;;:::i;:::-;;:::i;63577:21::-;;;;;;;;;;;;;;;;54208:256;;;;;;;;;;-1:-1:-1;54208:256:0;;;;;:::i;:::-;;:::i;69781:102::-;;;;;;;;;;-1:-1:-1;69781:102:0;;;;;:::i;:::-;;:::i;73160:1312::-;;;;;;;;;;-1:-1:-1;73160:1312:0;;;;;:::i;:::-;;:::i;64577:117::-;;;;;;;;;;-1:-1:-1;64577:117:0;;;;;:::i;:::-;;:::i;43881:185::-;;;;;;;;;;-1:-1:-1;43881:185:0;;;;;:::i;:::-;;:::i;64424:145::-;;;;;;;;;;-1:-1:-1;64424:145:0;;;;;:::i;:::-;;:::i;64819:112::-;;;;;;;;;;-1:-1:-1;64819:112:0;;;;;:::i;:::-;;:::i;65212:251::-;;;;;;;;;;-1:-1:-1;65212:251:0;;;;;:::i;:::-;;:::i;54730:233::-;;;;;;;;;;-1:-1:-1;54730:233:0;;;;;:::i;:::-;;:::i;63378:27::-;;;;;;;;;;-1:-1:-1;63378:27:0;;;;;:::i;:::-;;:::i;74773:1459::-;;;;;;:::i;:::-;;:::i;66186:402::-;;;;;;;;;;-1:-1:-1;66186:402:0;;;;;:::i;:::-;;:::i;69377:339::-;;;;;;;;;;-1:-1:-1;69377:339:0;;;;;:::i;:::-;;:::i;81344:303::-;;;;;;;;;;;;;:::i;74480:107::-;;;;;;;;;;-1:-1:-1;74480:107:0;;;;;:::i;:::-;74540:4;74564:15;;;:6;:15;;;;;;;74480:107;40746:239;;;;;;;;;;-1:-1:-1;40746:239:0;;;;;:::i;:::-;;:::i;69011:358::-;;;;;;;;;;-1:-1:-1;69011:358:0;;;;;:::i;:::-;;:::i;40476:208::-;;;;;;;;;;-1:-1:-1;40476:208:0;;;;;:::i;:::-;;:::i;25498:94::-;;;;;;;;;;;;;:::i;87885:113::-;;;;;;;;;;;;;:::i;83516:102::-;;;;;;;;;;;;;:::i;64055:228::-;;;;;;;;;;-1:-1:-1;64055:228:0;;;;;:::i;:::-;;:::i;64291:125::-;;;;;;;;;;-1:-1:-1;64291:125:0;;;;;:::i;:::-;;:::i;63990:35::-;;;;;;;;;;-1:-1:-1;63990:35:0;;;;;:::i;:::-;;;;;;;;;;;;;;63714:27;;;;;;;;;;;;;;;;24847:87;;;;;;;;;;-1:-1:-1;24920:6:0;;-1:-1:-1;;;;;24920:6:0;24847:87;;80525:240;;;;;;;;;;-1:-1:-1;80525:240:0;;;;;:::i;:::-;;:::i;64703:111::-;;;;;;;;;;-1:-1:-1;64703:111:0;;;;;:::i;:::-;;:::i;76240:772::-;;;;;;:::i;:::-;;:::i;15512:210::-;;;;;;;;;;-1:-1:-1;15512:210:0;;;;;:::i;:::-;;:::i;41221:104::-;;;;;;;;;;;;;:::i;42874:295::-;;;;;;;;;;-1:-1:-1;42874:295:0;;;;;:::i;:::-;;:::i;68187:355::-;;;;;;;;;;-1:-1:-1;68187:355:0;;;;;:::i;:::-;;:::i;80770:255::-;;;;;;;;;;;;;:::i;73029:105::-;;;;;;;;;;-1:-1:-1;73029:105:0;;;;;:::i;:::-;;:::i;81030:308::-;;;;;;;;;;;;;:::i;63928:35::-;;;;;;;;;;-1:-1:-1;63928:35:0;;;;;:::i;:::-;;;;;;;;;;;;;;44137:328;;;;;;;;;;-1:-1:-1;44137:328:0;;;;;:::i;:::-;;:::i;70051:2956::-;;;;;;;;;;-1:-1:-1;70051:2956:0;;;;;:::i;:::-;;:::i;74595:173::-;;;;;;;;;;-1:-1:-1;74595:173:0;;;;;:::i;:::-;;:::i;78244:1624::-;;;;;;:::i;:::-;;:::i;69946:100::-;;;;;;;;;;-1:-1:-1;69946:100:0;;;;;:::i;:::-;;:::i;67329:406::-;;;;;;;;;;-1:-1:-1;67329:406:0;;;;;:::i;:::-;;:::i;83174:205::-;;;;;;;;;;;;;:::i;63411:37::-;;;;;;;;;;;;63444:4;63411:37;;43240:164;;;;;;;;;;-1:-1:-1;43240:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;43361:25:0;;;43337:4;43361:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;43240:164;25747:192;;;;;;;;;;-1:-1:-1;25747:192:0;;;;;:::i;:::-;;:::i;81653:393::-;;;;;;;;;;;;;:::i;63677:30::-;;;;;;;;;;;;;;;;53900:224;54002:4;-1:-1:-1;;;;;;54026:50:0;;-1:-1:-1;;;54026:50:0;;:90;;;54080:36;54104:11;54080:23;:36::i;:::-;54019:97;53900:224;-1:-1:-1;;53900:224:0:o;41052:100::-;41106:13;41139:5;41132:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41052:100;:::o;42581:221::-;42657:7;42685:16;42693:7;42685;:16::i;:::-;42677:73;;;;-1:-1:-1;;;42677:73:0;;42843:2:1;42677:73:0;;;42825:21:1;42882:2;42862:18;;;42855:30;42921:34;42901:18;;;42894:62;-1:-1:-1;;;42972:18:1;;;42965:42;43024:19;;42677:73:0;;;;;;;;;-1:-1:-1;42770:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;42770:24:0;;42581:221::o;42104:411::-;42185:13;42201:23;42216:7;42201:14;:23::i;:::-;42185:39;;42249:5;-1:-1:-1;;;;;42243:11:0;:2;-1:-1:-1;;;;;42243:11:0;;;42235:57;;;;-1:-1:-1;;;42235:57:0;;45152:2:1;42235:57:0;;;45134:21:1;45191:2;45171:18;;;45164:30;45230:34;45210:18;;;45203:62;-1:-1:-1;;;45281:18:1;;;45274:31;45322:19;;42235:57:0;44950:397:1;42235:57:0;23801:10;-1:-1:-1;;;;;42327:21:0;;;;:62;;-1:-1:-1;42352:37:0;42369:5;23801:10;43240:164;:::i;42352:37::-;42305:168;;;;-1:-1:-1;;;42305:168:0;;38329:2:1;42305:168:0;;;38311:21:1;38368:2;38348:18;;;38341:30;38407:34;38387:18;;;38380:62;38478:26;38458:18;;;38451:54;38522:19;;42305:168:0;38127:420:1;42305:168:0;42486:21;42495:2;42499:7;42486:8;:21::i;:::-;42174:341;42104:411;;:::o;64939:126::-;24920:6;;-1:-1:-1;;;;;24920:6:0;23801:10;25067:23;25059:68;;;;-1:-1:-1;;;25059:68:0;;;;;;;:::i;:::-;65023:15:::1;:34:::0;;-1:-1:-1;;;;;;65023:34:0::1;-1:-1:-1::0;;;;;65023:34:0;;;::::1;::::0;;;::::1;::::0;;64939:126::o;63503:22::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63503:22:0;:::o;77020:1212::-;27780:1;28376:7;;:19;;28368:63;;;;-1:-1:-1;;;28368:63:0;;;;;;;:::i;:::-;27780:1;28509:7;:18;77133::::1;::::0;77154:15:::1;-1:-1:-1::0;77125:85:0::1;;;;-1:-1:-1::0;;;77125:85:0::1;;;;;;;:::i;:::-;63444:4;77237:8;:15;77229:5;;:23;;;;:::i;:::-;:35;77221:81;;;;-1:-1:-1::0;;;77221:81:0::1;;;;;;;:::i;:::-;77320:6;77315:227;77334:8;:15;77330:1;:19;77315:227;;;77379:35;77402:8;77411:1;77402:11;;;;;;;;:::i;:::-;;;;;;;77379:22;:35::i;:::-;77371:81;;;;-1:-1:-1::0;;;77371:81:0::1;;;;;;;:::i;:::-;77476:27;77491:8;77500:1;77491:11;;;;;;;;:::i;:::-;;;;;;;77476:14;:27::i;:::-;77475:28;77467:63;;;::::0;-1:-1:-1;;;77467:63:0;;47838:2:1;77467:63:0::1;::::0;::::1;47820:21:1::0;47877:2;47857:18;;;47850:30;-1:-1:-1;;;47896:18:1;;;47889:52;47958:18;;77467:63:0::1;47636:346:1::0;77467:63:0::1;77351:3:::0;::::1;::::0;::::1;:::i;:::-;;;;77315:227;;;-1:-1:-1::0;77648:28:0::1;::::0;-1:-1:-1;;;;;;77665:10:0::1;11680:2:1::0;11676:15;11672:53;77648:28:0::1;::::0;::::1;11660:66:1::0;77554:15:0::1;::::0;;;11742:12:1;;77648:28:0::1;;;;;;;;;;;;77638:39;;;;;;77623:54;;77695:6;77690:186;77709:10;:17:::0;77705:21;::::1;77690:186;;;77754:46;77773:5;77780:10;77791:1;77780:13;;;;;;;;:::i;:::-;;;;;;;;;77795:4;77754:18;:46::i;:::-;77750:113;;;77837:8;:1:::0;77841:4:::1;77837:8;:::i;:::-;77824:21;;77750:113;77728:3:::0;::::1;::::0;::::1;:::i;:::-;;;;77690:186;;;;77893:6;77888:335;77907:8;:15;77903:1;:19;77888:335;;;77979:12;77994:64;78012:4;78018:27;78033:8;78042:1;78033:11;;;;;;;;:::i;:::-;;;;;;;78018:14;:27::i;:::-;78047:10;77994:17;:64::i;:::-;77979:79;;78100:4;78073:11;:24;78085:8;78094:1;78085:11;;;;;;;;:::i;:::-;;;;;;;78073:24;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;78121:5;;:7;;;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;78143:19:0::1;:21:::0;;;:19:::1;:21;::::0;::::1;:::i;:::-;;;;;;78179:32;78189:12;23801:10:::0;;23721:98;78189:12:::1;78203:7;78179:9;:32::i;:::-;-1:-1:-1::0;77924:3:0;::::1;::::0;::::1;:::i;:::-;;;;77888:335;;;-1:-1:-1::0;;27736:1:0;28688:7;:22;-1:-1:-1;;;77020:1212:0:o;80340:176::-;80396:4;80417:21;;;:11;:21;;;;;;;;:29;;:21;:29;80413:73;;;-1:-1:-1;80470:4:0;;80340:176;-1:-1:-1;80340:176:0:o;80413:73::-;-1:-1:-1;80503:5:0;;80340:176;-1:-1:-1;80340:176:0:o;66972:349::-;67033:13;67067:16;67075:7;67067;:16::i;:::-;67059:46;;;;-1:-1:-1;;;67059:46:0;;;;;;;:::i;:::-;67185:12;;67149:22;67268:15;;;:6;:15;;;;;;;;67233:51;;-1:-1:-1;;;67233:51:0;;67120:20;;-1:-1:-1;;;;;67185:12:0;;67222:10;;67185:12;;67233:25;;:51;;67259:7;;67233:51;;32436:25:1;;;32492:2;32477:18;;32470:34;32424:2;32409:18;;32262:248;67233:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67222:63;;;;;;;;;;:::i;:::-;;;;;;;;67213:72;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67213:72:0;;66972:349;-1:-1:-1;;;;;;;;66972:349:0:o;43471:339::-;43666:41;23801:10;43699:7;43666:18;:41::i;:::-;43658:103;;;;-1:-1:-1;;;43658:103:0;;;;;;;:::i;:::-;43774:28;43784:4;43790:2;43794:7;43774:9;:28::i;65832:346::-;65892:13;65926:16;65934:7;65926;:16::i;:::-;65918:46;;;;-1:-1:-1;;;65918:46:0;;;;;;;:::i;:::-;66044:12;;66008:22;66125:15;;;:6;:15;;;;;;;;66091:50;;-1:-1:-1;;;66091:50:0;;65979:20;;-1:-1:-1;;;;;66044:12:0;;66081:9;;66044:12;;66091:24;;:50;;66116:7;;66091:50;;32436:25:1;;;32492:2;32477:18;;32470:34;32424:2;32409:18;;32262:248;54208:256:0;54305:7;54341:23;54358:5;54341:16;:23::i;:::-;54333:5;:31;54325:87;;;;-1:-1:-1;;;54325:87:0;;34465:2:1;54325:87:0;;;34447:21:1;34504:2;34484:18;;;34477:30;34543:34;34523:18;;;34516:62;-1:-1:-1;;;34594:18:1;;;34587:41;34645:19;;54325:87:0;34263:407:1;54325:87:0;-1:-1:-1;;;;;;54430:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;54208:256::o;69781:102::-;24920:6;;-1:-1:-1;;;;;24920:6:0;23801:10;25067:23;25059:68;;;;-1:-1:-1;;;25059:68:0;;;;;;;:::i;:::-;69856:19;;::::1;::::0;:12:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;;69781:102:::0;:::o;73160:1312::-;73214:13;73248:16;73256:7;73248;:16::i;:::-;73240:58;;;;-1:-1:-1;;;73240:58:0;;42130:2:1;73240:58:0;;;42112:21:1;42169:2;42149:18;;;42142:30;42208:31;42188:18;;;42181:59;42257:18;;73240:58:0;41928:353:1;73240:58:0;73347:12;;73311:22;73458:15;;;:6;:15;;;;;;;73424:50;;-1:-1:-1;;;73424:50:0;;-1:-1:-1;;;;;73347:12:0;;;;;;73424:24;;:50;;73449:7;;73424:50;;32436:25:1;;;32492:2;32477:18;;32470:34;32424:2;32409:18;;32262:248;73424:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73516:20;73574:15;;;:6;:15;;;;;;;73539:51;;-1:-1:-1;;;73539:51:0;;;;;32436:25:1;;;32477:18;;;32470:34;;;;73402:72:0;;;;;;-1:-1:-1;73516:20:0;-1:-1:-1;;;;;73539:25:0;;;;;32409:18:1;;73539:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73516:74;;;;73603:20;;:::i;:::-;73703:15;;;;:6;:15;;;;;;73701:18;;:1;:18::i;:::-;73740:15;;;;:6;:15;;;;;;73738:18;;:1;:18::i;:::-;73775:17;73777:14;73775:1;:17::i;:::-;73811:29;73813:26;73831:7;73813:17;:26::i;73811:29::-;73666:189;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;73666:189:0;;;;;;73636:230;;73943:18;73945:15;73943:1;:18::i;:::-;73980:30;73982:27;74001:7;73982:18;:27::i;73980:30::-;74068:15;;;;:6;:15;;;;;;;;74031:53;;-1:-1:-1;;;74031:53:0;;;;;32436:25:1;;;32477:18;;;32470:34;;;;74029:56:0;;-1:-1:-1;;;;;74031:27:0;;;;;32409:18:1;;74031:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74029:56;;:1;:56::i;:::-;74144:15;;;;:6;:15;;;;;;;;74106:54;;-1:-1:-1;;;74106:54:0;;;;;32436:25:1;;;32477:18;;;32470:34;;;;74104:57:0;;-1:-1:-1;;;;;74106:28:0;;;;;32409:18:1;;74106:54:0;32262:248:1;74104:57:0;74180:23;74182:20;74194:7;74182:11;:20::i;74180:23::-;73908:310;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;73908:310:0;;;;;;73887:6;;;;:336;;;74331:6;;74288:105;;74236:20;;74288:105;;74331:6;73908:310;;74288:105;;:::i;:::-;;;;;;;;;;;;;74236:176;;74456:6;74439:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;74425:39;;;;;;;73160:1312;;;:::o;64577:117::-;24920:6;;-1:-1:-1;;;;;24920:6:0;23801:10;25067:23;25059:68;;;;-1:-1:-1;;;25059:68:0;;;;;;;:::i;:::-;64655:18:::1;:31:::0;64577:117::o;43881:185::-;44019:39;44036:4;44042:2;44046:7;44019:39;;;;;;;;;;;;:16;:39::i;64424:145::-;24920:6;;-1:-1:-1;;;;;24920:6:0;23801:10;25067:23;25059:68;;;;-1:-1:-1;;;25059:68:0;;;;;;;:::i;:::-;64521:18:::1;:40:::0;;-1:-1:-1;;;;;;64521:40:0::1;-1:-1:-1::0;;;;;64521:40:0;;;::::1;::::0;;;::::1;::::0;;64424:145::o;64819:112::-;24920:6;;-1:-1:-1;;;;;24920:6:0;23801:10;25067:23;25059:68;;;;-1:-1:-1;;;25059:68:0;;;;;;;:::i;:::-;64895:12:::1;:28:::0;;-1:-1:-1;;;;;;64895:28:0::1;-1:-1:-1::0;;;;;64895:28:0;;;::::1;::::0;;;::::1;::::0;;64819:112::o;65212:251::-;65269:13;65303:16;65311:7;65303;:16::i;:::-;65295:46;;;;-1:-1:-1;;;65295:46:0;;;;;;;:::i;:::-;65356:20;65400:10;65411:6;:15;65418:7;65411:15;;;;;;;;;;;;65400:27;;;;;;;;:::i;:::-;;;;;;;;65391:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65391:36:0;;65212:251;-1:-1:-1;;;;;;;65212:251:0:o;54730:233::-;54805:7;54841:30;54628:10;:17;;54540:113;54841:30;54833:5;:38;54825:95;;;;-1:-1:-1;;;54825:95:0;;46723:2:1;54825:95:0;;;46705:21:1;46762:2;46742:18;;;46735:30;46801:34;46781:18;;;46774:62;-1:-1:-1;;;46852:18:1;;;46845:42;46904:19;;54825:95:0;46521:408:1;54825:95:0;54938:10;54949:5;54938:17;;;;;;;;:::i;:::-;;;;;;;;;54931:24;;54730:233;;;:::o;63378:27::-;;;;;;;;;;;;74773:1459;27780:1;28376:7;;:19;;28368:63;;;;-1:-1:-1;;;28368:63:0;;;;;;;:::i;:::-;27780:1;28509:7;:18;74868::::1;::::0;74889:15:::1;-1:-1:-1::0;74860:85:0::1;;;;-1:-1:-1::0;;;74860:85:0::1;;;;;;;:::i;:::-;74984:19;::::0;74976:5:::1;::::0;74964:17:::1;::::0;63444:4:::1;74964:17;:::i;:::-;:39;74956:83;;;::::0;-1:-1:-1;;;74956:83:0;;44027:2:1;74956:83:0::1;::::0;::::1;44009:21:1::0;44066:2;44046:18;;;44039:30;44105:33;44085:18;;;44078:61;44156:18;;74956:83:0::1;43825:355:1::0;74956:83:0::1;63444:4;75058:5;;:17;75050:65;;;;-1:-1:-1::0;;;75050:65:0::1;;;;;;;:::i;:::-;75141:8;;75128:9;:21;75120:59;;;;-1:-1:-1::0;;;75120:59:0::1;;;;;;;:::i;:::-;23801:10:::0;75198:31:::1;::::0;;;:17:::1;:31;::::0;;;;;75232:1:::1;-1:-1:-1::0;75190:69:0::1;;;::::0;-1:-1:-1;;;75190:69:0;;39100:2:1;75190:69:0::1;::::0;::::1;39082:21:1::0;39139:2;39119:18;;;39112:30;-1:-1:-1;;;39158:18:1;;;39151:51;39219:18;;75190:69:0::1;38898:345:1::0;75190:69:0::1;75322:28;::::0;-1:-1:-1;;;;;;75339:10:0::1;11680:2:1::0;11676:15;11672:53;75322:28:0::1;::::0;::::1;11660:66:1::0;75297:12:0::1;::::0;11742::1;;75322:28:0::1;::::0;;-1:-1:-1;;75322:28:0;;::::1;::::0;;;;;;75312:39;;75322:28:::1;75312:39:::0;;::::1;::::0;;-1:-1:-1;75364:19:0::1;::::0;75396:706:::1;75415:10;:17:::0;75411:21;::::1;75396:706;;;75460:46;75479:5;75486:10;75497:1;75486:13;;;;;;;;:::i;:::-;;;;;;;;;75501:4;75460:18;:46::i;:::-;75456:635;;;75529:15;75547:8;:1:::0;75551:4:::1;75547:8;:::i;:::-;75529:26;;75639:12;75654:39;75672:5;75679:1:::0;75682:10:::1;75654:17;:39::i;:::-;75712:5;:7:::0;;75639:54;;-1:-1:-1;75712:5:0::1;:7;::::0;::::1;:::i;:::-;;;;;;75871;75837:17;:31;75855:12;23801:10:::0;;23721:98;75855:12:::1;-1:-1:-1::0;;;;;75837:31:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;75837:31:0;:41;75899:32:::1;23801:10:::0;75909:12:::1;23721:98:::0;75899:32:::1;75969:5;75952:22;;75993:5;;;;75456:635;76071:4;76054:21;;75434:3:::0;::::1;::::0;::::1;:::i;:::-;;;;75396:706;;;;76118:14;76114:109;;;76188:23;::::0;-1:-1:-1;;;76188:23:0;;47136:2:1;76188:23:0::1;::::0;::::1;47118:21:1::0;47175:2;47155:18;;;47148:30;-1:-1:-1;;;47194:18:1;;;47187:43;47247:18;;76188:23:0::1;46934:337:1::0;76114:109:0::1;-1:-1:-1::0;;27736:1:0;28688:7;:22;-1:-1:-1;74773:1459:0:o;66186:402::-;66251:4;66276:16;66284:7;66276;:16::i;:::-;66268:46;;;;-1:-1:-1;;;66268:46:0;;;;;;;:::i;:::-;66385:12;;66329:11;66468:15;;;:6;:15;;;;;;;66429:55;;-1:-1:-1;;;66429:55:0;;;;;32436:25:1;;;32477:18;;;32470:34;;;;66329:11:0;;-1:-1:-1;;;;;66385:12:0;;66329:11;;66385:12;;66429:29;;32409:18:1;;66429:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66407:77;;;;66526:21;66539:7;74540:4;74564:15;;;:6;:15;;;;;;;74480:107;66526:21;66509:38;;:14;:38;:::i;:::-;66508:44;;66551:1;66508:44;:::i;:::-;66499:53;66186:402;-1:-1:-1;;;;;66186:402:0:o;69377:339::-;69436:4;69461:16;69469:7;69461;:16::i;:::-;69453:46;;;;-1:-1:-1;;;69453:46:0;;;;;;;:::i;:::-;69570:12;;69514:11;74564:15;;;:6;:15;;;;;;;;;69640:6;:15;;;;;;;69607:49;;-1:-1:-1;;;69607:49:0;;;;;32436:25:1;;;32477:18;;;32470:34;;;;69514:11:0;;-1:-1:-1;;;;;69570:12:0;;;;69607:23;;32409:18:1;;69607:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;;;;;;:::i;:::-;69598:82;69377:339;-1:-1:-1;;;;69377:339:0:o;81344:303::-;27780:1;28376:7;;:19;;28368:63;;;;-1:-1:-1;;;28368:63:0;;;;;;;:::i;:::-;27780:1;28509:7;:18;81415:14:::1;::::0;-1:-1:-1;;;;;81415:14:0::1;81401:10;:28;81393:53;;;::::0;-1:-1:-1;;;81393:53:0;;36462:2:1;81393:53:0::1;::::0;::::1;36444:21:1::0;36501:2;36481:18;;;36474:30;-1:-1:-1;;;36520:18:1;;;36513:42;36572:18;;81393:53:0::1;36260:336:1::0;81393:53:0::1;81459:13;::::0;;;::::1;;;:22;81451:50;;;;-1:-1:-1::0;;;81451:50:0::1;;;;;;;:::i;:::-;81510:13;:20:::0;;-1:-1:-1;;81510:20:0::1;::::0;::::1;::::0;;;81550:30:::1;81510:20:::0;;;81550:17:::1;:30::i;:::-;81591:5;:7:::0;;81535:45;;-1:-1:-1;81591:5:0::1;:7;::::0;::::1;:::i;:::-;;;;;;81609:30;81619:10;81631:7;81609:9;:30::i;:::-;-1:-1:-1::0;27736:1:0;28688:7;:22;81344:303::o;40746:239::-;40818:7;40854:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40854:16:0;40889:19;40881:73;;;;-1:-1:-1;;;40881:73:0;;39861:2:1;40881:73:0;;;39843:21:1;39900:2;39880:18;;;39873:30;39939:34;39919:18;;;39912:62;-1:-1:-1;;;39990:18:1;;;39983:39;40039:19;;40881:73:0;39659:405:1;69011:358:0;69075:13;69109:16;69117:7;69109;:16::i;:::-;69101:46;;;;-1:-1:-1;;;69101:46:0;;;;;;;:::i;:::-;69227:12;;69191:22;69316:15;;;:6;:15;;;;;;;;69278:54;;-1:-1:-1;;;69278:54:0;;69162:20;;-1:-1:-1;;;;;69227:12:0;;69264:13;;69227:12;;69278:28;;:54;;69307:7;;69278:54;;32436:25:1;;;32492:2;32477:18;;32470:34;32424:2;32409:18;;32262:248;40476:208:0;40548:7;-1:-1:-1;;;;;40576:19:0;;40568:74;;;;-1:-1:-1;;;40568:74:0;;39450:2:1;40568:74:0;;;39432:21:1;39489:2;39469:18;;;39462:30;39528:34;39508:18;;;39501:62;-1:-1:-1;;;39579:18:1;;;39572:40;39629:19;;40568:74:0;39248:406:1;40568:74:0;-1:-1:-1;;;;;;40660:16:0;;;;;:9;:16;;;;;;;40476:208::o;25498:94::-;24920:6;;-1:-1:-1;;;;;24920:6:0;23801:10;25067:23;25059:68;;;;-1:-1:-1;;;25059:68:0;;;;;;;:::i;:::-;25563:21:::1;25581:1;25563:9;:21::i;:::-;25498:94::o:0;87885:113::-;24920:6;;-1:-1:-1;;;;;24920:6:0;23801:10;25067:23;25059:68;;;;-1:-1:-1;;;25059:68:0;;;;;;;:::i;:::-;87938:51:::1;::::0;87946:10:::1;::::0;87967:21:::1;87938:51:::0;::::1;;;::::0;::::1;::::0;;;87967:21;87946:10;87938:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;87885:113::o:0;83516:102::-;24920:6;;83574:4;;-1:-1:-1;;;;;24920:6:0;23801:10;25067:23;25059:68;;;;-1:-1:-1;;;25059:68:0;;;;;;;:::i;:::-;-1:-1:-1;83598:12:0::1;::::0;83516:102;:::o;64055:228::-;24920:6;;-1:-1:-1;;;;;24920:6:0;23801:10;25067:23;25059:68;;;;-1:-1:-1;;;25059:68:0;;;;;;;:::i;:::-;64151:16:::1;::::0;;64165:1:::1;64151:16:::0;;::::1;::::0;::::1;::::0;;;;64138:29;::::1;::::0;:10:::1;::::0;:29:::1;:::i;:::-;;64183:6;64178:98;64197:9;:16;64193:1;:20;64178:98;;;64235:10;64251:9;64261:1;64251:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;64235:29;;::::1;::::0;::::1;::::0;;-1:-1:-1;64235:29:0;;;;;;;::::1;::::0;64215:3;::::1;::::0;::::1;:::i;:::-;;;;64178:98;;64291:125:::0;24920:6;;-1:-1:-1;;;;;24920:6:0;23801:10;25067:23;25059:68;;;;-1:-1:-1;;;25059:68:0;;;;;;;:::i;:::-;64378:13:::1;:30:::0;;-1:-1:-1;;;;;;64378:30:0::1;-1:-1:-1::0;;;;;64378:30:0;;;::::1;::::0;;;::::1;::::0;;64291:125::o;80525:240::-;80654:12;;80691:36;;-1:-1:-1;;;80691:36:0;;;;;32226:25:1;;;80585:4:0;;;;-1:-1:-1;;;;;80654:12:0;;;;;;80691:26;;32199:18:1;;80691:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80682:45;;;80525:240;-1:-1:-1;;;;80525:240:0:o;64703:111::-;24920:6;;-1:-1:-1;;;;;24920:6:0;23801:10;25067:23;25059:68;;;;-1:-1:-1;;;25059:68:0;;;;;;;:::i;:::-;64778:15:::1;:28:::0;64703:111::o;76240:772::-;27780:1;28376:7;;:19;;28368:63;;;;-1:-1:-1;;;28368:63:0;;;;;;;:::i;:::-;27780:1;28509:7;:18;76329:15:::1;::::0;76347::::1;-1:-1:-1::0;76321:79:0::1;;;::::0;-1:-1:-1;;;76321:79:0;;36060:2:1;76321:79:0::1;::::0;::::1;36042:21:1::0;36099:2;36079:18;;;36072:30;36138:34;36118:18;;;36111:62;-1:-1:-1;;;36189:18:1;;;36182:31;36230:19;;76321:79:0::1;35858:397:1::0;76321:79:0::1;76439:19;::::0;76431:5:::1;::::0;76419:17:::1;::::0;63444:4:::1;76419:17;:::i;:::-;:39;76411:83;;;::::0;-1:-1:-1;;;76411:83:0;;44027:2:1;76411:83:0::1;::::0;::::1;44009:21:1::0;44066:2;44046:18;;;44039:30;44105:33;44085:18;;;44078:61;44156:18;;76411:83:0::1;43825:355:1::0;76411:83:0::1;63444:4;76521:14;76513:5;;:22;;;;:::i;:::-;:34;76505:82;;;;-1:-1:-1::0;;;76505:82:0::1;;;;;;;:::i;:::-;76623:1;76606:14;:18;76598:55;;;::::0;-1:-1:-1;;;76598:55:0;;33363:2:1;76598:55:0::1;::::0;::::1;33345:21:1::0;33402:2;33382:18;;;33375:30;33441:26;33421:18;;;33414:54;33485:18;;76598:55:0::1;33161:348:1::0;76598:55:0::1;76689:2;76672:14;:19;76664:58;;;::::0;-1:-1:-1;;;76664:58:0;;42488:2:1;76664:58:0::1;::::0;::::1;42470:21:1::0;42527:2;42507:18;;;42500:30;42566:28;42546:18;;;42539:56;42612:18;;76664:58:0::1;42286:350:1::0;76664:58:0::1;76765:14;76748;;:31;;;;:::i;:::-;76735:9;:44;76727:82;;;;-1:-1:-1::0;;;76727:82:0::1;;;;;;;:::i;:::-;76834:1;76822:181;76841:14;76837:1;:18;76822:181;;;76877:12;76892:30;76910:5;76917:1:::0;76920::::1;76892:17;:30::i;:::-;76937:5;:7:::0;;76877:45;;-1:-1:-1;76937:5:0::1;:7;::::0;::::1;:::i;:::-;;;;;;76959:32;76969:12;23801:10:::0;;23721:98;76959:32:::1;-1:-1:-1::0;76857:3:0;::::1;::::0;::::1;:::i;:::-;;;;76822:181;;;-1:-1:-1::0;;27736:1:0;28688:7;:22;76240:772::o;15512:210::-;15605:10;-1:-1:-1;;;;;15619:14:0;15605:28;;15597:72;;;;-1:-1:-1;;;15597:72:0;;44387:2:1;15597:72:0;;;44369:21:1;44426:2;44406:18;;;44399:30;44465:33;44445:18;;;44438:61;44516:18;;15597:72:0;44185:355:1;15597:72:0;83477:12;:25;-1:-1:-1;69781:102:0:o;41221:104::-;41277:13;41310:7;41303:14;;;;;:::i;42874:295::-;-1:-1:-1;;;;;42977:24:0;;23801:10;42977:24;;42969:62;;;;-1:-1:-1;;;42969:62:0;;37208:2:1;42969:62:0;;;37190:21:1;37247:2;37227:18;;;37220:30;37286:27;37266:18;;;37259:55;37331:18;;42969:62:0;37006:349:1;42969:62:0;23801:10;43044:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;43044:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;43044:53:0;;;;;;;;;;43113:48;;31694:41:1;;;43044:42:0;;23801:10;43113:48;;31667:18:1;43113:48:0;;;;;;;42874:295;;:::o;68187:355::-;68250:13;68284:16;68292:7;68284;:16::i;:::-;68276:46;;;;-1:-1:-1;;;68276:46:0;;;;;;;:::i;:::-;68402:12;;68366:22;68489:15;;;:6;:15;;;;;;;;68452:53;;-1:-1:-1;;;68452:53:0;;68337:20;;-1:-1:-1;;;;;68402:12:0;;68439;;68402;;68452:27;;:53;;68480:7;;68452:53;;32436:25:1;;;32492:2;32477:18;;32470:34;32424:2;32409:18;;32262:248;80770:255:0;24920:6;;-1:-1:-1;;;;;24920:6:0;23801:10;25067:23;25059:68;;;;-1:-1:-1;;;25059:68:0;;;;;;;:::i;:::-;27780:1:::1;28376:7;;:19;;28368:63;;;;-1:-1:-1::0;;;28368:63:0::1;;;;;;;:::i;:::-;27780:1;28509:7;:18:::0;80838:14:::2;::::0;::::2;;:23;80830:51;;;;-1:-1:-1::0;;;80830:51:0::2;;;;;;;:::i;:::-;80890:14;:21:::0;;-1:-1:-1;;80890:21:0::2;80907:4;80890:21;::::0;;:14:::2;80931:30;80890:14:::0;;;80931:17:::2;:30::i;:::-;80972:5;:7:::0;;80916:45;;-1:-1:-1;80972:5:0::2;:7;::::0;::::2;:::i;:::-;;;;;;80990:27;81000:7;24920:6:::0;;-1:-1:-1;;;;;24920:6:0;;24847:87;73029:105;73076:13;73103:26;73120:8;73103:16;:26::i;81030:308::-;27780:1;28376:7;;:19;;28368:63;;;;-1:-1:-1;;;28368:63:0;;;;;;;:::i;:::-;27780:1;28509:7;:18;81102:15:::1;::::0;;;::::1;-1:-1:-1::0;;;;;81102:15:0::1;81088:10;:29;81080:55;;;::::0;-1:-1:-1;;;81080:55:0;;41077:2:1;81080:55:0::1;::::0;::::1;41059:21:1::0;41116:2;41096:18;;;41089:30;-1:-1:-1;;;41135:18:1;;;41128:43;41188:18;;81080:55:0::1;40875:337:1::0;81080:55:0::1;81148:14;::::0;::::1;::::0;::::1;;;:23;81140:51;;;;-1:-1:-1::0;;;81140:51:0::1;;;;;;;:::i;:::-;81200:14;:21:::0;;-1:-1:-1;;81200:21:0::1;;;::::0;;;81241:30:::1;81200:21:::0;;;81241:17:::1;:30::i;44137:328::-:0;44312:41;23801:10;44345:7;44312:18;:41::i;:::-;44304:103;;;;-1:-1:-1;;;44304:103:0;;;;;;;:::i;:::-;44418:39;44432:4;44438:2;44442:7;44451:5;44418:13;:39::i;:::-;44137:328;;;;:::o;70051:2956::-;70114:13;70148:17;70156:8;70148:7;:17::i;:::-;70140:59;;;;-1:-1:-1;;;70140:59:0;;42130:2:1;70140:59:0;;;42112:21:1;42169:2;42149:18;;;42142:30;42208:31;42188:18;;;42181:59;42257:18;;70140:59:0;41928:353:1;70140:59:0;70212:21;;:::i;:::-;70335:11;70337:8;70335:1;:11::i;:::-;74540:4;74564:15;;;:6;:15;;;;;;70361:25;;73029:105;:::i;70361:25::-;70442:16;;;;:6;:16;;;;;;70426:12;;70440:19;;:1;:19::i;:::-;70509:11;70531:16;70538:8;70531:6;:16::i;:::-;70557:11;70559:8;70557:1;:11::i;:::-;70268:442;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;70268:442:0;;;;;;70246:469;;70831:19;70841:8;70831:9;:19::i;:::-;74540:4;74564:15;;;:6;:15;;;;;;70984:25;;73029:105;:::i;70984:25::-;70750:302;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;70750:302:0;;;;;;70728:7;;;:329;71205:22;71218:8;71205:12;:22::i;:::-;71236:30;71238:27;71256:8;71238:17;:27::i;71236:30::-;71090:219;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;71090:219:0;;;;;;71068:7;;:246;71464:23;71478:8;71464:13;:23::i;:::-;71495:31;71497:28;71516:8;71497:18;:28::i;71495:31::-;71349:220;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;71349:220:0;;;;;;71327:7;;;:247;71727:25;71743:8;71727:15;:25::i;:::-;71607:188;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;71607:188:0;;;;;;71585:7;;;:215;71965:26;71982:8;71965:16;:26::i;:::-;72114:24;72116:21;72128:8;72116:11;:21::i;72114:24::-;71833:347;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;71833:347:0;;;;;;71811:7;;;:374;72280:11;72302:16;72309:8;72302:6;:16::i;:::-;72329:11;72331:8;72329:1;:11::i;:::-;72385;72407:16;72414:8;72407:6;:16::i;:::-;72434:11;72436:8;72434:1;:11::i;:::-;72218:252;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;72218:252:0;;;;;;72196:7;;;:279;;;72635:7;;72196;72669;;;;72703;;;;72737;;;;72771;;;;72805;;;;72592:277;;72488:20;;72511:403;;72592:277;;72635:7;72805;;72592:277;;:::i;:::-;;;;;;;;;;;;;72511:13;:403::i;:::-;72488:426;;72991:6;72941:57;;;;;;;;:::i;:::-;;;;;;;;;;;;;72927:72;;;;70051:2956;;;:::o;74595:173::-;74685:15;;-1:-1:-1;;;;;74685:15:0;74671:10;:29;74663:63;;;;-1:-1:-1;;;74663:63:0;;41419:2:1;74663:63:0;;;41401:21:1;41458:2;41438:18;;;41431:30;-1:-1:-1;;;41477:18:1;;;41470:51;41538:18;;74663:63:0;41217:345:1;74663:63:0;74737:15;;;;:6;:15;;;;;;:23;74595:173::o;78244:1624::-;27780:1;28376:7;;:19;;28368:63;;;;-1:-1:-1;;;28368:63:0;;;;;;;:::i;:::-;27780:1;28509:7;:18;78373::::1;::::0;78394:15:::1;-1:-1:-1::0;78365:85:0::1;;;;-1:-1:-1::0;;;78365:85:0::1;;;;;;;:::i;:::-;63444:4;78481:8;:15;78469:5;;78477:1;78469:9;;;;:::i;:::-;:27;;;;:::i;:::-;:39;78461:85;;;;-1:-1:-1::0;;;78461:85:0::1;;;;;;;:::i;:::-;78578:8;;78565:9;:21;78557:59;;;;-1:-1:-1::0;;;78557:59:0::1;;;;;;;:::i;:::-;23801:10:::0;78635:31:::1;::::0;;;:17:::1;:31;::::0;;;;;78669:1:::1;-1:-1:-1::0;78627:69:0::1;;;::::0;-1:-1:-1;;;78627:69:0;;39100:2:1;78627:69:0::1;::::0;::::1;39082:21:1::0;39139:2;39119:18;;;39112:30;-1:-1:-1;;;39158:18:1;;;39151:51;39219:18;;78627:69:0::1;38898:345:1::0;78627:69:0::1;78714:6;78709:227;78728:8;:15;78724:1;:19;78709:227;;;78773:35;78796:8;78805:1;78796:11;;;;;;;;:::i;78773:35::-;78765:81;;;;-1:-1:-1::0;;;78765:81:0::1;;;;;;;:::i;:::-;78870:27;78885:8;78894:1;78885:11;;;;;;;;:::i;78870:27::-;78869:28;78861:63;;;::::0;-1:-1:-1;;;78861:63:0;;47838:2:1;78861:63:0::1;::::0;::::1;47820:21:1::0;47877:2;47857:18;;;47850:30;-1:-1:-1;;;47896:18:1;;;47889:52;47958:18;;78861:63:0::1;47636:346:1::0;78861:63:0::1;78745:3:::0;::::1;::::0;::::1;:::i;:::-;;;;78709:227;;;-1:-1:-1::0;79042:28:0::1;::::0;-1:-1:-1;;;;;;79059:10:0::1;11680:2:1::0;11676:15;11672:53;79042:28:0::1;::::0;::::1;11660:66:1::0;78948:15:0::1;::::0;;;11742:12:1;;79042:28:0::1;;;;;;;;;;;;79032:39;;;;;;79017:54;;79089:6;79084:186;79103:10;:17:::0;79099:21;::::1;79084:186;;;79148:46;79167:5;79174:10;79185:1;79174:13;;;;;;;;:::i;79148:46::-;79144:113;;;79231:8;:1:::0;79235:4:::1;79231:8;:::i;:::-;79218:21;;79144:113;79122:3:::0;::::1;::::0;::::1;:::i;:::-;;;;79084:186;;;;79324:6;79319:300;79338:8;:15;79334:1;:19;79319:300;;;79375:12;79390:64;79408:4;79414:27;79429:8;79438:1;79429:11;;;;;;;;:::i;79390:64::-;79375:79;;79496:4;79469:11;:24;79481:8;79490:1;79481:11;;;;;;;;:::i;:::-;;;;;;;79469:24;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;79517:5;;:7;;;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;79539:19:0::1;:21:::0;;;:19:::1;:21;::::0;::::1;:::i;:::-;;;;;;79575:32;79585:12;23801:10:::0;;23721:98;79575:32:::1;-1:-1:-1::0;79355:3:0;::::1;::::0;::::1;:::i;:::-;;;;79319:300;;;;79661:22;79686:39;79704:5;79711:1:::0;79714:10:::1;79686:17;:39::i;:::-;79736:5;:7:::0;;79661:64;;-1:-1:-1;79736:5:0::1;:7;::::0;::::1;:::i;:::-;;;;;;79788:17;79754;:31;79772:12;23801:10:::0;;23721:98;79772:12:::1;-1:-1:-1::0;;;;;79754:31:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;79754:31:0;:51;79816:42:::1;23801:10:::0;79826:12:::1;23721:98:::0;69946:100;24920:6;;-1:-1:-1;;;;;24920:6:0;23801:10;25067:23;25059:68;;;;-1:-1:-1;;;25059:68:0;;;;;;;:::i;:::-;70020:18;;::::1;::::0;:11:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;67329:406::-:0;67395:4;67420:16;67428:7;67420;:16::i;:::-;67412:46;;;;-1:-1:-1;;;67412:46:0;;;;;;;:::i;:::-;67529:12;;67473:11;67614:15;;;:6;:15;;;;;;;67574:56;;-1:-1:-1;;;67574:56:0;;;;;32436:25:1;;;32477:18;;;32470:34;;;;67473:11:0;;-1:-1:-1;;;;;67529:12:0;;67473:11;;67529:12;;67574:30;;32409:18:1;;67574:56:0;32262:248:1;83174:205:0;24920:6;;83227:17;;-1:-1:-1;;;;;24920:6:0;23801:10;25067:23;25059:68;;;;-1:-1:-1;;;25059:68:0;;;;;;;:::i;:::-;83298:3:::1;::::0;83265:29:::1;::::0;-1:-1:-1;;;83265:29:0;;83288:4:::1;83265:29;::::0;::::1;30609:51:1::0;83265:4:0::1;-1:-1:-1::0;;;;;83265:14:0::1;::::0;::::1;::::0;30582:18:1;;83265:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;83257:65;;;::::0;-1:-1:-1;;;83257:65:0;;33716:2:1;83257:65:0::1;::::0;::::1;33698:21:1::0;33755:2;33735:18;;;33728:30;-1:-1:-1;;;33774:18:1;;;33767:46;33830:18;;83257:65:0::1;33514:340:1::0;83257:65:0::1;83340:31;83358:7;;83367:3;;83340:17;:31::i;:::-;83333:38;;83174:205:::0;:::o;25747:192::-;24920:6;;-1:-1:-1;;;;;24920:6:0;23801:10;25067:23;25059:68;;;;-1:-1:-1;;;25059:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25836:22:0;::::1;25828:73;;;::::0;-1:-1:-1;;;25828:73:0;;35296:2:1;25828:73:0::1;::::0;::::1;35278:21:1::0;35335:2;35315:18;;;35308:30;35374:34;35354:18;;;35347:62;-1:-1:-1;;;35425:18:1;;;35418:36;35471:19;;25828:73:0::1;35094:402:1::0;25828:73:0::1;25912:19;25922:8;25912:9;:19::i;81653:393::-:0;27780:1;28376:7;;:19;;28368:63;;;;-1:-1:-1;;;28368:63:0;;;;;;;:::i;:::-;27780:1;28509:7;:18;81726:16:::1;::::0;-1:-1:-1;;;;;81726:16:0::1;81712:10;:30;81704:63;;;::::0;-1:-1:-1;;;81704:63:0;;45956:2:1;81704:63:0::1;::::0;::::1;45938:21:1::0;45995:2;45975:18;;;45968:30;-1:-1:-1;;;46014:18:1;;;46007:50;46074:18;;81704:63:0::1;45754:344:1::0;81704:63:0::1;81780:15;::::0;;;::::1;;;:24;81772:52;;;;-1:-1:-1::0;;;81772:52:0::1;;;;;;;:::i;:::-;81833:15;:22:::0;;-1:-1:-1;;81833:22:0::1;::::0;::::1;::::0;;;81868:167:::1;81887:2;81883:1;:6;81868:167;;;81911:12;81926:30;81944:5;81951:1:::0;81954::::1;81926:17;:30::i;:::-;81971:5;:7:::0;;81911:45;;-1:-1:-1;81971:5:0::1;:7;::::0;::::1;:::i;:::-;;;;;;81993:30;82003:10;82015:7;81993:9;:30::i;:::-;-1:-1:-1::0;81891:3:0;::::1;::::0;::::1;:::i;:::-;;;;81868:167;;40107:305:::0;40209:4;-1:-1:-1;;;;;;40246:40:0;;-1:-1:-1;;;40246:40:0;;:105;;-1:-1:-1;;;;;;;40303:48:0;;-1:-1:-1;;;40303:48:0;40246:105;:158;;;-1:-1:-1;;;;;;;;;;38823:40:0;;;40368:36;38714:157;45975:127;46040:4;46064:16;;;:7;:16;;;;;;-1:-1:-1;;;;;46064:16:0;:30;;;45975:127::o;49957:174::-;50032:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;50032:29:0;-1:-1:-1;;;;;50032:29:0;;;;;;;;:24;;50086:23;50032:24;50086:14;:23::i;:::-;-1:-1:-1;;;;;50077:46:0;;;;;;;;;;;49957:174;;:::o;79876:267::-;79996:13;;80024:35;;-1:-1:-1;;;80024:35:0;;;;;32226:25:1;;;79945:4:0;;-1:-1:-1;;;;;79996:13:0;;80063:10;;79996:13;;80024:25;;32199:18:1;;80024:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;80024:49:0;;80021:92;;;-1:-1:-1;80097:4:0;;79876:267;-1:-1:-1;;79876:267:0:o;80021:92::-;-1:-1:-1;80130:5:0;;79876:267;-1:-1:-1;;79876:267:0:o;1714:190::-;1839:4;1892;1863:25;1876:5;1883:4;1863:12;:25::i;:::-;:33;;1714:190;-1:-1:-1;;;;1714:190:0:o;83905:3069::-;84001:4;84026:12;;84042:1;84026:17;;84018:65;;;;-1:-1:-1;;;84018:65:0;;34061:2:1;84018:65:0;;;34043:21:1;34100:2;34080:18;;;34073:30;34139:34;34119:18;;;34112:62;-1:-1:-1;;;34190:18:1;;;34183:33;34233:19;;84018:65:0;33859:399:1;84018:65:0;84132:21;84168:5;;63444:4;84156:17;;;;:::i;:::-;84132:41;-1:-1:-1;84255:14:0;84272:21;;:48;;84300:20;84319:1;84300:16;:20;:::i;:::-;84272:48;;;84296:1;84272:48;84403:12;;84417:5;;84386:84;;84255:65;;-1:-1:-1;84358:10:0;;84475:16;;84386:84;;84403:12;;84417:5;;;;;84424:10;;84436:16;;84454:15;;84386:84;;;:::i;:::-;;;;;;;;;;;;;84376:95;;;;;;84371:101;;:120;;;;:::i;:::-;84358:133;;84508:12;84547:7;84555:5;84547:14;;;;;;;:::i;:::-;;;:43;;84585:5;84547:43;;;84569:7;84577:5;84569:14;;;;;;;:::i;:::-;;;84547:43;84537:53;;84618:7;84626:9;84618:18;;;;;;;:::i;:::-;;;:23;:56;;84656:7;84664:9;84656:18;;;;;;;:::i;:::-;;;84618:56;;;84644:9;84618:56;84601:7;84609:5;84601:14;;;;;;;:::i;:::-;;:73;84748:12;;84762:5;;84731:84;;84687:16;;84821:2;;84731:84;;84762:5;;;;;84769:10;;84781:16;;84799:15;;84731:84;;;:::i;:::-;;;;;;;;;;;;;84721:95;;;;;;84713:104;;84706:117;;;;:::i;:::-;84834:5;:18;;84687:136;;-1:-1:-1;84687:136:0;;84834:5;;:18;;84687:136;;84834:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;84971:18:0;;85033:66;;-1:-1:-1;;;85033:66:0;;31967:14:1;;31960:22;85033:66:0;;;31942:41:1;31999:18;;;31992:34;;;32042:18;;;32035:34;;;-1:-1:-1;;;;;84971:18:0;;;;-1:-1:-1;;84971:18:0;;85033:30;;31915:18:1;;85033:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;85033:66:0;;;;;;;;;;;;:::i;:::-;85338:13;;;85349:1;85338:13;;;;;;;;;85001:98;;-1:-1:-1;85278:15:0;;;;85338:13;;;;;;;;;;-1:-1:-1;85338:13:0;85304:47;;85367:6;85362:155;85381:15;:22;85377:1;:26;85362:155;;;85439:15;85455:1;85439:18;;;;;;;;:::i;:::-;;;;;;;85425:32;;;;;:::i;:::-;;;85495:10;85472:17;85490:1;85472:20;;;;;;;;:::i;:::-;;;;;;;;;;:33;85405:3;;;;:::i;:::-;;;;85362:155;;;-1:-1:-1;85644:12:0;;85658:5;;85627:84;;85593:16;;85716:10;;85627:84;;85658:5;;;;;85665:10;;85677:16;;85695:15;;85627:84;;;:::i;:::-;;;;;;;;;;;;;85617:95;;;;;;85612:101;;:114;;;;:::i;:::-;85593:133;;85739:17;85861;85879:1;85861:20;;;;;;;;:::i;:::-;;;;;;;85846:11;:35;;:73;;;;;85899:17;85917:1;85899:20;;;;;;;;:::i;:::-;;;;;;;85885:11;:34;85846:73;85842:134;;;-1:-1:-1;85951:1:0;85842:134;86005:17;86023:1;86005:20;;;;;;;;:::i;:::-;;;;;;;85990:11;:35;;:73;;;;;86043:17;86061:1;86043:20;;;;;;;;:::i;:::-;;;;;;;86029:11;:34;85990:73;85986:130;;;-1:-1:-1;86095:1:0;85986:130;86145:17;86163:1;86145:20;;;;;;;;:::i;:::-;;;;;;;86130:11;:35;;:73;;;;;86183:17;86201:1;86183:20;;;;;;;;:::i;:::-;;;;;;;86169:11;:34;86130:73;86126:130;;;-1:-1:-1;86235:1:0;86126:130;86285:17;86303:1;86285:20;;;;;;;;:::i;:::-;;;;;;;86270:11;:35;;:74;;;;;86324:17;86342:1;86324:20;;;;;;;;:::i;:::-;;;;;;;86309:11;:35;;86270:74;86266:136;;;-1:-1:-1;86376:1:0;86266:136;86512:1;86487:8;86496:12;86487:22;;;;;;;;:::i;:::-;;;;;;;;;:26;86483:457;;;86544:8;86553:12;86544:22;;;;;;;;:::i;:::-;;;;;;;;;:24;;;;;;:::i;:::-;;;;-1:-1:-1;;86689:15:0;;;;:6;:15;;;;;;;;:30;;;86774:6;:15;;;;;86792:1;86774:19;;86483:457;;;86899:29;86915:12;86899:15;:29::i;:::-;86881:15;;;;:6;:15;;;;;:47;86483:457;-1:-1:-1;86959:7:0;;83905:3069;-1:-1:-1;;;;;;;;;;;;;83905:3069:0:o;46959:110::-;47035:26;47045:2;47049:7;47035:26;;;;;;;;;;;;:9;:26::i;46269:348::-;46362:4;46387:16;46395:7;46387;:16::i;:::-;46379:73;;;;-1:-1:-1;;;46379:73:0;;37562:2:1;46379:73:0;;;37544:21:1;37601:2;37581:18;;;37574:30;37640:34;37620:18;;;37613:62;-1:-1:-1;;;37691:18:1;;;37684:42;37743:19;;46379:73:0;37360:408:1;46379:73:0;46463:13;46479:23;46494:7;46479:14;:23::i;:::-;46463:39;;46532:5;-1:-1:-1;;;;;46521:16:0;:7;-1:-1:-1;;;;;46521:16:0;;:51;;;;46565:7;-1:-1:-1;;;;;46541:31:0;:20;46553:7;46541:11;:20::i;:::-;-1:-1:-1;;;;;46541:31:0;;46521:51;:87;;;-1:-1:-1;;;;;;43361:25:0;;;43337:4;43361:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;46576:32;43240:164;49261:578;49420:4;-1:-1:-1;;;;;49393:31:0;:23;49408:7;49393:14;:23::i;:::-;-1:-1:-1;;;;;49393:31:0;;49385:85;;;;-1:-1:-1;;;49385:85:0;;43617:2:1;49385:85:0;;;43599:21:1;43656:2;43636:18;;;43629:30;43695:34;43675:18;;;43668:62;-1:-1:-1;;;43746:18:1;;;43739:39;43795:19;;49385:85:0;43415:405:1;49385:85:0;-1:-1:-1;;;;;49489:16:0;;49481:65;;;;-1:-1:-1;;;49481:65:0;;36803:2:1;49481:65:0;;;36785:21:1;36842:2;36822:18;;;36815:30;36881:34;36861:18;;;36854:62;-1:-1:-1;;;36932:18:1;;;36925:34;36976:19;;49481:65:0;36601:400:1;49481:65:0;49559:39;49580:4;49586:2;49590:7;49559:20;:39::i;:::-;49663:29;49680:1;49684:7;49663:8;:29::i;:::-;-1:-1:-1;;;;;49705:15:0;;;;;;:9;:15;;;;;:20;;49724:1;;49705:15;:20;;49724:1;;49705:20;:::i;:::-;;;;-1:-1:-1;;;;;;;49736:13:0;;;;;;:9;:13;;;;;:18;;49753:1;;49736:13;:18;;49753:1;;49736:18;:::i;:::-;;;;-1:-1:-1;;49765:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;49765:21:0;-1:-1:-1;;;;;49765:21:0;;;;;;;;;49804:27;;49765:16;;49804:27;;;;;;;49261:578;;;:::o;25947:173::-;26022:6;;;-1:-1:-1;;;;;26039:17:0;;;-1:-1:-1;;;;;;26039:17:0;;;;;;;26072:40;;26022:6;;;26039:17;26022:6;;26072:40;;26003:16;;26072:40;25992:128;25947:173;:::o;21418:723::-;21474:13;21695:10;21691:53;;-1:-1:-1;;21722:10:0;;;;;;;;;;;;-1:-1:-1;;;21722:10:0;;;;;21418:723::o;21691:53::-;21769:5;21754:12;21810:78;21817:9;;21810:78;;21843:8;;;;:::i;:::-;;-1:-1:-1;21866:10:0;;-1:-1:-1;21874:2:0;21866:10;;:::i;:::-;;;21810:78;;;21898:19;21930:6;21920:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21920:17:0;;21898:39;;21948:154;21955:10;;21948:154;;21982:11;21992:1;21982:11;;:::i;:::-;;-1:-1:-1;22051:10:0;22059:2;22051:5;:10;:::i;:::-;22038:24;;:2;:24;:::i;:::-;22025:39;;22008:6;22015;22008:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;22008:56:0;;;;;;;;-1:-1:-1;22079:11:0;22088:2;22079:11;;:::i;:::-;;;21948:154;;45347:315;45504:28;45514:4;45520:2;45524:7;45504:9;:28::i;:::-;45551:48;45574:4;45580:2;45584:7;45593:5;45551:22;:48::i;:::-;45543:111;;;;-1:-1:-1;;;45543:111:0;;;;;;;:::i;60395:1607::-;60493:11;;60453:13;;60519:8;60515:23;;-1:-1:-1;;60529:9:0;;;;;;;;;-1:-1:-1;60529:9:0;;;60395:1607;-1:-1:-1;60395:1607:0:o;60515:23::-;60590:18;60628:1;60617:7;:3;60623:1;60617:7;:::i;:::-;60616:13;;;;:::i;:::-;60611:19;;:1;:19;:::i;:::-;60590:40;-1:-1:-1;60688:19:0;60720:15;60590:40;60733:2;60720:15;:::i;:::-;60710:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60710:26:0;;60688:48;;60749:18;60770:5;;;;;;;;;;;;;;;;;60749:26;;60839:1;60832:5;60828:13;60884:2;60876:6;60872:15;60935:1;60903:777;60958:3;60955:1;60952:10;60903:777;;;61013:1;61056:12;;;;;61050:19;61151:4;61139:2;61135:14;;;;;61117:40;;61111:47;61260:2;61256:14;;;61252:25;;61238:40;;61232:47;61389:1;61385:13;;;61381:24;;61367:39;;61361:46;61509:16;;;;61495:31;;61489:38;61187:1;61183:11;;;61281:4;61228:58;;;61219:68;61312:11;;61357:57;;;61348:67;;;;61440:11;;61485:49;;61476:59;61564:3;61560:13;61593:22;;61663:1;61648:17;;;;61006:9;60903:777;;;60907:44;61712:1;61707:3;61703:11;61733:1;61728:84;;;;61831:1;61826:82;;;;61696:212;;61728:84;-1:-1:-1;;;;;61761:17:0;;61754:43;61728:84;;61826:82;-1:-1:-1;;;;;61859:17:0;;61852:41;61696:212;-1:-1:-1;;;61924:26:0;;;61931:6;60395:1607;-1:-1:-1;;;;60395:1607:0:o;13629:1034::-;13706:17;13732:4;-1:-1:-1;;;;;13732:20:0;;13753:14;13769:4;13786:8;12459:1;13775:43;;;;;;;;32436:25:1;;;32492:2;32477:18;;32470:34;32424:2;32409:18;;32262:248;13775:43:0;;;;;;;;;;;;;13732:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;14054:15:0;14137:16;;;:6;:16;;;;;;;;;3916:51;;;;;32746:25:1;;;32787:18;;;32780:34;;;14130:4:0;32830:18:1;;;32823:60;32899:18;;;;32892:34;;;3916:51:0;;;;;;;;;;32718:19:1;;;;3916:51:0;;;3906:62;;;;;;;;;14591:16;;;;;;;:20;;14610:1;14591:20;:::i;:::-;14572:16;;;;:6;:16;;;;;:39;14625:32;14579:8;14649:7;4486:41;;;;;;;11922:19:1;;;;11957:12;;;11950:28;;;;4486:41:0;;;;;;;;;11994:12:1;;;;4486:41:0;;4476:52;;;;;;4366:168;2266:701;2349:7;2392:4;2349:7;2407:523;2431:5;:12;2427:1;:16;2407:523;;;2465:20;2488:5;2494:1;2488:8;;;;;;;;:::i;:::-;;;;;;;2465:31;;2531:12;2515;:28;2511:408;;2668:44;;;;;;11922:19:1;;;11957:12;;;11950:28;;;11994:12;;2668:44:0;;;;;;;;;;;;2658:55;;;;;;2643:70;;2511:408;;;2858:44;;;;;;11922:19:1;;;11957:12;;;11950:28;;;11994:12;;2858:44:0;;;;;;;;;;;;2848:55;;;;;;2833:70;;2511:408;-1:-1:-1;2445:3:0;;;;:::i;:::-;;;;2407:523;;;-1:-1:-1;2947:12:0;2266:701;-1:-1:-1;;;2266:701:0:o;87036:245::-;87098:4;87119:16;;87115:159;;87159:28;87174:12;87159:14;:28::i;87115:159::-;87236:26;87249:12;87236;:26::i;47296:321::-;47426:18;47432:2;47436:7;47426:5;:18::i;:::-;47477:54;47508:1;47512:2;47516:7;47525:5;47477:22;:54::i;:::-;47455:154;;;;-1:-1:-1;;;47455:154:0;;;;;;;:::i;55576:589::-;-1:-1:-1;;;;;55782:18:0;;55778:187;;55817:40;55849:7;56992:10;:17;;56965:24;;;;:15;:24;;;;;:44;;;57020:24;;;;;;;;;;;;56888:164;55817:40;55778:187;;;55887:2;-1:-1:-1;;;;;55879:10:0;:4;-1:-1:-1;;;;;55879:10:0;;55875:90;;55906:47;55939:4;55945:7;55906:32;:47::i;:::-;-1:-1:-1;;;;;55979:16:0;;55975:183;;56012:45;56049:7;56012:36;:45::i;55975:183::-;56085:4;-1:-1:-1;;;;;56079:10:0;:2;-1:-1:-1;;;;;56079:10:0;;56075:83;;56106:40;56134:2;56138:7;56106:27;:40::i;50696:803::-;50851:4;-1:-1:-1;;;;;50872:13:0;;31219:20;31267:8;50868:624;;50908:72;;-1:-1:-1;;;50908:72:0;;-1:-1:-1;;;;;50908:36:0;;;;;:72;;23801:10;;50959:4;;50965:7;;50974:5;;50908:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50908:72:0;;;;;;;;-1:-1:-1;;50908:72:0;;;;;;;;;;;;:::i;:::-;;;50904:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51154:13:0;;51150:272;;51197:60;;-1:-1:-1;;;51197:60:0;;;;;;;:::i;51150:272::-;51372:6;51366:13;51357:6;51353:2;51349:15;51342:38;50904:533;-1:-1:-1;;;;;;51031:55:0;-1:-1:-1;;;51031:55:0;;-1:-1:-1;51024:62:0;;50868:624;-1:-1:-1;51476:4:0;50696:803;;;;;;:::o;87287:246::-;87348:4;;87369:8;87378:14;87391:1;87378:12;:14;:::i;:::-;87369:24;;;;;;;;:::i;:::-;;;;;;;;;:28;87365:161;;;87421:14;87434:1;87421:12;:14;:::i;87365:161::-;87484:30;87499:14;87512:1;87499:12;:14;:::i;:::-;87484;:30::i;87539:242::-;87598:4;;87619:8;87628:14;:12;87641:1;87628:14;:::i;:::-;87619:24;;;;;;;;:::i;:::-;;;;;;;;;:28;87615:159;;;87671:14;:12;87684:1;87671:14;:::i;87615:159::-;87734:28;87747:14;:12;87760:1;87747:14;:::i;:::-;87734:12;:28::i;47953:382::-;-1:-1:-1;;;;;48033:16:0;;48025:61;;;;-1:-1:-1;;;48025:61:0;;41769:2:1;48025:61:0;;;41751:21:1;;;41788:18;;;41781:30;41847:34;41827:18;;;41820:62;41899:18;;48025:61:0;41567:356:1;48025:61:0;48106:16;48114:7;48106;:16::i;:::-;48105:17;48097:58;;;;-1:-1:-1;;;48097:58:0;;35703:2:1;48097:58:0;;;35685:21:1;35742:2;35722:18;;;35715:30;35781;35761:18;;;35754:58;35829:18;;48097:58:0;35501:352:1;48097:58:0;48168:45;48197:1;48201:2;48205:7;48168:20;:45::i;:::-;-1:-1:-1;;;;;48226:13:0;;;;;;:9;:13;;;;;:18;;48243:1;;48226:13;:18;;48243:1;;48226:18;:::i;:::-;;;;-1:-1:-1;;48255:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;48255:21:0;-1:-1:-1;;;;;48255:21:0;;;;;;;;48294:33;;48255:16;;;48294:33;;48255:16;;48294:33;47953:382;;:::o;57679:988::-;57945:22;57995:1;57970:22;57987:4;57970:16;:22::i;:::-;:26;;;;:::i;:::-;58007:18;58028:26;;;:17;:26;;;;;;57945:51;;-1:-1:-1;58161:28:0;;;58157:328;;-1:-1:-1;;;;;58228:18:0;;58206:19;58228:18;;;:12;:18;;;;;;;;:34;;;;;;;;;58279:30;;;;;;:44;;;58396:30;;:17;:30;;;;;:43;;;58157:328;-1:-1:-1;58581:26:0;;;;:17;:26;;;;;;;;58574:33;;;-1:-1:-1;;;;;58625:18:0;;;;;:12;:18;;;;;:34;;;;;;;58618:41;57679:988::o;58962:1079::-;59240:10;:17;59215:22;;59240:21;;59260:1;;59240:21;:::i;:::-;59272:18;59293:24;;;:15;:24;;;;;;59666:10;:26;;59215:46;;-1:-1:-1;59293:24:0;;59215:46;;59666:26;;;;;;:::i;:::-;;;;;;;;;59644:48;;59730:11;59705:10;59716;59705:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;59810:28;;;:15;:28;;;;;;;:41;;;59982:24;;;;;59975:31;60017:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;59033:1008;;;58962:1079;:::o;56466:221::-;56551:14;56568:20;56585:2;56568:16;:20::i;:::-;-1:-1:-1;;;;;56599:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;56644:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;56466:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:673::-;479:5;532:3;525:4;517:6;513:17;509:27;499:55;;550:1;547;540:12;499:55;586:6;573:20;612:4;636:60;652:43;692:2;652:43;:::i;:::-;636:60;:::i;:::-;718:3;742:2;737:3;730:15;770:2;765:3;761:12;754:19;;805:2;797:6;793:15;857:3;852:2;846;843:1;839:10;831:6;827:23;823:32;820:41;817:61;;;874:1;871;864:12;817:61;896:1;906:163;920:2;917:1;914:9;906:163;;;977:17;;965:30;;1015:12;;;;1047;;;;938:1;931:9;906:163;;;-1:-1:-1;1087:5:1;;425:673;-1:-1:-1;;;;;;;425:673:1:o;1103:247::-;1162:6;1215:2;1203:9;1194:7;1190:23;1186:32;1183:52;;;1231:1;1228;1221:12;1183:52;1270:9;1257:23;1289:31;1314:5;1289:31;:::i;:::-;1339:5;1103:247;-1:-1:-1;;;1103:247:1:o;1355:251::-;1425:6;1478:2;1466:9;1457:7;1453:23;1449:32;1446:52;;;1494:1;1491;1484:12;1446:52;1526:9;1520:16;1545:31;1570:5;1545:31;:::i;1611:388::-;1679:6;1687;1740:2;1728:9;1719:7;1715:23;1711:32;1708:52;;;1756:1;1753;1746:12;1708:52;1795:9;1782:23;1814:31;1839:5;1814:31;:::i;:::-;1864:5;-1:-1:-1;1921:2:1;1906:18;;1893:32;1934:33;1893:32;1934:33;:::i;:::-;1986:7;1976:17;;;1611:388;;;;;:::o;2004:456::-;2081:6;2089;2097;2150:2;2138:9;2129:7;2125:23;2121:32;2118:52;;;2166:1;2163;2156:12;2118:52;2205:9;2192:23;2224:31;2249:5;2224:31;:::i;:::-;2274:5;-1:-1:-1;2331:2:1;2316:18;;2303:32;2344:33;2303:32;2344:33;:::i;:::-;2004:456;;2396:7;;-1:-1:-1;;;2450:2:1;2435:18;;;;2422:32;;2004:456::o;2465:794::-;2560:6;2568;2576;2584;2637:3;2625:9;2616:7;2612:23;2608:33;2605:53;;;2654:1;2651;2644:12;2605:53;2693:9;2680:23;2712:31;2737:5;2712:31;:::i;:::-;2762:5;-1:-1:-1;2819:2:1;2804:18;;2791:32;2832:33;2791:32;2832:33;:::i;:::-;2884:7;-1:-1:-1;2938:2:1;2923:18;;2910:32;;-1:-1:-1;2993:2:1;2978:18;;2965:32;3020:18;3009:30;;3006:50;;;3052:1;3049;3042:12;3006:50;3075:22;;3128:4;3120:13;;3116:27;-1:-1:-1;3106:55:1;;3157:1;3154;3147:12;3106:55;3180:73;3245:7;3240:2;3227:16;3222:2;3218;3214:11;3180:73;:::i;:::-;3170:83;;;2465:794;;;;;;;:::o;3264:382::-;3329:6;3337;3390:2;3378:9;3369:7;3365:23;3361:32;3358:52;;;3406:1;3403;3396:12;3358:52;3445:9;3432:23;3464:31;3489:5;3464:31;:::i;:::-;3514:5;-1:-1:-1;3571:2:1;3556:18;;3543:32;3584:30;3543:32;3584:30;:::i;3651:315::-;3719:6;3727;3780:2;3768:9;3759:7;3755:23;3751:32;3748:52;;;3796:1;3793;3786:12;3748:52;3835:9;3822:23;3854:31;3879:5;3854:31;:::i;:::-;3904:5;3956:2;3941:18;;;;3928:32;;-1:-1:-1;;;3651:315:1:o;3971:348::-;4055:6;4108:2;4096:9;4087:7;4083:23;4079:32;4076:52;;;4124:1;4121;4114:12;4076:52;4164:9;4151:23;4197:18;4189:6;4186:30;4183:50;;;4229:1;4226;4219:12;4183:50;4252:61;4305:7;4296:6;4285:9;4281:22;4252:61;:::i;4324:1149::-;4442:6;4450;4503:2;4491:9;4482:7;4478:23;4474:32;4471:52;;;4519:1;4516;4509:12;4471:52;4559:9;4546:23;4588:18;4629:2;4621:6;4618:14;4615:34;;;4645:1;4642;4635:12;4615:34;4668:61;4721:7;4712:6;4701:9;4697:22;4668:61;:::i;:::-;4658:71;;4748:2;4738:12;;4803:2;4792:9;4788:18;4775:32;4832:2;4822:8;4819:16;4816:36;;;4848:1;4845;4838:12;4816:36;4871:24;;;-1:-1:-1;4926:4:1;4918:13;;4914:27;-1:-1:-1;4904:55:1;;4955:1;4952;4945:12;4904:55;4991:2;4978:16;5014:60;5030:43;5070:2;5030:43;:::i;5014:60::-;5096:3;5120:2;5115:3;5108:15;5148:2;5143:3;5139:12;5132:19;;5179:2;5175;5171:11;5227:7;5222:2;5216;5213:1;5209:10;5205:2;5201:19;5197:28;5194:41;5191:61;;;5248:1;5245;5238:12;5191:61;5270:1;5261:10;;5280:163;5294:2;5291:1;5288:9;5280:163;;;5351:17;;5339:30;;5312:1;5305:9;;;;;5389:12;;;;5421;;5280:163;;;5284:3;5462:5;5452:15;;;;;;;4324:1149;;;;;:::o;5478:892::-;5573:6;5604:2;5647;5635:9;5626:7;5622:23;5618:32;5615:52;;;5663:1;5660;5653:12;5615:52;5696:9;5690:16;5729:18;5721:6;5718:30;5715:50;;;5761:1;5758;5751:12;5715:50;5784:22;;5837:4;5829:13;;5825:27;-1:-1:-1;5815:55:1;;5866:1;5863;5856:12;5815:55;5895:2;5889:9;5918:60;5934:43;5974:2;5934:43;:::i;5918:60::-;6000:3;6024:2;6019:3;6012:15;6052:2;6047:3;6043:12;6036:19;;6083:2;6079;6075:11;6131:7;6126:2;6120;6117:1;6113:10;6109:2;6105:19;6101:28;6098:41;6095:61;;;6152:1;6149;6142:12;6095:61;6174:1;6165:10;;6184:156;6198:2;6195:1;6192:9;6184:156;;;6255:10;;6243:23;;6216:1;6209:9;;;;;6286:12;;;;6318;;6184:156;;;-1:-1:-1;6359:5:1;5478:892;-1:-1:-1;;;;;;;5478:892:1:o;6375:245::-;6442:6;6495:2;6483:9;6474:7;6470:23;6466:32;6463:52;;;6511:1;6508;6501:12;6463:52;6543:9;6537:16;6562:28;6584:5;6562:28;:::i;6625:248::-;6693:6;6701;6754:2;6742:9;6733:7;6729:23;6725:32;6722:52;;;6770:1;6767;6760:12;6722:52;-1:-1:-1;;6793:23:1;;;6863:2;6848:18;;;6835:32;;-1:-1:-1;6625:248:1:o;6878:245::-;6936:6;6989:2;6977:9;6968:7;6964:23;6960:32;6957:52;;;7005:1;7002;6995:12;6957:52;7044:9;7031:23;7063:30;7087:5;7063:30;:::i;7128:249::-;7197:6;7250:2;7238:9;7229:7;7225:23;7221:32;7218:52;;;7266:1;7263;7256:12;7218:52;7298:9;7292:16;7317:30;7341:5;7317:30;:::i;7382:450::-;7451:6;7504:2;7492:9;7483:7;7479:23;7475:32;7472:52;;;7520:1;7517;7510:12;7472:52;7560:9;7547:23;7593:18;7585:6;7582:30;7579:50;;;7625:1;7622;7615:12;7579:50;7648:22;;7701:4;7693:13;;7689:27;-1:-1:-1;7679:55:1;;7730:1;7727;7720:12;7679:55;7753:73;7818:7;7813:2;7800:16;7795:2;7791;7787:11;7753:73;:::i;7837:180::-;7896:6;7949:2;7937:9;7928:7;7924:23;7920:32;7917:52;;;7965:1;7962;7955:12;7917:52;-1:-1:-1;7988:23:1;;7837:180;-1:-1:-1;7837:180:1:o;8022:184::-;8092:6;8145:2;8133:9;8124:7;8120:23;8116:32;8113:52;;;8161:1;8158;8151:12;8113:52;-1:-1:-1;8184:16:1;;8022:184;-1:-1:-1;8022:184:1:o;8464:273::-;8532:6;8585:2;8573:9;8564:7;8560:23;8556:32;8553:52;;;8601:1;8598;8591:12;8553:52;8633:9;8627:16;8683:4;8676:5;8672:16;8665:5;8662:27;8652:55;;8703:1;8700;8693:12;8742:257;8783:3;8821:5;8815:12;8848:6;8843:3;8836:19;8864:63;8920:6;8913:4;8908:3;8904:14;8897:4;8890:5;8886:16;8864:63;:::i;:::-;8981:2;8960:15;-1:-1:-1;;8956:29:1;8947:39;;;;8988:4;8943:50;;8742:257;-1:-1:-1;;8742:257:1:o;9004:185::-;9046:3;9084:5;9078:12;9099:52;9144:6;9139:3;9132:4;9125:5;9121:16;9099:52;:::i;:::-;9167:16;;;;;9004:185;-1:-1:-1;;9004:185:1:o;9194:973::-;9279:12;;9244:3;;9334:1;9354:18;;;;9407;;;;9434:61;;9488:4;9480:6;9476:17;9466:27;;9434:61;9514:2;9562;9554:6;9551:14;9531:18;9528:38;9525:161;;;9608:10;9603:3;9599:20;9596:1;9589:31;9643:4;9640:1;9633:15;9671:4;9668:1;9661:15;9525:161;9702:18;9729:104;;;;9847:1;9842:319;;;;9695:466;;9729:104;-1:-1:-1;;9762:24:1;;9750:37;;9807:16;;;;-1:-1:-1;9729:104:1;;9842:319;49307:1;49300:14;;;49344:4;49331:18;;9936:1;9950:165;9964:6;9961:1;9958:13;9950:165;;;10042:14;;10029:11;;;10022:35;10085:16;;;;9979:10;;9950:165;;;9954:3;;10144:6;10139:3;10135:16;10128:23;;9695:466;;;;;;;9194:973;;;;:::o;12269:276::-;12400:3;12438:6;12432:13;12454:53;12500:6;12495:3;12488:4;12480:6;12476:17;12454:53;:::i;:::-;12523:16;;;;;12269:276;-1:-1:-1;;12269:276:1:o;12550:470::-;12729:3;12767:6;12761:13;12783:53;12829:6;12824:3;12817:4;12809:6;12805:17;12783:53;:::i;:::-;12899:13;;12858:16;;;;12921:57;12899:13;12858:16;12955:4;12943:17;;12921:57;:::i;:::-;12994:20;;12550:470;-1:-1:-1;;;;12550:470:1:o;13025:858::-;13300:3;13338:6;13332:13;13354:53;13400:6;13395:3;13388:4;13380:6;13376:17;13354:53;:::i;:::-;13470:13;;13429:16;;;;13492:57;13470:13;13429:16;13526:4;13514:17;;13492:57;:::i;:::-;13616:13;;13571:20;;;13638:57;13616:13;13571:20;13672:4;13660:17;;13638:57;:::i;:::-;13762:13;;13717:20;;;13784:57;13762:13;13717:20;13818:4;13806:17;;13784:57;:::i;:::-;13857:20;;13025:858;-1:-1:-1;;;;;;13025:858:1:o;13888:1052::-;14211:3;14249:6;14243:13;14265:53;14311:6;14306:3;14299:4;14291:6;14287:17;14265:53;:::i;:::-;14381:13;;14340:16;;;;14403:57;14381:13;14340:16;14437:4;14425:17;;14403:57;:::i;:::-;14527:13;;14482:20;;;14549:57;14527:13;14482:20;14583:4;14571:17;;14549:57;:::i;:::-;14673:13;;14628:20;;;14695:57;14673:13;14628:20;14729:4;14717:17;;14695:57;:::i;:::-;14819:13;;14774:20;;;14841:57;14819:13;14774:20;14875:4;14863:17;;14841:57;:::i;:::-;14914:20;;13888:1052;-1:-1:-1;;;;;;;13888:1052:1:o;14945:1449::-;15364:3;15402:6;15396:13;15428:4;15441:51;15485:6;15480:3;15475:2;15467:6;15463:15;15441:51;:::i;:::-;15555:13;;15514:16;;;;15577:55;15555:13;15514:16;15599:15;;;15577:55;:::i;:::-;15699:13;;15654:20;;;15721:55;15699:13;15654:20;15743:15;;;15721:55;:::i;:::-;15843:13;;15798:20;;;15865:55;15843:13;15798:20;15887:15;;;15865:55;:::i;:::-;15987:13;;15942:20;;;16009:55;15987:13;15942:20;16031:15;;;16009:55;:::i;:::-;16131:13;;16086:20;;;16153:55;16131:13;16086:20;16175:15;;;16153:55;:::i;:::-;16275:13;;16230:20;;;16297:55;16275:13;16230:20;16319:15;;;16297:55;:::i;:::-;16368:20;;;;;14945:1449;-1:-1:-1;;;;;;;;;;14945:1449:1:o;16399:2304::-;-1:-1:-1;;;17792:17:1;;-1:-1:-1;;;17834:1:1;17825:11;;17818:69;-1:-1:-1;17906:47:1;17949:2;17940:12;;17932:6;17906:47;:::i;:::-;-1:-1:-1;;;17999:2:1;17995;17988:14;18031:6;18025:13;18047:60;18100:6;18096:1;18092:2;18088:10;18081:4;18073:6;18069:17;18047:60;:::i;:::-;-1:-1:-1;;;18165:1:1;18126:15;;;;18157:10;;;18150:26;18201:13;;18223:62;18201:13;18272:1;18264:10;;18257:4;18245:17;;18223:62;:::i;:::-;-1:-1:-1;;;18345:1:1;18304:17;;;;18337:10;;;18330:34;-1:-1:-1;;;18388:2:1;18380:11;;18373:63;18455:46;18497:2;18489:11;;18481:6;18455:46;:::i;:::-;18510:14;;;18445:56;-1:-1:-1;18540:157:1;18570:126;18600:95;18626:68;18656:37;18690:1;18682:10;;18674:6;18656:37;:::i;:::-;-1:-1:-1;;;10237:19:1;;10281:1;10272:11;;10172:117;18626:68;18618:6;18600:95;:::i;:::-;-1:-1:-1;;;10927:25:1;;10977:1;10968:11;;10862:123;18570:126;-1:-1:-1;;;11055:16:1;;11096:1;11087:11;;10990:114;18540:157;18533:164;16399:2304;-1:-1:-1;;;;;;;;;16399:2304:1:o;18708:1409::-;-1:-1:-1;;;19511:16:1;;19556:66;19552:1;19543:11;;19536:87;-1:-1:-1;;;19648:2:1;19639:12;;19632:54;19709:13;;-1:-1:-1;;19731:62:1;19709:13;19781:2;19772:12;;19765:4;19753:17;;19731:62;:::i;:::-;-1:-1:-1;;;19852:2:1;19812:16;;;19844:11;;;19837:25;19887:13;;19909:63;19887:13;19958:2;19950:11;;19943:4;19931:17;;19909:63;:::i;:::-;-1:-1:-1;;;20032:2:1;19991:17;;;;20024:11;;;20017:33;-1:-1:-1;;;20074:2:1;20066:11;;20059:25;20108:2;20100:11;;18708:1409;-1:-1:-1;;;;18708:1409:1:o;20122:2698::-;-1:-1:-1;;;21772:3:1;21765:16;21810:66;21806:1;21801:3;21797:11;21790:87;21747:3;21906:6;21900:13;21922:62;21977:6;21972:2;21967:3;21963:12;21956:4;21948:6;21944:17;21922:62;:::i;:::-;-1:-1:-1;;;22043:2:1;22003:16;;;22035:11;;;22028:32;22085:13;;22107:63;22085:13;22156:2;22148:11;;22141:4;22129:17;;22107:63;:::i;:::-;-1:-1:-1;;;22230:2:1;22189:17;;;;22222:11;;;22215:37;-1:-1:-1;;;22276:2:1;22268:11;;22261:53;22333:46;22375:2;22367:11;;22359:6;22333:46;:::i;:::-;22323:56;;22410:6;22404:13;22426:54;22471:8;22467:2;22460:4;22452:6;22448:17;22426:54;:::i;:::-;22496:318;22526:287;22556:256;22581:230;22607:203;22637:172;22663:145;22693:114;22727:79;22757:48;22795:8;22791:2;22787:17;-1:-1:-1;;;11174:37:1;;11236:1;11227:11;;11109:135;22757:48;-1:-1:-1;;;10764:59:1;;10848:2;10839:12;;10699:158;22727:79;22719:6;22693:114;:::i;:::-;-1:-1:-1;;;11473:20:1;;11518:1;11509:11;;11408:118;22663:145;22655:6;22637:172;:::i;22607:203::-;22599:6;22581:230;:::i;:::-;-1:-1:-1;;;10354:27:1;;10406:1;10397:11;;10294:120;22556:256;10496:66;10484:79;;10593:66;10588:2;10579:12;;10572:88;10685:2;10676:12;;10419:275;22526:287;-1:-1:-1;;;11314:55:1;;11394:2;11385:12;;11249:154;22496:318;22489:325;20122:2698;-1:-1:-1;;;;;;;;;;;20122:2698:1:o;22825:1078::-;-1:-1:-1;;;23479:16:1;;23524:66;23520:1;23511:11;;23504:87;-1:-1:-1;;;23616:2:1;23607:12;;23600:54;23677:13;;-1:-1:-1;;23699:60:1;23677:13;23747:2;23738:12;;23733:2;23721:15;;23699:60;:::i;:::-;-1:-1:-1;;;23818:2:1;23778:16;;;;23810:11;;;23803:33;-1:-1:-1;;;;23860:2:1;23852:11;;23845:25;23894:2;23886:11;;22825:1078;-1:-1:-1;22825:1078:1:o;23908:2072::-;25097:3;-1:-1:-1;;;25149:2:1;25144:3;25137:15;25181:66;25177:1;25172:3;25168:11;25161:87;25287:22;25282:3;25278:32;25273:2;25268:3;25264:12;25257:54;25340:6;25334:13;25356:60;25409:6;25404:2;25399:3;25395:12;25390:2;25382:6;25378:15;25356:60;:::i;:::-;-1:-1:-1;;;25506:2:1;25435:16;;;25498:11;;;25491:23;;;-1:-1:-1;;;25538:2:1;25530:11;;25523:25;25572:2;25564:11;;25557:23;;;;25609:66;25604:2;25596:11;;25589:87;-1:-1:-1;;;25700:2:1;25692:11;;25685:55;25765:13;;;25787:61;25765:13;25834:2;25826:11;;25821:2;25809:15;;25787:61;:::i;:::-;25867:17;;25908:2;25900:11;;25893:23;;;;-1:-1:-1;;;25970:2:1;25962:11;;11055:16;11087:11;;;25932:42;10990:114;25985:2076;27174:3;-1:-1:-1;;;27226:2:1;27221:3;27214:15;27258:66;27254:1;27249:3;27245:11;27238:87;27353:22;27348:3;27344:32;27406:2;27401;27396:3;27392:12;27385:24;27438:6;27432:13;27454:62;27509:6;27504:2;27499:3;27495:12;27488:4;27480:6;27476:17;27454:62;:::i;:::-;-1:-1:-1;;;27606:2:1;27535:16;;;27598:11;;;27591:23;;;-1:-1:-1;;;27661:2:1;27653:11;;27646:23;;;27693:2;27685:11;;27678:23;;;;-1:-1:-1;;;27725:2:1;27717:11;;27710:76;27810:2;27802:11;;27795:23;;;27843:13;;;27865:63;27843:13;27914:2;27906:11;;27899:4;27887:17;;27865:63;:::i;:::-;27988:2;27947:17;;;;27980:11;;;27973:23;28020:2;28012:11;;28005:23;;;;-1:-1:-1;28052:2:1;28044:11;;25985:2076;-1:-1:-1;;;;25985:2076:1:o;28066:1409::-;-1:-1:-1;;;28869:16:1;;28914:66;28910:1;28901:11;;28894:87;-1:-1:-1;;;29006:2:1;28997:12;;28990:54;29067:13;;-1:-1:-1;;29089:62:1;29067:13;29139:2;29130:12;;29123:4;29111:17;;29089:62;:::i;29480:448::-;29742:31;29737:3;29730:44;29712:3;29803:6;29797:13;29819:62;29874:6;29869:2;29864:3;29860:12;29853:4;29845:6;29841:17;29819:62;:::i;:::-;29901:16;;;;29919:2;29897:25;;29480:448;-1:-1:-1;;29480:448:1:o;29933:525::-;30172:19;;;30247:3;30225:16;;;;-1:-1:-1;;;;;;30221:43:1;30216:2;30207:12;;30200:65;30303:2;30299:15;;;;-1:-1:-1;;;;;;30295:53:1;30290:2;30281:12;;30274:75;30374:2;30365:12;;30358:28;30411:2;30402:12;;30395:28;30448:3;30439:13;;29933:525::o;30671:488::-;-1:-1:-1;;;;;30940:15:1;;;30922:34;;30992:15;;30987:2;30972:18;;30965:43;31039:2;31024:18;;31017:34;;;31087:3;31082:2;31067:18;;31060:31;;;30865:4;;31108:45;;31133:19;;31125:6;31108:45;:::i;:::-;31100:53;30671:488;-1:-1:-1;;;;;;30671:488:1:o;31164:385::-;31396:1;31392;31387:3;31383:11;31379:19;31371:6;31367:32;31356:9;31349:51;31436:6;31431:2;31420:9;31416:18;31409:34;31479:2;31474;31463:9;31459:18;31452:30;31330:4;31499:44;31539:2;31528:9;31524:18;31516:6;31499:44;:::i;32937:219::-;33086:2;33075:9;33068:21;33049:4;33106:44;33146:2;33135:9;33131:18;33123:6;33106:44;:::i;34675:414::-;34877:2;34859:21;;;34916:2;34896:18;;;34889:30;34955:34;34950:2;34935:18;;34928:62;-1:-1:-1;;;35021:2:1;35006:18;;34999:48;35079:3;35064:19;;34675:414::o;37773:349::-;37975:2;37957:21;;;38014:2;37994:18;;;37987:30;38053:27;38048:2;38033:18;;38026:55;38113:2;38098:18;;37773:349::o;38552:341::-;38754:2;38736:21;;;38793:2;38773:18;;;38766:30;-1:-1:-1;;;38827:2:1;38812:18;;38805:47;38884:2;38869:18;;38552:341::o;40069:399::-;40271:2;40253:21;;;40310:2;40290:18;;;40283:30;40349:34;40344:2;40329:18;;40322:62;-1:-1:-1;;;40415:2:1;40400:18;;40393:33;40458:3;40443:19;;40069:399::o;40473:397::-;40675:2;40657:21;;;40714:2;40694:18;;;40687:30;40753:34;40748:2;40733:18;;40726:62;-1:-1:-1;;;40819:2:1;40804:18;;40797:31;40860:3;40845:19;;40473:397::o;43054:356::-;43256:2;43238:21;;;43275:18;;;43268:30;43334:34;43329:2;43314:18;;43307:62;43401:2;43386:18;;43054:356::o;44545:400::-;44747:2;44729:21;;;44786:2;44766:18;;;44759:30;44825:34;44820:2;44805:18;;44798:62;-1:-1:-1;;;44891:2:1;44876:18;;44869:34;44935:3;44920:19;;44545:400::o;45352:397::-;45554:2;45536:21;;;45593:2;45573:18;;;45566:30;45632:34;45627:2;45612:18;;45605:62;-1:-1:-1;;;45698:2:1;45683:18;;45676:31;45739:3;45724:19;;45352:397::o;46103:413::-;46305:2;46287:21;;;46344:2;46324:18;;;46317:30;46383:34;46378:2;46363:18;;46356:62;-1:-1:-1;;;46449:2:1;46434:18;;46427:47;46506:3;46491:19;;46103:413::o;47276:355::-;47478:2;47460:21;;;47517:2;47497:18;;;47490:30;47556:33;47551:2;47536:18;;47529:61;47622:2;47607:18;;47276:355::o;47987:339::-;48189:2;48171:21;;;48228:2;48208:18;;;48201:30;-1:-1:-1;;;48262:2:1;48247:18;;48240:45;48317:2;48302:18;;47987:339::o;48766:275::-;48837:2;48831:9;48902:2;48883:13;;-1:-1:-1;;48879:27:1;48867:40;;48937:18;48922:34;;48958:22;;;48919:62;48916:88;;;48984:18;;:::i;:::-;49020:2;49013:22;48766:275;;-1:-1:-1;48766:275:1:o;49046:183::-;49106:4;49139:18;49131:6;49128:30;49125:56;;;49161:18;;:::i;:::-;-1:-1:-1;49206:1:1;49202:14;49218:4;49198:25;;49046:183::o;49360:128::-;49400:3;49431:1;49427:6;49424:1;49421:13;49418:39;;;49437:18;;:::i;:::-;-1:-1:-1;49473:9:1;;49360:128::o;49493:228::-;49532:3;49560:10;49597:2;49594:1;49590:10;49627:2;49624:1;49620:10;49658:3;49654:2;49650:12;49645:3;49642:21;49639:47;;;49666:18;;:::i;49726:120::-;49766:1;49792;49782:35;;49797:18;;:::i;:::-;-1:-1:-1;49831:9:1;;49726:120::o;49851:168::-;49891:7;49957:1;49953;49949:6;49945:14;49942:1;49939:21;49934:1;49927:9;49920:17;49916:45;49913:71;;;49964:18;;:::i;:::-;-1:-1:-1;50004:9:1;;49851:168::o;50024:125::-;50064:4;50092:1;50089;50086:8;50083:34;;;50097:18;;:::i;:::-;-1:-1:-1;50134:9:1;;50024:125::o;50154:258::-;50226:1;50236:113;50250:6;50247:1;50244:13;50236:113;;;50326:11;;;50320:18;50307:11;;;50300:39;50272:2;50265:10;50236:113;;;50367:6;50364:1;50361:13;50358:48;;;-1:-1:-1;;50402:1:1;50384:16;;50377:27;50154:258::o;50417:136::-;50456:3;50484:5;50474:39;;50493:18;;:::i;:::-;-1:-1:-1;;;50529:18:1;;50417:136::o;50558:380::-;50637:1;50633:12;;;;50680;;;50701:61;;50755:4;50747:6;50743:17;50733:27;;50701:61;50808:2;50800:6;50797:14;50777:18;50774:38;50771:161;;;50854:10;50849:3;50845:20;50842:1;50835:31;50889:4;50886:1;50879:15;50917:4;50914:1;50907:15;50771:161;;50558:380;;;:::o;50943:135::-;50982:3;-1:-1:-1;;51003:17:1;;51000:43;;;51023:18;;:::i;:::-;-1:-1:-1;51070:1:1;51059:13;;50943:135::o;51083:112::-;51115:1;51141;51131:35;;51146:18;;:::i;:::-;-1:-1:-1;51180:9:1;;51083:112::o;51200:183::-;51231:1;51257:10;51294:2;51291:1;51287:10;51316:3;51306:37;;51323:18;;:::i;:::-;51361:10;;51357:20;;;;;51200:183;-1:-1:-1;;51200:183:1:o;51388:127::-;51449:10;51444:3;51440:20;51437:1;51430:31;51480:4;51477:1;51470:15;51504:4;51501:1;51494:15;51520:127;51581:10;51576:3;51572:20;51569:1;51562:31;51612:4;51609:1;51602:15;51636:4;51633:1;51626:15;51652:127;51713:10;51708:3;51704:20;51701:1;51694:31;51744:4;51741:1;51734:15;51768:4;51765:1;51758:15;51784:127;51845:10;51840:3;51836:20;51833:1;51826:31;51876:4;51873:1;51866:15;51900:4;51897:1;51890:15;51916:127;51977:10;51972:3;51968:20;51965:1;51958:31;52008:4;52005:1;51998:15;52032:4;52029:1;52022:15;52048:131;-1:-1:-1;;;;;52123:31:1;;52113:42;;52103:70;;52169:1;52166;52159:12;52184:118;52270:5;52263:13;52256:21;52249:5;52246:32;52236:60;;52292:1;52289;52282:12;52307:131;-1:-1:-1;;;;;;52381:32:1;;52371:43;;52361:71;;52428:1;52425;52418:12

Swarm Source

ipfs://c226395b10bafba145ba7816ae597a33a7683d2fa0977284e951d49a758f3a7e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.