ETH Price: $2,804.21 (-5.01%)

Alchemists (ALCH)

Overview

TokenID

7

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
Alchemists

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 100 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Nova.Arbiscan.io on 2023-07-27
*/

// SPDX-License-Identifier: MIT
// Based on Loot (for Adventurers)
pragma solidity ^0.8.0;

/**
 * @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), "ERC721Metadata: URI query for nonexistent token");

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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







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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


contract Alchemists is ERC721Enumerable, ReentrancyGuard, Ownable {


    string[] private hand = [
        "Fist",
        "Glove",
        "TC Glove",
        "TC Tattoo",
        "Katana",
        "Brass Knuckles",
        "Automail Hand",
        "Rockbell Automail Hand"
    ];
    
    string[] private leftPocket = [
        "Empty",
        "Empty",
        "Empty",
        "Empty",
        "1 Cens",
        "8 Cens",
        "64 Cens",
        "128 Cens"
    ];

    string[] private rightPocket = [
        "Empty",
        "Empty",
        "Empty",
        "Empty",
        "1 Cens",
        "8 Cens",
        "64 Cens",
        "Bronze Bar"
    ];
    
    
    string[] private wallet = [
        "Empty",
        "1 Cens",
        "2 Cens",
        "4 Cens",
        "8 Cens",
        "16 Cens",
        "32 Cens",
        "64 Cens"
    ];
    
    string[] private arm = [
        "Arm",
        "Arm",
        "Arm",
        "Arm",
        "TC Tattoo",
        "TC Tattoo",
        "TA Sleeve",
        "Automail Arm"
    ];
    
    string[] private eyeColor = [
        "Brown",
        "Brown",
        "Brown",
        "Brown",
        "Blue",
        "Blue",
        "Blue",
        "Green",
        "Green",
        "Green",
        "Red",
        "White",
        "Baby Blue",
        "Purple",
        "Black"
    ];
    
    string[] private hairColor = [
        "Blonde",
        "Brown",
        "Black",
        "Red",
        "Dirty Blonde",
        "Dark Brown",
        "Light Brown",
        "Light Blonde",
        "White",
        "Gray",
        "Salt N Pepper",
        "Blue",
        "Purple"
    ];
    
    string[] private skinTone = [
        "A",
        "B",
        "C",
        "D",
        "E",
        "F"
    ];

    string[] private skinDarkness = [
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
        "10",
        "11",
        "12"
    ];

    string[] private statValues = [
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
        "10"
        ];
    
    string[] private affinity = [
        "Water",
        "Fire",
        "Blood Rune",
        "Earth",
        "Transformation",
        "Chimeric",
        "Construction",
        "Deconstruction"
    ];
    
    string[] private qualities = [
        "Good",
        "Good",
        "Superior",
        "Perfect"
    ];
    
    string[] private beauties = [
        "Pretty",
        "Beautiful",
        "Godlike"
        ];
    
    mapping (string => string[6]) darknessToHexArray;
    
    
            
    function cssRarity() internal pure returns (string memory) {
        return string(abi.encodePacked(
        '.small {font-size: 12px; } .big {font-size: 20px;} ',
            '.epic {fill: #bdb2ff; filter: drop-shadow(1px 1px 0 black);} ',
            '.leg {fill: #fb5607; filter: drop-shadow(1px 1px 0 black);} ',
            '.rare {fill: #9bf6ff; filter: drop-shadow(1px 1px 0 black);} '
        ));
    }
    
    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }
    
    function getStat(uint256 tokenId, string memory stat) public view returns (string memory) {
        return pluckComp(tokenId, stat, statValues);
    }
    
    function getComprehension(uint256 tokenId, string memory comprehension) public view returns (string memory) {
        return pluckComp(tokenId, comprehension, statValues);
    }
    
    function getAffinity(uint256 tokenId) public view returns (string memory) {
        return pluckAffinity(tokenId, "AFFI", affinity);
    }
    
    function getHand(uint256 tokenId, bool isLeft) public view returns (string memory) {
        string memory theHand = "RHAND";
        if (isLeft) {
            theHand = "LHAND";
        }
        return pluckHand(tokenId, theHand, hand);
    }

    function getArm(uint256 tokenId, bool isLeft) public view returns (string memory) {
        string memory theArm = "RARM";
        if (isLeft) {
            theArm = "LARM";
        }
        return pluckArm(tokenId, theArm, arm);
    }


    function getPocket(uint256 tokenId, bool isLeft) public view returns (string memory) {
        string memory thePocket = "RPOCK";
        string[] memory thePocketArray = rightPocket;
        if (isLeft) {
            thePocket = "LPOCK";
            thePocketArray = leftPocket;
        }
        return pluckPocket(tokenId, thePocket, thePocketArray);
    }
    
    function getWallet(uint256 tokenId) public view returns (string memory) {
        return pluckWallet(tokenId, "WALLET", wallet);
    }

    function getHairColor(uint256 tokenId) public view returns (string memory) {
        return pluckCosmetic(tokenId, "HAIR", hairColor);
    }

    function getEyeColor(uint256 tokenId) public view returns (string memory) {
        return pluckCosmetic(tokenId, "EYES", eyeColor);
    }

    function getSkinTone(uint256 tokenId) public view returns (string memory) {
        return pluckCosmetic(tokenId, "SKINT", skinTone);
    }

    function getSkinDarkness(uint256 tokenId) public view returns (string memory) {
        return pluckCosmetic(tokenId, "SKIND", skinDarkness);
    }
    

    mapping (string => string) compKeyToName;

    


    mapping (string => string) private pocketToCrit;
    mapping (string => string) private pocketToMaxCrit;
    mapping (string => string) private lrToMaxCrit;
    
    mapping (string => string) private eyeColorToHex;
    
    function getGreatness(uint256 tokenId, string memory keyPrefix) internal pure returns (uint256) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        uint256 greatness = rand % 21;
        return(greatness);
    }
    
    function getPrePlucked(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray) internal pure returns (uint256) {
        return random(string(abi.encodePacked(keyPrefix, toString(tokenId)))) % sourceArray.length;
    }
    
    function getSkinDarknessPrePlucked(uint256 tokenId) public view returns (string memory) {
        return skinDarkness[getPrePlucked(tokenId, "SKIND", skinDarkness)];
    }
    
    function getSkinTonePrePlucked(uint256 tokenId) public view returns (uint256) {
        return getPrePlucked(tokenId, "SKIND", skinTone);
    }
    
    function getSkinColor(uint256 tokenId) public view returns (string memory) {
       return string(
           abi.encodePacked(
               "#",
               darknessToHexArray[getSkinDarknessPrePlucked(tokenId)][getSkinTonePrePlucked(tokenId)]));
    }
    
    function getTier (uint tokenId, string memory keyPrefix) internal pure returns (string memory) {
        uint256 greatness = getGreatness(tokenId, keyPrefix);
        if (greatness > 19) {
            return "leg";
        } else {
            if (greatness > 18) {
                return "epic";
            } else {
                if (greatness > 14) {
                    return "rare";
                } else {
                    return "base";
                }
            }
        }
        
    }
    
    function pluckHand(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray) internal view returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        uint256 greatness = rand % 21;
      
        if (greatness > 14 && greatness < 19) {
            output = string(abi.encodePacked(qualities[0]," ",output));
        }
        if (greatness >= 19) {
            if (greatness == 19) {
                output = string(abi.encodePacked(qualities[2]," ", output));
            } else {
                output = string(abi.encodePacked(qualities[3]," ", output));
            }
        }

        

        return output;
    }

    function pluckCosmetic(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray) internal view returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        uint256 greatness = rand % 21;
        if (greatness > 14 && greatness < 19) {
            output = string(abi.encodePacked(beauties[0]," ",output));
        }
        if (greatness >= 19) {
            if (greatness == 19) {
                output = string(abi.encodePacked(beauties[1]," ", output));
            } else {
                output = string(abi.encodePacked(beauties[2]," ", output));
            }
        }
         
        return output;
     }

    function pluckComp(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray) internal pure returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        uint256 greatness = rand % 21;
        if (greatness > 14 && greatness < 19) {
            output = string(abi.encodePacked(toString(10 + greatness - 14)));
        }
        if (greatness >= 19) {
            if (greatness == 19) {
                output = string(abi.encodePacked("15"));
            } else {
                output = string(abi.encodePacked("18"));
            }
        }
        
        return output;
    }

    function pluckAffinity(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray) internal pure returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        uint256 greatness = rand % 21;
        if (greatness < 15) {
            output = string(abi.encodePacked(output, " Alchemist"));
        }
        if (greatness > 14 && greatness < 19) {
            output = string(abi.encodePacked("Master Rank ", toString(19 - greatness), " ", output, " Alchemist"));
        }
        if (greatness >= 19) {
            if (greatness == 19) {
                output = string(abi.encodePacked("Master of Alkahestry"));
            } else {
                output = string(abi.encodePacked("Master of Truth"));
            }
        }
        return output;
    }

    function pluckArm(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray) internal view returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        uint256 greatness = rand % 21;
 
            if (greatness > 14 && greatness < 19) {
                output = string(abi.encodePacked(qualities[greatness - 15], " ", output));
            }
            if (greatness >= 19) {
                if (greatness == 19) {
                    output = string(abi.encodePacked("Rockbell Automail Arm"));
                } else {
                    
                    output = string(abi.encodePacked(lrToMaxCrit[keyPrefix], " Sleeve"));
                }
            }
         return output;   
        
    }
    function pluckPocket(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray) internal view returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        uint256 greatness = rand % 21;               
        if (greatness > 14 && greatness < 19) {
                output = string(abi.encodePacked(sourceArray[greatness - 15 + 4]));
            }
        if (greatness >= 19) {
            if (greatness == 19) {
                output = string(abi.encodePacked(pocketToCrit[keyPrefix]));
            } else {
                output = string(abi.encodePacked(pocketToMaxCrit[keyPrefix]));
            }
        }
        
        return output;
    }

    function pluckWallet(
        uint256 tokenId, 
        string memory keyPrefix, 
        string[] memory sourceArray) 
    internal pure returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        uint256 greatness = rand % 21; 
        if (greatness > 14 && greatness < 19) {
                output = string(abi.encodePacked(sourceArray[greatness - 15 + 4]));
            }
            if (greatness >= 19) {
                if (greatness == 19) {
                    output = string(abi.encodePacked("640 Cens"));
                } else {
                    output = string(abi.encodePacked("6400 Cens"));
                }
            }
        
                         
        return output;
    }

    function svgTextOpenClose(uint256 x, uint256 y, string memory cssClass) internal pure returns (string memory) {
        return string(abi.encodePacked('</text><text x="',toString(x),'" y="',toString(y),'" class="',cssClass,'">'));
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        string[23] memory parts;
        string memory textColor = "white";
        if (getPrePlucked(tokenId, "SKIND", skinDarkness) < 4) {
            textColor = "black";
        }
        
        parts[0] = string(abi.encodePacked(
            '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350">',
            '<style>.base { fill: ',
            textColor,
            '; font-family: serif; font-size: 14px; } ',
            cssRarity(),
            '</style><rect width="100%" height="100%" fill="',
            getSkinColor(tokenId),
            '"/>'
            ));
        parts[1] = string(abi.encodePacked(
                '<text x="16" y="24" class="',
                getTier(tokenId,"AFFI"),
                " big",
                '">',
                getAffinity(tokenId)));
        parts[2] = string(abi.encodePacked(
            svgTextOpenClose(290,230,"base"),
            "Stats",
            svgTextOpenClose(290,250,string(abi.encodePacked(getTier(tokenId, "INT")," small")))
            ));
        parts[3] = string(abi.encodePacked(
            "INT ", 
            getStat(tokenId, "INT"),
            svgTextOpenClose(290,266,string(abi.encodePacked(getTier(tokenId, "APT")," small"))),
            "APT ", 
            getStat(tokenId, "APT"),
            svgTextOpenClose(290,282,string(abi.encodePacked(getTier(tokenId, "STR")," small"))),
            "STR ", 
            getStat(tokenId, "STR"),
            svgTextOpenClose(290,298,string(abi.encodePacked(getTier(tokenId, "AGI")," small"))),
            "AGI ", 
            getStat(tokenId, "AGI"),
            svgTextOpenClose(290,314,string(abi.encodePacked(getTier(tokenId, "SPD")," small"))),
            "SPD ", 
            getStat(tokenId, "SPD")));
        parts[4] = string(abi.encodePacked(
            svgTextOpenClose(16,274,"base"),
            "Comprehensions"
            ));
        parts[5] = string(abi.encodePacked(
            svgTextOpenClose(16,294,string(abi.encodePacked(getTier(tokenId, "CHEM")," small"))),
            "Chemistry ",
            getComprehension(tokenId, "CHEM"),
            svgTextOpenClose(16,310,string(abi.encodePacked(getTier(tokenId, "AALT")," small"))),
            "Ancient Alchemical Theory ",
            getComprehension(tokenId, "AALT"),
            svgTextOpenClose(16,326,string(abi.encodePacked(getTier(tokenId, "DRAG")," small"))),
            "Dragon's Pulse ",
            getComprehension(tokenId, "DRAG")
            ));
            
        parts[6] =  svgTextOpenClose(16,50,getTier(tokenId, "LHAND"));
        parts[7] = string(abi.encodePacked(
            "Hand - ",
            getHand(tokenId, true),
            svgTextOpenClose(16,70,getTier(tokenId, "RHAND")),
            "Hand - ",
            getHand(tokenId, false)));
        parts[8] =  svgTextOpenClose(16,90,getTier(tokenId, "LARM"));  
        parts[9] = string(abi.encodePacked(
            "Arm - ",
            getArm(tokenId, true),
            svgTextOpenClose(16,110,getTier(tokenId, "RARM")),
            "Arm - ",
            getArm(tokenId, false)));
        parts[10] =  svgTextOpenClose(16,135,getTier(tokenId, "LPOCK"));
        parts[11] = string(abi.encodePacked(
            "Pocket - ",
            getPocket(tokenId, true),
            svgTextOpenClose(16,155,getTier(tokenId, "RPOCK")),
            "Pocket - ",
            getPocket(tokenId, false)));
        parts[12] = string(abi.encodePacked(svgTextOpenClose(16,175,getTier(tokenId, "WALLET")),"Wallet - "));
        parts[13] = getWallet(tokenId);
        parts[14] = svgTextOpenClose(16,198,string(abi.encodePacked(getTier(tokenId, "HAIR")," small")));
        parts[15] = string(abi.encodePacked(getHairColor(tokenId), " Hair"));
        parts[16] = svgTextOpenClose(16,214,string(abi.encodePacked(getTier(tokenId, "EYES")," small")));
        parts[17] = string(abi.encodePacked(getEyeColor(tokenId), " Eyes"));
        parts[18] = svgTextOpenClose(16,230,string(abi.encodePacked(getTier(tokenId, "SKINT")," small")));
        parts[19] = string(abi.encodePacked(
            "Skin Tone ",
            getSkinTone(tokenId),
            svgTextOpenClose(16,246,string(abi.encodePacked(getTier(tokenId, "SKIND")," small"))),
            "Skin Darkness ",
            getSkinDarkness(tokenId)
            ));
        parts[20] = '</text>';
        parts[21] = string(
            abi.encodePacked(
                '<line x1="8" y1="8" x2="8" y2="342" stroke="white" />',
                '<line x1="8" y1="280" x2="160" y2="280" stroke="white" />',
                '<circle cx="350" cy="0" r="50" fill="white" />',
                '<circle cx="350" cy="0" r="25" fill="#',
                eyeColorToHex[eyeColor[getPrePlucked(tokenId,"EYES",eyeColor)]],
                '" />'
                
            
                ));
        parts[22] = '</svg>';

        string memory output = string(abi.encodePacked(
            parts[0], 
            parts[1], 
            parts[2], 
            parts[3], 
            parts[4], 
            parts[5],
            parts[6], 
            parts[7], parts[8]
            ));
        output = string(abi.encodePacked(output, parts[9], parts[10], parts[11], 
        parts[12], 
        parts[13], 
           parts[14], parts[15], 
           parts[16]
         ));
        output = string(abi.encodePacked(
           output, parts[17], parts[18], 
        parts[19], parts[20], parts[21], parts[22]));
        //output = string(abi.encodePacked(output, parts[25], parts[26], parts[27], parts[28], parts[29], parts[30], parts[31], parts[32]));
        string memory json = Base64.encode(bytes(string(abi.encodePacked(
            '{"name": "Alchemist #', 
            toString(tokenId), 
            '", "description": "Alchemists are generated stat sheets in the spirit of Fullmetal Alchemist. Everything is stored onchain. Feel free to use in any way you want.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }

    function claimFree(uint256 tokenId) public nonReentrant {
        require(tokenId > 0 && tokenId < 777, "Token ID invalid");
        require(balanceOf(msg.sender) < 10, "Chill");
        _safeMint(_msgSender(), tokenId);
    }
    
    function claimPaid(uint256 tokenId) public nonReentrant payable {
        require(tokenId > 776 && tokenId < 3334, "Token ID invalid");
        require(msg.value >= 0.004 ether, "Not enough");
        _safeMint(_msgSender(), tokenId);
        payable(0x8DE3c3891268502F77DB7E876d727257DEc0F852).transfer(msg.value*3/8);
        payable(ownerOf(13)).transfer(msg.value/16);
        payable(ownerOf(42)).transfer(msg.value/8);
        payable(ownerOf(69)).transfer(msg.value/8);
        payable(ownerOf(137)).transfer(msg.value/16);
        payable(ownerOf(420)).transfer(msg.value/4);
    }

    
    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }
    
  
    constructor() ERC721("Alchemists", "ALCH") Ownable() {
    
        
        pocketToCrit["LPOCK"] = "Bronze Bar";
        pocketToCrit["RPOCK"] = "Silver Bar";
        pocketToMaxCrit["LPOCK"] = "Philosopher Stone";
        pocketToMaxCrit["RPOCK"] = "Gold Bar";

        lrToMaxCrit["LARM"] = "Construction";
        lrToMaxCrit["RARM"] = "Deconstruction";
        
        darknessToHexArray["1"] = [
        "f1d2c8",
        "f0d5c9",
        "eed5c7",
        "edd7c6",
        "ecd7c6",
        "e9d6c6"
    ];    
    darknessToHexArray["2"] = [
        "eac1b9",
        "eac0b7",
        "e6c5b1",
        "e3c7b1",
        "dec6b0",
        "dfc7ae"
    ]; 
    darknessToHexArray["3"] = [
        "deafa7",
        "dcb1a0",
        "dbb1a0",
        "d8b49a",
        "d5b596",
        "d1b897"
    ]; 
    darknessToHexArray["4"] = [
        "d59e90",
        "cf9f90",
        "cba28b",
        "caa486",
        "c7a485",
        "c2a47f"
    ];
    darknessToHexArray["5"] = [
        "c58b80",
        "c18e78",
        "bf8f76",
        "bb9173",
        "b99473",
        "b4976f"
    ]; 
    darknessToHexArray["6"] = [
        "b67b6d",
        "b17d68",
        "ad8063",
        "a97f62",
        "a58361",
        "b4976f"
    ]; 
    darknessToHexArray["7"] = [
        "a26a5e",
        "a06c59",
        "9c6e53",
        "997052",
        "936f4f",
        "90744b"
    ]; 
    darknessToHexArray["8"] = [
        "8e5a4d",
        "8c5e4b",
        "896043",
        "865f41",
        "836241",
        "7e633d"
    ]; 
    darknessToHexArray["9"] = [
        "7b4a42",
        "744d3d",
        "734d37",
        "744f34",
        "6e5232",
        "6a5433"
    ]; 
    darknessToHexArray["10"] = [
        "633c37",
        "633d31",
        "5f3f2b",
        "5b4129",
        "5b4128",
        "584324"
    ]; 
    darknessToHexArray["11"] = [
        "4e2f29",
        "53322b",
        "523525",
        "463120",
        "433220",
        "453220"
    ]; 
    darknessToHexArray["12"] = [
        "422d29",
        "4b2d20",
        "4a3123",
        "4b2d20",
        "4b2d20",
        "4b2d20"
    ]; 
    
    eyeColorToHex["Brown"] = "9e6b4a";
    eyeColorToHex["Blue"] = "85abce";
    eyeColorToHex["Green"] = "7d956d";
    eyeColorToHex["Red"] = "f61515";
    eyeColorToHex["White"] = "eeeeee";
    eyeColorToHex["Purple"] = "7f00ff";
    eyeColorToHex["Baby Blue"] = "a1caf1";
    eyeColorToHex["Black"] = "111111";

    }
}

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

Contract Security Audit

Contract ABI

API
[{"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimPaid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAffinity","outputs":[{"internalType":"string","name":"","type":"string"}],"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"},{"internalType":"bool","name":"isLeft","type":"bool"}],"name":"getArm","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"comprehension","type":"string"}],"name":"getComprehension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getEyeColor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getHairColor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"isLeft","type":"bool"}],"name":"getHand","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"isLeft","type":"bool"}],"name":"getPocket","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSkinColor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSkinDarkness","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSkinDarknessPrePlucked","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSkinTone","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSkinTonePrePlucked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"stat","type":"string"}],"name":"getStat","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWallet","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":[],"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"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":[{"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":"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"}]

600461018090815263119a5cdd60e21b6101a052608090815260056101c090815264476c6f766560d81b6101e05260a052600861020081815267544320476c6f766560c01b6102205260c052600961024090815268544320546174746f6f60b81b6102605260e0526006610280908152654b6174616e6160d01b6102a05261010052600e6102c09081526d4272617373204b6e75636b6c657360901b6102e05261012052600d6103009081526c105d5d1bdb585a5b0812185b99609a1b610320526101405261038060405260166103409081527f526f636b62656c6c204175746f6d61696c2048616e640000000000000000000061036052610160526200010991600c9162001efa565b5060405180610100016040528060405180604001604052806005815260200164456d70747960d81b815250815260200160405180604001604052806005815260200164456d70747960d81b815250815260200160405180604001604052806005815260200164456d70747960d81b815250815260200160405180604001604052806005815260200164456d70747960d81b815250815260200160405180604001604052806006815260200165312043656e7360d01b815250815260200160405180604001604052806006815260200165382043656e7360d01b81525081526020016040518060400160405280600781526020016636342043656e7360c81b8152508152602001604051806040016040528060088152602001673132382043656e7360c01b815250815250600d9060086200024592919062001efa565b5060405180610100016040528060405180604001604052806005815260200164456d70747960d81b815250815260200160405180604001604052806005815260200164456d70747960d81b815250815260200160405180604001604052806005815260200164456d70747960d81b815250815260200160405180604001604052806005815260200164456d70747960d81b815250815260200160405180604001604052806006815260200165312043656e7360d01b815250815260200160405180604001604052806006815260200165382043656e7360d01b81525081526020016040518060400160405280600781526020016636342043656e7360c81b81525081526020016040518060400160405280600a815260200169213937b73d32902130b960b11b815250815250600e9060086200038392919062001efa565b5060408051610140810182526005610100820190815264456d70747960d81b610120830152815281518083018352600680825265312043656e7360d01b602083810191909152808401929092528351808501855281815265322043656e7360d01b81840152838501528351808501855281815265342043656e7360d01b8184015260608401528351808501855290815265382043656e7360d01b8183015260808301528251808401845260078082526631362043656e7360c81b8284015260a0840191909152835180850185528181526633322043656e7360c81b8184015260c0840152835180850190945283526636342043656e7360c81b9083015260e08101919091526200049890600f90600862001efa565b506040518061010001604052806040518060400160405280600381526020016241726d60e81b81525081526020016040518060400160405280600381526020016241726d60e81b81525081526020016040518060400160405280600381526020016241726d60e81b81525081526020016040518060400160405280600381526020016241726d60e81b815250815260200160405180604001604052806009815260200168544320546174746f6f60b81b815250815260200160405180604001604052806009815260200168544320546174746f6f60b81b815250815260200160405180604001604052806009815260200168544120536c6565766560b81b81525081526020016040518060400160405280600c81526020016b4175746f6d61696c2041726d60a01b8152508152506010906008620005d892919062001efa565b50604080516102208101825260056101e0820181815264213937bbb760d91b61020084018190529083528351808501855282815260208181018390528085019190915284518086018652838152808201839052848601528451808601865283815280820192909252606084019190915283518085018552600480825263426c756560e01b82840181905260808601929092528551808701875281815280840183905260a0860152855180870187529081528083019190915260c0840152835180850185528281526423b932b2b760d91b81830181905260e085019190915284518086018652838152808301829052610100850152845180860186528381528083019190915261012084015283518085018552600381526214995960ea1b818301526101408401528351808501855282815264576869746560d81b818301526101608401528351808501855260098152684261627920426c756560b81b81830152610180840152835180850185526006815265507572706c6560d01b818301526101a0840152835180850190945290835264426c61636b60d81b908301526101c08101919091526200078e90601190600f62001f5e565b50604080516101e08101825260066101a0820181815265426c6f6e646560d01b6101c0840152825282518084018452600580825264213937bbb760d91b602083810191909152808501929092528451808601865281815264426c61636b60d81b818401528486015284518086018652600381526214995960ea1b81840152606085015284518086018652600c8082526b446972747920426c6f6e646560a01b82850152608086019190915285518087018752600a8152692230b93590213937bbb760b11b8185015260a086015285518087018752600b81526a2634b3b43a10213937bbb760a91b8185015260c0860152855180870187529081526b4c6967687420426c6f6e646560a01b8184015260e08501528451808601865290815264576869746560d81b81830152610100840152835180850185526004808252634772617960e01b8284015261012085019190915284518086018652600d8082526c29b0b63a1027102832b83832b960991b828501526101408601919091528551808701875291825263426c756560e01b82840152610160850191909152845180860190955291845265507572706c6560d01b9084015261018082019290925262000959916012919062001fb0565b506040805161010081018252600160c08201818152604160f81b60e0840152825282518084018452818152602160f91b6020828101919091528084019190915283518085018552828152604360f81b818301528385015283518085018552828152601160fa1b81830152606084015283518085018552828152604560f81b8183015260808401528351808501909452908352602360f91b9083015260a081019190915262000a0c90601390600662002002565b50604080516101c08101825260016101808201818152603160f81b6101a0840152825282518084018452818152601960f91b6020828101919091528084019190915283518085018552828152603360f81b818301528385015283518085018552828152600d60fa1b81830152606084015283518085018552828152603560f81b81830152608084015283518085018552828152601b60f91b8183015260a084015283518085018552828152603760f81b8183015260c084015283518085018552828152600760fb1b8183015260e084015283518085018552918252603960f81b8282015261010083019190915282518084018452600280825261031360f41b828401526101208401919091528351808501855281815261313160f01b818401526101408401528351808501909452835261189960f11b9083015261016081019190915262000b5f90601490600c62002054565b50604080516101808101825260016101408201818152603160f81b610160840152825282518084018452818152601960f91b6020828101919091528084019190915283518085018552828152603360f81b818301528385015283518085018552828152600d60fa1b81830152606084015283518085018552828152603560f81b81830152608084015283518085018552828152601b60f91b8183015260a084015283518085018552828152603760f81b8183015260c084015283518085018552828152600760fb1b8183015260e084015283518085018552918252603960f81b8282015261010083019190915282518084019093526002835261031360f41b9083015261012081019190915262000c7b90601590600a620020a6565b50604051806101000160405280604051806040016040528060058152602001642bb0ba32b960d91b8152508152602001604051806040016040528060048152602001634669726560e01b81525081526020016040518060400160405280600a815260200169426c6f6f642052756e6560b01b81525081526020016040518060400160405280600581526020016408ac2e4e8d60db1b81525081526020016040518060400160405280600e81526020016d2a3930b739b337b936b0ba34b7b760911b8152508152602001604051806040016040528060088152602001674368696d6572696360c01b81525081526020016040518060400160405280600c81526020016b21b7b739ba393ab1ba34b7b760a11b81525081526020016040518060400160405280600e81526020016d2232b1b7b739ba393ab1ba34b7b760911b815250815250601690600862000dd092919062001efa565b506040805160c0810182526004608082018181526311dbdbd960e21b60a08401819052908352835180850185528281526020818101929092528184015283518085018552600881526729bab832b934b7b960c11b81830152838501528351808501909452600784526614195c999958dd60ca1b90840152606082019290925262000e5e9160179190620020f8565b5060405180606001604052806040518060400160405280600681526020016550726574747960d01b8152508152602001604051806040016040528060098152602001681099585d5d1a599d5b60ba1b815250815260200160405180604001604052806007815260200166476f646c696b6560c81b815250815250601890600362000eea9291906200214a565b5034801562000ef857600080fd5b50604080518082018252600a815269416c6368656d6973747360b01b6020808301918252835180850190945260048452630829886960e31b90840152815191929162000f47916000916200219c565b50805162000f5d9060019060208401906200219c565b50506001600a555062000f703362001ea8565b604080518082018252600a815269213937b73d32902130b960b11b602082019081528251644c504f434b60d81b8152601b6005820152925192839003602501909220905162000fc092906200219c565b50604080518082018252600a81526929b4b63b32b9102130b960b11b6020820190815282516452504f434b60d81b8152601b600582015292519283900360250190922090516200101192906200219c565b5060408051808201825260118152705068696c6f736f706865722053746f6e6560781b602082019081528251644c504f434b60d81b8152601c600582015292519283900360250190922090516200106992906200219c565b50604080518082018252600881526723b7b632102130b960c11b6020820190815282516452504f434b60d81b8152601c60058201529251928390036025019092209051620010b892906200219c565b50604080518082018252600c81526b21b7b739ba393ab1ba34b7b760a11b602082019081528251634c41524d60e01b8152601d600482015292519283900360240190922090516200110a92906200219c565b50604080518082018252600e81526d2232b1b7b739ba393ab1ba34b7b760911b602082019081528251635241524d60e01b8152601d600482015292519283900360240190922090516200115e92906200219c565b506040805161010081018252600660c08201818152650cc62c864c6760d31b60e08401528252825180840184528181526566306435633960d01b60208083019190915280840191909152835180850185528281526565656435633760d01b8183015283850152835180850185528281526532b2321bb19b60d11b818301526060840152835180850185528281526532b1b21bb19b60d11b8183015260808401528351808501855291825265329cb21b319b60d11b9082015260a08201529051603160f81b81526019906001019081526040519081900360200190206200124691600662002227565b506040805161010081018252600660c082018181526565616331623960d01b60e08401528252825180840184528181526565616330623760d01b60208083019190915280840191909152835180850185528281526565366335623160d01b8183015283850152835180850185528281526565336337623160d01b818301526060840152835180850185528281526506465633662360d41b818301526080840152835180850185529182526564666337616560d01b9082015260a08201529051601960f91b81526019906001019081526040519081900360200190206200132e91600662002227565b506040805161010081018252600660c082018181526564656166613760d01b60e08401528252825180840184528181526506463623161360d41b60208083019190915280840191909152835180850185528281526506462623161360d41b8183015283850152835180850185528281526564386234396160d01b8183015260608401528351808501855282815265321ab11a9c9b60d11b818301526080840152835180850185529182526564316238393760d01b9082015260a08201529051603360f81b81526019906001019081526040519081900360200190206200141691600662002227565b506040805161010081018252600660c082018181526506435396539360d41b60e08401528252825180840184528181526506366396639360d41b60208083019190915280840191909152835180850185528281526531b130991c3160d11b8183015283850152835180850185528281526531b0b09a1c1b60d11b818301526060840152835180850185528281526563376134383560d01b81830152608084015283518085018552918252653199309a1bb360d11b9082015260a08201529051600d60fa1b8152601990600101908152604051908190036020019020620014fe91600662002227565b506040805161010081018252600660c082018181526506335386238360d41b60e0840152825282518084018452818152650c66270ca6e760d31b60208083019190915280840191909152835180850185528281526531331c331b9b60d11b8183015283850152835180850185528281526562623931373360d01b818301526060840152835180850185528281526562393934373360d01b8183015260808401528351808501855291825265311a1c9b9b3360d11b9082015260a08201529051603560f81b8152601990600101908152604051908190036020019020620015e691600662002227565b506040805161010081018252600660c0820181815265188d8dd88d9960d21b60e0840152825282518084018452818152650c4626ec86c760d31b60208083019190915280840191909152835180850185528281526561643830363360d01b81830152838501528351808501855282815265309c9bb31b1960d11b818301526060840152835180850185528281526561353833363160d01b8183015260808401528351808501855291825265311a1c9b9b3360d11b9082015260a08201529051601b60f91b8152601990600101908152604051908190036020019020620016ce91600662002227565b506040805161010081018252600660c082018181526561323661356560d01b60e08401528252825180840184528181526561303663353960d01b60208083019190915280840191909152835180850185528281526539633665353360d01b818301528385015283518085018552828152651c9c9b981a9960d11b81830152606084015283518085018552828152651c999b331a3360d11b81830152608084015283518085018552918252651c981b9a1a3160d11b9082015260a08201529051603760f81b8152601990600101908152604051908190036020019020620017b691600662002227565b506040805161010081018252600660c08201818152650e194d584d1960d21b60e0840152825282518084018452818152651c319ab29a3160d11b60208083019190915280840191909152835180850185528281526538393630343360d01b8183015283850152835180850185528281526538363566343160d01b818301526060840152835180850185528281526538333632343160d01b81830152608084015283518085018552918252650dd94d8cccd960d21b9082015260a08201529051600760fb1b81526019906001019081526040519081900360200190206200189e91600662002227565b506040805161010081018252600660c08201818152651bb11a309a1960d11b60e0840152825282518084018452818152650dcd0d190cd960d21b60208083019190915280840191909152835180850185528281526537333464333760d01b818301528385015283518085018552828152650dcd0d198ccd60d21b81830152606084015283518085018552828152651b329a99199960d11b818301526080840152835180850185529182526536613534333360d01b9082015260a08201529051603960f81b81526019906001019081526040519081900360200190206200198691600662002227565b506040805161010081018252600660c082018181526536333363333760d01b60e08401528252825180840184528181526536333364333160d01b6020808301919091528084019190915283518085018552828152651ab319b3193160d11b8183015283850152835180850185528281526535623431323960d01b818301526060840152835180850185528281526506ac4686264760d31b81830152608084015283518085018552918252650d4e0d0ccc8d60d21b9082015260a0820152905161031360f41b815260199060020190815260405190819003602001902062001a6f91600662002227565b506040805161010081018252600660c082018181526534653266323960d01b60e0840152825282518084018452818152651a999999193160d11b60208083019190915280840191909152835180850185528281526535323335323560d01b8183015283850152835180850185528281526503436333132360d41b818301526060840152835180850185528281526503433333232360d41b818301526080840152835180850185529182526503435333232360d41b9082015260a0820152905161313160f01b815260199060020190815260405190819003602001902062001b5891600662002227565b506040805161010081018252600660c082018181526534323264323960d01b60e08401528252825180840184528181526503462326432360d41b602080830182905280850192909252845180860186528381526534613331323360d01b8184015284860152845180860186528381528083018290526060850152845180860186528381528083018290526080850152845180860186529283529082015260a0820152905161189960f11b815260199060020190815260405190819003602001902062001c2691600662002227565b50604080518082018252600681526539653662346160d01b60208201908152825164213937bbb760d91b8152601e6005820152925192839003602501909220905162001c7392906200219c565b50604080518082018252600681526538356162636560d01b60208201908152825163426c756560e01b8152601e6004820152925192839003602401909220905162001cbf92906200219c565b5060408051808201825260068152650dd90e4d4d9960d21b6020820190815282516423b932b2b760d91b8152601e6005820152925192839003602501909220905162001d0c92906200219c565b50604080518082018252600681526566363135313560d01b6020820190815282516214995960ea1b8152601e6003820152925192839003602301909220905162001d5792906200219c565b50604080518082018252600681526565656565656560d01b60208201908152825164576869746560d81b8152601e6005820152925192839003602501909220905162001da492906200219c565b50604051806040016040528060068152602001651bb31818333360d11b815250601e60405162001de09065507572706c6560d01b815260060190565b9081526020016040518091039020908051906020019062001e039291906200219c565b50604080518082018252600681526561316361663160d01b602082019081528251684261627920426c756560b81b8152601e6009820152925192839003602901909220905162001e5492906200219c565b50604080518082018252600681526531313131313160d01b60208201908152825164426c61636b60d81b8152601e6005820152925192839003602501909220905162001ea192906200219c565b5062002323565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090810192821562001f4c579160200282015b8281111562001f4c578251805162001f3b9184916020909101906200219c565b509160200191906001019062001f1b565b5062001f5a9291506200226c565b5090565b82805482825590600052602060002090810192821562001f4c579160200282015b8281111562001f4c578251805162001f9f9184916020909101906200219c565b509160200191906001019062001f7f565b82805482825590600052602060002090810192821562001f4c579160200282015b8281111562001f4c578251805162001ff19184916020909101906200219c565b509160200191906001019062001fd1565b82805482825590600052602060002090810192821562001f4c579160200282015b8281111562001f4c5782518051620020439184916020909101906200219c565b509160200191906001019062002023565b82805482825590600052602060002090810192821562001f4c579160200282015b8281111562001f4c5782518051620020959184916020909101906200219c565b509160200191906001019062002075565b82805482825590600052602060002090810192821562001f4c579160200282015b8281111562001f4c5782518051620020e79184916020909101906200219c565b5091602001919060010190620020c7565b82805482825590600052602060002090810192821562001f4c579160200282015b8281111562001f4c5782518051620021399184916020909101906200219c565b509160200191906001019062002119565b82805482825590600052602060002090810192821562001f4c579160200282015b8281111562001f4c57825180516200218b9184916020909101906200219c565b50916020019190600101906200216b565b828054620021aa90620022e6565b90600052602060002090601f016020900481019282620021ce576000855562002219565b82601f10620021e957805160ff191683800117855562002219565b8280016001018555821562002219579182015b8281111562002219578251825591602001919060010190620021fc565b5062001f5a9291506200228d565b826006810192821562001f4c579160200282015b8281111562001f4c57825180516200225b9184916020909101906200219c565b50916020019190600101906200223b565b8082111562001f5a576000620022838282620022a4565b506001016200226c565b5b8082111562001f5a57600081556001016200228e565b508054620022b290620022e6565b6000825580601f10620022c3575050565b601f016020900490600052602060002090810190620022e391906200228d565b50565b600181811c90821680620022fb57607f821691505b602082108114156200231d57634e487b7160e01b600052602260045260246000fd5b50919050565b61542280620023336000396000f3fe6080604052600436106101c45760003560e01c80636d64385d116100f8578063b88d4fde11610090578063b88d4fde14610514578063bebf9faa14610534578063c87b56dd14610554578063cc9562cb14610574578063d45e314114610594578063df720497146105b4578063e985e9c5146105d4578063f2fde38b146105f4578063f376dea61461061457600080fd5b80636d64385d1461040c57806370a082311461042c578063715018a61461044c57806373075aff1461046157806378bdeccd146104815780638da5cb5b146104a157806395d89b41146104bf578063a22cb465146104d4578063b70930de146104f457600080fd5b806323b872dd1161016b57806323b872dd146102f95780632f745c59146103195780633cf414371461033957806342842e0e146103595780634f6ccce7146103795780635470b13b1461039957806356873189146103b95780636352211e146103cc5780636d03f217146103ec57600080fd5b806301ffc9a7146101c957806306fdde03146101fe578063081812fc14610220578063095ea7b314610258578063123ef8b91461027a57806317899e041461029a57806318160ddd146102ba57806318c99c4e146102d9575b600080fd5b3480156101d557600080fd5b506101e96101e436600461427d565b610634565b60405190151581526020015b60405180910390f35b34801561020a57600080fd5b5061021361065f565b6040516101f591906150e4565b34801561022c57600080fd5b5061024061023b3660046142b7565b6106f1565b6040516001600160a01b0390911681526020016101f5565b34801561026457600080fd5b50610278610273366004614253565b61077e565b005b34801561028657600080fd5b506102136102953660046142b7565b61088f565b3480156102a657600080fd5b506102136102b53660046142d0565b610a36565b3480156102c657600080fd5b506008545b6040519081526020016101f5565b3480156102e557600080fd5b506102786102f43660046142b7565b610c3f565b34801561030557600080fd5b50610278610314366004614171565b610ce6565b34801561032557600080fd5b506102cb610334366004614253565b610d17565b34801561034557600080fd5b506102cb6103543660046142b7565b610dad565b34801561036557600080fd5b50610278610374366004614171565b610e9f565b34801561038557600080fd5b506102cb6103943660046142b7565b610eba565b3480156103a557600080fd5b506102136103b43660046142b7565b610f4d565b6102786103c73660046142b7565b611049565b3480156103d857600080fd5b506102406103e73660046142b7565b6112bf565b3480156103f857600080fd5b506102136104073660046142b7565b611336565b34801561041857600080fd5b506102136104273660046142f3565b611430565b34801561043857600080fd5b506102cb610447366004614123565b611515565b34801561045857600080fd5b5061027861159c565b34801561046d57600080fd5b5061021361047c3660046142b7565b6115d2565b34801561048d57600080fd5b5061021361049c3660046142f3565b61163a565b3480156104ad57600080fd5b50600b546001600160a01b0316610240565b3480156104cb57600080fd5b5061021361170f565b3480156104e057600080fd5b506102786104ef366004614229565b61171e565b34801561050057600080fd5b5061021361050f3660046142b7565b6117df565b34801561052057600080fd5b5061027861052f3660046141ad565b6118d9565b34801561054057600080fd5b5061021361054f3660046142b7565b611911565b34801561056057600080fd5b5061021361056f3660046142b7565b611a03565b34801561058057600080fd5b5061021361058f3660046142d0565b61264f565b3480156105a057600080fd5b506102136105af3660046142b7565b612774565b3480156105c057600080fd5b506102136105cf3660046142b7565b612866565b3480156105e057600080fd5b506101e96105ef36600461413e565b612957565b34801561060057600080fd5b5061027861060f366004614123565b612985565b34801561062057600080fd5b5061021361062f3660046142d0565b612a20565b60006001600160e01b0319821663780e9d6360e01b1480610659575061065982612b3f565b92915050565b60606000805461066e906152be565b80601f016020809104026020016040519081016040528092919081815260200182805461069a906152be565b80156106e75780601f106106bc576101008083540402835291602001916106e7565b820191906000526020600020905b8154815290600101906020018083116106ca57829003601f168201915b5050505050905090565b60006106fc82612b8f565b6107625760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610789826112bf565b9050806001600160a01b0316836001600160a01b031614156107f75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610759565b336001600160a01b038216148061081357506108138133612957565b6108805760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b6064820152608401610759565b61088a8383612bac565b505050565b6060601461098c836040518060400160405280600581526020016414d2d2539160da1b8152506014805480602002602001604051908101604052809291908181526020016000905b828210156109835783829060005260206000200180546108f6906152be565b80601f0160208091040260200160405190810160405280929190818152602001828054610922906152be565b801561096f5780601f106109445761010080835404028352916020019161096f565b820191906000526020600020905b81548152906001019060200180831161095257829003601f168201915b5050505050815260200190600101906108d7565b50505050612c1a565b8154811061099c5761099c61536a565b9060005260206000200180546109b1906152be565b80601f01602080910402602001604051908101604052809291908181526020018280546109dd906152be565b8015610a2a5780601f106109ff57610100808354040283529160200191610a2a565b820191906000526020600020905b815481529060010190602001808311610a0d57829003601f168201915b50505050509050919050565b606060006040518060400160405280600581526020016452504f434b60d81b81525090506000600e805480602002602001604051908101604052809291908181526020016000905b82821015610b2a578382906000526020600020018054610a9d906152be565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac9906152be565b8015610b165780601f10610aeb57610100808354040283529160200191610b16565b820191906000526020600020905b815481529060010190602001808311610af957829003601f168201915b505050505081526020019060010190610a7e565b5050505090508315610c2b57604051806040016040528060058152602001644c504f434b60d81b8152509150600d805480602002602001604051908101604052809291908181526020016000905b82821015610c24578382906000526020600020018054610b97906152be565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc3906152be565b8015610c105780601f10610be557610100808354040283529160200191610c10565b820191906000526020600020905b815481529060010190602001808311610bf357829003601f168201915b505050505081526020019060010190610b78565b5050505090505b610c36858383612c5a565b95945050505050565b6002600a541415610c625760405162461bcd60e51b8152600401610759906151f9565b6002600a558015801590610c77575061030981105b610c935760405162461bcd60e51b81526004016107599061517e565b600a610c9e33611515565b10610cd35760405162461bcd60e51b815260206004820152600560248201526410da1a5b1b60da1b6044820152606401610759565b610cde335b82612dad565b506001600a55565b610cf03382612dcb565b610d0c5760405162461bcd60e51b8152600401610759906151a8565b61088a838383612e8d565b6000610d2283611515565b8210610d845760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610759565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000610659826040518060400160405280600581526020016414d2d2539160da1b8152506013805480602002602001604051908101604052809291908181526020016000905b82821015610983578382906000526020600020018054610e12906152be565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3e906152be565b8015610e8b5780601f10610e6057610100808354040283529160200191610e8b565b820191906000526020600020905b815481529060010190602001808311610e6e57829003601f168201915b505050505081526020019060010190610df3565b61088a838383604051806020016040528060008152506118d9565b6000610ec560085490565b8210610f285760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610759565b60088281548110610f3b57610f3b61536a565b90600052602060002001549050919050565b6060610659826040518060400160405280600681526020016515d05313115560d21b815250600f805480602002602001604051908101604052809291908181526020016000905b82821015611040578382906000526020600020018054610fb3906152be565b80601f0160208091040260200160405190810160405280929190818152602001828054610fdf906152be565b801561102c5780601f106110015761010080835404028352916020019161102c565b820191906000526020600020905b81548152906001019060200180831161100f57829003601f168201915b505050505081526020019060010190610f94565b50505050613038565b6002600a54141561106c5760405162461bcd60e51b8152600401610759906151f9565b6002600a55610308811180156110835750610d0681105b61109f5760405162461bcd60e51b81526004016107599061517e565b660e35fa931a00003410156110e35760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b6044820152606401610759565b6110ec33610cd8565b738de3c3891268502f77db7e876d727257dec0f8526108fc600861111134600361525c565b61111b9190615248565b6040518115909202916000818181858888f19350505050158015611143573d6000803e3d6000fd5b5061114e600d6112bf565b6001600160a01b03166108fc611165601034615248565b6040518115909202916000818181858888f1935050505015801561118d573d6000803e3d6000fd5b50611198602a6112bf565b6001600160a01b03166108fc6111af600834615248565b6040518115909202916000818181858888f193505050501580156111d7573d6000803e3d6000fd5b506111e260456112bf565b6001600160a01b03166108fc6111f9600834615248565b6040518115909202916000818181858888f19350505050158015611221573d6000803e3d6000fd5b5061122c60896112bf565b6001600160a01b03166108fc611243601034615248565b6040518115909202916000818181858888f1935050505015801561126b573d6000803e3d6000fd5b506112776101a46112bf565b6001600160a01b03166108fc61128e600434615248565b6040518115909202916000818181858888f193505050501580156112b6573d6000803e3d6000fd5b50506001600a55565b6000818152600260205260408120546001600160a01b0316806106595760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610759565b606061065982604051806040016040528060048152602001634146464960e01b8152506016805480602002602001604051908101604052809291908181526020016000905b8282101561142757838290600052602060002001805461139a906152be565b80601f01602080910402602001604051908101604052809291908181526020018280546113c6906152be565b80156114135780601f106113e857610100808354040283529160200191611413565b820191906000526020600020905b8154815290600101906020018083116113f657829003601f168201915b50505050508152602001906001019061137b565b50505050613136565b606061150e83836015805480602002602001604051908101604052809291908181526020016000905b82821015611505578382906000526020600020018054611478906152be565b80601f01602080910402602001604051908101604052809291908181526020018280546114a4906152be565b80156114f15780601f106114c6576101008083540402835291602001916114f1565b820191906000526020600020905b8154815290600101906020018083116114d457829003601f168201915b505050505081526020019060010190611459565b50505050613258565b9392505050565b60006001600160a01b0382166115805760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610759565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146115c65760405162461bcd60e51b815260040161075990615149565b6115d06000613334565b565b606060196115df8361088f565b6040516115ec9190614430565b908152602001604051809103902061160383610dad565b600681106116135761161361536a565b016040516020016116249190614fde565b6040516020818303038152906040529050919050565b606061150e83836015805480602002602001604051908101604052809291908181526020016000905b82821015611505578382906000526020600020018054611682906152be565b80601f01602080910402602001604051908101604052809291908181526020018280546116ae906152be565b80156116fb5780601f106116d0576101008083540402835291602001916116fb565b820191906000526020600020905b8154815290600101906020018083116116de57829003601f168201915b505050505081526020019060010190611663565b60606001805461066e906152be565b6001600160a01b0382163314156117735760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610759565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b606061065982604051806040016040528060048152602001632420a4a960e11b8152506012805480602002602001604051908101604052809291908181526020016000905b828210156118d0578382906000526020600020018054611843906152be565b80601f016020809104026020016040519081016040528092919081815260200182805461186f906152be565b80156118bc5780601f10611891576101008083540402835291602001916118bc565b820191906000526020600020905b81548152906001019060200180831161189f57829003601f168201915b505050505081526020019060010190611824565b50505050613386565b6118e33383612dcb565b6118ff5760405162461bcd60e51b8152600401610759906151a8565b61190b8484848461349c565b50505050565b6060610659826040518060400160405280600581526020016414d2d2539560da1b8152506013805480602002602001604051908101604052809291908181526020016000905b828210156118d0578382906000526020600020018054611976906152be565b80601f01602080910402602001604051908101604052809291908181526020018280546119a2906152be565b80156119ef5780601f106119c4576101008083540402835291602001916119ef565b820191906000526020600020905b8154815290600101906020018083116119d257829003601f168201915b505050505081526020019060010190611957565b6060611a0d614059565b600060405180604001604052806005815260200164776869746560d81b81525090506004611b21856040518060400160405280600581526020016414d2d2539160da1b8152506014805480602002602001604051908101604052809291908181526020016000905b82821015610983578382906000526020600020018054611a94906152be565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac0906152be565b8015611b0d5780601f10611ae257610100808354040283529160200191611b0d565b820191906000526020600020905b815481529060010190602001808311611af057829003601f168201915b505050505081526020019060010190611a75565b1015611b455750604080518082019091526005815264626c61636b60d81b60208201525b80611b4e6134cf565b611b57866115d2565b604051602001611b6993929190614b4d565b60408051808303601f19018152918152908352805180820190915260048152634146464960e01b6020820152611ba09085906135f9565b611ba985611336565b604051602001611bba929190614f6b565b60408051601f198184030181529190528260016020020181905250611bff61012260e6604051806040016040528060048152602001636261736560e01b8152506136ab565b611c5061012260fa611c2c886040518060400160405280600381526020016212539560ea1b8152506135f9565b604051602001611c3c9190614734565b6040516020818303038152906040526136ab565b604051602001611c6192919061475e565b60408051808303601f19018152918152838101919091528051808201909152600381526212539560ea1b6020820152611c9b908590611430565b611cc961012261010a611c2c886040518060400160405280600381526020016210541560ea1b8152506135f9565b611cee866040518060400160405280600381526020016210541560ea1b815250611430565b611d1c61012261011a611c2c8a6040518060400160405280600381526020016229aa2960e91b8152506135f9565b611d41886040518060400160405280600381526020016229aa2960e91b815250611430565b611d6f61012261012a611c2c8c6040518060400160405280600381526020016241474960e81b8152506135f9565b611d948a6040518060400160405280600381526020016241474960e81b815250611430565b611dc261012261013a611c2c8e6040518060400160405280600381526020016214d41160ea1b8152506135f9565b611de78c6040518060400160405280600381526020016214d41160ea1b815250611430565b604051602001611dff9998979695949392919061492b565b60408051601f198184030181529190528260036020020181905250611e446010610112604051806040016040528060048152602001636261736560e01b8152506136ab565b604051602001611e54919061479e565b60408051601f198184030181529190528260046020020181905250611e9d6010610126611c2c87604051806040016040528060048152602001634348454d60e01b8152506135f9565b611ec385604051806040016040528060048152602001634348454d60e01b81525061163a565b611ef16010610136611c2c89604051806040016040528060048152602001631050531560e21b8152506135f9565b611f1787604051806040016040528060048152602001631050531560e21b81525061163a565b611f456010610146611c2c8b604051806040016040528060048152602001634452414760e01b8152506135f9565b611f6b89604051806040016040528060048152602001634452414760e01b81525061163a565b604051602001611f8096959493929190614651565b60408051601f198184030181529190528260056020020181905250611fce60106032611fc98760405180604001604052806005815260200164131210539160da1b8152506135f9565b6136ab565b60c0830152611fde846001612a20565b61200c60106046611fc98860405180604001604052806005815260200164149210539160da1b8152506135f9565b612017866000612a20565b60405160200161202993929190614daf565b60408051601f1981840301815291905282600760200201819052506120716010605a611fc987604051806040016040528060048152602001634c41524d60e01b8152506135f9565b61010083015261208284600161264f565b6120af6010606e611fc988604051806040016040528060048152602001635241524d60e01b8152506135f9565b6120ba86600061264f565b6040516020016120cc93929190614d4c565b60408051601f19818403018152919052826009602002018190525061211560106087611fc987604051806040016040528060058152602001644c504f434b60d81b8152506135f9565b610140830152612126846001610a36565b6121546010609b611fc9886040518060400160405280600581526020016452504f434b60d81b8152506135f9565b61215f866000610a36565b6040516020016121719392919061485a565b60408051601f1981840301815291905282600b60200201819052506121bb601060af611fc9876040518060400160405280600681526020016515d05313115560d21b8152506135f9565b6040516020016121cb91906145f6565b60408051808303601f190181529190526101808301526121ea84610f4d565b82600d6020020181905250612222601060c6611c2c87604051806040016040528060048152602001632420a4a960e11b8152506135f9565b6101c0830152612231846117df565b60405160200161224191906147d0565b60408051601f1981840301815291905282600f6020020181905250612289601060d6611c2c87604051806040016040528060048152602001634559455360e01b8152506135f9565b61020083015261229884612866565b6040516020016122a891906145cd565b60408051601f1981840301815291905282601160200201819052506122f1601060e6611c2c876040518060400160405280600581526020016414d2d2539560da1b8152506135f9565b61024083015261230084611911565b61232e601060f6611c2c886040518060400160405280600581526020016414d2d2539160da1b8152506135f9565b61233786612774565b60405160200161234993929190615039565b60408051808303601f19018152918152610260840191909152805180820190915260078152661e17ba32bc3a1f60c91b60208201528260146020020181905250601e601161247c86604051806040016040528060048152602001634559455360e01b8152506011805480602002602001604051908101604052809291908181526020016000905b828210156109835783829060005260206000200180546123ef906152be565b80601f016020809104026020016040519081016040528092919081815260200182805461241b906152be565b80156124685780601f1061243d57610100808354040283529160200191612468565b820191906000526020600020905b81548152906001019060200180831161244b57829003601f168201915b5050505050815260200190600101906123d0565b8154811061248c5761248c61536a565b906000526020600020016040516124a391906147f9565b90815260200160405180910390206040516020016124c19190614a2f565b60408051601f198184030181529181526102a08401919091528051808201825260068152651e17b9bb339f60d11b6020808301919091526102c0850191909152835181850151858401516060870151608088015160a089015160c08a015160e08b01516101008c0151995160009a61253b9a90910161450d565b60408051808303601f19018152908290526101208501516101408601516101608701516101808801516101a08901516101c08a01516101e08b01516102008c015197995061258e988a989060200161450d565b60408051808303601f19018152908290526102208501516102408601516102608701516102808801516102a08901516102c08a01519597506125d59688969060200161447b565b604051602081830303815290604052905060006126226125f4876136ea565b6125fd846137e8565b60405160200161260e929190614e13565b6040516020818303038152906040526137e8565b9050806040516020016126359190614ff4565b60408051601f198184030181529190529695505050505050565b6040805180820190915260048152635241524d60e01b6020820152606090821561269057506040805180820190915260048152634c41524d60e01b60208201525b61276c84826010805480602002602001604051908101604052809291908181526020016000905b828210156127635783829060005260206000200180546126d6906152be565b80601f0160208091040260200160405190810160405280929190818152602001828054612702906152be565b801561274f5780601f106127245761010080835404028352916020019161274f565b820191906000526020600020905b81548152906001019060200180831161273257829003601f168201915b5050505050815260200190600101906126b7565b5050505061394e565b949350505050565b6060610659826040518060400160405280600581526020016414d2d2539160da1b8152506014805480602002602001604051908101604052809291908181526020016000905b828210156118d05783829060005260206000200180546127d9906152be565b80601f0160208091040260200160405190810160405280929190818152602001828054612805906152be565b80156128525780601f1061282757610100808354040283529160200191612852565b820191906000526020600020905b81548152906001019060200180831161283557829003601f168201915b5050505050815260200190600101906127ba565b606061065982604051806040016040528060048152602001634559455360e01b8152506011805480602002602001604051908101604052809291908181526020016000905b828210156118d05783829060005260206000200180546128ca906152be565b80601f01602080910402602001604051908101604052809291908181526020018280546128f6906152be565b80156129435780601f1061291857610100808354040283529160200191612943565b820191906000526020600020905b81548152906001019060200180831161292657829003601f168201915b5050505050815260200190600101906128ab565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600b546001600160a01b031633146129af5760405162461bcd60e51b815260040161075990615149565b6001600160a01b038116612a145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610759565b612a1d81613334565b50565b604080518082019091526005815264149210539160da1b60208201526060908215612a635750604080518082019091526005815264131210539160da1b60208201525b61276c8482600c805480602002602001604051908101604052809291908181526020016000905b82821015612b36578382906000526020600020018054612aa9906152be565b80601f0160208091040260200160405190810160405280929190818152602001828054612ad5906152be565b8015612b225780601f10612af757610100808354040283529160200191612b22565b820191906000526020600020905b815481529060010190602001808311612b0557829003601f168201915b505050505081526020019060010190612a8a565b50505050613a64565b60006001600160e01b031982166380ac58cd60e01b1480612b7057506001600160e01b03198216635b5e139f60e01b145b8061065957506301ffc9a760e01b6001600160e01b0319831614610659565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612be1826112bf565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008151612c5084612c2b876136ea565b604051602001612c3c92919061444c565b604051602081830303815290604052613b42565b61276c9190615314565b60606000612c6b84612c2b876136ea565b9050600083845183612c7d9190615314565b81518110612c8d57612c8d61536a565b602002602001015190506000601583612ca69190615314565b9050600e81118015612cb85750601381105b15612d0e5784612cc9600f8361527b565b612cd4906004615230565b81518110612ce457612ce461536a565b6020026020010151604051602001612cfc9190614430565b60405160208183030381529060405291505b60138110612da3578060131415612d6357601b86604051612d2f9190614430565b9081526020016040518091039020604051602001612d4d91906147f9565b6040516020818303038152906040529150612da3565b601c86604051612d739190614430565b9081526020016040518091039020604051602001612d9191906147f9565b60405160208183030381529060405291505b5095945050505050565b612dc7828260405180602001604052806000815250613b73565b5050565b6000612dd682612b8f565b612e375760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610759565b6000612e42836112bf565b9050806001600160a01b0316846001600160a01b03161480612e7d5750836001600160a01b0316612e72846106f1565b6001600160a01b0316145b8061276c575061276c8185612957565b826001600160a01b0316612ea0826112bf565b6001600160a01b031614612f085760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610759565b6001600160a01b038216612f6a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610759565b612f75838383613ba6565b612f80600082612bac565b6001600160a01b0383166000908152600360205260408120805460019290612fa990849061527b565b90915550506001600160a01b0382166000908152600360205260408120805460019290612fd7908490615230565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6060600061304984612c2b876136ea565b905060008384518361305b9190615314565b8151811061306b5761306b61536a565b6020026020010151905060006015836130849190615314565b9050600e811180156130965750601381105b156130ec57846130a7600f8361527b565b6130b2906004615230565b815181106130c2576130c261536a565b60200260200101516040516020016130da9190614430565b60405160208183030381529060405291505b60138110612da357806013141561311957604051673634302043656e7360c01b6020820152602801612d4d565b60405168363430302043656e7360b81b6020820152602901612d91565b6060600061314784612c2b876136ea565b90506000838451836131599190615314565b815181106131695761316961536a565b6020026020010151905060006015836131829190615314565b9050600f8110156131b0578160405160200161319e9190614623565b60405160208183030381529060405291505b600e811180156131c05750601381105b156131fc576131d86131d382601361527b565b6136ea565b826040516020016131ea9291906148c0565b60405160208183030381529060405291505b60138110612da357806013141561323557604051734d6173746572206f6620416c6b6168657374727960601b6020820152603401612d4d565b6040516e09ac2e6e8cae440decc40a8e4eae8d608b1b6020820152602f01612d91565b6060600061326984612c2b876136ea565b905060008384518361327b9190615314565b8151811061328b5761328b61536a565b6020026020010151905060006015836132a49190615314565b9050600e811180156132b65750601381105b156132f7576132d5600e6132cb83600a615230565b6131d3919061527b565b6040516020016132e59190614430565b60405160208183030381529060405291505b60138110612da357806013141561331e5760405161313560f01b6020820152602201612d4d565b60405161062760f31b6020820152602201612d91565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600061339784612c2b876136ea565b90506000838451836133a99190615314565b815181106133b9576133b961536a565b6020026020010151905060006015836133d29190615314565b9050600e811180156133e45750601381105b1561342b5760186000815481106133fd576133fd61536a565b9060005260206000200182604051602001613419929190614805565b60405160208183030381529060405291505b60138110612da357806013141561346c5760186001815481106134505761345061536a565b9060005260206000200182604051602001612d4d929190614805565b60186002815481106134805761348061536a565b9060005260206000200182604051602001612d91929190614805565b6134a7848484612e8d565b6134b384848484613c5e565b61190b5760405162461bcd60e51b8152600401610759906150f7565b60606040516020016135e5907f2e736d616c6c207b666f6e742d73697a653a20313270783b207d202e6269672081527203db337b73a16b9b4bd329d101918383c1dbe9606d1b60208201527f2e65706963207b66696c6c3a20236264623266663b2066696c7465723a20647260338201527f6f702d736861646f772831707820317078203020626c61636b293b7d20000000605382018190527f2e6c6567207b66696c6c3a20236662353630373b2066696c7465723a2064726f60708301527f702d736861646f772831707820317078203020626c61636b293b7d200000000060908301527f2e72617265207b66696c6c3a20233962663666663b2066696c7465723a20647260ac83015260cc82015260e90190565b604051602081830303815290604052905090565b606060006136078484613d6b565b905060138111156136335750506040805180820190915260038152626c656760e81b6020820152610659565b601281111561365e5750506040805180820190915260048152636570696360e01b6020820152610659565b600e8111156136895750506040805180820190915260048152637261726560e01b6020820152610659565b50506040805180820190915260048152636261736560e01b6020820152610659565b60606136b6846136ea565b6136bf846136ea565b836040516020016136d293929190614cb5565b60405160208183030381529060405290509392505050565b60608161370e5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156137385780613722816152f9565b91506137319050600a83615248565b9150613712565b60008167ffffffffffffffff81111561375357613753615380565b6040519080825280601f01601f19166020018201604052801561377d576020820181803683370190505b5090505b841561276c5761379260018361527b565b915061379f600a86615314565b6137aa906030615230565b60f81b8183815181106137bf576137bf61536a565b60200101906001600160f81b031916908160001a9053506137e1600a86615248565b9450613781565b805160609080613808575050604080516020810190915260008152919050565b60006003613817836002615230565b6138219190615248565b61382c90600461525c565b9050600061383b826020615230565b67ffffffffffffffff81111561385357613853615380565b6040519080825280601f01601f19166020018201604052801561387d576020820181803683370190505b50905060006040518060600160405280604081526020016153ad604091399050600181016020830160005b86811015613909576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016138a8565b506003860660018114613923576002811461393457613940565b613d3d60f01b600119830152613940565b603d60f81b6000198301525b505050918152949350505050565b6060600061395f84612c2b876136ea565b90506000838451836139719190615314565b815181106139815761398161536a565b60200260200101519050600060158361399a9190615314565b9050600e811180156139ac5750601381105b156139fc5760176139be600f8361527b565b815481106139ce576139ce61536a565b90600052602060002001826040516020016139ea929190614805565b60405160208183030381529060405291505b60138110612da3578060131415613a365760405174526f636b62656c6c204175746f6d61696c2041726d60581b6020820152603501612d4d565b601d86604051613a469190614430565b9081526020016040518091039020604051602001612d919190614837565b60606000613a7584612c2b876136ea565b9050600083845183613a879190615314565b81518110613a9757613a9761536a565b602002602001015190506000601583613ab09190615314565b9050600e81118015613ac25750601381105b15613b09576017600081548110613adb57613adb61536a565b9060005260206000200182604051602001613af7929190614805565b60405160208183030381529060405291505b60138110612da3578060131415613b2e5760176002815481106134505761345061536a565b60176003815481106134805761348061536a565b600081604051602001613b559190614430565b60408051601f19818403018152919052805160209091012092915050565b613b7d8383613d8a565b613b8a6000848484613c5e565b61088a5760405162461bcd60e51b8152600401610759906150f7565b6001600160a01b038316613c0157613bfc81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613c24565b816001600160a01b0316836001600160a01b031614613c2457613c248382613ec9565b6001600160a01b038216613c3b5761088a81613f66565b826001600160a01b0316826001600160a01b03161461088a5761088a8282614015565b60006001600160a01b0384163b15613d6057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613ca29033908990889088906004016150b1565b602060405180830381600087803b158015613cbc57600080fd5b505af1925050508015613cec575060408051601f3d908101601f19168201909252613ce99181019061429a565b60015b613d46573d808015613d1a576040519150601f19603f3d011682016040523d82523d6000602084013e613d1f565b606091505b508051613d3e5760405162461bcd60e51b8152600401610759906150f7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061276c565b506001949350505050565b600080613d7b83612c2b866136ea565b90506000610c36601583615314565b6001600160a01b038216613de05760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610759565b613de981612b8f565b15613e365760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610759565b613e4260008383613ba6565b6001600160a01b0382166000908152600360205260408120805460019290613e6b908490615230565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001613ed684611515565b613ee0919061527b565b600083815260076020526040902054909150808214613f33576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613f789060019061527b565b60008381526009602052604081205460088054939450909284908110613fa057613fa061536a565b906000526020600020015490508060088381548110613fc157613fc161536a565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613ff957613ff9615354565b6001900381819060005260206000200160009055905550505050565b600061402083611515565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b604051806102e001604052806017905b60608152602001906001900390816140695790505090565b600067ffffffffffffffff8084111561409c5761409c615380565b604051601f8501601f19908116603f011681019082821181831017156140c4576140c4615380565b816040528093508581528686860111156140dd57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461410e57600080fd5b919050565b8035801515811461410e57600080fd5b60006020828403121561413557600080fd5b61150e826140f7565b6000806040838503121561415157600080fd5b61415a836140f7565b9150614168602084016140f7565b90509250929050565b60008060006060848603121561418657600080fd5b61418f846140f7565b925061419d602085016140f7565b9150604084013590509250925092565b600080600080608085870312156141c357600080fd5b6141cc856140f7565b93506141da602086016140f7565b925060408501359150606085013567ffffffffffffffff8111156141fd57600080fd5b8501601f8101871361420e57600080fd5b61421d87823560208401614081565b91505092959194509250565b6000806040838503121561423c57600080fd5b614245836140f7565b915061416860208401614113565b6000806040838503121561426657600080fd5b61426f836140f7565b946020939093013593505050565b60006020828403121561428f57600080fd5b813561150e81615396565b6000602082840312156142ac57600080fd5b815161150e81615396565b6000602082840312156142c957600080fd5b5035919050565b600080604083850312156142e357600080fd5b8235915061416860208401614113565b6000806040838503121561430657600080fd5b82359150602083013567ffffffffffffffff81111561432457600080fd5b8301601f8101851361433557600080fd5b61434485823560208401614081565b9150509250929050565b60008151808452614366816020860160208601615292565b601f01601f19169290920160200192915050565b6000815161438c818560208601615292565b9290920192915050565b8054600090600181811c90808316806143b057607f831692505b60208084108214156143d257634e487b7160e01b600052602260045260246000fd5b8180156143e657600181146143f757614424565b60ff19861689528489019650614424565b60008881526020902060005b8681101561441c5781548b820152908501908301614403565b505084890196505b50505050505092915050565b60008251614442818460208701615292565b9190910192915050565b6000835161445e818460208801615292565b835190830190614472818360208801615292565b01949350505050565b60008851602061448e8285838e01615292565b8951918401916144a18184848e01615292565b89519201916144b38184848d01615292565b88519201916144c58184848c01615292565b87519201916144d78184848b01615292565b86519201916144e98184848a01615292565b85519201916144fb8184848901615292565b919091019a9950505050505050505050565b60008a5161451f818460208f01615292565b8a516145318183860160208f01615292565b8a519184010190614546818360208e01615292565b89516145588183850160208e01615292565b895192909101019061456e818360208c01615292565b87516145808183850160208c01615292565b8751929091010190614596818360208a01615292565b85519101906145a9818360208901615292565b84516145bb8183850160208901615292565b9101019b9a5050505050505050505050565b600082516145df818460208701615292565b64204579657360d81b920191825250600501919050565b60008251614608818460208701615292565b6802bb0b63632ba1016960bd1b920191825250600901919050565b60008251614635818460208701615292565b6908105b18da195b5a5cdd60b21b920191825250600a01919050565b6000875160206146648285838d01615292565b69021b432b6b4b9ba393c960b51b918401918252885161468a81600a8501848d01615292565b885192019161469f81600a8501848c01615292565b7f416e6369656e7420416c6368656d6963616c205468656f727920000000000000600a939091019283015286516146dc8160248501848b01615292565b86519201916146f18160248501848a01615292565b6e0223930b3b7b713b990283ab639b29608d1b6024939091019283015284516147208160338501848901615292565b919091016033019998505050505050505050565b60008251614746818460208701615292565b65081cdb585b1b60d21b920191825250600601919050565b60008351614770818460208801615292565b64537461747360d81b9083019081528351614792816005840160208801615292565b01600501949350505050565b600082516147b0818460208701615292565b6d436f6d70726568656e73696f6e7360901b920191825250600e01919050565b600082516147e2818460208701615292565b64102430b4b960d91b920191825250600501919050565b600061150e8284614396565b60006148118285614396565b600160fd1b8152835161482b816001840160208801615292565b01600101949350505050565b60006148438284614396565b6620536c6565766560c81b81526007019392505050565b60006802837b1b5b2ba1016960bd1b808352855161487f816009860160208a01615292565b855190840190614896816009840160208a01615292565b0160098101919091528351906148b3826012830160208801615292565b0160120195945050505050565b6b026b0b9ba32b9102930b735960a51b8152600083516148e781600c850160208801615292565b600160fd1b600c91840191820152835161490881600d840160208801615292565b6908105b18da195b5a5cdd60b21b600d9290910191820152601701949350505050565b63024a72a160e51b815260008a5161494a816004850160208f01615292565b8a5190830190614961816004840160208f01615292565b63020a82a160e51b600492909101918201528951614986816008840160208e01615292565b895191019061499c816008840160208d01615292565b63029aa29160e51b6008929091019182015287516149c181600c840160208c01615292565b87519101906149d781600c840160208b01615292565b614a1e614a18614a08614a026149fc600c8688010163020a3a4960e51b815260040190565b8b61437a565b8961437a565b63029a822160e51b815260040190565b8661437a565b9d9c50505050505050505050505050565b7f3c6c696e652078313d2238222079313d2238222078323d2238222079323d22338152741a19111039ba3937b5b29e913bb434ba329110179f60591b60208201527f3c6c696e652078313d2238222079313d22323830222078323d22313630222079603582015278191e91191c18111039ba3937b5b29e913bb434ba329110179f60391b60558201527f3c636972636c652063783d22333530222063793d22302220723d223530222066606e8201526d34b6361e913bb434ba329110179f60911b608e8201527f3c636972636c652063783d22333530222063793d22302220723d223235222066609c82015265696c6c3d222360d01b60bc8201526000614b3960c2830184614396565b631110179f60e11b81526004019392505050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f73766722207072657365727665417370656374526174696f3d22784d6960208201527f6e594d696e206d656574222076696577426f783d223020302033353020333530604082015261111f60f11b60608201527401e39ba3cb6329f173130b9b2903d903334b6361d1605d1b606282015260008451614bfa816077850160208901615292565b7f3b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a60779184019182015268010189a383c1d903e960bd1b60978201528451614c498160a0840160208901615292565b7f3c2f7374796c653e3c726563742077696474683d22313030252220686569676860a092909101918201526e3a1e911898181291103334b6361e9160891b60c0820152614cab614c9c60cf83018661437a565b6211179f60e91b815260030190565b9695505050505050565b6f1e17ba32bc3a1f1e3a32bc3a103c1e9160811b81528351600090614ce1816010850160208901615292565b6411103c9e9160d91b6010918401918201528451614d06816015840160208901615292565b68111031b630b9b99e9160b91b601592909101918201528351614d3081601e840160208801615292565b61111f60f11b601e929091019182015260200195945050505050565b600065020b9369016960d51b8083528551614d6e816006860160208a01615292565b855190840190614d85816006840160208a01615292565b016006810191909152835190614da282600c830160208801615292565b01600c0195945050505050565b60006602430b7321016960cd1b8083528551614dd2816007860160208a01615292565b855190840190614de9816007840160208a01615292565b016007810191909152835190614e0682600e830160208801615292565b01600e0195945050505050565b747b226e616d65223a2022416c6368656d697374202360581b81528251600090614e44816015850160208801615292565b7f222c20226465736372697074696f6e223a2022416c6368656d697374732061726015918401918201527f652067656e65726174656420737461742073686565747320696e20746865207360358201527f7069726974206f662046756c6c6d6574616c20416c6368656d6973742e20457660558201527f6572797468696e672069732073746f726564206f6e636861696e2e204665656c60758201527f206672656520746f2075736520696e20616e792077617920796f752077616e7460958201527f2e222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c60b5820152670ed8985cd94d8d0b60c21b60d58201528351614f508160dd840160208801615292565b61227d60f01b60dd929091019182015260df01949350505050565b7f3c7465787420783d2231362220793d2232342220636c6173733d220000000000815260008351614fa381601b850160208801615292565b632062696760e01b601b9184019182015261111f60f11b601f8201528351614fd2816021840160208801615292565b01602101949350505050565b602360f81b8152600061150e6001830184614396565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161502c81601d850160208701615292565b91909101601d0192915050565b69029b5b4b7102a37b732960b51b81526000845161505e81600a850160208901615292565b84519083019061507581600a840160208901615292565b6d029b5b4b7102230b935b732b9b9960951b600a929091019182015283516150a4816018840160208801615292565b0160180195945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614cab9083018461434e565b60208152600061150e602083018461434e565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f151bdad95b881251081a5b9d985b1a5960821b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000821982111561524357615243615328565b500190565b6000826152575761525761533e565b500490565b600081600019048311821515161561527657615276615328565b500290565b60008282101561528d5761528d615328565b500390565b60005b838110156152ad578181015183820152602001615295565b8381111561190b5750506000910152565b600181811c908216806152d257607f821691505b602082108114156152f357634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561530d5761530d615328565b5060010190565b6000826153235761532361533e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114612a1d57600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212203c3c6aacda577b459fc0b1097eb4d249fd8e96b19d6022a41186be78524a453f64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101c45760003560e01c80636d64385d116100f8578063b88d4fde11610090578063b88d4fde14610514578063bebf9faa14610534578063c87b56dd14610554578063cc9562cb14610574578063d45e314114610594578063df720497146105b4578063e985e9c5146105d4578063f2fde38b146105f4578063f376dea61461061457600080fd5b80636d64385d1461040c57806370a082311461042c578063715018a61461044c57806373075aff1461046157806378bdeccd146104815780638da5cb5b146104a157806395d89b41146104bf578063a22cb465146104d4578063b70930de146104f457600080fd5b806323b872dd1161016b57806323b872dd146102f95780632f745c59146103195780633cf414371461033957806342842e0e146103595780634f6ccce7146103795780635470b13b1461039957806356873189146103b95780636352211e146103cc5780636d03f217146103ec57600080fd5b806301ffc9a7146101c957806306fdde03146101fe578063081812fc14610220578063095ea7b314610258578063123ef8b91461027a57806317899e041461029a57806318160ddd146102ba57806318c99c4e146102d9575b600080fd5b3480156101d557600080fd5b506101e96101e436600461427d565b610634565b60405190151581526020015b60405180910390f35b34801561020a57600080fd5b5061021361065f565b6040516101f591906150e4565b34801561022c57600080fd5b5061024061023b3660046142b7565b6106f1565b6040516001600160a01b0390911681526020016101f5565b34801561026457600080fd5b50610278610273366004614253565b61077e565b005b34801561028657600080fd5b506102136102953660046142b7565b61088f565b3480156102a657600080fd5b506102136102b53660046142d0565b610a36565b3480156102c657600080fd5b506008545b6040519081526020016101f5565b3480156102e557600080fd5b506102786102f43660046142b7565b610c3f565b34801561030557600080fd5b50610278610314366004614171565b610ce6565b34801561032557600080fd5b506102cb610334366004614253565b610d17565b34801561034557600080fd5b506102cb6103543660046142b7565b610dad565b34801561036557600080fd5b50610278610374366004614171565b610e9f565b34801561038557600080fd5b506102cb6103943660046142b7565b610eba565b3480156103a557600080fd5b506102136103b43660046142b7565b610f4d565b6102786103c73660046142b7565b611049565b3480156103d857600080fd5b506102406103e73660046142b7565b6112bf565b3480156103f857600080fd5b506102136104073660046142b7565b611336565b34801561041857600080fd5b506102136104273660046142f3565b611430565b34801561043857600080fd5b506102cb610447366004614123565b611515565b34801561045857600080fd5b5061027861159c565b34801561046d57600080fd5b5061021361047c3660046142b7565b6115d2565b34801561048d57600080fd5b5061021361049c3660046142f3565b61163a565b3480156104ad57600080fd5b50600b546001600160a01b0316610240565b3480156104cb57600080fd5b5061021361170f565b3480156104e057600080fd5b506102786104ef366004614229565b61171e565b34801561050057600080fd5b5061021361050f3660046142b7565b6117df565b34801561052057600080fd5b5061027861052f3660046141ad565b6118d9565b34801561054057600080fd5b5061021361054f3660046142b7565b611911565b34801561056057600080fd5b5061021361056f3660046142b7565b611a03565b34801561058057600080fd5b5061021361058f3660046142d0565b61264f565b3480156105a057600080fd5b506102136105af3660046142b7565b612774565b3480156105c057600080fd5b506102136105cf3660046142b7565b612866565b3480156105e057600080fd5b506101e96105ef36600461413e565b612957565b34801561060057600080fd5b5061027861060f366004614123565b612985565b34801561062057600080fd5b5061021361062f3660046142d0565b612a20565b60006001600160e01b0319821663780e9d6360e01b1480610659575061065982612b3f565b92915050565b60606000805461066e906152be565b80601f016020809104026020016040519081016040528092919081815260200182805461069a906152be565b80156106e75780601f106106bc576101008083540402835291602001916106e7565b820191906000526020600020905b8154815290600101906020018083116106ca57829003601f168201915b5050505050905090565b60006106fc82612b8f565b6107625760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610789826112bf565b9050806001600160a01b0316836001600160a01b031614156107f75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610759565b336001600160a01b038216148061081357506108138133612957565b6108805760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b6064820152608401610759565b61088a8383612bac565b505050565b6060601461098c836040518060400160405280600581526020016414d2d2539160da1b8152506014805480602002602001604051908101604052809291908181526020016000905b828210156109835783829060005260206000200180546108f6906152be565b80601f0160208091040260200160405190810160405280929190818152602001828054610922906152be565b801561096f5780601f106109445761010080835404028352916020019161096f565b820191906000526020600020905b81548152906001019060200180831161095257829003601f168201915b5050505050815260200190600101906108d7565b50505050612c1a565b8154811061099c5761099c61536a565b9060005260206000200180546109b1906152be565b80601f01602080910402602001604051908101604052809291908181526020018280546109dd906152be565b8015610a2a5780601f106109ff57610100808354040283529160200191610a2a565b820191906000526020600020905b815481529060010190602001808311610a0d57829003601f168201915b50505050509050919050565b606060006040518060400160405280600581526020016452504f434b60d81b81525090506000600e805480602002602001604051908101604052809291908181526020016000905b82821015610b2a578382906000526020600020018054610a9d906152be565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac9906152be565b8015610b165780601f10610aeb57610100808354040283529160200191610b16565b820191906000526020600020905b815481529060010190602001808311610af957829003601f168201915b505050505081526020019060010190610a7e565b5050505090508315610c2b57604051806040016040528060058152602001644c504f434b60d81b8152509150600d805480602002602001604051908101604052809291908181526020016000905b82821015610c24578382906000526020600020018054610b97906152be565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc3906152be565b8015610c105780601f10610be557610100808354040283529160200191610c10565b820191906000526020600020905b815481529060010190602001808311610bf357829003601f168201915b505050505081526020019060010190610b78565b5050505090505b610c36858383612c5a565b95945050505050565b6002600a541415610c625760405162461bcd60e51b8152600401610759906151f9565b6002600a558015801590610c77575061030981105b610c935760405162461bcd60e51b81526004016107599061517e565b600a610c9e33611515565b10610cd35760405162461bcd60e51b815260206004820152600560248201526410da1a5b1b60da1b6044820152606401610759565b610cde335b82612dad565b506001600a55565b610cf03382612dcb565b610d0c5760405162461bcd60e51b8152600401610759906151a8565b61088a838383612e8d565b6000610d2283611515565b8210610d845760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610759565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000610659826040518060400160405280600581526020016414d2d2539160da1b8152506013805480602002602001604051908101604052809291908181526020016000905b82821015610983578382906000526020600020018054610e12906152be565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3e906152be565b8015610e8b5780601f10610e6057610100808354040283529160200191610e8b565b820191906000526020600020905b815481529060010190602001808311610e6e57829003601f168201915b505050505081526020019060010190610df3565b61088a838383604051806020016040528060008152506118d9565b6000610ec560085490565b8210610f285760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610759565b60088281548110610f3b57610f3b61536a565b90600052602060002001549050919050565b6060610659826040518060400160405280600681526020016515d05313115560d21b815250600f805480602002602001604051908101604052809291908181526020016000905b82821015611040578382906000526020600020018054610fb3906152be565b80601f0160208091040260200160405190810160405280929190818152602001828054610fdf906152be565b801561102c5780601f106110015761010080835404028352916020019161102c565b820191906000526020600020905b81548152906001019060200180831161100f57829003601f168201915b505050505081526020019060010190610f94565b50505050613038565b6002600a54141561106c5760405162461bcd60e51b8152600401610759906151f9565b6002600a55610308811180156110835750610d0681105b61109f5760405162461bcd60e51b81526004016107599061517e565b660e35fa931a00003410156110e35760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b6044820152606401610759565b6110ec33610cd8565b738de3c3891268502f77db7e876d727257dec0f8526108fc600861111134600361525c565b61111b9190615248565b6040518115909202916000818181858888f19350505050158015611143573d6000803e3d6000fd5b5061114e600d6112bf565b6001600160a01b03166108fc611165601034615248565b6040518115909202916000818181858888f1935050505015801561118d573d6000803e3d6000fd5b50611198602a6112bf565b6001600160a01b03166108fc6111af600834615248565b6040518115909202916000818181858888f193505050501580156111d7573d6000803e3d6000fd5b506111e260456112bf565b6001600160a01b03166108fc6111f9600834615248565b6040518115909202916000818181858888f19350505050158015611221573d6000803e3d6000fd5b5061122c60896112bf565b6001600160a01b03166108fc611243601034615248565b6040518115909202916000818181858888f1935050505015801561126b573d6000803e3d6000fd5b506112776101a46112bf565b6001600160a01b03166108fc61128e600434615248565b6040518115909202916000818181858888f193505050501580156112b6573d6000803e3d6000fd5b50506001600a55565b6000818152600260205260408120546001600160a01b0316806106595760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610759565b606061065982604051806040016040528060048152602001634146464960e01b8152506016805480602002602001604051908101604052809291908181526020016000905b8282101561142757838290600052602060002001805461139a906152be565b80601f01602080910402602001604051908101604052809291908181526020018280546113c6906152be565b80156114135780601f106113e857610100808354040283529160200191611413565b820191906000526020600020905b8154815290600101906020018083116113f657829003601f168201915b50505050508152602001906001019061137b565b50505050613136565b606061150e83836015805480602002602001604051908101604052809291908181526020016000905b82821015611505578382906000526020600020018054611478906152be565b80601f01602080910402602001604051908101604052809291908181526020018280546114a4906152be565b80156114f15780601f106114c6576101008083540402835291602001916114f1565b820191906000526020600020905b8154815290600101906020018083116114d457829003601f168201915b505050505081526020019060010190611459565b50505050613258565b9392505050565b60006001600160a01b0382166115805760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610759565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146115c65760405162461bcd60e51b815260040161075990615149565b6115d06000613334565b565b606060196115df8361088f565b6040516115ec9190614430565b908152602001604051809103902061160383610dad565b600681106116135761161361536a565b016040516020016116249190614fde565b6040516020818303038152906040529050919050565b606061150e83836015805480602002602001604051908101604052809291908181526020016000905b82821015611505578382906000526020600020018054611682906152be565b80601f01602080910402602001604051908101604052809291908181526020018280546116ae906152be565b80156116fb5780601f106116d0576101008083540402835291602001916116fb565b820191906000526020600020905b8154815290600101906020018083116116de57829003601f168201915b505050505081526020019060010190611663565b60606001805461066e906152be565b6001600160a01b0382163314156117735760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610759565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b606061065982604051806040016040528060048152602001632420a4a960e11b8152506012805480602002602001604051908101604052809291908181526020016000905b828210156118d0578382906000526020600020018054611843906152be565b80601f016020809104026020016040519081016040528092919081815260200182805461186f906152be565b80156118bc5780601f10611891576101008083540402835291602001916118bc565b820191906000526020600020905b81548152906001019060200180831161189f57829003601f168201915b505050505081526020019060010190611824565b50505050613386565b6118e33383612dcb565b6118ff5760405162461bcd60e51b8152600401610759906151a8565b61190b8484848461349c565b50505050565b6060610659826040518060400160405280600581526020016414d2d2539560da1b8152506013805480602002602001604051908101604052809291908181526020016000905b828210156118d0578382906000526020600020018054611976906152be565b80601f01602080910402602001604051908101604052809291908181526020018280546119a2906152be565b80156119ef5780601f106119c4576101008083540402835291602001916119ef565b820191906000526020600020905b8154815290600101906020018083116119d257829003601f168201915b505050505081526020019060010190611957565b6060611a0d614059565b600060405180604001604052806005815260200164776869746560d81b81525090506004611b21856040518060400160405280600581526020016414d2d2539160da1b8152506014805480602002602001604051908101604052809291908181526020016000905b82821015610983578382906000526020600020018054611a94906152be565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac0906152be565b8015611b0d5780601f10611ae257610100808354040283529160200191611b0d565b820191906000526020600020905b815481529060010190602001808311611af057829003601f168201915b505050505081526020019060010190611a75565b1015611b455750604080518082019091526005815264626c61636b60d81b60208201525b80611b4e6134cf565b611b57866115d2565b604051602001611b6993929190614b4d565b60408051808303601f19018152918152908352805180820190915260048152634146464960e01b6020820152611ba09085906135f9565b611ba985611336565b604051602001611bba929190614f6b565b60408051601f198184030181529190528260016020020181905250611bff61012260e6604051806040016040528060048152602001636261736560e01b8152506136ab565b611c5061012260fa611c2c886040518060400160405280600381526020016212539560ea1b8152506135f9565b604051602001611c3c9190614734565b6040516020818303038152906040526136ab565b604051602001611c6192919061475e565b60408051808303601f19018152918152838101919091528051808201909152600381526212539560ea1b6020820152611c9b908590611430565b611cc961012261010a611c2c886040518060400160405280600381526020016210541560ea1b8152506135f9565b611cee866040518060400160405280600381526020016210541560ea1b815250611430565b611d1c61012261011a611c2c8a6040518060400160405280600381526020016229aa2960e91b8152506135f9565b611d41886040518060400160405280600381526020016229aa2960e91b815250611430565b611d6f61012261012a611c2c8c6040518060400160405280600381526020016241474960e81b8152506135f9565b611d948a6040518060400160405280600381526020016241474960e81b815250611430565b611dc261012261013a611c2c8e6040518060400160405280600381526020016214d41160ea1b8152506135f9565b611de78c6040518060400160405280600381526020016214d41160ea1b815250611430565b604051602001611dff9998979695949392919061492b565b60408051601f198184030181529190528260036020020181905250611e446010610112604051806040016040528060048152602001636261736560e01b8152506136ab565b604051602001611e54919061479e565b60408051601f198184030181529190528260046020020181905250611e9d6010610126611c2c87604051806040016040528060048152602001634348454d60e01b8152506135f9565b611ec385604051806040016040528060048152602001634348454d60e01b81525061163a565b611ef16010610136611c2c89604051806040016040528060048152602001631050531560e21b8152506135f9565b611f1787604051806040016040528060048152602001631050531560e21b81525061163a565b611f456010610146611c2c8b604051806040016040528060048152602001634452414760e01b8152506135f9565b611f6b89604051806040016040528060048152602001634452414760e01b81525061163a565b604051602001611f8096959493929190614651565b60408051601f198184030181529190528260056020020181905250611fce60106032611fc98760405180604001604052806005815260200164131210539160da1b8152506135f9565b6136ab565b60c0830152611fde846001612a20565b61200c60106046611fc98860405180604001604052806005815260200164149210539160da1b8152506135f9565b612017866000612a20565b60405160200161202993929190614daf565b60408051601f1981840301815291905282600760200201819052506120716010605a611fc987604051806040016040528060048152602001634c41524d60e01b8152506135f9565b61010083015261208284600161264f565b6120af6010606e611fc988604051806040016040528060048152602001635241524d60e01b8152506135f9565b6120ba86600061264f565b6040516020016120cc93929190614d4c565b60408051601f19818403018152919052826009602002018190525061211560106087611fc987604051806040016040528060058152602001644c504f434b60d81b8152506135f9565b610140830152612126846001610a36565b6121546010609b611fc9886040518060400160405280600581526020016452504f434b60d81b8152506135f9565b61215f866000610a36565b6040516020016121719392919061485a565b60408051601f1981840301815291905282600b60200201819052506121bb601060af611fc9876040518060400160405280600681526020016515d05313115560d21b8152506135f9565b6040516020016121cb91906145f6565b60408051808303601f190181529190526101808301526121ea84610f4d565b82600d6020020181905250612222601060c6611c2c87604051806040016040528060048152602001632420a4a960e11b8152506135f9565b6101c0830152612231846117df565b60405160200161224191906147d0565b60408051601f1981840301815291905282600f6020020181905250612289601060d6611c2c87604051806040016040528060048152602001634559455360e01b8152506135f9565b61020083015261229884612866565b6040516020016122a891906145cd565b60408051601f1981840301815291905282601160200201819052506122f1601060e6611c2c876040518060400160405280600581526020016414d2d2539560da1b8152506135f9565b61024083015261230084611911565b61232e601060f6611c2c886040518060400160405280600581526020016414d2d2539160da1b8152506135f9565b61233786612774565b60405160200161234993929190615039565b60408051808303601f19018152918152610260840191909152805180820190915260078152661e17ba32bc3a1f60c91b60208201528260146020020181905250601e601161247c86604051806040016040528060048152602001634559455360e01b8152506011805480602002602001604051908101604052809291908181526020016000905b828210156109835783829060005260206000200180546123ef906152be565b80601f016020809104026020016040519081016040528092919081815260200182805461241b906152be565b80156124685780601f1061243d57610100808354040283529160200191612468565b820191906000526020600020905b81548152906001019060200180831161244b57829003601f168201915b5050505050815260200190600101906123d0565b8154811061248c5761248c61536a565b906000526020600020016040516124a391906147f9565b90815260200160405180910390206040516020016124c19190614a2f565b60408051601f198184030181529181526102a08401919091528051808201825260068152651e17b9bb339f60d11b6020808301919091526102c0850191909152835181850151858401516060870151608088015160a089015160c08a015160e08b01516101008c0151995160009a61253b9a90910161450d565b60408051808303601f19018152908290526101208501516101408601516101608701516101808801516101a08901516101c08a01516101e08b01516102008c015197995061258e988a989060200161450d565b60408051808303601f19018152908290526102208501516102408601516102608701516102808801516102a08901516102c08a01519597506125d59688969060200161447b565b604051602081830303815290604052905060006126226125f4876136ea565b6125fd846137e8565b60405160200161260e929190614e13565b6040516020818303038152906040526137e8565b9050806040516020016126359190614ff4565b60408051601f198184030181529190529695505050505050565b6040805180820190915260048152635241524d60e01b6020820152606090821561269057506040805180820190915260048152634c41524d60e01b60208201525b61276c84826010805480602002602001604051908101604052809291908181526020016000905b828210156127635783829060005260206000200180546126d6906152be565b80601f0160208091040260200160405190810160405280929190818152602001828054612702906152be565b801561274f5780601f106127245761010080835404028352916020019161274f565b820191906000526020600020905b81548152906001019060200180831161273257829003601f168201915b5050505050815260200190600101906126b7565b5050505061394e565b949350505050565b6060610659826040518060400160405280600581526020016414d2d2539160da1b8152506014805480602002602001604051908101604052809291908181526020016000905b828210156118d05783829060005260206000200180546127d9906152be565b80601f0160208091040260200160405190810160405280929190818152602001828054612805906152be565b80156128525780601f1061282757610100808354040283529160200191612852565b820191906000526020600020905b81548152906001019060200180831161283557829003601f168201915b5050505050815260200190600101906127ba565b606061065982604051806040016040528060048152602001634559455360e01b8152506011805480602002602001604051908101604052809291908181526020016000905b828210156118d05783829060005260206000200180546128ca906152be565b80601f01602080910402602001604051908101604052809291908181526020018280546128f6906152be565b80156129435780601f1061291857610100808354040283529160200191612943565b820191906000526020600020905b81548152906001019060200180831161292657829003601f168201915b5050505050815260200190600101906128ab565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600b546001600160a01b031633146129af5760405162461bcd60e51b815260040161075990615149565b6001600160a01b038116612a145760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610759565b612a1d81613334565b50565b604080518082019091526005815264149210539160da1b60208201526060908215612a635750604080518082019091526005815264131210539160da1b60208201525b61276c8482600c805480602002602001604051908101604052809291908181526020016000905b82821015612b36578382906000526020600020018054612aa9906152be565b80601f0160208091040260200160405190810160405280929190818152602001828054612ad5906152be565b8015612b225780601f10612af757610100808354040283529160200191612b22565b820191906000526020600020905b815481529060010190602001808311612b0557829003601f168201915b505050505081526020019060010190612a8a565b50505050613a64565b60006001600160e01b031982166380ac58cd60e01b1480612b7057506001600160e01b03198216635b5e139f60e01b145b8061065957506301ffc9a760e01b6001600160e01b0319831614610659565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612be1826112bf565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008151612c5084612c2b876136ea565b604051602001612c3c92919061444c565b604051602081830303815290604052613b42565b61276c9190615314565b60606000612c6b84612c2b876136ea565b9050600083845183612c7d9190615314565b81518110612c8d57612c8d61536a565b602002602001015190506000601583612ca69190615314565b9050600e81118015612cb85750601381105b15612d0e5784612cc9600f8361527b565b612cd4906004615230565b81518110612ce457612ce461536a565b6020026020010151604051602001612cfc9190614430565b60405160208183030381529060405291505b60138110612da3578060131415612d6357601b86604051612d2f9190614430565b9081526020016040518091039020604051602001612d4d91906147f9565b6040516020818303038152906040529150612da3565b601c86604051612d739190614430565b9081526020016040518091039020604051602001612d9191906147f9565b60405160208183030381529060405291505b5095945050505050565b612dc7828260405180602001604052806000815250613b73565b5050565b6000612dd682612b8f565b612e375760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610759565b6000612e42836112bf565b9050806001600160a01b0316846001600160a01b03161480612e7d5750836001600160a01b0316612e72846106f1565b6001600160a01b0316145b8061276c575061276c8185612957565b826001600160a01b0316612ea0826112bf565b6001600160a01b031614612f085760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610759565b6001600160a01b038216612f6a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610759565b612f75838383613ba6565b612f80600082612bac565b6001600160a01b0383166000908152600360205260408120805460019290612fa990849061527b565b90915550506001600160a01b0382166000908152600360205260408120805460019290612fd7908490615230565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6060600061304984612c2b876136ea565b905060008384518361305b9190615314565b8151811061306b5761306b61536a565b6020026020010151905060006015836130849190615314565b9050600e811180156130965750601381105b156130ec57846130a7600f8361527b565b6130b2906004615230565b815181106130c2576130c261536a565b60200260200101516040516020016130da9190614430565b60405160208183030381529060405291505b60138110612da357806013141561311957604051673634302043656e7360c01b6020820152602801612d4d565b60405168363430302043656e7360b81b6020820152602901612d91565b6060600061314784612c2b876136ea565b90506000838451836131599190615314565b815181106131695761316961536a565b6020026020010151905060006015836131829190615314565b9050600f8110156131b0578160405160200161319e9190614623565b60405160208183030381529060405291505b600e811180156131c05750601381105b156131fc576131d86131d382601361527b565b6136ea565b826040516020016131ea9291906148c0565b60405160208183030381529060405291505b60138110612da357806013141561323557604051734d6173746572206f6620416c6b6168657374727960601b6020820152603401612d4d565b6040516e09ac2e6e8cae440decc40a8e4eae8d608b1b6020820152602f01612d91565b6060600061326984612c2b876136ea565b905060008384518361327b9190615314565b8151811061328b5761328b61536a565b6020026020010151905060006015836132a49190615314565b9050600e811180156132b65750601381105b156132f7576132d5600e6132cb83600a615230565b6131d3919061527b565b6040516020016132e59190614430565b60405160208183030381529060405291505b60138110612da357806013141561331e5760405161313560f01b6020820152602201612d4d565b60405161062760f31b6020820152602201612d91565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600061339784612c2b876136ea565b90506000838451836133a99190615314565b815181106133b9576133b961536a565b6020026020010151905060006015836133d29190615314565b9050600e811180156133e45750601381105b1561342b5760186000815481106133fd576133fd61536a565b9060005260206000200182604051602001613419929190614805565b60405160208183030381529060405291505b60138110612da357806013141561346c5760186001815481106134505761345061536a565b9060005260206000200182604051602001612d4d929190614805565b60186002815481106134805761348061536a565b9060005260206000200182604051602001612d91929190614805565b6134a7848484612e8d565b6134b384848484613c5e565b61190b5760405162461bcd60e51b8152600401610759906150f7565b60606040516020016135e5907f2e736d616c6c207b666f6e742d73697a653a20313270783b207d202e6269672081527203db337b73a16b9b4bd329d101918383c1dbe9606d1b60208201527f2e65706963207b66696c6c3a20236264623266663b2066696c7465723a20647260338201527f6f702d736861646f772831707820317078203020626c61636b293b7d20000000605382018190527f2e6c6567207b66696c6c3a20236662353630373b2066696c7465723a2064726f60708301527f702d736861646f772831707820317078203020626c61636b293b7d200000000060908301527f2e72617265207b66696c6c3a20233962663666663b2066696c7465723a20647260ac83015260cc82015260e90190565b604051602081830303815290604052905090565b606060006136078484613d6b565b905060138111156136335750506040805180820190915260038152626c656760e81b6020820152610659565b601281111561365e5750506040805180820190915260048152636570696360e01b6020820152610659565b600e8111156136895750506040805180820190915260048152637261726560e01b6020820152610659565b50506040805180820190915260048152636261736560e01b6020820152610659565b60606136b6846136ea565b6136bf846136ea565b836040516020016136d293929190614cb5565b60405160208183030381529060405290509392505050565b60608161370e5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156137385780613722816152f9565b91506137319050600a83615248565b9150613712565b60008167ffffffffffffffff81111561375357613753615380565b6040519080825280601f01601f19166020018201604052801561377d576020820181803683370190505b5090505b841561276c5761379260018361527b565b915061379f600a86615314565b6137aa906030615230565b60f81b8183815181106137bf576137bf61536a565b60200101906001600160f81b031916908160001a9053506137e1600a86615248565b9450613781565b805160609080613808575050604080516020810190915260008152919050565b60006003613817836002615230565b6138219190615248565b61382c90600461525c565b9050600061383b826020615230565b67ffffffffffffffff81111561385357613853615380565b6040519080825280601f01601f19166020018201604052801561387d576020820181803683370190505b50905060006040518060600160405280604081526020016153ad604091399050600181016020830160005b86811015613909576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016138a8565b506003860660018114613923576002811461393457613940565b613d3d60f01b600119830152613940565b603d60f81b6000198301525b505050918152949350505050565b6060600061395f84612c2b876136ea565b90506000838451836139719190615314565b815181106139815761398161536a565b60200260200101519050600060158361399a9190615314565b9050600e811180156139ac5750601381105b156139fc5760176139be600f8361527b565b815481106139ce576139ce61536a565b90600052602060002001826040516020016139ea929190614805565b60405160208183030381529060405291505b60138110612da3578060131415613a365760405174526f636b62656c6c204175746f6d61696c2041726d60581b6020820152603501612d4d565b601d86604051613a469190614430565b9081526020016040518091039020604051602001612d919190614837565b60606000613a7584612c2b876136ea565b9050600083845183613a879190615314565b81518110613a9757613a9761536a565b602002602001015190506000601583613ab09190615314565b9050600e81118015613ac25750601381105b15613b09576017600081548110613adb57613adb61536a565b9060005260206000200182604051602001613af7929190614805565b60405160208183030381529060405291505b60138110612da3578060131415613b2e5760176002815481106134505761345061536a565b60176003815481106134805761348061536a565b600081604051602001613b559190614430565b60408051601f19818403018152919052805160209091012092915050565b613b7d8383613d8a565b613b8a6000848484613c5e565b61088a5760405162461bcd60e51b8152600401610759906150f7565b6001600160a01b038316613c0157613bfc81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613c24565b816001600160a01b0316836001600160a01b031614613c2457613c248382613ec9565b6001600160a01b038216613c3b5761088a81613f66565b826001600160a01b0316826001600160a01b03161461088a5761088a8282614015565b60006001600160a01b0384163b15613d6057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613ca29033908990889088906004016150b1565b602060405180830381600087803b158015613cbc57600080fd5b505af1925050508015613cec575060408051601f3d908101601f19168201909252613ce99181019061429a565b60015b613d46573d808015613d1a576040519150601f19603f3d011682016040523d82523d6000602084013e613d1f565b606091505b508051613d3e5760405162461bcd60e51b8152600401610759906150f7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061276c565b506001949350505050565b600080613d7b83612c2b866136ea565b90506000610c36601583615314565b6001600160a01b038216613de05760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610759565b613de981612b8f565b15613e365760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610759565b613e4260008383613ba6565b6001600160a01b0382166000908152600360205260408120805460019290613e6b908490615230565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001613ed684611515565b613ee0919061527b565b600083815260076020526040902054909150808214613f33576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613f789060019061527b565b60008381526009602052604081205460088054939450909284908110613fa057613fa061536a565b906000526020600020015490508060088381548110613fc157613fc161536a565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613ff957613ff9615354565b6001900381819060005260206000200160009055905550505050565b600061402083611515565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b604051806102e001604052806017905b60608152602001906001900390816140695790505090565b600067ffffffffffffffff8084111561409c5761409c615380565b604051601f8501601f19908116603f011681019082821181831017156140c4576140c4615380565b816040528093508581528686860111156140dd57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461410e57600080fd5b919050565b8035801515811461410e57600080fd5b60006020828403121561413557600080fd5b61150e826140f7565b6000806040838503121561415157600080fd5b61415a836140f7565b9150614168602084016140f7565b90509250929050565b60008060006060848603121561418657600080fd5b61418f846140f7565b925061419d602085016140f7565b9150604084013590509250925092565b600080600080608085870312156141c357600080fd5b6141cc856140f7565b93506141da602086016140f7565b925060408501359150606085013567ffffffffffffffff8111156141fd57600080fd5b8501601f8101871361420e57600080fd5b61421d87823560208401614081565b91505092959194509250565b6000806040838503121561423c57600080fd5b614245836140f7565b915061416860208401614113565b6000806040838503121561426657600080fd5b61426f836140f7565b946020939093013593505050565b60006020828403121561428f57600080fd5b813561150e81615396565b6000602082840312156142ac57600080fd5b815161150e81615396565b6000602082840312156142c957600080fd5b5035919050565b600080604083850312156142e357600080fd5b8235915061416860208401614113565b6000806040838503121561430657600080fd5b82359150602083013567ffffffffffffffff81111561432457600080fd5b8301601f8101851361433557600080fd5b61434485823560208401614081565b9150509250929050565b60008151808452614366816020860160208601615292565b601f01601f19169290920160200192915050565b6000815161438c818560208601615292565b9290920192915050565b8054600090600181811c90808316806143b057607f831692505b60208084108214156143d257634e487b7160e01b600052602260045260246000fd5b8180156143e657600181146143f757614424565b60ff19861689528489019650614424565b60008881526020902060005b8681101561441c5781548b820152908501908301614403565b505084890196505b50505050505092915050565b60008251614442818460208701615292565b9190910192915050565b6000835161445e818460208801615292565b835190830190614472818360208801615292565b01949350505050565b60008851602061448e8285838e01615292565b8951918401916144a18184848e01615292565b89519201916144b38184848d01615292565b88519201916144c58184848c01615292565b87519201916144d78184848b01615292565b86519201916144e98184848a01615292565b85519201916144fb8184848901615292565b919091019a9950505050505050505050565b60008a5161451f818460208f01615292565b8a516145318183860160208f01615292565b8a519184010190614546818360208e01615292565b89516145588183850160208e01615292565b895192909101019061456e818360208c01615292565b87516145808183850160208c01615292565b8751929091010190614596818360208a01615292565b85519101906145a9818360208901615292565b84516145bb8183850160208901615292565b9101019b9a5050505050505050505050565b600082516145df818460208701615292565b64204579657360d81b920191825250600501919050565b60008251614608818460208701615292565b6802bb0b63632ba1016960bd1b920191825250600901919050565b60008251614635818460208701615292565b6908105b18da195b5a5cdd60b21b920191825250600a01919050565b6000875160206146648285838d01615292565b69021b432b6b4b9ba393c960b51b918401918252885161468a81600a8501848d01615292565b885192019161469f81600a8501848c01615292565b7f416e6369656e7420416c6368656d6963616c205468656f727920000000000000600a939091019283015286516146dc8160248501848b01615292565b86519201916146f18160248501848a01615292565b6e0223930b3b7b713b990283ab639b29608d1b6024939091019283015284516147208160338501848901615292565b919091016033019998505050505050505050565b60008251614746818460208701615292565b65081cdb585b1b60d21b920191825250600601919050565b60008351614770818460208801615292565b64537461747360d81b9083019081528351614792816005840160208801615292565b01600501949350505050565b600082516147b0818460208701615292565b6d436f6d70726568656e73696f6e7360901b920191825250600e01919050565b600082516147e2818460208701615292565b64102430b4b960d91b920191825250600501919050565b600061150e8284614396565b60006148118285614396565b600160fd1b8152835161482b816001840160208801615292565b01600101949350505050565b60006148438284614396565b6620536c6565766560c81b81526007019392505050565b60006802837b1b5b2ba1016960bd1b808352855161487f816009860160208a01615292565b855190840190614896816009840160208a01615292565b0160098101919091528351906148b3826012830160208801615292565b0160120195945050505050565b6b026b0b9ba32b9102930b735960a51b8152600083516148e781600c850160208801615292565b600160fd1b600c91840191820152835161490881600d840160208801615292565b6908105b18da195b5a5cdd60b21b600d9290910191820152601701949350505050565b63024a72a160e51b815260008a5161494a816004850160208f01615292565b8a5190830190614961816004840160208f01615292565b63020a82a160e51b600492909101918201528951614986816008840160208e01615292565b895191019061499c816008840160208d01615292565b63029aa29160e51b6008929091019182015287516149c181600c840160208c01615292565b87519101906149d781600c840160208b01615292565b614a1e614a18614a08614a026149fc600c8688010163020a3a4960e51b815260040190565b8b61437a565b8961437a565b63029a822160e51b815260040190565b8661437a565b9d9c50505050505050505050505050565b7f3c6c696e652078313d2238222079313d2238222078323d2238222079323d22338152741a19111039ba3937b5b29e913bb434ba329110179f60591b60208201527f3c6c696e652078313d2238222079313d22323830222078323d22313630222079603582015278191e91191c18111039ba3937b5b29e913bb434ba329110179f60391b60558201527f3c636972636c652063783d22333530222063793d22302220723d223530222066606e8201526d34b6361e913bb434ba329110179f60911b608e8201527f3c636972636c652063783d22333530222063793d22302220723d223235222066609c82015265696c6c3d222360d01b60bc8201526000614b3960c2830184614396565b631110179f60e11b81526004019392505050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f73766722207072657365727665417370656374526174696f3d22784d6960208201527f6e594d696e206d656574222076696577426f783d223020302033353020333530604082015261111f60f11b60608201527401e39ba3cb6329f173130b9b2903d903334b6361d1605d1b606282015260008451614bfa816077850160208901615292565b7f3b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a60779184019182015268010189a383c1d903e960bd1b60978201528451614c498160a0840160208901615292565b7f3c2f7374796c653e3c726563742077696474683d22313030252220686569676860a092909101918201526e3a1e911898181291103334b6361e9160891b60c0820152614cab614c9c60cf83018661437a565b6211179f60e91b815260030190565b9695505050505050565b6f1e17ba32bc3a1f1e3a32bc3a103c1e9160811b81528351600090614ce1816010850160208901615292565b6411103c9e9160d91b6010918401918201528451614d06816015840160208901615292565b68111031b630b9b99e9160b91b601592909101918201528351614d3081601e840160208801615292565b61111f60f11b601e929091019182015260200195945050505050565b600065020b9369016960d51b8083528551614d6e816006860160208a01615292565b855190840190614d85816006840160208a01615292565b016006810191909152835190614da282600c830160208801615292565b01600c0195945050505050565b60006602430b7321016960cd1b8083528551614dd2816007860160208a01615292565b855190840190614de9816007840160208a01615292565b016007810191909152835190614e0682600e830160208801615292565b01600e0195945050505050565b747b226e616d65223a2022416c6368656d697374202360581b81528251600090614e44816015850160208801615292565b7f222c20226465736372697074696f6e223a2022416c6368656d697374732061726015918401918201527f652067656e65726174656420737461742073686565747320696e20746865207360358201527f7069726974206f662046756c6c6d6574616c20416c6368656d6973742e20457660558201527f6572797468696e672069732073746f726564206f6e636861696e2e204665656c60758201527f206672656520746f2075736520696e20616e792077617920796f752077616e7460958201527f2e222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c60b5820152670ed8985cd94d8d0b60c21b60d58201528351614f508160dd840160208801615292565b61227d60f01b60dd929091019182015260df01949350505050565b7f3c7465787420783d2231362220793d2232342220636c6173733d220000000000815260008351614fa381601b850160208801615292565b632062696760e01b601b9184019182015261111f60f11b601f8201528351614fd2816021840160208801615292565b01602101949350505050565b602360f81b8152600061150e6001830184614396565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161502c81601d850160208701615292565b91909101601d0192915050565b69029b5b4b7102a37b732960b51b81526000845161505e81600a850160208901615292565b84519083019061507581600a840160208901615292565b6d029b5b4b7102230b935b732b9b9960951b600a929091019182015283516150a4816018840160208801615292565b0160180195945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614cab9083018461434e565b60208152600061150e602083018461434e565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f151bdad95b881251081a5b9d985b1a5960821b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000821982111561524357615243615328565b500190565b6000826152575761525761533e565b500490565b600081600019048311821515161561527657615276615328565b500290565b60008282101561528d5761528d615328565b500390565b60005b838110156152ad578181015183820152602001615295565b8381111561190b5750506000910152565b600181811c908216806152d257607f821691505b602082108114156152f357634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561530d5761530d615328565b5060010190565b6000826153235761532361533e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114612a1d57600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212203c3c6aacda577b459fc0b1097eb4d249fd8e96b19d6022a41186be78524a453f64736f6c63430008070033

Deployed Bytecode Sourcemap

44534:24113:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38384:224;;;;;;;;;;-1:-1:-1;38384:224:0;;;;;:::i;:::-;;:::i;:::-;;;34854:14:1;;34847:22;34829:41;;34817:2;34802:18;38384:224:0;;;;;;;;25498:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27057:221::-;;;;;;;;;;-1:-1:-1;27057:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;34152:32:1;;;34134:51;;34122:2;34107:18;27057:221:0;33988:203:1;26580:411:0;;;;;;;;;;-1:-1:-1;26580:411:0;;;;;:::i;:::-;;:::i;:::-;;50899:173;;;;;;;;;;-1:-1:-1;50899:173:0;;;;;:::i;:::-;;:::i;48957:367::-;;;;;;;;;;-1:-1:-1;48957:367:0;;;;;:::i;:::-;;:::i;39024:113::-;;;;;;;;;;-1:-1:-1;39112:10:0;:17;39024:113;;;43419:25:1;;;43407:2;43392:18;39024:113:0;43273:177:1;64475:230:0;;;;;;;;;;-1:-1:-1;64475:230:0;;;;;:::i;:::-;;:::i;27947:339::-;;;;;;;;;;-1:-1:-1;27947:339:0;;;;;:::i;:::-;;:::i;38692:256::-;;;;;;;;;;-1:-1:-1;38692:256:0;;;;;:::i;:::-;;:::i;51084:145::-;;;;;;;;;;-1:-1:-1;51084:145:0;;;;;:::i;:::-;;:::i;28357:185::-;;;;;;;;;;-1:-1:-1;28357:185:0;;;;;:::i;:::-;;:::i;39214:233::-;;;;;;;;;;-1:-1:-1;39214:233:0;;;;;:::i;:::-;;:::i;49336:136::-;;;;;;;;;;-1:-1:-1;49336:136:0;;;;;:::i;:::-;;:::i;64717:599::-;;;;;;:::i;:::-;;:::i;25192:239::-;;;;;;;;;;-1:-1:-1;25192:239:0;;;;;:::i;:::-;;:::i;48295:140::-;;;;;;;;;;-1:-1:-1;48295:140:0;;;;;:::i;:::-;;:::i;47940:152::-;;;;;;;;;;-1:-1:-1;47940:152:0;;;;;:::i;:::-;;:::i;24922:208::-;;;;;;;;;;-1:-1:-1;24922:208:0;;;;;:::i;:::-;;:::i;9890:94::-;;;;;;;;;;;;;:::i;51241:263::-;;;;;;;;;;-1:-1:-1;51241:263:0;;;;;:::i;:::-;;:::i;48104:179::-;;;;;;;;;;-1:-1:-1;48104:179:0;;;;;:::i;:::-;;:::i;9239:87::-;;;;;;;;;;-1:-1:-1;9312:6:0;;-1:-1:-1;;;;;9312:6:0;9239:87;;25667:104;;;;;;;;;;;;;:::i;27350:295::-;;;;;;;;;;-1:-1:-1;27350:295:0;;;;;:::i;:::-;;:::i;49480:142::-;;;;;;;;;;-1:-1:-1;49480:142:0;;;;;:::i;:::-;;:::i;28613:328::-;;;;;;;;;;-1:-1:-1;28613:328:0;;;;;:::i;:::-;;:::i;49778:141::-;;;;;;;;;;-1:-1:-1;49778:141:0;;;;;:::i;:::-;;:::i;58106:6361::-;;;;;;;;;;-1:-1:-1;58106:6361:0;;;;;:::i;:::-;;:::i;48705:242::-;;;;;;;;;;-1:-1:-1;48705:242:0;;;;;:::i;:::-;;:::i;49927:149::-;;;;;;;;;;-1:-1:-1;49927:149:0;;;;;:::i;:::-;;:::i;49630:140::-;;;;;;;;;;-1:-1:-1;49630:140:0;;;;;:::i;:::-;;:::i;27716:164::-;;;;;;;;;;-1:-1:-1;27716:164:0;;;;;:::i;:::-;;:::i;10139:192::-;;;;;;;;;;-1:-1:-1;10139:192:0;;;;;:::i;:::-;;:::i;48447:250::-;;;;;;;;;;-1:-1:-1;48447:250:0;;;;;:::i;:::-;;:::i;38384:224::-;38486:4;-1:-1:-1;;;;;;38510:50:0;;-1:-1:-1;;;38510:50:0;;:90;;;38564:36;38588:11;38564:23;:36::i;:::-;38503:97;38384:224;-1:-1:-1;;38384:224:0:o;25498:100::-;25552:13;25585:5;25578:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25498:100;:::o;27057:221::-;27133:7;27161:16;27169:7;27161;:16::i;:::-;27153:73;;;;-1:-1:-1;;;27153:73:0;;40020:2:1;27153:73:0;;;40002:21:1;40059:2;40039:18;;;40032:30;40098:34;40078:18;;;40071:62;-1:-1:-1;;;40149:18:1;;;40142:42;40201:19;;27153:73:0;;;;;;;;;-1:-1:-1;27246:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27246:24:0;;27057:221::o;26580:411::-;26661:13;26677:23;26692:7;26677:14;:23::i;:::-;26661:39;;26725:5;-1:-1:-1;;;;;26719:11:0;:2;-1:-1:-1;;;;;26719:11:0;;;26711:57;;;;-1:-1:-1;;;26711:57:0;;41549:2:1;26711:57:0;;;41531:21:1;41588:2;41568:18;;;41561:30;41627:34;41607:18;;;41600:62;-1:-1:-1;;;41678:18:1;;;41671:31;41719:19;;26711:57:0;41347:397:1;26711:57:0;8179:10;-1:-1:-1;;;;;26803:21:0;;;;:62;;-1:-1:-1;26828:37:0;26845:5;8179:10;27716:164;:::i;26828:37::-;26781:168;;;;-1:-1:-1;;;26781:168:0;;38074:2:1;26781:168:0;;;38056:21:1;38113:2;38093:18;;;38086:30;38152:34;38132:18;;;38125:62;-1:-1:-1;;;38203:18:1;;;38196:54;38267:19;;26781:168:0;37872:420:1;26781:168:0;26962:21;26971:2;26975:7;26962:8;:21::i;:::-;26650:341;26580:411;;:::o;50899:173::-;50972:13;51005:12;51018:45;51032:7;51018:45;;;;;;;;;;;;;-1:-1:-1;;;51018:45:0;;;51050:12;51018:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:45::i;:::-;51005:59;;;;;;;;:::i;:::-;;;;;;;;50998:66;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50899:173;;;:::o;48957:367::-;49027:13;49053:23;:33;;;;;;;;;;;;;-1:-1:-1;;;49053:33:0;;;;;49097:30;49130:11;49097:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49156:6;49152:100;;;49179:19;;;;;;;;;;;;;-1:-1:-1;;;49179:19:0;;;;;49230:10;49213:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49152:100;49269:47;49281:7;49290:9;49301:14;49269:11;:47::i;:::-;49262:54;48957:367;-1:-1:-1;;;;;48957:367:0:o;64475:230::-;12178:1;12774:7;;:19;;12766:63;;;;-1:-1:-1;;;12766:63:0;;;;;;;:::i;:::-;12178:1;12907:7;:18;64550:11;;;;;:28:::1;;;64575:3;64565:7;:13;64550:28;64542:57;;;;-1:-1:-1::0;;;64542:57:0::1;;;;;;;:::i;:::-;64642:2;64618:21;64628:10;64618:9;:21::i;:::-;:26;64610:44;;;::::0;-1:-1:-1;;;64610:44:0;;43142:2:1;64610:44:0::1;::::0;::::1;43124:21:1::0;43181:1;43161:18;;;43154:29;-1:-1:-1;;;43199:18:1;;;43192:35;43244:18;;64610:44:0::1;42940:328:1::0;64610:44:0::1;64665:32;8179:10:::0;64675:12:::1;64689:7;64665:9;:32::i;:::-;-1:-1:-1::0;12134:1:0;13086:7;:22;64475:230::o;27947:339::-;28142:41;8179:10;28175:7;28142:18;:41::i;:::-;28134:103;;;;-1:-1:-1;;;28134:103:0;;;;;;;:::i;:::-;28250:28;28260:4;28266:2;28270:7;28250:9;:28::i;38692:256::-;38789:7;38825:23;38842:5;38825:16;:23::i;:::-;38817:5;:31;38809:87;;;;-1:-1:-1;;;38809:87:0;;35307:2:1;38809:87:0;;;35289:21:1;35346:2;35326:18;;;35319:30;35385:34;35365:18;;;35358:62;-1:-1:-1;;;35436:18:1;;;35429:41;35487:19;;38809:87:0;35105:407:1;38809:87:0;-1:-1:-1;;;;;;38914:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;38692:256::o;51084:145::-;51153:7;51180:41;51194:7;51180:41;;;;;;;;;;;;;-1:-1:-1;;;51180:41:0;;;51212:8;51180:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28357:185;28495:39;28512:4;28518:2;28522:7;28495:39;;;;;;;;;;;;:16;:39::i;39214:233::-;39289:7;39325:30;39112:10;:17;;39024:113;39325:30;39317:5;:38;39309:95;;;;-1:-1:-1;;;39309:95:0;;42369:2:1;39309:95:0;;;42351:21:1;42408:2;42388:18;;;42381:30;42447:34;42427:18;;;42420:62;-1:-1:-1;;;42498:18:1;;;42491:42;42550:19;;39309:95:0;42167:408:1;39309:95:0;39422:10;39433:5;39422:17;;;;;;;;:::i;:::-;;;;;;;;;39415:24;;39214:233;;;:::o;49336:136::-;49393:13;49426:38;49438:7;49426:38;;;;;;;;;;;;;-1:-1:-1;;;49426:38:0;;;49457:6;49426:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;:38::i;64717:599::-;12178:1;12774:7;;:19;;12766:63;;;;-1:-1:-1;;;12766:63:0;;;;;;;:::i;:::-;12178:1;12907:7;:18;64810:3:::1;64800:13:::0;::::1;:31:::0;::::1;;;;64827:4;64817:7;:14;64800:31;64792:60;;;;-1:-1:-1::0;;;64792:60:0::1;;;;;;;:::i;:::-;64884:11;64871:9;:24;;64863:47;;;::::0;-1:-1:-1;;;64863:47:0;;38499:2:1;64863:47:0::1;::::0;::::1;38481:21:1::0;38538:2;38518:18;;;38511:30;-1:-1:-1;;;38557:18:1;;;38550:40;38607:18;;64863:47:0::1;38297:334:1::0;64863:47:0::1;64921:32;8179:10:::0;64931:12:::1;8099:98:::0;64921:32:::1;64972:42;64964:75;65037:1;65025:11;:9;65035:1;65025:11;:::i;:::-;:13;;;;:::i;:::-;64964:75;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;65058:11;65066:2;65058:7;:11::i;:::-;-1:-1:-1::0;;;;;65050:29:0::1;:43;65080:12;65090:2;65080:9;:12;:::i;:::-;65050:43;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;65112:11;65120:2;65112:7;:11::i;:::-;-1:-1:-1::0;;;;;65104:29:0::1;:42;65134:11;65144:1;65134:9;:11;:::i;:::-;65104:42;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;65165:11;65173:2;65165:7;:11::i;:::-;-1:-1:-1::0;;;;;65157:29:0::1;:42;65187:11;65197:1;65187:9;:11;:::i;:::-;65157:42;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;65218:12;65226:3;65218:7;:12::i;:::-;-1:-1:-1::0;;;;;65210:30:0::1;:44;65241:12;65251:2;65241:9;:12;:::i;:::-;65210:44;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;65273:12;65281:3;65273:7;:12::i;:::-;-1:-1:-1::0;;;;;65265:30:0::1;:43;65296:11;65306:1;65296:9;:11;:::i;:::-;65265:43;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;12134:1:0;13086:7;:22;64717:599::o;25192:239::-;25264:7;25300:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25300:16:0;25335:19;25327:73;;;;-1:-1:-1;;;25327:73:0;;39249:2:1;25327:73:0;;;39231:21:1;39288:2;39268:18;;;39261:30;39327:34;39307:18;;;39300:62;-1:-1:-1;;;39378:18:1;;;39371:39;39427:19;;25327:73:0;39047:405:1;48295:140:0;48354:13;48387:40;48401:7;48387:40;;;;;;;;;;;;;-1:-1:-1;;;48387:40:0;;;48418:8;48387:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:40::i;47940:152::-;48015:13;48048:36;48058:7;48067:4;48073:10;48048:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:36::i;:::-;48041:43;47940:152;-1:-1:-1;;;47940:152:0:o;24922:208::-;24994:7;-1:-1:-1;;;;;25022:19:0;;25014:74;;;;-1:-1:-1;;;25014:74:0;;38838:2:1;25014:74:0;;;38820:21:1;38877:2;38857:18;;;38850:30;38916:34;38896:18;;;38889:62;-1:-1:-1;;;38967:18:1;;;38960:40;39017:19;;25014:74:0;38636:406:1;25014:74:0;-1:-1:-1;;;;;;25106:16:0;;;;;:9;:16;;;;;;;24922:208::o;9890:94::-;9312:6;;-1:-1:-1;;;;;9312:6:0;8179:10;9459:23;9451:68;;;;-1:-1:-1;;;9451:68:0;;;;;;;:::i;:::-;9955:21:::1;9973:1;9955:9;:21::i;:::-;9890:94::o:0;51241:263::-;51301:13;51408:18;51427:34;51453:7;51427:25;:34::i;:::-;51408:54;;;;;;:::i;:::-;;;;;;;;;;;;;51463:30;51485:7;51463:21;:30::i;:::-;51408:86;;;;;;;:::i;:::-;;51353:142;;;;;;;;:::i;:::-;;;;;;;;;;;;;51326:170;;51241:263;;;:::o;48104:179::-;48197:13;48230:45;48240:7;48249:13;48264:10;48230:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25667:104;25723:13;25756:7;25749:14;;;;;:::i;27350:295::-;-1:-1:-1;;;;;27453:24:0;;8179:10;27453:24;;27445:62;;;;-1:-1:-1;;;27445:62:0;;37307:2:1;27445:62:0;;;37289:21:1;37346:2;37326:18;;;37319:30;-1:-1:-1;;;37365:18:1;;;37358:55;37430:18;;27445:62:0;37105:349:1;27445:62:0;8179:10;27520:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;27520:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;27520:53:0;;;;;;;;;;27589:48;;34829:41:1;;;27520:42:0;;8179:10;27589:48;;34802:18:1;27589:48:0;;;;;;;27350:295;;:::o;49480:142::-;49540:13;49573:41;49587:7;49573:41;;;;;;;;;;;;;-1:-1:-1;;;49573:41:0;;;49604:9;49573:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:41::i;28613:328::-;28788:41;8179:10;28821:7;28788:18;:41::i;:::-;28780:103;;;;-1:-1:-1;;;28780:103:0;;;;;;;:::i;:::-;28894:39;28908:4;28914:2;28918:7;28927:5;28894:13;:39::i;:::-;28613:328;;;;:::o;49778:141::-;49837:13;49870:41;49884:7;49870:41;;;;;;;;;;;;;-1:-1:-1;;;49870:41:0;;;49902:8;49870:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58106:6361;58171:13;58197:23;;:::i;:::-;58231;:33;;;;;;;;;;;;;-1:-1:-1;;;58231:33:0;;;;;58327:1;58279:45;58293:7;58279:45;;;;;;;;;;;;;-1:-1:-1;;;58279:45:0;;;58311:12;58279:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:49;58275:101;;;-1:-1:-1;58345:19:0;;;;;;;;;;;;-1:-1:-1;;;58345:19:0;;;;58275:101;58598:9;58680:11;:9;:11::i;:::-;58770:21;58783:7;58770:12;:21::i;:::-;58414:412;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;58414:412:0;;;;;;58396:431;;;58939:23;;;;;;;;;;;-1:-1:-1;;;58396:8:0;58939:23;;;;;58947:7;;58939;:23::i;:::-;59029:20;59041:7;59029:11;:20::i;:::-;58856:194;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;58856:194:0;;;;;;;;;58838:5;58844:1;58838:8;;;:213;;;;59111:32;59128:3;59132;59111:32;;;;;;;;;;;;;-1:-1:-1;;;59111:32:0;;;:16;:32::i;:::-;59180:84;59197:3;59201;59229:23;59237:7;59229:23;;;;;;;;;;;;;-1:-1:-1;;;59229:23:0;;;:7;:23::i;:::-;59212:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;59180:16;:84::i;:::-;59080:199;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;59080:199:0;;;;;;59062:8;;;:218;;;;59362:23;;;;;;;;;;;-1:-1:-1;;;59062:8:0;59362:23;;;;;59370:7;;59362;:23::i;:::-;59400:84;59417:3;59421;59449:23;59457:7;59449:23;;;;;;;;;;;;;-1:-1:-1;;;59449:23:0;;;:7;:23::i;59400:84::-;59521:23;59529:7;59521:23;;;;;;;;;;;;;-1:-1:-1;;;59521:23:0;;;:7;:23::i;:::-;59559:84;59576:3;59580;59608:23;59616:7;59608:23;;;;;;;;;;;;;-1:-1:-1;;;59608:23:0;;;:7;:23::i;59559:84::-;59680:23;59688:7;59680:23;;;;;;;;;;;;;-1:-1:-1;;;59680:23:0;;;:7;:23::i;:::-;59718:84;59735:3;59739;59767:23;59775:7;59767:23;;;;;;;;;;;;;-1:-1:-1;;;59767:23:0;;;:7;:23::i;59718:84::-;59839:23;59847:7;59839:23;;;;;;;;;;;;;-1:-1:-1;;;59839:23:0;;;:7;:23::i;:::-;59877:84;59894:3;59898;59926:23;59934:7;59926:23;;;;;;;;;;;;;-1:-1:-1;;;59926:23:0;;;:7;:23::i;59877:84::-;59998:23;60006:7;59998:23;;;;;;;;;;;;;-1:-1:-1;;;59998:23:0;;;:7;:23::i;:::-;59309:713;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;59309:713:0;;;;;;;;;59291:5;59297:1;59291:8;;;:732;;;;60083:31;60100:2;60103:3;60083:31;;;;;;;;;;;;;-1:-1:-1;;;60083:31:0;;;:16;:31::i;:::-;60052:108;;;;;;;;:::i;:::-;;;;-1:-1:-1;;60052:108:0;;;;;;;;;60034:5;60040:1;60034:8;;;:127;;;;60221:84;60238:2;60241:3;60269:24;60277:7;60269:24;;;;;;;;;;;;;-1:-1:-1;;;60269:24:0;;;:7;:24::i;60221:84::-;60347:33;60364:7;60347:33;;;;;;;;;;;;;-1:-1:-1;;;60347:33:0;;;:16;:33::i;:::-;60395:84;60412:2;60415:3;60443:24;60451:7;60443:24;;;;;;;;;;;;;-1:-1:-1;;;60443:24:0;;;:7;:24::i;60395:84::-;60537:33;60554:7;60537:33;;;;;;;;;;;;;-1:-1:-1;;;60537:33:0;;;:16;:33::i;:::-;60585:84;60602:2;60605:3;60633:24;60641:7;60633:24;;;;;;;;;;;;;-1:-1:-1;;;60633:24:0;;;:7;:24::i;60585:84::-;60716:33;60733:7;60716:33;;;;;;;;;;;;;-1:-1:-1;;;60716:33:0;;;:16;:33::i;:::-;60190:574;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;60190:574:0;;;;;;;;;60172:5;60178:1;60172:8;;;:593;;;;60802:49;60819:2;60822;60825:25;60833:7;60825:25;;;;;;;;;;;;;-1:-1:-1;;;60825:25:0;;;:7;:25::i;:::-;60802:16;:49::i;:::-;60790:8;;;:61;60935:22;60943:7;60952:4;60935:7;:22::i;:::-;60972:49;60989:2;60992;60995:25;61003:7;60995:25;;;;;;;;;;;;;-1:-1:-1;;;60995:25:0;;;:7;:25::i;60972:49::-;61060:23;61068:7;61077:5;61060:7;:23::i;:::-;60880:204;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;60880:204:0;;;;;;;;;60862:5;60868:1;60862:8;;;:223;;;;61108:48;61125:2;61128;61131:24;61139:7;61131:24;;;;;;;;;;;;;-1:-1:-1;;;61131:24:0;;;:7;:24::i;61108:48::-;61096:8;;;:60;61241:21;61248:7;61257:4;61241:6;:21::i;:::-;61277:49;61294:2;61297:3;61301:24;61309:7;61301:24;;;;;;;;;;;;;-1:-1:-1;;;61301:24:0;;;:7;:24::i;61277:49::-;61364:22;61371:7;61380:5;61364:6;:22::i;:::-;61187:200;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;61187:200:0;;;;;;;;;61169:5;61175:1;61169:8;;;:219;;;;61412:50;61429:2;61432:3;61436:25;61444:7;61436:25;;;;;;;;;;;;;-1:-1:-1;;;61436:25:0;;;:7;:25::i;61412:50::-;61399:9;;;:63;61549:24;61559:7;61568:4;61549:9;:24::i;:::-;61588:50;61605:2;61608:3;61612:25;61620:7;61612:25;;;;;;;;;;;;;-1:-1:-1;;;61612:25:0;;;:7;:25::i;61588:50::-;61679:25;61689:7;61698:5;61679:9;:25::i;:::-;61492:213;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;61492:213:0;;;;;;;;;61473:5;61479:2;61473:9;;;:233;;;;61753:51;61770:2;61773:3;61777:26;61785:7;61777:26;;;;;;;;;;;;;-1:-1:-1;;;61777:26:0;;;:7;:26::i;61753:51::-;61736:81;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;61736:81:0;;;;;;61717:9;;;:101;61841:18;61851:7;61841:9;:18::i;:::-;61829:5;61835:2;61829:9;;;:30;;;;61882:84;61899:2;61902:3;61930:24;61938:7;61930:24;;;;;;;;;;;;;-1:-1:-1;;;61930:24:0;;;:7;:24::i;61882:84::-;61870:9;;;:96;62013:21;62026:7;62013:12;:21::i;:::-;61996:48;;;;;;;;:::i;:::-;;;;-1:-1:-1;;61996:48:0;;;;;;;;;61977:5;61983:2;61977:9;;;:68;;;;62068:84;62085:2;62088:3;62116:24;62124:7;62116:24;;;;;;;;;;;;;-1:-1:-1;;;62116:24:0;;;:7;:24::i;62068:84::-;62056:9;;;:96;62199:20;62211:7;62199:11;:20::i;:::-;62182:47;;;;;;;;:::i;:::-;;;;-1:-1:-1;;62182:47:0;;;;;;;;;62163:5;62169:2;62163:9;;;:67;;;;62253:85;62270:2;62273:3;62301:25;62309:7;62301:25;;;;;;;;;;;;;-1:-1:-1;;;62301:25:0;;;:7;:25::i;62253:85::-;62241:9;;;:97;62426:20;62438:7;62426:11;:20::i;:::-;62461:85;62478:2;62481:3;62509:25;62517:7;62509:25;;;;;;;;;;;;;-1:-1:-1;;;62509:25:0;;;:7;:25::i;62461:85::-;62592:24;62608:7;62592:15;:24::i;:::-;62368:263;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;62368:263:0;;;;;;62349:9;;;:283;;;;62643:21;;;;;;;;;;;-1:-1:-1;;;62349:9:0;62643:21;;;62349:5;62649:2;62643:9;;;:21;;;;63021:13;63035:8;63044:38;63058:7;63044:38;;;;;;;;;;;;;-1:-1:-1;;;63044:38:0;;;63073:8;63044:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63035:48;;;;;;;;:::i;:::-;;;;;;;;63021:63;;;;;;:::i;:::-;;;;;;;;;;;;;62708:452;;;;;;;;:::i;:::-;;;;-1:-1:-1;;62708:452:0;;;;;;;;;62675:9;;;:486;;;;63172:20;;;;;;;;;;-1:-1:-1;;;62675:9:0;63172:20;;;;;;;:9;;;:20;;;;63266:8;;63290;;;;63314;;;;63338;;;;63362;;;;63386;;;;63409;;;;63433;;;;63443;;;;63235:231;;-1:-1:-1;;63235:231:0;;63443:8;;63235:231;;:::i;:::-;;;;;;;-1:-1:-1;;63235:231:0;;;;;;;63519:8;;;;63529:9;;;;63540;;;;63561;;;;63582;;;;63606;;;;63617;;;;63641;;;;63235:231;;-1:-1:-1;63494:168:0;;63235:231;;63641:9;63519:8;63494:168;;:::i;:::-;;;;;;;-1:-1:-1;;63494:168:0;;;;;;;63728:9;;;;63739;;;;63760;;;;63771;;;;63782;;;;63793;;;;63494:168;;-1:-1:-1;63690:113:0;;63494:168;;63793:9;63728;63690:113;;:::i;:::-;;;;;;;;;;;;;63674:130;;63957:18;63978:372;64075:17;64084:7;64075:8;:17::i;:::-;64312:28;64332:6;64312:13;:28::i;:::-;64005:342;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63978:13;:372::i;:::-;63957:393;;64427:4;64377:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;64377:55:0;;;;;;;;;;58106:6361;-1:-1:-1;;;;;;58106:6361:0:o;48705:242::-;48798:29;;;;;;;;;;;;-1:-1:-1;;;48798:29:0;;;;48772:13;;48838:54;;;;-1:-1:-1;48865:15:0;;;;;;;;;;;;-1:-1:-1;;;48865:15:0;;;;48838:54;48909:30;48918:7;48927:6;48935:3;48909:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;:30::i;:::-;48902:37;48705:242;-1:-1:-1;;;;48705:242:0:o;49927:149::-;49990:13;50023:45;50037:7;50023:45;;;;;;;;;;;;;-1:-1:-1;;;50023:45:0;;;50055:12;50023:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49630:140;49689:13;49722:40;49736:7;49722:40;;;;;;;;;;;;;-1:-1:-1;;;49722:40:0;;;49753:8;49722:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27716:164;-1:-1:-1;;;;;27837:25:0;;;27813:4;27837:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27716:164::o;10139:192::-;9312:6;;-1:-1:-1;;;;;9312:6:0;8179:10;9459:23;9451:68;;;;-1:-1:-1;;;9451:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10228:22:0;::::1;10220:73;;;::::0;-1:-1:-1;;;10220:73:0;;36138:2:1;10220:73:0::1;::::0;::::1;36120:21:1::0;36177:2;36157:18;;;36150:30;36216:34;36196:18;;;36189:62;-1:-1:-1;;;36267:18:1;;;36260:36;36313:19;;10220:73:0::1;35936:402:1::0;10220:73:0::1;10304:19;10314:8;10304:9;:19::i;:::-;10139:192:::0;:::o;48447:250::-;48541:31;;;;;;;;;;;;-1:-1:-1;;;48541:31:0;;;;48515:13;;48583:56;;;;-1:-1:-1;48610:17:0;;;;;;;;;;;;-1:-1:-1;;;48610:17:0;;;;48583:56;48656:33;48666:7;48675;48684:4;48656:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:33::i;24553:305::-;24655:4;-1:-1:-1;;;;;;24692:40:0;;-1:-1:-1;;;24692:40:0;;:105;;-1:-1:-1;;;;;;;24749:48:0;;-1:-1:-1;;;24749:48:0;24692:105;:158;;;-1:-1:-1;;;;;;;;;;23269:40:0;;;24814:36;23160:157;30451:127;30516:4;30540:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30540:16:0;:30;;;30451:127::o;34433:174::-;34508:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34508:29:0;-1:-1:-1;;;;;34508:29:0;;;;;;;;:24;;34562:23;34508:24;34562:14;:23::i;:::-;-1:-1:-1;;;;;34553:46:0;;;;;;;;;;;34433:174;;:::o;50652:235::-;50769:7;50861:11;:18;50796:62;50827:9;50838:17;50847:7;50838:8;:17::i;:::-;50810:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50796:6;:62::i;:::-;:83;;;;:::i;56177:809::-;56292:13;56318:12;56333:62;56364:9;56375:17;56384:7;56375:8;:17::i;56333:62::-;56318:77;;56406:20;56429:11;56448;:18;56441:4;:25;;;;:::i;:::-;56429:38;;;;;;;;:::i;:::-;;;;;;;56406:61;;56478:17;56505:2;56498:4;:9;;;;:::i;:::-;56478:29;;56549:2;56537:9;:14;:32;;;;;56567:2;56555:9;:14;56537:32;56533:139;;;56623:11;56635:14;56647:2;56635:9;:14;:::i;:::-;:18;;56652:1;56635:18;:::i;:::-;56623:31;;;;;;;;:::i;:::-;;;;;;;56606:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;56590:66;;56533:139;56699:2;56686:9;:15;56682:263;;56722:9;56735:2;56722:15;56718:216;;;56791:12;56804:9;56791:23;;;;;;:::i;:::-;;;;;;;;;;;;;56774:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;56758:58;;56718:216;;;56890:15;56906:9;56890:26;;;;;;:::i;:::-;;;;;;;;;;;;;56873:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;56857:61;;56718:216;-1:-1:-1;56972:6:0;56177:809;-1:-1:-1;;;;;56177:809:0:o;31435:110::-;31511:26;31521:2;31525:7;31511:26;;;;;;;;;;;;:9;:26::i;:::-;31435:110;;:::o;30745:348::-;30838:4;30863:16;30871:7;30863;:16::i;:::-;30855:73;;;;-1:-1:-1;;;30855:73:0;;37661:2:1;30855:73:0;;;37643:21:1;37700:2;37680:18;;;37673:30;37739:34;37719:18;;;37712:62;-1:-1:-1;;;37790:18:1;;;37783:42;37842:19;;30855:73:0;37459:408:1;30855:73:0;30939:13;30955:23;30970:7;30955:14;:23::i;:::-;30939:39;;31008:5;-1:-1:-1;;;;;30997:16:0;:7;-1:-1:-1;;;;;30997:16:0;;:51;;;;31041:7;-1:-1:-1;;;;;31017:31:0;:20;31029:7;31017:11;:20::i;:::-;-1:-1:-1;;;;;31017:31:0;;30997:51;:87;;;;31052:32;31069:5;31076:7;31052:16;:32::i;33737:578::-;33896:4;-1:-1:-1;;;;;33869:31:0;:23;33884:7;33869:14;:23::i;:::-;-1:-1:-1;;;;;33869:31:0;;33861:85;;;;-1:-1:-1;;;33861:85:0;;41139:2:1;33861:85:0;;;41121:21:1;41178:2;41158:18;;;41151:30;41217:34;41197:18;;;41190:62;-1:-1:-1;;;41268:18:1;;;41261:39;41317:19;;33861:85:0;40937:405:1;33861:85:0;-1:-1:-1;;;;;33965:16:0;;33957:65;;;;-1:-1:-1;;;33957:65:0;;36902:2:1;33957:65:0;;;36884:21:1;36941:2;36921:18;;;36914:30;36980:34;36960:18;;;36953:62;-1:-1:-1;;;37031:18:1;;;37024:34;37075:19;;33957:65:0;36700:400:1;33957:65:0;34035:39;34056:4;34062:2;34066:7;34035:20;:39::i;:::-;34139:29;34156:1;34160:7;34139:8;:29::i;:::-;-1:-1:-1;;;;;34181:15:0;;;;;;:9;:15;;;;;:20;;34200:1;;34181:15;:20;;34200:1;;34181:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34212:13:0;;;;;;:9;:13;;;;;:18;;34229:1;;34212:13;:18;;34229:1;;34212:18;:::i;:::-;;;;-1:-1:-1;;34241:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34241:21:0;-1:-1:-1;;;;;34241:21:0;;;;;;;;;34280:27;;34241:16;;34280:27;;;;;;;33737:578;;;:::o;56994:858::-;57145:13;57171:12;57186:62;57217:9;57228:17;57237:7;57228:8;:17::i;57186:62::-;57171:77;;57259:20;57282:11;57301;:18;57294:4;:25;;;;:::i;:::-;57282:38;;;;;;;;:::i;:::-;;;;;;;57259:61;;57331:17;57358:2;57351:4;:9;;;;:::i;:::-;57331:29;;57388:2;57376:9;:14;:32;;;;;57406:2;57394:9;:14;57376:32;57372:139;;;57462:11;57474:14;57486:2;57474:9;:14;:::i;:::-;:18;;57491:1;57474:18;:::i;:::-;57462:31;;;;;;;;:::i;:::-;;;;;;;57445:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;57429:66;;57372:139;57542:2;57529:9;:15;57525:259;;57569:9;57582:2;57569:15;57565:204;;;57625:28;;-1:-1:-1;;;57625:28:0;;;26980:23:1;27019:11;;57625:28:0;26778:258:1;57565:204:0;57719:29;;-1:-1:-1;;;57719:29:0;;;17545:24:1;17585:11;;57719:29:0;17343:259:1;54381:916:0;54498:13;54524:12;54539:62;54570:9;54581:17;54590:7;54581:8;:17::i;54539:62::-;54524:77;;54612:20;54635:11;54654;:18;54647:4;:25;;;;:::i;:::-;54635:38;;;;;;;;:::i;:::-;;;;;;;54612:61;;54684:17;54711:2;54704:4;:9;;;;:::i;:::-;54684:29;;54740:2;54728:9;:14;54724:102;;;54792:6;54775:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;54759:55;;54724:102;54852:2;54840:9;:14;:32;;;;;54870:2;54858:9;:14;54840:32;54836:167;;;54938:24;54947:14;54952:9;54947:2;:14;:::i;:::-;54938:8;:24::i;:::-;54969:6;54905:85;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54889:102;;54836:167;55030:2;55017:9;:15;55013:253;;55053:9;55066:2;55053:15;55049:206;;;55105:40;;-1:-1:-1;;;55105:40:0;;;27243:35:1;27294:12;;55105:40:0;27041:271:1;55049:206:0;55203:35;;-1:-1:-1;;;55203:35:0;;;30177:30:1;30223:12;;55203:35:0;29975:266:1;53632:741:0;53745:13;53771:12;53786:62;53817:9;53828:17;53837:7;53828:8;:17::i;53786:62::-;53771:77;;53859:20;53882:11;53901;:18;53894:4;:25;;;;:::i;:::-;53882:38;;;;;;;;:::i;:::-;;;;;;;53859:61;;53931:17;53958:2;53951:4;:9;;;;:::i;:::-;53931:29;;53987:2;53975:9;:14;:32;;;;;54005:2;53993:9;:14;53975:32;53971:129;;;54057:29;54083:2;54066:14;54071:9;54066:2;:14;:::i;:::-;:19;;;;:::i;54057:29::-;54040:47;;;;;;;;:::i;:::-;;;;;;;;;;;;;54024:64;;53971:129;54127:2;54114:9;:15;54110:222;;54150:9;54163:2;54150:15;54146:175;;;54202:22;;-1:-1:-1;;;54202:22:0;;;17809:17:1;17842:11;;54202:22:0;17607:252:1;54146:175:0;54282:22;;-1:-1:-1;;;54282:22:0;;;29920:17:1;29953:11;;54282:22:0;29718:252:1;10339:173:0;10414:6;;;-1:-1:-1;;;;;10431:17:0;;;-1:-1:-1;;;;;;10431:17:0;;;;;;;10464:40;;10414:6;;;10431:17;10414:6;;10464:40;;10395:16;;10464:40;10384:128;10339:173;:::o;52846:778::-;52963:13;52989:12;53004:62;53035:9;53046:17;53055:7;53046:8;:17::i;53004:62::-;52989:77;;53077:20;53100:11;53119;:18;53112:4;:25;;;;:::i;:::-;53100:38;;;;;;;;:::i;:::-;;;;;;;53077:61;;53149:17;53176:2;53169:4;:9;;;;:::i;:::-;53149:29;;53205:2;53193:9;:14;:32;;;;;53223:2;53211:9;:14;53193:32;53189:122;;;53275:8;53284:1;53275:11;;;;;;;;:::i;:::-;;;;;;;;53291:6;53258:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53242:57;;53189:122;53338:2;53325:9;:15;53321:260;;53361:9;53374:2;53361:15;53357:213;;;53430:8;53439:1;53430:11;;;;;;;;:::i;:::-;;;;;;;;53447:6;53413:41;;;;;;;;;:::i;53357:213::-;53529:8;53538:1;53529:11;;;;;;;;:::i;:::-;;;;;;;;53546:6;53512:41;;;;;;;;;:::i;29823:315::-;29980:28;29990:4;29996:2;30000:7;29980:9;:28::i;:::-;30027:48;30050:4;30056:2;30060:7;30069:5;30027:22;:48::i;:::-;30019:111;;;;-1:-1:-1;;;30019:111:0;;;;;;;:::i;47361:417::-;47405:13;47445:324;;;;;;33485:34:1;33473:47;;-1:-1:-1;;;33545:2:1;33536:12;;33529:43;33602:34;33597:2;33588:12;;33581:56;33656:31;33712:2;33703:12;;33696:24;;;33751:34;33745:3;33736:13;;33729:57;33817:30;33811:3;33802:13;;33795:53;33879:34;33873:3;33864:13;;33857:57;33939:3;33930:13;;33923:25;33973:3;33964:13;;32968:1015;47445:324:0;;;;;;;;;;;;;47431:339;;47361:417;:::o;51516:523::-;51596:13;51622:17;51642:32;51655:7;51664:9;51642:12;:32::i;:::-;51622:52;;51701:2;51689:9;:14;51685:337;;;-1:-1:-1;;51720:12:0;;;;;;;;;;;;-1:-1:-1;;;51720:12:0;;;;;;51685:337;51781:2;51769:9;:14;51765:246;;;-1:-1:-1;;51804:13:0;;;;;;;;;;;;-1:-1:-1;;;51804:13:0;;;;;;51765:246;51874:2;51862:9;:14;51858:138;;;-1:-1:-1;;51901:13:0;;;;;;;;;;;;-1:-1:-1;;;51901:13:0;;;;;;51858:138;-1:-1:-1;;51963:13:0;;;;;;;;;;;;-1:-1:-1;;;51963:13:0;;;;;;57860:238;57955:13;58031:11;58040:1;58031:8;:11::i;:::-;58051;58060:1;58051:8;:11::i;:::-;58075:8;57995:94;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57981:109;;57860:238;;;;;:::o;65330:715::-;65386:13;65599:10;65595:53;;-1:-1:-1;;65626:10:0;;;;;;;;;;;;-1:-1:-1;;;65626:10:0;;;;;65330:715::o;65595:53::-;65673:5;65658:12;65714:78;65721:9;;65714:78;;65747:8;;;;:::i;:::-;;-1:-1:-1;65770:10:0;;-1:-1:-1;65778:2:0;65770:10;;:::i;:::-;;;65714:78;;;65802:19;65834:6;65824:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65824:17:0;;65802:39;;65852:154;65859:10;;65852:154;;65886:11;65896:1;65886:11;;:::i;:::-;;-1:-1:-1;65955:10:0;65963:2;65955:5;:10;:::i;:::-;65942:24;;:2;:24;:::i;:::-;65929:39;;65912:6;65919;65912:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;65912:56:0;;;;;;;;-1:-1:-1;65983:11:0;65992:2;65983:11;;:::i;:::-;;;65852:154;;68998:1607;69096:11;;69056:13;;69122:8;69118:23;;-1:-1:-1;;69132:9:0;;;;;;;;;-1:-1:-1;69132:9:0;;;68998:1607;-1:-1:-1;68998:1607:0:o;69118:23::-;69193:18;69231:1;69220:7;:3;69226:1;69220:7;:::i;:::-;69219:13;;;;:::i;:::-;69214:19;;:1;:19;:::i;:::-;69193:40;-1:-1:-1;69291:19:0;69323:15;69193:40;69336:2;69323:15;:::i;:::-;69313:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69313:26:0;;69291:48;;69352:18;69373:5;;;;;;;;;;;;;;;;;69352:26;;69442:1;69435:5;69431:13;69487:2;69479:6;69475:15;69538:1;69506:777;69561:3;69558:1;69555:10;69506:777;;;69616:1;69659:12;;;;;69653:19;69754:4;69742:2;69738:14;;;;;69720:40;;69714:47;69863:2;69859:14;;;69855:25;;69841:40;;69835:47;69992:1;69988:13;;;69984:24;;69970:39;;69964:46;70112:16;;;;70098:31;;70092:38;69790:1;69786:11;;;69884:4;69831:58;;;69822:68;69915:11;;69960:57;;;69951:67;;;;70043:11;;70088:49;;70079:59;70167:3;70163:13;70196:22;;70266:1;70251:17;;;;69609:9;69506:777;;;69510:44;70315:1;70310:3;70306:11;70336:1;70331:84;;;;70434:1;70429:82;;;;70299:212;;70331:84;-1:-1:-1;;;;;70364:17:0;;70357:43;70331:84;;70429:82;-1:-1:-1;;;;;70462:17:0;;70455:41;70299:212;-1:-1:-1;;;70527:26:0;;;70534:6;68998:1607;-1:-1:-1;;;;68998:1607:0:o;55305:866::-;55417:13;55443:12;55458:62;55489:9;55500:17;55509:7;55500:8;:17::i;55458:62::-;55443:77;;55531:20;55554:11;55573;:18;55566:4;:25;;;;:::i;:::-;55554:38;;;;;;;;:::i;:::-;;;;;;;55531:61;;55603:17;55630:2;55623:4;:9;;;;:::i;:::-;55603:29;;55666:2;55654:9;:14;:32;;;;;55684:2;55672:9;:14;55654:32;55650:146;;;55740:9;55750:14;55762:2;55750:9;:14;:::i;:::-;55740:25;;;;;;;;:::i;:::-;;;;;;;;55772:6;55723:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55707:73;;55650:146;55827:2;55814:9;:15;55810:316;;55854:9;55867:2;55854:15;55850:261;;;55910:41;;-1:-1:-1;;;55910:41:0;;;18994:36:1;19046:12;;55910:41:0;18792:272:1;55850:261:0;56056:11;56068:9;56056:22;;;;;;:::i;:::-;;;;;;;;;;;;;56039:51;;;;;;;;:::i;52051:787::-;52164:13;52190:12;52205:62;52236:9;52247:17;52256:7;52247:8;:17::i;52205:62::-;52190:77;;52278:20;52301:11;52320;:18;52313:4;:25;;;;:::i;:::-;52301:38;;;;;;;;:::i;:::-;;;;;;;52278:61;;52350:17;52377:2;52370:4;:9;;;;:::i;:::-;52350:29;;52414:2;52402:9;:14;:32;;;;;52432:2;52420:9;:14;52402:32;52398:123;;;52484:9;52494:1;52484:12;;;;;;;;:::i;:::-;;;;;;;;52501:6;52467:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52451:58;;52398:123;52548:2;52535:9;:15;52531:262;;52571:9;52584:2;52571:15;52567:215;;;52640:9;52650:1;52640:12;;;;;;;;:::i;52567:215::-;52740:9;52750:1;52740:12;;;;;;;;:::i;47790:138::-;47850:7;47912:5;47895:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;47895:23:0;;;;;;;;;47885:34;;47895:23;47885:34;;;;;47790:138;-1:-1:-1;;47790:138:0:o;31772:321::-;31902:18;31908:2;31912:7;31902:5;:18::i;:::-;31953:54;31984:1;31988:2;31992:7;32001:5;31953:22;:54::i;:::-;31931:154;;;;-1:-1:-1;;;31931:154:0;;;;;;;:::i;40060:589::-;-1:-1:-1;;;;;40266:18:0;;40262:187;;40301:40;40333:7;41476:10;:17;;41449:24;;;;:15;:24;;;;;:44;;;41504:24;;;;;;;;;;;;41372:164;40301:40;40262:187;;;40371:2;-1:-1:-1;;;;;40363:10:0;:4;-1:-1:-1;;;;;40363:10:0;;40359:90;;40390:47;40423:4;40429:7;40390:32;:47::i;:::-;-1:-1:-1;;;;;40463:16:0;;40459:183;;40496:45;40533:7;40496:36;:45::i;40459:183::-;40569:4;-1:-1:-1;;;;;40563:10:0;:2;-1:-1:-1;;;;;40563:10:0;;40559:83;;40590:40;40618:2;40622:7;40590:27;:40::i;35172:803::-;35327:4;-1:-1:-1;;;;;35348:13:0;;15655:20;15703:8;35344:624;;35384:72;;-1:-1:-1;;;35384:72:0;;-1:-1:-1;;;;;35384:36:0;;;;;:72;;8179:10;;35435:4;;35441:7;;35450:5;;35384:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35384:72:0;;;;;;;;-1:-1:-1;;35384:72:0;;;;;;;;;;;;:::i;:::-;;;35380:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35630:13:0;;35626:272;;35673:60;;-1:-1:-1;;;35673:60:0;;;;;;;:::i;35626:272::-;35848:6;35842:13;35833:6;35829:2;35825:15;35818:38;35380:533;-1:-1:-1;;;;;;35507:55:0;-1:-1:-1;;;35507:55:0;;-1:-1:-1;35500:62:0;;35344:624;-1:-1:-1;35952:4:0;35172:803;;;;;;:::o;50380:260::-;50467:7;50487:12;50502:62;50533:9;50544:17;50553:7;50544:8;:17::i;50502:62::-;50487:77;-1:-1:-1;50575:17:0;50595:9;50602:2;50487:77;50595:9;:::i;32429:382::-;-1:-1:-1;;;;;32509:16:0;;32501:61;;;;-1:-1:-1;;;32501:61:0;;39659:2:1;32501:61:0;;;39641:21:1;;;39678:18;;;39671:30;39737:34;39717:18;;;39710:62;39789:18;;32501:61:0;39457:356:1;32501:61:0;32582:16;32590:7;32582;:16::i;:::-;32581:17;32573:58;;;;-1:-1:-1;;;32573:58:0;;36545:2:1;32573:58:0;;;36527:21:1;36584:2;36564:18;;;36557:30;36623;36603:18;;;36596:58;36671:18;;32573:58:0;36343:352:1;32573:58:0;32644:45;32673:1;32677:2;32681:7;32644:20;:45::i;:::-;-1:-1:-1;;;;;32702:13:0;;;;;;:9;:13;;;;;:18;;32719:1;;32702:13;:18;;32719:1;;32702:18;:::i;:::-;;;;-1:-1:-1;;32731:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32731:21:0;-1:-1:-1;;;;;32731:21:0;;;;;;;;32770:33;;32731:16;;;32770:33;;32731:16;;32770:33;32429:382;;:::o;42163:988::-;42429:22;42479:1;42454:22;42471:4;42454:16;:22::i;:::-;:26;;;;:::i;:::-;42491:18;42512:26;;;:17;:26;;;;;;42429:51;;-1:-1:-1;42645:28:0;;;42641:328;;-1:-1:-1;;;;;42712:18:0;;42690:19;42712:18;;;:12;:18;;;;;;;;:34;;;;;;;;;42763:30;;;;;;:44;;;42880:30;;:17;:30;;;;;:43;;;42641:328;-1:-1:-1;43065:26:0;;;;:17;:26;;;;;;;;43058:33;;;-1:-1:-1;;;;;43109:18:0;;;;;:12;:18;;;;;:34;;;;;;;43102:41;42163:988::o;43446:1079::-;43724:10;:17;43699:22;;43724:21;;43744:1;;43724:21;:::i;:::-;43756:18;43777:24;;;:15;:24;;;;;;44150:10;:26;;43699:46;;-1:-1:-1;43777:24:0;;43699:46;;44150:26;;;;;;:::i;:::-;;;;;;;;;44128:48;;44214:11;44189:10;44200;44189:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;44294:28;;;:15;:28;;;;;;;:41;;;44466:24;;;;;44459:31;44501:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43517:1008;;;43446:1079;:::o;40950:221::-;41035:14;41052:20;41069:2;41052:16;:20::i;:::-;-1:-1:-1;;;;;41083:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;41128:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;40950:221:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:631:1:-;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:186;1052:6;1105:2;1093:9;1084:7;1080:23;1076:32;1073:52;;;1121:1;1118;1111:12;1073:52;1144:29;1163:9;1144:29;:::i;1184:260::-;1252:6;1260;1313:2;1301:9;1292:7;1288:23;1284:32;1281:52;;;1329:1;1326;1319:12;1281:52;1352:29;1371:9;1352:29;:::i;:::-;1342:39;;1400:38;1434:2;1423:9;1419:18;1400:38;:::i;:::-;1390:48;;1184:260;;;;;:::o;1449:328::-;1526:6;1534;1542;1595:2;1583:9;1574:7;1570:23;1566:32;1563:52;;;1611:1;1608;1601:12;1563:52;1634:29;1653:9;1634:29;:::i;:::-;1624:39;;1682:38;1716:2;1705:9;1701:18;1682:38;:::i;:::-;1672:48;;1767:2;1756:9;1752:18;1739:32;1729:42;;1449:328;;;;;:::o;1782:666::-;1877:6;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;1994:29;2013:9;1994:29;:::i;:::-;1984:39;;2042:38;2076:2;2065:9;2061:18;2042:38;:::i;:::-;2032:48;;2127:2;2116:9;2112:18;2099:32;2089:42;;2182:2;2171:9;2167:18;2154:32;2209:18;2201:6;2198:30;2195:50;;;2241:1;2238;2231:12;2195:50;2264:22;;2317:4;2309:13;;2305:27;-1:-1:-1;2295:55:1;;2346:1;2343;2336:12;2295:55;2369:73;2434:7;2429:2;2416:16;2411:2;2407;2403:11;2369:73;:::i;:::-;2359:83;;;1782:666;;;;;;;:::o;2453:254::-;2518:6;2526;2579:2;2567:9;2558:7;2554:23;2550:32;2547:52;;;2595:1;2592;2585:12;2547:52;2618:29;2637:9;2618:29;:::i;:::-;2608:39;;2666:35;2697:2;2686:9;2682:18;2666:35;:::i;2712:254::-;2780:6;2788;2841:2;2829:9;2820:7;2816:23;2812:32;2809:52;;;2857:1;2854;2847:12;2809:52;2880:29;2899:9;2880:29;:::i;:::-;2870:39;2956:2;2941:18;;;;2928:32;;-1:-1:-1;;;2712:254:1:o;2971:245::-;3029:6;3082:2;3070:9;3061:7;3057:23;3053:32;3050:52;;;3098:1;3095;3088:12;3050:52;3137:9;3124:23;3156:30;3180:5;3156:30;:::i;3221:249::-;3290:6;3343:2;3331:9;3322:7;3318:23;3314:32;3311:52;;;3359:1;3356;3349:12;3311:52;3391:9;3385:16;3410:30;3434:5;3410:30;:::i;3475:180::-;3534:6;3587:2;3575:9;3566:7;3562:23;3558:32;3555:52;;;3603:1;3600;3593:12;3555:52;-1:-1:-1;3626:23:1;;3475:180;-1:-1:-1;3475:180:1:o;3660:248::-;3725:6;3733;3786:2;3774:9;3765:7;3761:23;3757:32;3754:52;;;3802:1;3799;3792:12;3754:52;3838:9;3825:23;3815:33;;3867:35;3898:2;3887:9;3883:18;3867:35;:::i;3913:518::-;3991:6;3999;4052:2;4040:9;4031:7;4027:23;4023:32;4020:52;;;4068:1;4065;4058:12;4020:52;4104:9;4091:23;4081:33;;4165:2;4154:9;4150:18;4137:32;4192:18;4184:6;4181:30;4178:50;;;4224:1;4221;4214:12;4178:50;4247:22;;4300:4;4292:13;;4288:27;-1:-1:-1;4278:55:1;;4329:1;4326;4319:12;4278:55;4352:73;4417:7;4412:2;4399:16;4394:2;4390;4386:11;4352:73;:::i;:::-;4342:83;;;3913:518;;;;;:::o;4436:257::-;4477:3;4515:5;4509:12;4542:6;4537:3;4530:19;4558:63;4614:6;4607:4;4602:3;4598:14;4591:4;4584:5;4580:16;4558:63;:::i;:::-;4675:2;4654:15;-1:-1:-1;;4650:29:1;4641:39;;;;4682:4;4637:50;;4436:257;-1:-1:-1;;4436:257:1:o;4698:185::-;4740:3;4778:5;4772:12;4793:52;4838:6;4833:3;4826:4;4819:5;4815:16;4793:52;:::i;:::-;4861:16;;;;;4698:185;-1:-1:-1;;4698:185:1:o;4888:973::-;4973:12;;4938:3;;5028:1;5048:18;;;;5101;;;;5128:61;;5182:4;5174:6;5170:17;5160:27;;5128:61;5208:2;5256;5248:6;5245:14;5225:18;5222:38;5219:161;;;5302:10;5297:3;5293:20;5290:1;5283:31;5337:4;5334:1;5327:15;5365:4;5362:1;5355:15;5219:161;5396:18;5423:104;;;;5541:1;5536:319;;;;5389:466;;5423:104;-1:-1:-1;;5456:24:1;;5444:37;;5501:16;;;;-1:-1:-1;5423:104:1;;5536:319;43528:1;43521:14;;;43565:4;43552:18;;5630:1;5644:165;5658:6;5655:1;5652:13;5644:165;;;5736:14;;5723:11;;;5716:35;5779:16;;;;5673:10;;5644:165;;;5648:3;;5838:6;5833:3;5829:16;5822:23;;5389:466;;;;;;;4888:973;;;;:::o;6238:276::-;6369:3;6407:6;6401:13;6423:53;6469:6;6464:3;6457:4;6449:6;6445:17;6423:53;:::i;:::-;6492:16;;;;;6238:276;-1:-1:-1;;6238:276:1:o;6519:470::-;6698:3;6736:6;6730:13;6752:53;6798:6;6793:3;6786:4;6778:6;6774:17;6752:53;:::i;:::-;6868:13;;6827:16;;;;6890:57;6868:13;6827:16;6924:4;6912:17;;6890:57;:::i;:::-;6963:20;;6519:470;-1:-1:-1;;;;6519:470:1:o;6994:1449::-;7413:3;7451:6;7445:13;7477:4;7490:51;7534:6;7529:3;7524:2;7516:6;7512:15;7490:51;:::i;:::-;7604:13;;7563:16;;;;7626:55;7604:13;7563:16;7648:15;;;7626:55;:::i;:::-;7748:13;;7703:20;;;7770:55;7748:13;7703:20;7792:15;;;7770:55;:::i;:::-;7892:13;;7847:20;;;7914:55;7892:13;7847:20;7936:15;;;7914:55;:::i;:::-;8036:13;;7991:20;;;8058:55;8036:13;7991:20;8080:15;;;8058:55;:::i;:::-;8180:13;;8135:20;;;8202:55;8180:13;8135:20;8224:15;;;8202:55;:::i;:::-;8324:13;;8279:20;;;8346:55;8324:13;8279:20;8368:15;;;8346:55;:::i;:::-;8417:20;;;;;6994:1449;-1:-1:-1;;;;;;;;;;6994:1449:1:o;8448:1776::-;8963:3;9001:6;8995:13;9017:53;9063:6;9058:3;9051:4;9043:6;9039:17;9017:53;:::i;:::-;9101:6;9095:13;9117:68;9176:8;9167:6;9162:3;9158:16;9151:4;9143:6;9139:17;9117:68;:::i;:::-;9263:13;;9211:16;;;9207:31;;9285:57;9263:13;9207:31;9319:4;9307:17;;9285:57;:::i;:::-;9373:6;9367:13;9389:72;9452:8;9441;9434:5;9430:20;9423:4;9415:6;9411:17;9389:72;:::i;:::-;9543:13;;9487:20;;;;9483:35;;9565:57;9543:13;9483:35;9599:4;9587:17;;9565:57;:::i;:::-;9653:6;9647:13;9669:72;9732:8;9721;9714:5;9710:20;9703:4;9695:6;9691:17;9669:72;:::i;:::-;9823:13;;9767:20;;;;9763:35;;9845:57;9823:13;9763:35;9879:4;9867:17;;9845:57;:::i;:::-;9969:13;;9924:20;;;9991:57;9969:13;9924:20;10025:4;10013:17;;9991:57;:::i;:::-;10079:6;10073:13;10095:72;10158:8;10147;10140:5;10136:20;10129:4;10121:6;10117:17;10095:72;:::i;:::-;10187:20;;10183:35;;8448:1776;-1:-1:-1;;;;;;;;;;;8448:1776:1:o;10229:443::-;10461:3;10499:6;10493:13;10515:53;10561:6;10556:3;10549:4;10541:6;10537:17;10515:53;:::i;:::-;-1:-1:-1;;;10590:16:1;;10615:22;;;-1:-1:-1;10664:1:1;10653:13;;10229:443;-1:-1:-1;10229:443:1:o;10677:447::-;10909:3;10947:6;10941:13;10963:53;11009:6;11004:3;10997:4;10989:6;10985:17;10963:53;:::i;:::-;-1:-1:-1;;;11038:16:1;;11063:26;;;-1:-1:-1;11116:1:1;11105:13;;10677:447;-1:-1:-1;10677:447:1:o;11129:449::-;11361:3;11399:6;11393:13;11415:53;11461:6;11456:3;11449:4;11441:6;11437:17;11415:53;:::i;:::-;-1:-1:-1;;;11490:16:1;;11515:27;;;-1:-1:-1;11569:2:1;11558:14;;11129:449;-1:-1:-1;11129:449:1:o;11583:1719::-;12257:3;12295:6;12289:13;12321:4;12334:51;12378:6;12373:3;12368:2;12360:6;12356:15;12334:51;:::i;:::-;-1:-1:-1;;;12407:16:1;;;12432:27;;;12484:13;;12506:64;12484:13;12556:2;12545:14;;12528:15;;;12506:64;:::i;:::-;12634:13;;12589:20;;;12656:61;12634:13;12703:2;12695:11;;12678:15;;;12656:61;:::i;:::-;12782:28;12777:2;12736:17;;;;12769:11;;;12762:49;12836:13;;12858:61;12836:13;12905:2;12897:11;;12880:15;;;12858:61;:::i;:::-;12980:13;;12938:17;;;13002:61;12980:13;13049:2;13041:11;;13024:15;;;13002:61;:::i;:::-;-1:-1:-1;;;13123:2:1;13082:17;;;;13115:11;;;13108:38;13171:13;;13193:61;13171:13;13240:2;13232:11;;13215:15;;;13193:61;:::i;:::-;13274:17;;;;13293:2;13270:26;;11583:1719;-1:-1:-1;;;;;;;;;11583:1719:1:o;13307:444::-;13539:3;13577:6;13571:13;13593:53;13639:6;13634:3;13627:4;13619:6;13615:17;13593:53;:::i;:::-;-1:-1:-1;;;13668:16:1;;13693:23;;;-1:-1:-1;13743:1:1;13732:13;;13307:444;-1:-1:-1;13307:444:1:o;13756:618::-;14036:3;14074:6;14068:13;14090:53;14136:6;14131:3;14124:4;14116:6;14112:17;14090:53;:::i;:::-;-1:-1:-1;;;14165:16:1;;;14190:22;;;14237:13;;14259:65;14237:13;14311:1;14300:13;;14293:4;14281:17;;14259:65;:::i;:::-;14344:20;14366:1;14340:28;;13756:618;-1:-1:-1;;;;13756:618:1:o;14379:453::-;14611:3;14649:6;14643:13;14665:53;14711:6;14706:3;14699:4;14691:6;14687:17;14665:53;:::i;:::-;-1:-1:-1;;;14740:16:1;;14765:31;;;-1:-1:-1;14823:2:1;14812:14;;14379:453;-1:-1:-1;14379:453:1:o;14837:443::-;15069:3;15107:6;15101:13;15123:53;15169:6;15164:3;15157:4;15149:6;15145:17;15123:53;:::i;:::-;-1:-1:-1;;;15198:16:1;;15223:22;;;-1:-1:-1;15272:1:1;15261:13;;14837:443;-1:-1:-1;14837:443:1:o;15285:197::-;15413:3;15438:38;15472:3;15464:6;15438:38;:::i;15487:517::-;15764:3;15792:38;15826:3;15818:6;15792:38;:::i;:::-;-1:-1:-1;;;15846:2:1;15839:15;15883:6;15877:13;15899:60;15952:6;15948:1;15944:2;15940:10;15933:4;15925:6;15921:17;15899:60;:::i;:::-;15979:15;15996:1;15975:23;;15487:517;-1:-1:-1;;;;15487:517:1:o;16009:357::-;16238:3;16266:38;16300:3;16292:6;16266:38;:::i;:::-;-1:-1:-1;;;16313:21:1;;16358:1;16350:10;;16009:357;-1:-1:-1;;;16009:357:1:o;16371:967::-;16800:3;-1:-1:-1;;;16860:2:1;16855:3;16848:15;16892:6;16886:13;16908:61;16962:6;16958:1;16953:3;16949:11;16942:4;16934:6;16930:17;16908:61;:::i;:::-;17029:13;;16988:16;;;;17051:62;17029:13;17100:1;17092:10;;17085:4;17073:17;;17051:62;:::i;:::-;17132:17;17173:1;17165:10;;17158:22;;;;17205:13;;;17227:63;17205:13;17276:2;17268:11;;17261:4;17249:17;;17227:63;:::i;:::-;17310:17;17329:2;17306:26;;16371:967;-1:-1:-1;;;;;16371:967:1:o;17864:923::-;-1:-1:-1;;;18371:3:1;18364:27;18346:3;18420:6;18414:13;18436:62;18491:6;18486:2;18481:3;18477:12;18470:4;18462:6;18458:17;18436:62;:::i;:::-;-1:-1:-1;;;18557:2:1;18517:16;;;18549:11;;;18542:24;18591:13;;18613:63;18591:13;18662:2;18654:11;;18647:4;18635:17;;18613:63;:::i;:::-;-1:-1:-1;;;18736:2:1;18695:17;;;;18728:11;;;18721:33;18778:2;18770:11;;17864:923;-1:-1:-1;;;;17864:923:1:o;19069:2145::-;-1:-1:-1;;;20114:3:1;20107:19;20089:3;20155:6;20149:13;20171:61;20225:6;20221:1;20216:3;20212:11;20205:4;20197:6;20193:17;20171:61;:::i;:::-;20292:13;;20251:16;;;;20314:62;20292:13;20363:1;20355:10;;20348:4;20336:17;;20314:62;:::i;:::-;-1:-1:-1;;;20436:1:1;20395:17;;;;20428:10;;;20421:26;20472:13;;20494:62;20472:13;20543:1;20535:10;;20528:4;20516:17;;20494:62;:::i;:::-;20617:13;;20575:17;;;20639:62;20617:13;20688:1;20680:10;;20673:4;20661:17;;20639:62;:::i;:::-;-1:-1:-1;;;20761:1:1;20720:17;;;;20753:10;;;20746:26;20797:13;;20819:63;20797:13;20868:2;20860:11;;20853:4;20841:17;;20819:63;:::i;:::-;20943:13;;20901:17;;;20965:63;20943:13;21014:2;21006:11;;20999:4;20987:17;;20965:63;:::i;:::-;21044:164;21070:137;21095:111;21121:84;21147:57;21200:2;21189:8;21185:2;21181:17;21177:26;-1:-1:-1;;;6181:19:1;;6225:1;6216:11;;6116:117;21147:57;21139:6;21121:84;:::i;:::-;21113:6;21095:111;:::i;:::-;-1:-1:-1;;;5926:19:1;;5970:1;5961:11;;5866:112;21070:137;21062:6;21044:164;:::i;:::-;21037:171;19069:2145;-1:-1:-1;;;;;;;;;;;;;19069:2145:1:o;21219:1467::-;21882:66;21870:79;;-1:-1:-1;;;21974:2:1;21965:12;;21958:75;22063:66;22058:2;22049:12;;22042:88;-1:-1:-1;;;22155:2:1;22146:12;;22139:83;22253:66;22247:3;22238:13;;22231:89;-1:-1:-1;;;22345:3:1;22336:13;;22329:63;22423:66;22417:3;22408:13;;22401:89;-1:-1:-1;;;22515:3:1;22506:13;;22499:47;-1:-1:-1;22565:48:1;22608:3;22599:13;;22591:6;22565:48;:::i;:::-;-1:-1:-1;;;22622:32:1;;22678:1;22670:10;;21219:1467;-1:-1:-1;;;21219:1467:1:o;22691:1777::-;23453:66;23448:3;23441:79;23550:66;23545:2;23540:3;23536:12;23529:88;23647:66;23642:2;23637:3;23633:12;23626:88;23753:4;23748:3;23744:14;23739:2;23734:3;23730:12;23723:36;-1:-1:-1;;;23784:2:1;23779:3;23775:12;23768:45;23423:3;23842:6;23836:13;23858:61;23912:6;23906:3;23901;23897:13;23892:2;23884:6;23880:15;23858:61;:::i;:::-;23984:34;23978:3;23938:16;;;23970:12;;;23963:56;-1:-1:-1;;;24043:3:1;24035:12;;24028:33;24086:13;;24108:62;24086:13;24155:3;24147:12;;24142:2;24130:15;;24108:62;:::i;:::-;24236:66;24230:3;24189:17;;;;24222:12;;;24215:88;-1:-1:-1;;;24327:3:1;24319:12;;24312:64;24392:70;24422:39;24456:3;24448:12;;24440:6;24422:39;:::i;:::-;-1:-1:-1;;;6048:30:1;;6103:1;6094:11;;5983:128;24392:70;24385:77;22691:1777;-1:-1:-1;;;;;;22691:1777:1:o;24473:1331::-;-1:-1:-1;;;25122:57:1;;25202:13;;25104:3;;25224:62;25202:13;25274:2;25265:12;;25258:4;25246:17;;25224:62;:::i;:::-;-1:-1:-1;;;25345:2:1;25305:16;;;25337:11;;;25330:43;25398:13;;25420:63;25398:13;25469:2;25461:11;;25454:4;25442:17;;25420:63;:::i;:::-;-1:-1:-1;;;25543:2:1;25502:17;;;;25535:11;;;25528:51;25604:13;;25626:63;25604:13;25675:2;25667:11;;25660:4;25648:17;;25626:63;:::i;:::-;-1:-1:-1;;;25749:2:1;25708:17;;;;25741:11;;;25734:35;25793:4;25785:13;;24473:1331;-1:-1:-1;;;;;24473:1331:1:o;25809:964::-;26238:3;-1:-1:-1;;;26295:2:1;26290:3;26283:15;26327:6;26321:13;26343:61;26397:6;26393:1;26388:3;26384:11;26377:4;26369:6;26365:17;26343:61;:::i;:::-;26464:13;;26423:16;;;;26486:62;26464:13;26535:1;26527:10;;26520:4;26508:17;;26486:62;:::i;:::-;26567:17;26608:1;26600:10;;26593:22;;;;26640:13;;;26662:63;26640:13;26711:2;26703:11;;26696:4;26684:17;;26662:63;:::i;:::-;26745:17;26764:2;26741:26;;25809:964;-1:-1:-1;;;;;25809:964:1:o;27317:965::-;27746:3;-1:-1:-1;;;27804:2:1;27799:3;27792:15;27836:6;27830:13;27852:61;27906:6;27902:1;27897:3;27893:11;27886:4;27878:6;27874:17;27852:61;:::i;:::-;27973:13;;27932:16;;;;27995:62;27973:13;28044:1;28036:10;;28029:4;28017:17;;27995:62;:::i;:::-;28076:17;28117:1;28109:10;;28102:22;;;;28149:13;;;28171:63;28149:13;28220:2;28212:11;;28205:4;28193:17;;28171:63;:::i;:::-;28254:17;28273:2;28250:26;;27317:965;-1:-1:-1;;;;;27317:965:1:o;28287:1426::-;-1:-1:-1;;;28787:66:1;;28876:13;;28769:3;;28898:62;28876:13;28948:2;28939:12;;28932:4;28920:17;;28898:62;:::i;:::-;29024:66;29019:2;28979:16;;;29011:11;;;29004:87;29120:34;29115:2;29107:11;;29100:55;29184:34;29179:2;29171:11;;29164:55;29249:34;29243:3;29235:12;;29228:56;29314:34;29308:3;29300:12;;29293:56;29379:66;29373:3;29365:12;;29358:88;-1:-1:-1;;;29470:3:1;29462:12;;29455:32;29512:13;;29534:64;29512:13;29583:3;29575:12;;29568:4;29556:17;;29534:64;:::i;:::-;-1:-1:-1;;;29658:3:1;29617:17;;;;29650:12;;;29643:36;29703:3;29695:12;;28287:1426;-1:-1:-1;;;;28287:1426:1:o;30246:959::-;30758:66;30753:3;30746:79;30728:3;30854:6;30848:13;30870:62;30925:6;30920:2;30915:3;30911:12;30904:4;30896:6;30892:17;30870:62;:::i;:::-;-1:-1:-1;;;30991:2:1;30951:16;;;30983:11;;;30976:27;-1:-1:-1;;;31027:2:1;31019:11;;31012:35;31072:13;;31094:63;31072:13;31143:2;31135:11;;31128:4;31116:17;;31094:63;:::i;:::-;31177:17;31196:2;31173:26;;30246:959;-1:-1:-1;;;;30246:959:1:o;31210:331::-;-1:-1:-1;;;31464:3:1;31457:16;31439:3;31489:46;31532:1;31527:3;31523:11;31515:6;31489:46;:::i;31546:448::-;31808:31;31803:3;31796:44;31778:3;31869:6;31863:13;31885:62;31940:6;31935:2;31930:3;31926:12;31919:4;31911:6;31907:17;31885:62;:::i;:::-;31967:16;;;;31985:2;31963:25;;31546:448;-1:-1:-1;;31546:448:1:o;31999:964::-;-1:-1:-1;;;32453:3:1;32446:25;32428:3;32500:6;32494:13;32516:62;32571:6;32566:2;32561:3;32557:12;32550:4;32542:6;32538:17;32516:62;:::i;:::-;32638:13;;32597:16;;;;32660:63;32638:13;32709:2;32701:11;;32694:4;32682:17;;32660:63;:::i;:::-;-1:-1:-1;;;32783:2:1;32742:17;;;;32775:11;;;32768:37;32830:13;;32852:63;32830:13;32901:2;32893:11;;32886:4;32874:17;;32852:63;:::i;:::-;32935:17;32954:2;32931:26;;31999:964;-1:-1:-1;;;;;31999:964:1:o;34196:488::-;-1:-1:-1;;;;;34465:15:1;;;34447:34;;34517:15;;34512:2;34497:18;;34490:43;34564:2;34549:18;;34542:34;;;34612:3;34607:2;34592:18;;34585:31;;;34390:4;;34633:45;;34658:19;;34650:6;34633:45;:::i;34881:219::-;35030:2;35019:9;35012:21;34993:4;35050:44;35090:2;35079:9;35075:18;35067:6;35050:44;:::i;35517:414::-;35719:2;35701:21;;;35758:2;35738:18;;;35731:30;35797:34;35792:2;35777:18;;35770:62;-1:-1:-1;;;35863:2:1;35848:18;;35841:48;35921:3;35906:19;;35517:414::o;40231:356::-;40433:2;40415:21;;;40452:18;;;40445:30;40511:34;40506:2;40491:18;;40484:62;40578:2;40563:18;;40231:356::o;40592:340::-;40794:2;40776:21;;;40833:2;40813:18;;;40806:30;-1:-1:-1;;;40867:2:1;40852:18;;40845:46;40923:2;40908:18;;40592:340::o;41749:413::-;41951:2;41933:21;;;41990:2;41970:18;;;41963:30;42029:34;42024:2;42009:18;;42002:62;-1:-1:-1;;;42095:2:1;42080:18;;42073:47;42152:3;42137:19;;41749:413::o;42580:355::-;42782:2;42764:21;;;42821:2;42801:18;;;42794:30;42860:33;42855:2;42840:18;;42833:61;42926:2;42911:18;;42580:355::o;43581:128::-;43621:3;43652:1;43648:6;43645:1;43642:13;43639:39;;;43658:18;;:::i;:::-;-1:-1:-1;43694:9:1;;43581:128::o;43714:120::-;43754:1;43780;43770:35;;43785:18;;:::i;:::-;-1:-1:-1;43819:9:1;;43714:120::o;43839:168::-;43879:7;43945:1;43941;43937:6;43933:14;43930:1;43927:21;43922:1;43915:9;43908:17;43904:45;43901:71;;;43952:18;;:::i;:::-;-1:-1:-1;43992:9:1;;43839:168::o;44012:125::-;44052:4;44080:1;44077;44074:8;44071:34;;;44085:18;;:::i;:::-;-1:-1:-1;44122:9:1;;44012:125::o;44142:258::-;44214:1;44224:113;44238:6;44235:1;44232:13;44224:113;;;44314:11;;;44308:18;44295:11;;;44288:39;44260:2;44253:10;44224:113;;;44355:6;44352:1;44349:13;44346:48;;;-1:-1:-1;;44390:1:1;44372:16;;44365:27;44142:258::o;44405:380::-;44484:1;44480:12;;;;44527;;;44548:61;;44602:4;44594:6;44590:17;44580:27;;44548:61;44655:2;44647:6;44644:14;44624:18;44621:38;44618:161;;;44701:10;44696:3;44692:20;44689:1;44682:31;44736:4;44733:1;44726:15;44764:4;44761:1;44754:15;44618:161;;44405:380;;;:::o;44790:135::-;44829:3;-1:-1:-1;;44850:17:1;;44847:43;;;44870:18;;:::i;:::-;-1:-1:-1;44917:1:1;44906:13;;44790:135::o;44930:112::-;44962:1;44988;44978:35;;44993:18;;:::i;:::-;-1:-1:-1;45027:9:1;;44930:112::o;45047:127::-;45108:10;45103:3;45099:20;45096:1;45089:31;45139:4;45136:1;45129:15;45163:4;45160:1;45153:15;45179:127;45240:10;45235:3;45231:20;45228:1;45221:31;45271:4;45268:1;45261:15;45295:4;45292:1;45285:15;45311:127;45372:10;45367:3;45363:20;45360:1;45353:31;45403:4;45400:1;45393:15;45427:4;45424:1;45417:15;45443:127;45504:10;45499:3;45495:20;45492:1;45485:31;45535:4;45532:1;45525:15;45559:4;45556:1;45549:15;45575:127;45636:10;45631:3;45627:20;45624:1;45617:31;45667:4;45664:1;45657:15;45691:4;45688:1;45681:15;45707:131;-1:-1:-1;;;;;;45781:32:1;;45771:43;;45761:71;;45828:1;45825;45818:12

Swarm Source

ipfs://3c3c6aacda577b459fc0b1097eb4d249fd8e96b19d6022a41186be78524a453f
Loading...
Loading
Loading...
Loading
[ 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.