ETH Price: $2,435.99 (-2.12%)

Token

SangSaka (Saka)
 

Overview

Max Total Supply

0 Saka

Holders

248

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
irmeca.eth
Balance
7 Saka
0x67D0e5d11F6a53D08A0ca120778fF85E7DE96C62
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Sang Saka is an immersive web3 media franchise based on Nusantara mythical creatures. Art is 100% uniquely hand-drawn 1/1s. Aspires to create Sang Saka Animated Series.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SangSaka

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-26
*/

//  ██████  ▄▄▄       ███▄    █   ▄████      ██████  ▄▄▄       ██ ▄█▀▄▄▄      
//▒██    ▒ ▒████▄     ██ ▀█   █  ██▒ ▀█▒   ▒██    ▒ ▒████▄     ██▄█▒▒████▄    
//░ ▓██▄   ▒██  ▀█▄  ▓██  ▀█ ██▒▒██░▄▄▄░   ░ ▓██▄   ▒██  ▀█▄  ▓███▄░▒██  ▀█▄  
//  ▒   ██▒░██▄▄▄▄██ ▓██▒  ▐▌██▒░▓█  ██▓     ▒   ██▒░██▄▄▄▄██ ▓██ █▄░██▄▄▄▄██ 
//▒██████▒▒ ▓█   ▓██▒▒██░   ▓██░░▒▓███▀▒   ▒██████▒▒ ▓█   ▓██▒▒██▒ █▄▓█   ▓██▒
//▒ ▒▓▒ ▒ ░ ▒▒   ▓▒█░░ ▒░   ▒ ▒  ░▒   ▒    ▒ ▒▓▒ ▒ ░ ▒▒   ▓▒█░▒ ▒▒ ▓▒▒▒   ▓▒█░
//░ ░▒  ░ ░  ▒   ▒▒ ░░ ░░   ░ ▒░  ░   ░    ░ ░▒  ░ ░  ▒   ▒▒ ░░ ░▒ ▒░ ▒   ▒▒ ░
//░  ░  ░    ░   ▒      ░   ░ ░ ░ ░   ░    ░  ░  ░    ░   ▒   ░ ░░ ░  ░   ▒   
//      ░        ░  ░         ░       ░          ░        ░  ░░  ░        ░  ░

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

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

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @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`.
     *
     * 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 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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @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: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

    /**
     * @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 from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 {
        _transferOwnership(address(0));
    }

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

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

// File: sangsaka.sol

//  ██████  ▄▄▄       ███▄    █   ▄████      ██████  ▄▄▄       ██ ▄█▀▄▄▄      
//▒██    ▒ ▒████▄     ██ ▀█   █  ██▒ ▀█▒   ▒██    ▒ ▒████▄     ██▄█▒▒████▄    
//░ ▓██▄   ▒██  ▀█▄  ▓██  ▀█ ██▒▒██░▄▄▄░   ░ ▓██▄   ▒██  ▀█▄  ▓███▄░▒██  ▀█▄  
//  ▒   ██▒░██▄▄▄▄██ ▓██▒  ▐▌██▒░▓█  ██▓     ▒   ██▒░██▄▄▄▄██ ▓██ █▄░██▄▄▄▄██ 
//▒██████▒▒ ▓█   ▓██▒▒██░   ▓██░░▒▓███▀▒   ▒██████▒▒ ▓█   ▓██▒▒██▒ █▄▓█   ▓██▒
//▒ ▒▓▒ ▒ ░ ▒▒   ▓▒█░░ ▒░   ▒ ▒  ░▒   ▒    ▒ ▒▓▒ ▒ ░ ▒▒   ▓▒█░▒ ▒▒ ▓▒▒▒   ▓▒█░
//░ ░▒  ░ ░  ▒   ▒▒ ░░ ░░   ░ ▒░  ░   ░    ░ ░▒  ░ ░  ▒   ▒▒ ░░ ░▒ ▒░ ▒   ▒▒ ░
//░  ░  ░    ░   ▒      ░   ░ ░ ░ ░   ░    ░  ░  ░    ░   ▒   ░ ░░ ░  ░   ▒   
//      ░        ░  ░         ░       ░          ░        ░  ░░  ░        ░  ░

pragma solidity ^0.8.18;







contract SangSaka is ERC721, Ownable {
    using Address for address;
    using Strings for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIds;
    mapping(address => uint256) public mintBalance;

    uint256 public cost_public = 1 ether;
    uint256 public cost_whitelist = 1 ether;

    uint256 public quantity_public = 0;
    uint256 public quantity_whitelist = 0;
    uint256 public quantity_max = 530;

    bool public available_mint = false;
    bool public available_whitelist = false;

    bytes32 private merkleRoot =
        0xc72d2373ed597cc1eccd45955203671adfd9ffe47c2050a819670fc66635011c;
    address public vault;

    string private baseuri;

    constructor() ERC721("SangSaka", "Saka") {
        vault = _msgSender();
        baseuri = "ipfs://QmZJnM4GK7rNbznNdekmR5ieTi1Ckh2PTpRVpjvq9Uq44p/";
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        string memory baseURI = _baseURI();
        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, tokenId.toString()))
                : "";
    }

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

    function set_av_mint(bool value) public onlyOwner {
        available_mint = value;
    }

    function set_av_whitelist(bool value) public onlyOwner {
        available_whitelist = value;
    }

    function set_quan_public(uint256 value) public onlyOwner {
        quantity_public = value;
    }

    function set_quan_whitelist(uint256 value) public onlyOwner {
        quantity_whitelist = value;
    }

    function set_cost_public(uint256 value) public onlyOwner {
        cost_public = value;
    }

    function set_cost_whitelist(uint256 value) public onlyOwner {
        cost_whitelist = value;
    }

    function setMerkleRoot(bytes32 root) external onlyOwner {
        merkleRoot = root;
    }

    function setTotalMax(uint256 value) external onlyOwner {
        quantity_max = value;
    }

    function setVault(address addr) external onlyOwner {
        vault = addr;
    }

    function setBaseUri(string memory uri) external onlyOwner {
        baseuri = uri;
    }

    function mint_public(uint256 amount) external payable callerIsUser {
        require(amount >= 1, "Public Mint Amount should be bigger than 0.");
        require(amount <= quantity_public, "Public Mint Amount is overflow");
        require(available_mint == true, "Public Mint is disabled.");
        require(
            cost_public * amount <= msg.value,
            "Insufficient Fund to mint public nft"
        );

        uint256 newItemId = _tokenIds.current();
        require(newItemId + amount <= quantity_max, "Amount Exceed.");

        require(
            mintBalance[_msgSender()] + amount <= quantity_public,
            "Public Mint Amount Exceed."
        );

        payable(vault).transfer(msg.value);

        for (uint256 i = 0; i < amount; i++) {
            newItemId = _tokenIds.current();
            _safeMint(_msgSender(), newItemId);
            _tokenIds.increment();
        }

        mintBalance[_msgSender()] += amount;
    }

    function mint_whitelist(uint256 amount, bytes32[] calldata merkleProof)
        external
        payable
    {
        require(amount >= 1, "Whitelist Mint Amount should be bigger than 0.");
        require(
            amount <= quantity_whitelist,
            "Whitelist Mint Amount is overflow"
        );
        require(available_whitelist == true, "Whitelist Mint is disabled.");
        require(
            cost_whitelist * amount <= msg.value,
            "Insufficient Fund to mint whitelist nft"
        );

        uint256 newItemId = _tokenIds.current();
        require(newItemId + amount <= quantity_max, "Amount Exceed.");

        require(
            mintBalance[_msgSender()] + amount <= quantity_whitelist,
            "Whitelist Mint Amount Exceed."
        );

        bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
        require(
            MerkleProof.verify(merkleProof, merkleRoot, leaf) == true,
            "This address is not whitelisted"
        );

        payable(vault).transfer(msg.value);

        for (uint256 i = 0; i < amount; i++) {
            newItemId = _tokenIds.current();
            _safeMint(_msgSender(), newItemId);
            _tokenIds.increment();
        }

        mintBalance[_msgSender()] += amount;
    }

    function mint(uint256 amount) external onlyOwner {
        uint256 newItemId = _tokenIds.current();
        require(newItemId + amount <= quantity_max, "Amount Exceed.");

        for (uint256 i = 0; i < amount; i++) {
            newItemId = _tokenIds.current();
            _safeMint(_msgSender(), newItemId);
            _tokenIds.increment();
        }

        mintBalance[_msgSender()] += amount;
    }

    function getLastId() public view returns (uint256) {
        return _tokenIds.current();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"available_mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"available_whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost_public","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost_whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint_public","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mint_whitelist","outputs":[],"stateMutability":"payable","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":"quantity_max","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quantity_public","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quantity_whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"string","name":"uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setTotalMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"set_av_mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"set_av_whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"set_cost_public","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"set_cost_whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"set_quan_public","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"set_quan_whitelist","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6080604052670de0b6b3a7640000600955670de0b6b3a7640000600a556000600b556000600c55610212600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055507fc72d2373ed597cc1eccd45955203671adfd9ffe47c2050a819670fc66635011c60001b600f553480156200009657600080fd5b506040518060400160405280600881526020017f53616e6753616b610000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f53616b6100000000000000000000000000000000000000000000000000000000815250816000908162000114919062000512565b50806001908162000126919062000512565b505050620001496200013d620001ca60201b60201c565b620001d260201b60201c565b62000159620001ca60201b60201c565b601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180606001604052806036815260200162004d2e6036913960119081620001c3919062000512565b50620005f9565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200031a57607f821691505b60208210810362000330576200032f620002d2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200039a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200035b565b620003a686836200035b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003f3620003ed620003e784620003be565b620003c8565b620003be565b9050919050565b6000819050919050565b6200040f83620003d2565b620004276200041e82620003fa565b84845462000368565b825550505050565b600090565b6200043e6200042f565b6200044b81848462000404565b505050565b5b8181101562000473576200046760008262000434565b60018101905062000451565b5050565b601f821115620004c2576200048c8162000336565b62000497846200034b565b81016020851015620004a7578190505b620004bf620004b6856200034b565b83018262000450565b50505b505050565b600082821c905092915050565b6000620004e760001984600802620004c7565b1980831691505092915050565b6000620005028383620004d4565b9150826002028217905092915050565b6200051d8262000298565b67ffffffffffffffff811115620005395762000538620002a3565b5b62000545825462000301565b6200055282828562000477565b600060209050601f8311600181146200058a576000841562000575578287015190505b620005818582620004f4565b865550620005f1565b601f1984166200059a8662000336565b60005b82811015620005c4578489015182556001820191506020850194506020810190506200059d565b86831015620005e45784890151620005e0601f891682620004d4565b8355505b6001600288020188555050505b505050505050565b61472580620006096000396000f3fe6080604052600436106102305760003560e01c80637cb647591161012e578063b88d4fde116100ab578063e985e9c51161006f578063e985e9c514610805578063f2fde38b14610842578063f44a909f1461086b578063f48b898914610896578063fbfa77cf146108c157610230565b8063b88d4fde14610710578063c42886e814610739578063c87b56dd14610762578063cf8d0aae1461079f578063d88cc3ff146107c857610230565b8063a0712d68116100f2578063a0712d6814610641578063a0bcfc7f1461066a578063a22cb46514610693578063a8e5862d146106bc578063b729a222146106e757610230565b80637cb647591461057057806386130146146105995780638da5cb5b146105c25780638fb12b5d146105ed57806395d89b411461061657610230565b80631ecf77d1116101bc578063503f3b9511610180578063503f3b951461049a5780636352211e146104b65780636817031b146104f357806370a082311461051c578063715018a61461055957610230565b80631ecf77d1146103c957806323b872dd146103f257806331eb4cc31461041b57806342842e0e14610446578063474f80e61461046f57610230565b8063095ea7b311610203578063095ea7b3146103055780630963e81b1461032e5780630a0caa461461035957806311d9eace1461037557806313da3e92146103a057610230565b806301ffc9a71461023557806303006d381461027257806306fdde031461029d578063081812fc146102c8575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190612c7e565b6108ec565b6040516102699190612cc6565b60405180910390f35b34801561027e57600080fd5b506102876109ce565b6040516102949190612cfa565b60405180910390f35b3480156102a957600080fd5b506102b26109d4565b6040516102bf9190612da5565b60405180910390f35b3480156102d457600080fd5b506102ef60048036038101906102ea9190612df3565b610a66565b6040516102fc9190612e61565b60405180910390f35b34801561031157600080fd5b5061032c60048036038101906103279190612ea8565b610aac565b005b34801561033a57600080fd5b50610343610bc3565b6040516103509190612cfa565b60405180910390f35b610373600480360381019061036e9190612f4d565b610bc9565b005b34801561038157600080fd5b5061038a610fc5565b6040516103979190612cfa565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c29190612df3565b610fcb565b005b3480156103d557600080fd5b506103f060048036038101906103eb9190612fd9565b610fdd565b005b3480156103fe57600080fd5b5061041960048036038101906104149190613006565b611002565b005b34801561042757600080fd5b50610430611062565b60405161043d9190612cc6565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190613006565b611075565b005b34801561047b57600080fd5b50610484611095565b6040516104919190612cfa565b60405180910390f35b6104b460048036038101906104af9190612df3565b61109b565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190612df3565b61143c565b6040516104ea9190612e61565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190613059565b6114c2565b005b34801561052857600080fd5b50610543600480360381019061053e9190613059565b61150e565b6040516105509190612cfa565b60405180910390f35b34801561056557600080fd5b5061056e6115c5565b005b34801561057c57600080fd5b50610597600480360381019061059291906130bc565b6115d9565b005b3480156105a557600080fd5b506105c060048036038101906105bb9190612df3565b6115eb565b005b3480156105ce57600080fd5b506105d76115fd565b6040516105e49190612e61565b60405180910390f35b3480156105f957600080fd5b50610614600480360381019061060f9190612fd9565b611627565b005b34801561062257600080fd5b5061062b61164c565b6040516106389190612da5565b60405180910390f35b34801561064d57600080fd5b5061066860048036038101906106639190612df3565b6116de565b005b34801561067657600080fd5b50610691600480360381019061068c9190613219565b6117eb565b005b34801561069f57600080fd5b506106ba60048036038101906106b59190613262565b611806565b005b3480156106c857600080fd5b506106d161181c565b6040516106de9190612cfa565b60405180910390f35b3480156106f357600080fd5b5061070e60048036038101906107099190612df3565b61182d565b005b34801561071c57600080fd5b5061073760048036038101906107329190613343565b61183f565b005b34801561074557600080fd5b50610760600480360381019061075b9190612df3565b6118a1565b005b34801561076e57600080fd5b5061078960048036038101906107849190612df3565b6118b3565b6040516107969190612da5565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c19190612df3565b611912565b005b3480156107d457600080fd5b506107ef60048036038101906107ea9190613059565b611924565b6040516107fc9190612cfa565b60405180910390f35b34801561081157600080fd5b5061082c600480360381019061082791906133c6565b61193c565b6040516108399190612cc6565b60405180910390f35b34801561084e57600080fd5b5061086960048036038101906108649190613059565b6119d0565b005b34801561087757600080fd5b50610880611a53565b60405161088d9190612cc6565b60405180910390f35b3480156108a257600080fd5b506108ab611a66565b6040516108b89190612cfa565b60405180910390f35b3480156108cd57600080fd5b506108d6611a6c565b6040516108e39190612e61565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109b757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109c757506109c682611a92565b5b9050919050565b600a5481565b6060600080546109e390613435565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0f90613435565b8015610a5c5780601f10610a3157610100808354040283529160200191610a5c565b820191906000526020600020905b815481529060010190602001808311610a3f57829003601f168201915b5050505050905090565b6000610a7182611afc565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ab78261143c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e906134d8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b46611b47565b73ffffffffffffffffffffffffffffffffffffffff161480610b755750610b7481610b6f611b47565b61193c565b5b610bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bab9061356a565b60405180910390fd5b610bbe8383611b4f565b505050565b600c5481565b6001831015610c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c04906135fc565b60405180910390fd5b600c54831115610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c499061368e565b60405180910390fd5b60011515600e60019054906101000a900460ff16151514610ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9f906136fa565b60405180910390fd5b3483600a54610cb79190613749565b1115610cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cef906137fd565b60405180910390fd5b6000610d046007611c08565b9050600d548482610d15919061381d565b1115610d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4d9061389d565b60405180910390fd5b600c548460086000610d66611b47565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610dab919061381d565b1115610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de390613909565b60405180910390fd5b6000610df6611b47565b604051602001610e069190613971565b60405160208183030381529060405280519060200120905060011515610e70858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f5484611c16565b151514610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea9906139d8565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610f1a573d6000803e3d6000fd5b5060005b85811015610f6057610f306007611c08565b9250610f43610f3d611b47565b84611c2d565b610f4d6007611c4b565b8080610f58906139f8565b915050610f1e565b508460086000610f6e611b47565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fb7919061381d565b925050819055505050505050565b600d5481565b610fd3611c61565b80600b8190555050565b610fe5611c61565b80600e60016101000a81548160ff02191690831515021790555050565b61101361100d611b47565b82611cdf565b611052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104990613ab2565b60405180910390fd5b61105d838383611d74565b505050565b600e60009054906101000a900460ff1681565b6110908383836040518060200160405280600081525061183f565b505050565b600b5481565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110090613b1e565b60405180910390fd5b600181101561114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114490613bb0565b60405180910390fd5b600b54811115611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990613c1c565b60405180910390fd5b60011515600e60009054906101000a900460ff161515146111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111df90613c88565b60405180910390fd5b34816009546111f79190613749565b1115611238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122f90613d1a565b60405180910390fd5b60006112446007611c08565b9050600d548282611255919061381d565b1115611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d9061389d565b60405180910390fd5b600b5482600860006112a6611b47565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112eb919061381d565b111561132c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132390613d86565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611394573d6000803e3d6000fd5b5060005b828110156113da576113aa6007611c08565b91506113bd6113b7611b47565b83611c2d565b6113c76007611c4b565b80806113d2906139f8565b915050611398565b5081600860006113e8611b47565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611431919061381d565b925050819055505050565b6000806114488361206d565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b090613df2565b60405180910390fd5b80915050919050565b6114ca611c61565b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157590613e84565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115cd611c61565b6115d760006120aa565b565b6115e1611c61565b80600f8190555050565b6115f3611c61565b80600c8190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61162f611c61565b80600e60006101000a81548160ff02191690831515021790555050565b60606001805461165b90613435565b80601f016020809104026020016040519081016040528092919081815260200182805461168790613435565b80156116d45780601f106116a9576101008083540402835291602001916116d4565b820191906000526020600020905b8154815290600101906020018083116116b757829003601f168201915b5050505050905090565b6116e6611c61565b60006116f26007611c08565b9050600d548282611703919061381d565b1115611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173b9061389d565b60405180910390fd5b60005b82811015611789576117596007611c08565b915061176c611766611b47565b83611c2d565b6117766007611c4b565b8080611781906139f8565b915050611747565b508160086000611797611b47565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117e0919061381d565b925050819055505050565b6117f3611c61565b80601190816118029190614050565b5050565b611818611811611b47565b8383612170565b5050565b60006118286007611c08565b905090565b611835611c61565b80600d8190555050565b61185061184a611b47565b83611cdf565b61188f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188690613ab2565b60405180910390fd5b61189b848484846122dc565b50505050565b6118a9611c61565b80600a8190555050565b606060006118bf612338565b905060008151116118df576040518060200160405280600081525061190a565b806118e9846123ca565b6040516020016118fa92919061415e565b6040516020818303038152906040525b915050919050565b61191a611c61565b8060098190555050565b60086020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119d8611c61565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e906141f4565b60405180910390fd5b611a50816120aa565b50565b600e60019054906101000a900460ff1681565b60095481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611b0581612498565b611b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3b90613df2565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bc28361143c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600082611c2385846124d9565b1490509392505050565b611c4782826040518060200160405280600081525061252f565b5050565b6001816000016000828254019250508190555050565b611c69611b47565b73ffffffffffffffffffffffffffffffffffffffff16611c876115fd565b73ffffffffffffffffffffffffffffffffffffffff1614611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd490614260565b60405180910390fd5b565b600080611ceb8361143c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d2d5750611d2c818561193c565b5b80611d6b57508373ffffffffffffffffffffffffffffffffffffffff16611d5384610a66565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d948261143c565b73ffffffffffffffffffffffffffffffffffffffff1614611dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de1906142f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5090614384565b60405180910390fd5b611e66838383600161258a565b8273ffffffffffffffffffffffffffffffffffffffff16611e868261143c565b73ffffffffffffffffffffffffffffffffffffffff1614611edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed3906142f2565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461206883838360016126b0565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d5906143f0565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122cf9190612cc6565b60405180910390a3505050565b6122e7848484611d74565b6122f3848484846126b6565b612332576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232990614482565b60405180910390fd5b50505050565b60606011805461234790613435565b80601f016020809104026020016040519081016040528092919081815260200182805461237390613435565b80156123c05780601f10612395576101008083540402835291602001916123c0565b820191906000526020600020905b8154815290600101906020018083116123a357829003601f168201915b5050505050905090565b6060600060016123d98461283d565b01905060008167ffffffffffffffff8111156123f8576123f76130ee565b5b6040519080825280601f01601f19166020018201604052801561242a5781602001600182028036833780820191505090505b509050600082602001820190505b60011561248d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612481576124806144a2565b5b04945060008503612438575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166124ba8361206d565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60008082905060005b84518110156125245761250f82868381518110612502576125016144d1565b5b6020026020010151612990565b9150808061251c906139f8565b9150506124e2565b508091505092915050565b61253983836129bb565b61254660008484846126b6565b612585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257c90614482565b60405180910390fd5b505050565b60018111156126aa57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461261e5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126169190614500565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126a95780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126a1919061381d565b925050819055505b5b50505050565b50505050565b60006126d78473ffffffffffffffffffffffffffffffffffffffff16612bd8565b15612830578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612700611b47565b8786866040518563ffffffff1660e01b81526004016127229493929190614589565b6020604051808303816000875af192505050801561275e57506040513d601f19601f8201168201806040525081019061275b91906145ea565b60015b6127e0573d806000811461278e576040519150601f19603f3d011682016040523d82523d6000602084013e612793565b606091505b5060008151036127d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127cf90614482565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612835565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061289b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612891576128906144a2565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106128d8576d04ee2d6d415b85acef810000000083816128ce576128cd6144a2565b5b0492506020810190505b662386f26fc10000831061290757662386f26fc1000083816128fd576128fc6144a2565b5b0492506010810190505b6305f5e1008310612930576305f5e1008381612926576129256144a2565b5b0492506008810190505b612710831061295557612710838161294b5761294a6144a2565b5b0492506004810190505b60648310612978576064838161296e5761296d6144a2565b5b0492506002810190505b600a8310612987576001810190505b80915050919050565b60008183106129a8576129a38284612bfb565b6129b3565b6129b28383612bfb565b5b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2190614663565b60405180910390fd5b612a3381612498565b15612a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6a906146cf565b60405180910390fd5b612a8160008383600161258a565b612a8a81612498565b15612aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac1906146cf565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bd46000838360016126b0565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c5b81612c26565b8114612c6657600080fd5b50565b600081359050612c7881612c52565b92915050565b600060208284031215612c9457612c93612c1c565b5b6000612ca284828501612c69565b91505092915050565b60008115159050919050565b612cc081612cab565b82525050565b6000602082019050612cdb6000830184612cb7565b92915050565b6000819050919050565b612cf481612ce1565b82525050565b6000602082019050612d0f6000830184612ceb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d4f578082015181840152602081019050612d34565b60008484015250505050565b6000601f19601f8301169050919050565b6000612d7782612d15565b612d818185612d20565b9350612d91818560208601612d31565b612d9a81612d5b565b840191505092915050565b60006020820190508181036000830152612dbf8184612d6c565b905092915050565b612dd081612ce1565b8114612ddb57600080fd5b50565b600081359050612ded81612dc7565b92915050565b600060208284031215612e0957612e08612c1c565b5b6000612e1784828501612dde565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e4b82612e20565b9050919050565b612e5b81612e40565b82525050565b6000602082019050612e766000830184612e52565b92915050565b612e8581612e40565b8114612e9057600080fd5b50565b600081359050612ea281612e7c565b92915050565b60008060408385031215612ebf57612ebe612c1c565b5b6000612ecd85828601612e93565b9250506020612ede85828601612dde565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112612f0d57612f0c612ee8565b5b8235905067ffffffffffffffff811115612f2a57612f29612eed565b5b602083019150836020820283011115612f4657612f45612ef2565b5b9250929050565b600080600060408486031215612f6657612f65612c1c565b5b6000612f7486828701612dde565b935050602084013567ffffffffffffffff811115612f9557612f94612c21565b5b612fa186828701612ef7565b92509250509250925092565b612fb681612cab565b8114612fc157600080fd5b50565b600081359050612fd381612fad565b92915050565b600060208284031215612fef57612fee612c1c565b5b6000612ffd84828501612fc4565b91505092915050565b60008060006060848603121561301f5761301e612c1c565b5b600061302d86828701612e93565b935050602061303e86828701612e93565b925050604061304f86828701612dde565b9150509250925092565b60006020828403121561306f5761306e612c1c565b5b600061307d84828501612e93565b91505092915050565b6000819050919050565b61309981613086565b81146130a457600080fd5b50565b6000813590506130b681613090565b92915050565b6000602082840312156130d2576130d1612c1c565b5b60006130e0848285016130a7565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61312682612d5b565b810181811067ffffffffffffffff82111715613145576131446130ee565b5b80604052505050565b6000613158612c12565b9050613164828261311d565b919050565b600067ffffffffffffffff821115613184576131836130ee565b5b61318d82612d5b565b9050602081019050919050565b82818337600083830152505050565b60006131bc6131b784613169565b61314e565b9050828152602081018484840111156131d8576131d76130e9565b5b6131e384828561319a565b509392505050565b600082601f830112613200576131ff612ee8565b5b81356132108482602086016131a9565b91505092915050565b60006020828403121561322f5761322e612c1c565b5b600082013567ffffffffffffffff81111561324d5761324c612c21565b5b613259848285016131eb565b91505092915050565b6000806040838503121561327957613278612c1c565b5b600061328785828601612e93565b925050602061329885828601612fc4565b9150509250929050565b600067ffffffffffffffff8211156132bd576132bc6130ee565b5b6132c682612d5b565b9050602081019050919050565b60006132e66132e1846132a2565b61314e565b905082815260208101848484011115613302576133016130e9565b5b61330d84828561319a565b509392505050565b600082601f83011261332a57613329612ee8565b5b813561333a8482602086016132d3565b91505092915050565b6000806000806080858703121561335d5761335c612c1c565b5b600061336b87828801612e93565b945050602061337c87828801612e93565b935050604061338d87828801612dde565b925050606085013567ffffffffffffffff8111156133ae576133ad612c21565b5b6133ba87828801613315565b91505092959194509250565b600080604083850312156133dd576133dc612c1c565b5b60006133eb85828601612e93565b92505060206133fc85828601612e93565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061344d57607f821691505b6020821081036134605761345f613406565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006134c2602183612d20565b91506134cd82613466565b604082019050919050565b600060208201905081810360008301526134f1816134b5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613554603d83612d20565b915061355f826134f8565b604082019050919050565b6000602082019050818103600083015261358381613547565b9050919050565b7f57686974656c697374204d696e7420416d6f756e742073686f756c642062652060008201527f626967676572207468616e20302e000000000000000000000000000000000000602082015250565b60006135e6602e83612d20565b91506135f18261358a565b604082019050919050565b60006020820190508181036000830152613615816135d9565b9050919050565b7f57686974656c697374204d696e7420416d6f756e74206973206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000613678602183612d20565b91506136838261361c565b604082019050919050565b600060208201905081810360008301526136a78161366b565b9050919050565b7f57686974656c697374204d696e742069732064697361626c65642e0000000000600082015250565b60006136e4601b83612d20565b91506136ef826136ae565b602082019050919050565b60006020820190508181036000830152613713816136d7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061375482612ce1565b915061375f83612ce1565b925082820261376d81612ce1565b915082820484148315176137845761378361371a565b5b5092915050565b7f496e73756666696369656e742046756e6420746f206d696e742077686974656c60008201527f697374206e667400000000000000000000000000000000000000000000000000602082015250565b60006137e7602783612d20565b91506137f28261378b565b604082019050919050565b60006020820190508181036000830152613816816137da565b9050919050565b600061382882612ce1565b915061383383612ce1565b925082820190508082111561384b5761384a61371a565b5b92915050565b7f416d6f756e74204578636565642e000000000000000000000000000000000000600082015250565b6000613887600e83612d20565b915061389282613851565b602082019050919050565b600060208201905081810360008301526138b68161387a565b9050919050565b7f57686974656c697374204d696e7420416d6f756e74204578636565642e000000600082015250565b60006138f3601d83612d20565b91506138fe826138bd565b602082019050919050565b60006020820190508181036000830152613922816138e6565b9050919050565b60008160601b9050919050565b600061394182613929565b9050919050565b600061395382613936565b9050919050565b61396b61396682612e40565b613948565b82525050565b600061397d828461395a565b60148201915081905092915050565b7f546869732061646472657373206973206e6f742077686974656c697374656400600082015250565b60006139c2601f83612d20565b91506139cd8261398c565b602082019050919050565b600060208201905081810360008301526139f1816139b5565b9050919050565b6000613a0382612ce1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a3557613a3461371a565b5b600182019050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613a9c602d83612d20565b9150613aa782613a40565b604082019050919050565b60006020820190508181036000830152613acb81613a8f565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613b08601e83612d20565b9150613b1382613ad2565b602082019050919050565b60006020820190508181036000830152613b3781613afb565b9050919050565b7f5075626c6963204d696e7420416d6f756e742073686f756c642062652062696760008201527f676572207468616e20302e000000000000000000000000000000000000000000602082015250565b6000613b9a602b83612d20565b9150613ba582613b3e565b604082019050919050565b60006020820190508181036000830152613bc981613b8d565b9050919050565b7f5075626c6963204d696e7420416d6f756e74206973206f766572666c6f770000600082015250565b6000613c06601e83612d20565b9150613c1182613bd0565b602082019050919050565b60006020820190508181036000830152613c3581613bf9565b9050919050565b7f5075626c6963204d696e742069732064697361626c65642e0000000000000000600082015250565b6000613c72601883612d20565b9150613c7d82613c3c565b602082019050919050565b60006020820190508181036000830152613ca181613c65565b9050919050565b7f496e73756666696369656e742046756e6420746f206d696e74207075626c696360008201527f206e667400000000000000000000000000000000000000000000000000000000602082015250565b6000613d04602483612d20565b9150613d0f82613ca8565b604082019050919050565b60006020820190508181036000830152613d3381613cf7565b9050919050565b7f5075626c6963204d696e7420416d6f756e74204578636565642e000000000000600082015250565b6000613d70601a83612d20565b9150613d7b82613d3a565b602082019050919050565b60006020820190508181036000830152613d9f81613d63565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ddc601883612d20565b9150613de782613da6565b602082019050919050565b60006020820190508181036000830152613e0b81613dcf565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613e6e602983612d20565b9150613e7982613e12565b604082019050919050565b60006020820190508181036000830152613e9d81613e61565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613f067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ec9565b613f108683613ec9565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613f4d613f48613f4384612ce1565b613f28565b612ce1565b9050919050565b6000819050919050565b613f6783613f32565b613f7b613f7382613f54565b848454613ed6565b825550505050565b600090565b613f90613f83565b613f9b818484613f5e565b505050565b5b81811015613fbf57613fb4600082613f88565b600181019050613fa1565b5050565b601f82111561400457613fd581613ea4565b613fde84613eb9565b81016020851015613fed578190505b614001613ff985613eb9565b830182613fa0565b50505b505050565b600082821c905092915050565b600061402760001984600802614009565b1980831691505092915050565b60006140408383614016565b9150826002028217905092915050565b61405982612d15565b67ffffffffffffffff811115614072576140716130ee565b5b61407c8254613435565b614087828285613fc3565b600060209050601f8311600181146140ba57600084156140a8578287015190505b6140b28582614034565b86555061411a565b601f1984166140c886613ea4565b60005b828110156140f0578489015182556001820191506020850194506020810190506140cb565b8683101561410d5784890151614109601f891682614016565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b600061413882612d15565b6141428185614122565b9350614152818560208601612d31565b80840191505092915050565b600061416a828561412d565b9150614176828461412d565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141de602683612d20565b91506141e982614182565b604082019050919050565b6000602082019050818103600083015261420d816141d1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061424a602083612d20565b915061425582614214565b602082019050919050565b600060208201905081810360008301526142798161423d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006142dc602583612d20565b91506142e782614280565b604082019050919050565b6000602082019050818103600083015261430b816142cf565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061436e602483612d20565b915061437982614312565b604082019050919050565b6000602082019050818103600083015261439d81614361565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006143da601983612d20565b91506143e5826143a4565b602082019050919050565b60006020820190508181036000830152614409816143cd565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061446c603283612d20565b915061447782614410565b604082019050919050565b6000602082019050818103600083015261449b8161445f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061450b82612ce1565b915061451683612ce1565b925082820390508181111561452e5761452d61371a565b5b92915050565b600081519050919050565b600082825260208201905092915050565b600061455b82614534565b614565818561453f565b9350614575818560208601612d31565b61457e81612d5b565b840191505092915050565b600060808201905061459e6000830187612e52565b6145ab6020830186612e52565b6145b86040830185612ceb565b81810360608301526145ca8184614550565b905095945050505050565b6000815190506145e481612c52565b92915050565b600060208284031215614600576145ff612c1c565b5b600061460e848285016145d5565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061464d602083612d20565b915061465882614617565b602082019050919050565b6000602082019050818103600083015261467c81614640565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006146b9601c83612d20565b91506146c482614683565b602082019050919050565b600060208201905081810360008301526146e8816146ac565b905091905056fea264697066735822122074f21d851aa2e9fd31f76b8f2fffd070c0f39201497174d3846a9f536978d32d64736f6c63430008120033697066733a2f2f516d5a4a6e4d34474b37724e627a6e4e64656b6d52356965546931436b68325054705256706a76713955713434702f

Deployed Bytecode

0x6080604052600436106102305760003560e01c80637cb647591161012e578063b88d4fde116100ab578063e985e9c51161006f578063e985e9c514610805578063f2fde38b14610842578063f44a909f1461086b578063f48b898914610896578063fbfa77cf146108c157610230565b8063b88d4fde14610710578063c42886e814610739578063c87b56dd14610762578063cf8d0aae1461079f578063d88cc3ff146107c857610230565b8063a0712d68116100f2578063a0712d6814610641578063a0bcfc7f1461066a578063a22cb46514610693578063a8e5862d146106bc578063b729a222146106e757610230565b80637cb647591461057057806386130146146105995780638da5cb5b146105c25780638fb12b5d146105ed57806395d89b411461061657610230565b80631ecf77d1116101bc578063503f3b9511610180578063503f3b951461049a5780636352211e146104b65780636817031b146104f357806370a082311461051c578063715018a61461055957610230565b80631ecf77d1146103c957806323b872dd146103f257806331eb4cc31461041b57806342842e0e14610446578063474f80e61461046f57610230565b8063095ea7b311610203578063095ea7b3146103055780630963e81b1461032e5780630a0caa461461035957806311d9eace1461037557806313da3e92146103a057610230565b806301ffc9a71461023557806303006d381461027257806306fdde031461029d578063081812fc146102c8575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190612c7e565b6108ec565b6040516102699190612cc6565b60405180910390f35b34801561027e57600080fd5b506102876109ce565b6040516102949190612cfa565b60405180910390f35b3480156102a957600080fd5b506102b26109d4565b6040516102bf9190612da5565b60405180910390f35b3480156102d457600080fd5b506102ef60048036038101906102ea9190612df3565b610a66565b6040516102fc9190612e61565b60405180910390f35b34801561031157600080fd5b5061032c60048036038101906103279190612ea8565b610aac565b005b34801561033a57600080fd5b50610343610bc3565b6040516103509190612cfa565b60405180910390f35b610373600480360381019061036e9190612f4d565b610bc9565b005b34801561038157600080fd5b5061038a610fc5565b6040516103979190612cfa565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c29190612df3565b610fcb565b005b3480156103d557600080fd5b506103f060048036038101906103eb9190612fd9565b610fdd565b005b3480156103fe57600080fd5b5061041960048036038101906104149190613006565b611002565b005b34801561042757600080fd5b50610430611062565b60405161043d9190612cc6565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190613006565b611075565b005b34801561047b57600080fd5b50610484611095565b6040516104919190612cfa565b60405180910390f35b6104b460048036038101906104af9190612df3565b61109b565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190612df3565b61143c565b6040516104ea9190612e61565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190613059565b6114c2565b005b34801561052857600080fd5b50610543600480360381019061053e9190613059565b61150e565b6040516105509190612cfa565b60405180910390f35b34801561056557600080fd5b5061056e6115c5565b005b34801561057c57600080fd5b50610597600480360381019061059291906130bc565b6115d9565b005b3480156105a557600080fd5b506105c060048036038101906105bb9190612df3565b6115eb565b005b3480156105ce57600080fd5b506105d76115fd565b6040516105e49190612e61565b60405180910390f35b3480156105f957600080fd5b50610614600480360381019061060f9190612fd9565b611627565b005b34801561062257600080fd5b5061062b61164c565b6040516106389190612da5565b60405180910390f35b34801561064d57600080fd5b5061066860048036038101906106639190612df3565b6116de565b005b34801561067657600080fd5b50610691600480360381019061068c9190613219565b6117eb565b005b34801561069f57600080fd5b506106ba60048036038101906106b59190613262565b611806565b005b3480156106c857600080fd5b506106d161181c565b6040516106de9190612cfa565b60405180910390f35b3480156106f357600080fd5b5061070e60048036038101906107099190612df3565b61182d565b005b34801561071c57600080fd5b5061073760048036038101906107329190613343565b61183f565b005b34801561074557600080fd5b50610760600480360381019061075b9190612df3565b6118a1565b005b34801561076e57600080fd5b5061078960048036038101906107849190612df3565b6118b3565b6040516107969190612da5565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c19190612df3565b611912565b005b3480156107d457600080fd5b506107ef60048036038101906107ea9190613059565b611924565b6040516107fc9190612cfa565b60405180910390f35b34801561081157600080fd5b5061082c600480360381019061082791906133c6565b61193c565b6040516108399190612cc6565b60405180910390f35b34801561084e57600080fd5b5061086960048036038101906108649190613059565b6119d0565b005b34801561087757600080fd5b50610880611a53565b60405161088d9190612cc6565b60405180910390f35b3480156108a257600080fd5b506108ab611a66565b6040516108b89190612cfa565b60405180910390f35b3480156108cd57600080fd5b506108d6611a6c565b6040516108e39190612e61565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109b757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109c757506109c682611a92565b5b9050919050565b600a5481565b6060600080546109e390613435565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0f90613435565b8015610a5c5780601f10610a3157610100808354040283529160200191610a5c565b820191906000526020600020905b815481529060010190602001808311610a3f57829003601f168201915b5050505050905090565b6000610a7182611afc565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ab78261143c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e906134d8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b46611b47565b73ffffffffffffffffffffffffffffffffffffffff161480610b755750610b7481610b6f611b47565b61193c565b5b610bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bab9061356a565b60405180910390fd5b610bbe8383611b4f565b505050565b600c5481565b6001831015610c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c04906135fc565b60405180910390fd5b600c54831115610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c499061368e565b60405180910390fd5b60011515600e60019054906101000a900460ff16151514610ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9f906136fa565b60405180910390fd5b3483600a54610cb79190613749565b1115610cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cef906137fd565b60405180910390fd5b6000610d046007611c08565b9050600d548482610d15919061381d565b1115610d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4d9061389d565b60405180910390fd5b600c548460086000610d66611b47565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610dab919061381d565b1115610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de390613909565b60405180910390fd5b6000610df6611b47565b604051602001610e069190613971565b60405160208183030381529060405280519060200120905060011515610e70858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f5484611c16565b151514610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea9906139d8565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610f1a573d6000803e3d6000fd5b5060005b85811015610f6057610f306007611c08565b9250610f43610f3d611b47565b84611c2d565b610f4d6007611c4b565b8080610f58906139f8565b915050610f1e565b508460086000610f6e611b47565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fb7919061381d565b925050819055505050505050565b600d5481565b610fd3611c61565b80600b8190555050565b610fe5611c61565b80600e60016101000a81548160ff02191690831515021790555050565b61101361100d611b47565b82611cdf565b611052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104990613ab2565b60405180910390fd5b61105d838383611d74565b505050565b600e60009054906101000a900460ff1681565b6110908383836040518060200160405280600081525061183f565b505050565b600b5481565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110090613b1e565b60405180910390fd5b600181101561114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114490613bb0565b60405180910390fd5b600b54811115611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990613c1c565b60405180910390fd5b60011515600e60009054906101000a900460ff161515146111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111df90613c88565b60405180910390fd5b34816009546111f79190613749565b1115611238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122f90613d1a565b60405180910390fd5b60006112446007611c08565b9050600d548282611255919061381d565b1115611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d9061389d565b60405180910390fd5b600b5482600860006112a6611b47565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112eb919061381d565b111561132c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132390613d86565b60405180910390fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611394573d6000803e3d6000fd5b5060005b828110156113da576113aa6007611c08565b91506113bd6113b7611b47565b83611c2d565b6113c76007611c4b565b80806113d2906139f8565b915050611398565b5081600860006113e8611b47565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611431919061381d565b925050819055505050565b6000806114488361206d565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b090613df2565b60405180910390fd5b80915050919050565b6114ca611c61565b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157590613e84565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115cd611c61565b6115d760006120aa565b565b6115e1611c61565b80600f8190555050565b6115f3611c61565b80600c8190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61162f611c61565b80600e60006101000a81548160ff02191690831515021790555050565b60606001805461165b90613435565b80601f016020809104026020016040519081016040528092919081815260200182805461168790613435565b80156116d45780601f106116a9576101008083540402835291602001916116d4565b820191906000526020600020905b8154815290600101906020018083116116b757829003601f168201915b5050505050905090565b6116e6611c61565b60006116f26007611c08565b9050600d548282611703919061381d565b1115611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173b9061389d565b60405180910390fd5b60005b82811015611789576117596007611c08565b915061176c611766611b47565b83611c2d565b6117766007611c4b565b8080611781906139f8565b915050611747565b508160086000611797611b47565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117e0919061381d565b925050819055505050565b6117f3611c61565b80601190816118029190614050565b5050565b611818611811611b47565b8383612170565b5050565b60006118286007611c08565b905090565b611835611c61565b80600d8190555050565b61185061184a611b47565b83611cdf565b61188f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188690613ab2565b60405180910390fd5b61189b848484846122dc565b50505050565b6118a9611c61565b80600a8190555050565b606060006118bf612338565b905060008151116118df576040518060200160405280600081525061190a565b806118e9846123ca565b6040516020016118fa92919061415e565b6040516020818303038152906040525b915050919050565b61191a611c61565b8060098190555050565b60086020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119d8611c61565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3e906141f4565b60405180910390fd5b611a50816120aa565b50565b600e60019054906101000a900460ff1681565b60095481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611b0581612498565b611b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3b90613df2565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bc28361143c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600082611c2385846124d9565b1490509392505050565b611c4782826040518060200160405280600081525061252f565b5050565b6001816000016000828254019250508190555050565b611c69611b47565b73ffffffffffffffffffffffffffffffffffffffff16611c876115fd565b73ffffffffffffffffffffffffffffffffffffffff1614611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd490614260565b60405180910390fd5b565b600080611ceb8361143c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d2d5750611d2c818561193c565b5b80611d6b57508373ffffffffffffffffffffffffffffffffffffffff16611d5384610a66565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d948261143c565b73ffffffffffffffffffffffffffffffffffffffff1614611dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de1906142f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5090614384565b60405180910390fd5b611e66838383600161258a565b8273ffffffffffffffffffffffffffffffffffffffff16611e868261143c565b73ffffffffffffffffffffffffffffffffffffffff1614611edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed3906142f2565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461206883838360016126b0565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d5906143f0565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122cf9190612cc6565b60405180910390a3505050565b6122e7848484611d74565b6122f3848484846126b6565b612332576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232990614482565b60405180910390fd5b50505050565b60606011805461234790613435565b80601f016020809104026020016040519081016040528092919081815260200182805461237390613435565b80156123c05780601f10612395576101008083540402835291602001916123c0565b820191906000526020600020905b8154815290600101906020018083116123a357829003601f168201915b5050505050905090565b6060600060016123d98461283d565b01905060008167ffffffffffffffff8111156123f8576123f76130ee565b5b6040519080825280601f01601f19166020018201604052801561242a5781602001600182028036833780820191505090505b509050600082602001820190505b60011561248d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612481576124806144a2565b5b04945060008503612438575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166124ba8361206d565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60008082905060005b84518110156125245761250f82868381518110612502576125016144d1565b5b6020026020010151612990565b9150808061251c906139f8565b9150506124e2565b508091505092915050565b61253983836129bb565b61254660008484846126b6565b612585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257c90614482565b60405180910390fd5b505050565b60018111156126aa57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461261e5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126169190614500565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126a95780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126a1919061381d565b925050819055505b5b50505050565b50505050565b60006126d78473ffffffffffffffffffffffffffffffffffffffff16612bd8565b15612830578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612700611b47565b8786866040518563ffffffff1660e01b81526004016127229493929190614589565b6020604051808303816000875af192505050801561275e57506040513d601f19601f8201168201806040525081019061275b91906145ea565b60015b6127e0573d806000811461278e576040519150601f19603f3d011682016040523d82523d6000602084013e612793565b606091505b5060008151036127d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127cf90614482565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612835565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061289b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612891576128906144a2565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106128d8576d04ee2d6d415b85acef810000000083816128ce576128cd6144a2565b5b0492506020810190505b662386f26fc10000831061290757662386f26fc1000083816128fd576128fc6144a2565b5b0492506010810190505b6305f5e1008310612930576305f5e1008381612926576129256144a2565b5b0492506008810190505b612710831061295557612710838161294b5761294a6144a2565b5b0492506004810190505b60648310612978576064838161296e5761296d6144a2565b5b0492506002810190505b600a8310612987576001810190505b80915050919050565b60008183106129a8576129a38284612bfb565b6129b3565b6129b28383612bfb565b5b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2190614663565b60405180910390fd5b612a3381612498565b15612a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6a906146cf565b60405180910390fd5b612a8160008383600161258a565b612a8a81612498565b15612aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac1906146cf565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bd46000838360016126b0565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c5b81612c26565b8114612c6657600080fd5b50565b600081359050612c7881612c52565b92915050565b600060208284031215612c9457612c93612c1c565b5b6000612ca284828501612c69565b91505092915050565b60008115159050919050565b612cc081612cab565b82525050565b6000602082019050612cdb6000830184612cb7565b92915050565b6000819050919050565b612cf481612ce1565b82525050565b6000602082019050612d0f6000830184612ceb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d4f578082015181840152602081019050612d34565b60008484015250505050565b6000601f19601f8301169050919050565b6000612d7782612d15565b612d818185612d20565b9350612d91818560208601612d31565b612d9a81612d5b565b840191505092915050565b60006020820190508181036000830152612dbf8184612d6c565b905092915050565b612dd081612ce1565b8114612ddb57600080fd5b50565b600081359050612ded81612dc7565b92915050565b600060208284031215612e0957612e08612c1c565b5b6000612e1784828501612dde565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e4b82612e20565b9050919050565b612e5b81612e40565b82525050565b6000602082019050612e766000830184612e52565b92915050565b612e8581612e40565b8114612e9057600080fd5b50565b600081359050612ea281612e7c565b92915050565b60008060408385031215612ebf57612ebe612c1c565b5b6000612ecd85828601612e93565b9250506020612ede85828601612dde565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112612f0d57612f0c612ee8565b5b8235905067ffffffffffffffff811115612f2a57612f29612eed565b5b602083019150836020820283011115612f4657612f45612ef2565b5b9250929050565b600080600060408486031215612f6657612f65612c1c565b5b6000612f7486828701612dde565b935050602084013567ffffffffffffffff811115612f9557612f94612c21565b5b612fa186828701612ef7565b92509250509250925092565b612fb681612cab565b8114612fc157600080fd5b50565b600081359050612fd381612fad565b92915050565b600060208284031215612fef57612fee612c1c565b5b6000612ffd84828501612fc4565b91505092915050565b60008060006060848603121561301f5761301e612c1c565b5b600061302d86828701612e93565b935050602061303e86828701612e93565b925050604061304f86828701612dde565b9150509250925092565b60006020828403121561306f5761306e612c1c565b5b600061307d84828501612e93565b91505092915050565b6000819050919050565b61309981613086565b81146130a457600080fd5b50565b6000813590506130b681613090565b92915050565b6000602082840312156130d2576130d1612c1c565b5b60006130e0848285016130a7565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61312682612d5b565b810181811067ffffffffffffffff82111715613145576131446130ee565b5b80604052505050565b6000613158612c12565b9050613164828261311d565b919050565b600067ffffffffffffffff821115613184576131836130ee565b5b61318d82612d5b565b9050602081019050919050565b82818337600083830152505050565b60006131bc6131b784613169565b61314e565b9050828152602081018484840111156131d8576131d76130e9565b5b6131e384828561319a565b509392505050565b600082601f830112613200576131ff612ee8565b5b81356132108482602086016131a9565b91505092915050565b60006020828403121561322f5761322e612c1c565b5b600082013567ffffffffffffffff81111561324d5761324c612c21565b5b613259848285016131eb565b91505092915050565b6000806040838503121561327957613278612c1c565b5b600061328785828601612e93565b925050602061329885828601612fc4565b9150509250929050565b600067ffffffffffffffff8211156132bd576132bc6130ee565b5b6132c682612d5b565b9050602081019050919050565b60006132e66132e1846132a2565b61314e565b905082815260208101848484011115613302576133016130e9565b5b61330d84828561319a565b509392505050565b600082601f83011261332a57613329612ee8565b5b813561333a8482602086016132d3565b91505092915050565b6000806000806080858703121561335d5761335c612c1c565b5b600061336b87828801612e93565b945050602061337c87828801612e93565b935050604061338d87828801612dde565b925050606085013567ffffffffffffffff8111156133ae576133ad612c21565b5b6133ba87828801613315565b91505092959194509250565b600080604083850312156133dd576133dc612c1c565b5b60006133eb85828601612e93565b92505060206133fc85828601612e93565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061344d57607f821691505b6020821081036134605761345f613406565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006134c2602183612d20565b91506134cd82613466565b604082019050919050565b600060208201905081810360008301526134f1816134b5565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613554603d83612d20565b915061355f826134f8565b604082019050919050565b6000602082019050818103600083015261358381613547565b9050919050565b7f57686974656c697374204d696e7420416d6f756e742073686f756c642062652060008201527f626967676572207468616e20302e000000000000000000000000000000000000602082015250565b60006135e6602e83612d20565b91506135f18261358a565b604082019050919050565b60006020820190508181036000830152613615816135d9565b9050919050565b7f57686974656c697374204d696e7420416d6f756e74206973206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000613678602183612d20565b91506136838261361c565b604082019050919050565b600060208201905081810360008301526136a78161366b565b9050919050565b7f57686974656c697374204d696e742069732064697361626c65642e0000000000600082015250565b60006136e4601b83612d20565b91506136ef826136ae565b602082019050919050565b60006020820190508181036000830152613713816136d7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061375482612ce1565b915061375f83612ce1565b925082820261376d81612ce1565b915082820484148315176137845761378361371a565b5b5092915050565b7f496e73756666696369656e742046756e6420746f206d696e742077686974656c60008201527f697374206e667400000000000000000000000000000000000000000000000000602082015250565b60006137e7602783612d20565b91506137f28261378b565b604082019050919050565b60006020820190508181036000830152613816816137da565b9050919050565b600061382882612ce1565b915061383383612ce1565b925082820190508082111561384b5761384a61371a565b5b92915050565b7f416d6f756e74204578636565642e000000000000000000000000000000000000600082015250565b6000613887600e83612d20565b915061389282613851565b602082019050919050565b600060208201905081810360008301526138b68161387a565b9050919050565b7f57686974656c697374204d696e7420416d6f756e74204578636565642e000000600082015250565b60006138f3601d83612d20565b91506138fe826138bd565b602082019050919050565b60006020820190508181036000830152613922816138e6565b9050919050565b60008160601b9050919050565b600061394182613929565b9050919050565b600061395382613936565b9050919050565b61396b61396682612e40565b613948565b82525050565b600061397d828461395a565b60148201915081905092915050565b7f546869732061646472657373206973206e6f742077686974656c697374656400600082015250565b60006139c2601f83612d20565b91506139cd8261398c565b602082019050919050565b600060208201905081810360008301526139f1816139b5565b9050919050565b6000613a0382612ce1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a3557613a3461371a565b5b600182019050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613a9c602d83612d20565b9150613aa782613a40565b604082019050919050565b60006020820190508181036000830152613acb81613a8f565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613b08601e83612d20565b9150613b1382613ad2565b602082019050919050565b60006020820190508181036000830152613b3781613afb565b9050919050565b7f5075626c6963204d696e7420416d6f756e742073686f756c642062652062696760008201527f676572207468616e20302e000000000000000000000000000000000000000000602082015250565b6000613b9a602b83612d20565b9150613ba582613b3e565b604082019050919050565b60006020820190508181036000830152613bc981613b8d565b9050919050565b7f5075626c6963204d696e7420416d6f756e74206973206f766572666c6f770000600082015250565b6000613c06601e83612d20565b9150613c1182613bd0565b602082019050919050565b60006020820190508181036000830152613c3581613bf9565b9050919050565b7f5075626c6963204d696e742069732064697361626c65642e0000000000000000600082015250565b6000613c72601883612d20565b9150613c7d82613c3c565b602082019050919050565b60006020820190508181036000830152613ca181613c65565b9050919050565b7f496e73756666696369656e742046756e6420746f206d696e74207075626c696360008201527f206e667400000000000000000000000000000000000000000000000000000000602082015250565b6000613d04602483612d20565b9150613d0f82613ca8565b604082019050919050565b60006020820190508181036000830152613d3381613cf7565b9050919050565b7f5075626c6963204d696e7420416d6f756e74204578636565642e000000000000600082015250565b6000613d70601a83612d20565b9150613d7b82613d3a565b602082019050919050565b60006020820190508181036000830152613d9f81613d63565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ddc601883612d20565b9150613de782613da6565b602082019050919050565b60006020820190508181036000830152613e0b81613dcf565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613e6e602983612d20565b9150613e7982613e12565b604082019050919050565b60006020820190508181036000830152613e9d81613e61565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613f067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ec9565b613f108683613ec9565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613f4d613f48613f4384612ce1565b613f28565b612ce1565b9050919050565b6000819050919050565b613f6783613f32565b613f7b613f7382613f54565b848454613ed6565b825550505050565b600090565b613f90613f83565b613f9b818484613f5e565b505050565b5b81811015613fbf57613fb4600082613f88565b600181019050613fa1565b5050565b601f82111561400457613fd581613ea4565b613fde84613eb9565b81016020851015613fed578190505b614001613ff985613eb9565b830182613fa0565b50505b505050565b600082821c905092915050565b600061402760001984600802614009565b1980831691505092915050565b60006140408383614016565b9150826002028217905092915050565b61405982612d15565b67ffffffffffffffff811115614072576140716130ee565b5b61407c8254613435565b614087828285613fc3565b600060209050601f8311600181146140ba57600084156140a8578287015190505b6140b28582614034565b86555061411a565b601f1984166140c886613ea4565b60005b828110156140f0578489015182556001820191506020850194506020810190506140cb565b8683101561410d5784890151614109601f891682614016565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b600061413882612d15565b6141428185614122565b9350614152818560208601612d31565b80840191505092915050565b600061416a828561412d565b9150614176828461412d565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141de602683612d20565b91506141e982614182565b604082019050919050565b6000602082019050818103600083015261420d816141d1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061424a602083612d20565b915061425582614214565b602082019050919050565b600060208201905081810360008301526142798161423d565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006142dc602583612d20565b91506142e782614280565b604082019050919050565b6000602082019050818103600083015261430b816142cf565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061436e602483612d20565b915061437982614312565b604082019050919050565b6000602082019050818103600083015261439d81614361565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006143da601983612d20565b91506143e5826143a4565b602082019050919050565b60006020820190508181036000830152614409816143cd565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061446c603283612d20565b915061447782614410565b604082019050919050565b6000602082019050818103600083015261449b8161445f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061450b82612ce1565b915061451683612ce1565b925082820390508181111561452e5761452d61371a565b5b92915050565b600081519050919050565b600082825260208201905092915050565b600061455b82614534565b614565818561453f565b9350614575818560208601612d31565b61457e81612d5b565b840191505092915050565b600060808201905061459e6000830187612e52565b6145ab6020830186612e52565b6145b86040830185612ceb565b81810360608301526145ca8184614550565b905095945050505050565b6000815190506145e481612c52565b92915050565b600060208284031215614600576145ff612c1c565b5b600061460e848285016145d5565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061464d602083612d20565b915061465882614617565b602082019050919050565b6000602082019050818103600083015261467c81614640565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006146b9601c83612d20565b91506146c482614683565b602082019050919050565b600060208201905081810360008301526146e8816146ac565b905091905056fea264697066735822122074f21d851aa2e9fd31f76b8f2fffd070c0f39201497174d3846a9f536978d32d64736f6c63430008120033

Deployed Bytecode Sourcemap

68362:5357:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48329:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68653:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49257:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50769:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50287:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68742:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71871:1314;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68786:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70056:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69947:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51469:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68828:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51875:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68701:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70878:985;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48967:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70690:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48698:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66052:103;;;;;;;;;;;;;:::i;:::-;;70488:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70163:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65404:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69848:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49426:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73193:419;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70780:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51012:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73620:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70588:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52131:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70379:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69382:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70276:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68555:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51238:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66310:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68869:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68610:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69028:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48329:305;48431:4;48483:25;48468:40;;;:11;:40;;;;:105;;;;48540:33;48525:48;;;:11;:48;;;;48468:105;:158;;;;48590:36;48614:11;48590:23;:36::i;:::-;48468:158;48448:178;;48329:305;;;:::o;68653:39::-;;;;:::o;49257:100::-;49311:13;49344:5;49337:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49257:100;:::o;50769:171::-;50845:7;50865:23;50880:7;50865:14;:23::i;:::-;50908:15;:24;50924:7;50908:24;;;;;;;;;;;;;;;;;;;;;50901:31;;50769:171;;;:::o;50287:416::-;50368:13;50384:23;50399:7;50384:14;:23::i;:::-;50368:39;;50432:5;50426:11;;:2;:11;;;50418:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50526:5;50510:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;50535:37;50552:5;50559:12;:10;:12::i;:::-;50535:16;:37::i;:::-;50510:62;50488:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;50674:21;50683:2;50687:7;50674:8;:21::i;:::-;50357:346;50287:416;;:::o;68742:37::-;;;;:::o;71871:1314::-;72012:1;72002:6;:11;;71994:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;72107:18;;72097:6;:28;;72075:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;72228:4;72205:27;;:19;;;;;;;;;;;:27;;;72197:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;72324:9;72314:6;72297:14;;:23;;;;:::i;:::-;:36;;72275:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;72413:17;72433:19;:9;:17;:19::i;:::-;72413:39;;72493:12;;72483:6;72471:9;:18;;;;:::i;:::-;:34;;72463:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;72597:18;;72587:6;72559:11;:25;72571:12;:10;:12::i;:::-;72559:25;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;:56;;72537:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;72685:12;72727;:10;:12::i;:::-;72710:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;72700:41;;;;;;72685:56;;72827:4;72774:57;;:49;72793:11;;72774:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72806:10;;72818:4;72774:18;:49::i;:::-;:57;;;72752:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;72911:5;;;;;;;;;;;72903:23;;:34;72927:9;72903:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72955:9;72950:180;72974:6;72970:1;:10;72950:180;;;73014:19;:9;:17;:19::i;:::-;73002:31;;73048:34;73058:12;:10;:12::i;:::-;73072:9;73048;:34::i;:::-;73097:21;:9;:19;:21::i;:::-;72982:3;;;;;:::i;:::-;;;;72950:180;;;;73171:6;73142:11;:25;73154:12;:10;:12::i;:::-;73142:25;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;71983:1202;;71871:1314;;;:::o;68786:33::-;;;;:::o;70056:99::-;65290:13;:11;:13::i;:::-;70142:5:::1;70124:15;:23;;;;70056:99:::0;:::o;69947:101::-;65290:13;:11;:13::i;:::-;70035:5:::1;70013:19;;:27;;;;;;;;;;;;;;;;;;69947:101:::0;:::o;51469:335::-;51664:41;51683:12;:10;:12::i;:::-;51697:7;51664:18;:41::i;:::-;51656:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;51768:28;51778:4;51784:2;51788:7;51768:9;:28::i;:::-;51469:335;;;:::o;68828:34::-;;;;;;;;;;;;;:::o;51875:185::-;52013:39;52030:4;52036:2;52040:7;52013:39;;;;;;;;;;;;:16;:39::i;:::-;51875:185;;;:::o;68701:34::-;;;;:::o;70878:985::-;69309:10;69296:23;;:9;:23;;;69288:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;70974:1:::1;70964:6;:11;;70956:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;71052:15;;71042:6;:25;;71034:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71139:4;71121:22;;:14;;;;;;;;;;;:22;;;71113:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;71229:9;71219:6;71205:11;;:20;;;;:::i;:::-;:33;;71183:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;71315:17;71335:19;:9;:17;:19::i;:::-;71315:39;;71395:12;;71385:6;71373:9;:18;;;;:::i;:::-;:34;;71365:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;71499:15;;71489:6;71461:11;:25;71473:12;:10;:12::i;:::-;71461:25;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;:53;;71439:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;71589:5;;;;;;;;;;;71581:23;;:34;71605:9;71581:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;71633:9;71628:180;71652:6;71648:1;:10;71628:180;;;71692:19;:9;:17;:19::i;:::-;71680:31;;71726:34;71736:12;:10;:12::i;:::-;71750:9;71726;:34::i;:::-;71775:21;:9;:19;:21::i;:::-;71660:3;;;;;:::i;:::-;;;;71628:180;;;;71849:6;71820:11;:25;71832:12;:10;:12::i;:::-;71820:25;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;70945:918;70878:985:::0;:::o;48967:223::-;49039:7;49059:13;49075:17;49084:7;49075:8;:17::i;:::-;49059:33;;49128:1;49111:19;;:5;:19;;;49103:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;49177:5;49170:12;;;48967:223;;;:::o;70690:82::-;65290:13;:11;:13::i;:::-;70760:4:::1;70752:5;;:12;;;;;;;;;;;;;;;;;;70690:82:::0;:::o;48698:207::-;48770:7;48815:1;48798:19;;:5;:19;;;48790:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48881:9;:16;48891:5;48881:16;;;;;;;;;;;;;;;;48874:23;;48698:207;;;:::o;66052:103::-;65290:13;:11;:13::i;:::-;66117:30:::1;66144:1;66117:18;:30::i;:::-;66052:103::o:0;70488:92::-;65290:13;:11;:13::i;:::-;70568:4:::1;70555:10;:17;;;;70488:92:::0;:::o;70163:105::-;65290:13;:11;:13::i;:::-;70255:5:::1;70234:18;:26;;;;70163:105:::0;:::o;65404:87::-;65450:7;65477:6;;;;;;;;;;;65470:13;;65404:87;:::o;69848:91::-;65290:13;:11;:13::i;:::-;69926:5:::1;69909:14;;:22;;;;;;;;;;;;;;;;;;69848:91:::0;:::o;49426:104::-;49482:13;49515:7;49508:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49426:104;:::o;73193:419::-;65290:13;:11;:13::i;:::-;73253:17:::1;73273:19;:9;:17;:19::i;:::-;73253:39;;73333:12;;73323:6;73311:9;:18;;;;:::i;:::-;:34;;73303:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;73382:9;73377:180;73401:6;73397:1;:10;73377:180;;;73441:19;:9;:17;:19::i;:::-;73429:31;;73475:34;73485:12;:10;:12::i;:::-;73499:9;73475;:34::i;:::-;73524:21;:9;:19;:21::i;:::-;73409:3;;;;;:::i;:::-;;;;73377:180;;;;73598:6;73569:11;:25;73581:12;:10;:12::i;:::-;73569:25;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;73242:370;73193:419:::0;:::o;70780:90::-;65290:13;:11;:13::i;:::-;70859:3:::1;70849:7;:13;;;;;;:::i;:::-;;70780:90:::0;:::o;51012:155::-;51107:52;51126:12;:10;:12::i;:::-;51140:8;51150;51107:18;:52::i;:::-;51012:155;;:::o;73620:96::-;73662:7;73689:19;:9;:17;:19::i;:::-;73682:26;;73620:96;:::o;70588:94::-;65290:13;:11;:13::i;:::-;70669:5:::1;70654:12;:20;;;;70588:94:::0;:::o;52131:322::-;52305:41;52324:12;:10;:12::i;:::-;52338:7;52305:18;:41::i;:::-;52297:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;52407:38;52421:4;52427:2;52431:7;52440:4;52407:13;:38::i;:::-;52131:322;;;;:::o;70379:101::-;65290:13;:11;:13::i;:::-;70467:5:::1;70450:14;:22;;;;70379:101:::0;:::o;69382:342::-;69500:13;69531:21;69555:10;:8;:10::i;:::-;69531:34;;69620:1;69602:7;69596:21;:25;:120;;;;;;;;;;;;;;;;;69665:7;69674:18;:7;:16;:18::i;:::-;69648:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69596:120;69576:140;;;69382:342;;;:::o;70276:95::-;65290:13;:11;:13::i;:::-;70358:5:::1;70344:11;:19;;;;70276:95:::0;:::o;68555:46::-;;;;;;;;;;;;;;;;;:::o;51238:164::-;51335:4;51359:18;:25;51378:5;51359:25;;;;;;;;;;;;;;;:35;51385:8;51359:35;;;;;;;;;;;;;;;;;;;;;;;;;51352:42;;51238:164;;;;:::o;66310:201::-;65290:13;:11;:13::i;:::-;66419:1:::1;66399:22;;:8;:22;;::::0;66391:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;66475:28;66494:8;66475:18;:28::i;:::-;66310:201:::0;:::o;68869:39::-;;;;;;;;;;;;;:::o;68610:36::-;;;;:::o;69028:20::-;;;;;;;;;;;;;:::o;39948:157::-;40033:4;40072:25;40057:40;;;:11;:40;;;;40050:47;;39948:157;;;:::o;60588:135::-;60670:16;60678:7;60670;:16::i;:::-;60662:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60588:135;:::o;46708:98::-;46761:7;46788:10;46781:17;;46708:98;:::o;59867:174::-;59969:2;59942:15;:24;59958:7;59942:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;60025:7;60021:2;59987:46;;59996:23;60011:7;59996:14;:23::i;:::-;59987:46;;;;;;;;;;;;59867:174;;:::o;11892:114::-;11957:7;11984;:14;;;11977:21;;11892:114;;;:::o;2681:190::-;2806:4;2859;2830:25;2843:5;2850:4;2830:12;:25::i;:::-;:33;2823:40;;2681:190;;;;;:::o;55092:110::-;55168:26;55178:2;55182:7;55168:26;;;;;;;;;;;;:9;:26::i;:::-;55092:110;;:::o;12014:127::-;12121:1;12103:7;:14;;;:19;;;;;;;;;;;12014:127;:::o;65569:132::-;65644:12;:10;:12::i;:::-;65633:23;;:7;:5;:7::i;:::-;:23;;;65625:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65569:132::o;54486:264::-;54579:4;54596:13;54612:23;54627:7;54612:14;:23::i;:::-;54596:39;;54665:5;54654:16;;:7;:16;;;:52;;;;54674:32;54691:5;54698:7;54674:16;:32::i;:::-;54654:52;:87;;;;54734:7;54710:31;;:20;54722:7;54710:11;:20::i;:::-;:31;;;54654:87;54646:96;;;54486:264;;;;:::o;58485:1263::-;58644:4;58617:31;;:23;58632:7;58617:14;:23::i;:::-;:31;;;58609:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;58723:1;58709:16;;:2;:16;;;58701:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;58779:42;58800:4;58806:2;58810:7;58819:1;58779:20;:42::i;:::-;58951:4;58924:31;;:23;58939:7;58924:14;:23::i;:::-;:31;;;58916:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;59069:15;:24;59085:7;59069:24;;;;;;;;;;;;59062:31;;;;;;;;;;;59564:1;59545:9;:15;59555:4;59545:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;59597:1;59580:9;:13;59590:2;59580:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;59639:2;59620:7;:16;59628:7;59620:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;59678:7;59674:2;59659:27;;59668:4;59659:27;;;;;;;;;;;;59699:41;59719:4;59725:2;59729:7;59738:1;59699:19;:41::i;:::-;58485:1263;;;:::o;53761:117::-;53827:7;53854;:16;53862:7;53854:16;;;;;;;;;;;;;;;;;;;;;53847:23;;53761:117;;;:::o;66671:191::-;66745:16;66764:6;;;;;;;;;;;66745:25;;66790:8;66781:6;;:17;;;;;;;;;;;;;;;;;;66845:8;66814:40;;66835:8;66814:40;;;;;;;;;;;;66734:128;66671:191;:::o;60184:315::-;60339:8;60330:17;;:5;:17;;;60322:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;60426:8;60388:18;:25;60407:5;60388:25;;;;;;;;;;;;;;;:35;60414:8;60388:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;60472:8;60450:41;;60465:5;60450:41;;;60482:8;60450:41;;;;;;:::i;:::-;;;;;;;;60184:315;;;:::o;53334:313::-;53490:28;53500:4;53506:2;53510:7;53490:9;:28::i;:::-;53537:47;53560:4;53566:2;53570:7;53579:4;53537:22;:47::i;:::-;53529:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;53334:313;;;;:::o;69732:108::-;69792:13;69825:7;69818:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69732:108;:::o;25790:716::-;25846:13;25897:14;25934:1;25914:17;25925:5;25914:10;:17::i;:::-;:21;25897:38;;25950:20;25984:6;25973:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25950:41;;26006:11;26135:6;26131:2;26127:15;26119:6;26115:28;26108:35;;26172:288;26179:4;26172:288;;;26204:5;;;;;;;;26346:8;26341:2;26334:5;26330:14;26325:30;26320:3;26312:44;26402:2;26393:11;;;;;;:::i;:::-;;;;;26436:1;26427:5;:10;26172:288;26423:21;26172:288;26481:6;26474:13;;;;;25790:716;;;:::o;54191:128::-;54256:4;54309:1;54280:31;;:17;54289:7;54280:8;:17::i;:::-;:31;;;;54273:38;;54191:128;;;:::o;3548:296::-;3631:7;3651:20;3674:4;3651:27;;3694:9;3689:118;3713:5;:12;3709:1;:16;3689:118;;;3762:33;3772:12;3786:5;3792:1;3786:8;;;;;;;;:::i;:::-;;;;;;;;3762:9;:33::i;:::-;3747:48;;3727:3;;;;;:::i;:::-;;;;3689:118;;;;3824:12;3817:19;;;3548:296;;;;:::o;55429:319::-;55558:18;55564:2;55568:7;55558:5;:18::i;:::-;55609:53;55640:1;55644:2;55648:7;55657:4;55609:22;:53::i;:::-;55587:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;55429:319;;;:::o;62872:410::-;63062:1;63050:9;:13;63046:229;;;63100:1;63084:18;;:4;:18;;;63080:87;;63142:9;63123;:15;63133:4;63123:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;63080:87;63199:1;63185:16;;:2;:16;;;63181:83;;63239:9;63222;:13;63232:2;63222:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;63181:83;63046:229;62872:410;;;;:::o;64004:158::-;;;;;:::o;61287:853::-;61441:4;61462:15;:2;:13;;;:15::i;:::-;61458:675;;;61514:2;61498:36;;;61535:12;:10;:12::i;:::-;61549:4;61555:7;61564:4;61498:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;61494:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61756:1;61739:6;:13;:18;61735:328;;61782:60;;;;;;;;;;:::i;:::-;;;;;;;;61735:328;62013:6;62007:13;61998:6;61994:2;61990:15;61983:38;61494:584;61630:41;;;61620:51;;;:6;:51;;;;61613:58;;;;;61458:675;62117:4;62110:11;;61287:853;;;;;;;:::o;22656:922::-;22709:7;22729:14;22746:1;22729:18;;22796:6;22787:5;:15;22783:102;;22832:6;22823:15;;;;;;:::i;:::-;;;;;22867:2;22857:12;;;;22783:102;22912:6;22903:5;:15;22899:102;;22948:6;22939:15;;;;;;:::i;:::-;;;;;22983:2;22973:12;;;;22899:102;23028:6;23019:5;:15;23015:102;;23064:6;23055:15;;;;;;:::i;:::-;;;;;23099:2;23089:12;;;;23015:102;23144:5;23135;:14;23131:99;;23179:5;23170:14;;;;;;:::i;:::-;;;;;23213:1;23203:11;;;;23131:99;23257:5;23248;:14;23244:99;;23292:5;23283:14;;;;;;:::i;:::-;;;;;23326:1;23316:11;;;;23244:99;23370:5;23361;:14;23357:99;;23405:5;23396:14;;;;;;:::i;:::-;;;;;23439:1;23429:11;;;;23357:99;23483:5;23474;:14;23470:66;;23519:1;23509:11;;;;23470:66;23564:6;23557:13;;;22656:922;;;:::o;10588:149::-;10651:7;10682:1;10678;:5;:51;;10709:20;10724:1;10727;10709:14;:20::i;:::-;10678:51;;;10686:20;10701:1;10704;10686:14;:20::i;:::-;10678:51;10671:58;;10588:149;;;;:::o;56084:942::-;56178:1;56164:16;;:2;:16;;;56156:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;56237:16;56245:7;56237;:16::i;:::-;56236:17;56228:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56299:48;56328:1;56332:2;56336:7;56345:1;56299:20;:48::i;:::-;56446:16;56454:7;56446;:16::i;:::-;56445:17;56437:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56861:1;56844:9;:13;56854:2;56844:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;56905:2;56886:7;:16;56894:7;56886:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;56950:7;56946:2;56925:33;;56942:1;56925:33;;;;;;;;;;;;56971:47;56999:1;57003:2;57007:7;57016:1;56971:19;:47::i;:::-;56084:942;;:::o;28917:326::-;28977:4;29234:1;29212:7;:19;;;:23;29205:30;;28917:326;;;:::o;10745:268::-;10813:13;10920:1;10914:4;10907:15;10949:1;10943:4;10936:15;10990:4;10984;10974:21;10965:30;;10745:268;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:246::-;2314:1;2324:113;2338:6;2335:1;2332:13;2324:113;;;2423:1;2418:3;2414:11;2408:18;2404:1;2399:3;2395:11;2388:39;2360:2;2357:1;2353:10;2348:15;;2324:113;;;2471:1;2462:6;2457:3;2453:16;2446:27;2295:184;2233:246;;;:::o;2485:102::-;2526:6;2577:2;2573:7;2568:2;2561:5;2557:14;2553:28;2543:38;;2485:102;;;:::o;2593:377::-;2681:3;2709:39;2742:5;2709:39;:::i;:::-;2764:71;2828:6;2823:3;2764:71;:::i;:::-;2757:78;;2844:65;2902:6;2897:3;2890:4;2883:5;2879:16;2844:65;:::i;:::-;2934:29;2956:6;2934:29;:::i;:::-;2929:3;2925:39;2918:46;;2685:285;2593:377;;;;:::o;2976:313::-;3089:4;3127:2;3116:9;3112:18;3104:26;;3176:9;3170:4;3166:20;3162:1;3151:9;3147:17;3140:47;3204:78;3277:4;3268:6;3204:78;:::i;:::-;3196:86;;2976:313;;;;:::o;3295:122::-;3368:24;3386:5;3368:24;:::i;:::-;3361:5;3358:35;3348:63;;3407:1;3404;3397:12;3348:63;3295:122;:::o;3423:139::-;3469:5;3507:6;3494:20;3485:29;;3523:33;3550:5;3523:33;:::i;:::-;3423:139;;;;:::o;3568:329::-;3627:6;3676:2;3664:9;3655:7;3651:23;3647:32;3644:119;;;3682:79;;:::i;:::-;3644:119;3802:1;3827:53;3872:7;3863:6;3852:9;3848:22;3827:53;:::i;:::-;3817:63;;3773:117;3568:329;;;;:::o;3903:126::-;3940:7;3980:42;3973:5;3969:54;3958:65;;3903:126;;;:::o;4035:96::-;4072:7;4101:24;4119:5;4101:24;:::i;:::-;4090:35;;4035:96;;;:::o;4137:118::-;4224:24;4242:5;4224:24;:::i;:::-;4219:3;4212:37;4137:118;;:::o;4261:222::-;4354:4;4392:2;4381:9;4377:18;4369:26;;4405:71;4473:1;4462:9;4458:17;4449:6;4405:71;:::i;:::-;4261:222;;;;:::o;4489:122::-;4562:24;4580:5;4562:24;:::i;:::-;4555:5;4552:35;4542:63;;4601:1;4598;4591:12;4542:63;4489:122;:::o;4617:139::-;4663:5;4701:6;4688:20;4679:29;;4717:33;4744:5;4717:33;:::i;:::-;4617:139;;;;:::o;4762:474::-;4830:6;4838;4887:2;4875:9;4866:7;4862:23;4858:32;4855:119;;;4893:79;;:::i;:::-;4855:119;5013:1;5038:53;5083:7;5074:6;5063:9;5059:22;5038:53;:::i;:::-;5028:63;;4984:117;5140:2;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;:::i;:::-;5156:63;;5111:118;4762:474;;;;;:::o;5242:117::-;5351:1;5348;5341:12;5365:117;5474:1;5471;5464:12;5488:117;5597:1;5594;5587:12;5628:568;5701:8;5711:6;5761:3;5754:4;5746:6;5742:17;5738:27;5728:122;;5769:79;;:::i;:::-;5728:122;5882:6;5869:20;5859:30;;5912:18;5904:6;5901:30;5898:117;;;5934:79;;:::i;:::-;5898:117;6048:4;6040:6;6036:17;6024:29;;6102:3;6094:4;6086:6;6082:17;6072:8;6068:32;6065:41;6062:128;;;6109:79;;:::i;:::-;6062:128;5628:568;;;;;:::o;6202:704::-;6297:6;6305;6313;6362:2;6350:9;6341:7;6337:23;6333:32;6330:119;;;6368:79;;:::i;:::-;6330:119;6488:1;6513:53;6558:7;6549:6;6538:9;6534:22;6513:53;:::i;:::-;6503:63;;6459:117;6643:2;6632:9;6628:18;6615:32;6674:18;6666:6;6663:30;6660:117;;;6696:79;;:::i;:::-;6660:117;6809:80;6881:7;6872:6;6861:9;6857:22;6809:80;:::i;:::-;6791:98;;;;6586:313;6202:704;;;;;:::o;6912:116::-;6982:21;6997:5;6982:21;:::i;:::-;6975:5;6972:32;6962:60;;7018:1;7015;7008:12;6962:60;6912:116;:::o;7034:133::-;7077:5;7115:6;7102:20;7093:29;;7131:30;7155:5;7131:30;:::i;:::-;7034:133;;;;:::o;7173:323::-;7229:6;7278:2;7266:9;7257:7;7253:23;7249:32;7246:119;;;7284:79;;:::i;:::-;7246:119;7404:1;7429:50;7471:7;7462:6;7451:9;7447:22;7429:50;:::i;:::-;7419:60;;7375:114;7173:323;;;;:::o;7502:619::-;7579:6;7587;7595;7644:2;7632:9;7623:7;7619:23;7615:32;7612:119;;;7650:79;;:::i;:::-;7612:119;7770:1;7795:53;7840:7;7831:6;7820:9;7816:22;7795:53;:::i;:::-;7785:63;;7741:117;7897:2;7923:53;7968:7;7959:6;7948:9;7944:22;7923:53;:::i;:::-;7913:63;;7868:118;8025:2;8051:53;8096:7;8087:6;8076:9;8072:22;8051:53;:::i;:::-;8041:63;;7996:118;7502:619;;;;;:::o;8127:329::-;8186:6;8235:2;8223:9;8214:7;8210:23;8206:32;8203:119;;;8241:79;;:::i;:::-;8203:119;8361:1;8386:53;8431:7;8422:6;8411:9;8407:22;8386:53;:::i;:::-;8376:63;;8332:117;8127:329;;;;:::o;8462:77::-;8499:7;8528:5;8517:16;;8462:77;;;:::o;8545:122::-;8618:24;8636:5;8618:24;:::i;:::-;8611:5;8608:35;8598:63;;8657:1;8654;8647:12;8598:63;8545:122;:::o;8673:139::-;8719:5;8757:6;8744:20;8735:29;;8773:33;8800:5;8773:33;:::i;:::-;8673:139;;;;:::o;8818:329::-;8877:6;8926:2;8914:9;8905:7;8901:23;8897:32;8894:119;;;8932:79;;:::i;:::-;8894:119;9052:1;9077:53;9122:7;9113:6;9102:9;9098:22;9077:53;:::i;:::-;9067:63;;9023:117;8818:329;;;;:::o;9153:117::-;9262:1;9259;9252:12;9276:180;9324:77;9321:1;9314:88;9421:4;9418:1;9411:15;9445:4;9442:1;9435:15;9462:281;9545:27;9567:4;9545:27;:::i;:::-;9537:6;9533:40;9675:6;9663:10;9660:22;9639:18;9627:10;9624:34;9621:62;9618:88;;;9686:18;;:::i;:::-;9618:88;9726:10;9722:2;9715:22;9505:238;9462:281;;:::o;9749:129::-;9783:6;9810:20;;:::i;:::-;9800:30;;9839:33;9867:4;9859:6;9839:33;:::i;:::-;9749:129;;;:::o;9884:308::-;9946:4;10036:18;10028:6;10025:30;10022:56;;;10058:18;;:::i;:::-;10022:56;10096:29;10118:6;10096:29;:::i;:::-;10088:37;;10180:4;10174;10170:15;10162:23;;9884:308;;;:::o;10198:146::-;10295:6;10290:3;10285;10272:30;10336:1;10327:6;10322:3;10318:16;10311:27;10198:146;;;:::o;10350:425::-;10428:5;10453:66;10469:49;10511:6;10469:49;:::i;:::-;10453:66;:::i;:::-;10444:75;;10542:6;10535:5;10528:21;10580:4;10573:5;10569:16;10618:3;10609:6;10604:3;10600:16;10597:25;10594:112;;;10625:79;;:::i;:::-;10594:112;10715:54;10762:6;10757:3;10752;10715:54;:::i;:::-;10434:341;10350:425;;;;;:::o;10795:340::-;10851:5;10900:3;10893:4;10885:6;10881:17;10877:27;10867:122;;10908:79;;:::i;:::-;10867:122;11025:6;11012:20;11050:79;11125:3;11117:6;11110:4;11102:6;11098:17;11050:79;:::i;:::-;11041:88;;10857:278;10795:340;;;;:::o;11141:509::-;11210:6;11259:2;11247:9;11238:7;11234:23;11230:32;11227:119;;;11265:79;;:::i;:::-;11227:119;11413:1;11402:9;11398:17;11385:31;11443:18;11435:6;11432:30;11429:117;;;11465:79;;:::i;:::-;11429:117;11570:63;11625:7;11616:6;11605:9;11601:22;11570:63;:::i;:::-;11560:73;;11356:287;11141:509;;;;:::o;11656:468::-;11721:6;11729;11778:2;11766:9;11757:7;11753:23;11749:32;11746:119;;;11784:79;;:::i;:::-;11746:119;11904:1;11929:53;11974:7;11965:6;11954:9;11950:22;11929:53;:::i;:::-;11919:63;;11875:117;12031:2;12057:50;12099:7;12090:6;12079:9;12075:22;12057:50;:::i;:::-;12047:60;;12002:115;11656:468;;;;;:::o;12130:307::-;12191:4;12281:18;12273:6;12270:30;12267:56;;;12303:18;;:::i;:::-;12267:56;12341:29;12363:6;12341:29;:::i;:::-;12333:37;;12425:4;12419;12415:15;12407:23;;12130:307;;;:::o;12443:423::-;12520:5;12545:65;12561:48;12602:6;12561:48;:::i;:::-;12545:65;:::i;:::-;12536:74;;12633:6;12626:5;12619:21;12671:4;12664:5;12660:16;12709:3;12700:6;12695:3;12691:16;12688:25;12685:112;;;12716:79;;:::i;:::-;12685:112;12806:54;12853:6;12848:3;12843;12806:54;:::i;:::-;12526:340;12443:423;;;;;:::o;12885:338::-;12940:5;12989:3;12982:4;12974:6;12970:17;12966:27;12956:122;;12997:79;;:::i;:::-;12956:122;13114:6;13101:20;13139:78;13213:3;13205:6;13198:4;13190:6;13186:17;13139:78;:::i;:::-;13130:87;;12946:277;12885:338;;;;:::o;13229:943::-;13324:6;13332;13340;13348;13397:3;13385:9;13376:7;13372:23;13368:33;13365:120;;;13404:79;;:::i;:::-;13365:120;13524:1;13549:53;13594:7;13585:6;13574:9;13570:22;13549:53;:::i;:::-;13539:63;;13495:117;13651:2;13677:53;13722:7;13713:6;13702:9;13698:22;13677:53;:::i;:::-;13667:63;;13622:118;13779:2;13805:53;13850:7;13841:6;13830:9;13826:22;13805:53;:::i;:::-;13795:63;;13750:118;13935:2;13924:9;13920:18;13907:32;13966:18;13958:6;13955:30;13952:117;;;13988:79;;:::i;:::-;13952:117;14093:62;14147:7;14138:6;14127:9;14123:22;14093:62;:::i;:::-;14083:72;;13878:287;13229:943;;;;;;;:::o;14178:474::-;14246:6;14254;14303:2;14291:9;14282:7;14278:23;14274:32;14271:119;;;14309:79;;:::i;:::-;14271:119;14429:1;14454:53;14499:7;14490:6;14479:9;14475:22;14454:53;:::i;:::-;14444:63;;14400:117;14556:2;14582:53;14627:7;14618:6;14607:9;14603:22;14582:53;:::i;:::-;14572:63;;14527:118;14178:474;;;;;:::o;14658:180::-;14706:77;14703:1;14696:88;14803:4;14800:1;14793:15;14827:4;14824:1;14817:15;14844:320;14888:6;14925:1;14919:4;14915:12;14905:22;;14972:1;14966:4;14962:12;14993:18;14983:81;;15049:4;15041:6;15037:17;15027:27;;14983:81;15111:2;15103:6;15100:14;15080:18;15077:38;15074:84;;15130:18;;:::i;:::-;15074:84;14895:269;14844:320;;;:::o;15170:220::-;15310:34;15306:1;15298:6;15294:14;15287:58;15379:3;15374:2;15366:6;15362:15;15355:28;15170:220;:::o;15396:366::-;15538:3;15559:67;15623:2;15618:3;15559:67;:::i;:::-;15552:74;;15635:93;15724:3;15635:93;:::i;:::-;15753:2;15748:3;15744:12;15737:19;;15396:366;;;:::o;15768:419::-;15934:4;15972:2;15961:9;15957:18;15949:26;;16021:9;16015:4;16011:20;16007:1;15996:9;15992:17;15985:47;16049:131;16175:4;16049:131;:::i;:::-;16041:139;;15768:419;;;:::o;16193:248::-;16333:34;16329:1;16321:6;16317:14;16310:58;16402:31;16397:2;16389:6;16385:15;16378:56;16193:248;:::o;16447:366::-;16589:3;16610:67;16674:2;16669:3;16610:67;:::i;:::-;16603:74;;16686:93;16775:3;16686:93;:::i;:::-;16804:2;16799:3;16795:12;16788:19;;16447:366;;;:::o;16819:419::-;16985:4;17023:2;17012:9;17008:18;17000:26;;17072:9;17066:4;17062:20;17058:1;17047:9;17043:17;17036:47;17100:131;17226:4;17100:131;:::i;:::-;17092:139;;16819:419;;;:::o;17244:233::-;17384:34;17380:1;17372:6;17368:14;17361:58;17453:16;17448:2;17440:6;17436:15;17429:41;17244:233;:::o;17483:366::-;17625:3;17646:67;17710:2;17705:3;17646:67;:::i;:::-;17639:74;;17722:93;17811:3;17722:93;:::i;:::-;17840:2;17835:3;17831:12;17824:19;;17483:366;;;:::o;17855:419::-;18021:4;18059:2;18048:9;18044:18;18036:26;;18108:9;18102:4;18098:20;18094:1;18083:9;18079:17;18072:47;18136:131;18262:4;18136:131;:::i;:::-;18128:139;;17855:419;;;:::o;18280:220::-;18420:34;18416:1;18408:6;18404:14;18397:58;18489:3;18484:2;18476:6;18472:15;18465:28;18280:220;:::o;18506:366::-;18648:3;18669:67;18733:2;18728:3;18669:67;:::i;:::-;18662:74;;18745:93;18834:3;18745:93;:::i;:::-;18863:2;18858:3;18854:12;18847:19;;18506:366;;;:::o;18878:419::-;19044:4;19082:2;19071:9;19067:18;19059:26;;19131:9;19125:4;19121:20;19117:1;19106:9;19102:17;19095:47;19159:131;19285:4;19159:131;:::i;:::-;19151:139;;18878:419;;;:::o;19303:177::-;19443:29;19439:1;19431:6;19427:14;19420:53;19303:177;:::o;19486:366::-;19628:3;19649:67;19713:2;19708:3;19649:67;:::i;:::-;19642:74;;19725:93;19814:3;19725:93;:::i;:::-;19843:2;19838:3;19834:12;19827:19;;19486:366;;;:::o;19858:419::-;20024:4;20062:2;20051:9;20047:18;20039:26;;20111:9;20105:4;20101:20;20097:1;20086:9;20082:17;20075:47;20139:131;20265:4;20139:131;:::i;:::-;20131:139;;19858:419;;;:::o;20283:180::-;20331:77;20328:1;20321:88;20428:4;20425:1;20418:15;20452:4;20449:1;20442:15;20469:410;20509:7;20532:20;20550:1;20532:20;:::i;:::-;20527:25;;20566:20;20584:1;20566:20;:::i;:::-;20561:25;;20621:1;20618;20614:9;20643:30;20661:11;20643:30;:::i;:::-;20632:41;;20822:1;20813:7;20809:15;20806:1;20803:22;20783:1;20776:9;20756:83;20733:139;;20852:18;;:::i;:::-;20733:139;20517:362;20469:410;;;;:::o;20885:226::-;21025:34;21021:1;21013:6;21009:14;21002:58;21094:9;21089:2;21081:6;21077:15;21070:34;20885:226;:::o;21117:366::-;21259:3;21280:67;21344:2;21339:3;21280:67;:::i;:::-;21273:74;;21356:93;21445:3;21356:93;:::i;:::-;21474:2;21469:3;21465:12;21458:19;;21117:366;;;:::o;21489:419::-;21655:4;21693:2;21682:9;21678:18;21670:26;;21742:9;21736:4;21732:20;21728:1;21717:9;21713:17;21706:47;21770:131;21896:4;21770:131;:::i;:::-;21762:139;;21489:419;;;:::o;21914:191::-;21954:3;21973:20;21991:1;21973:20;:::i;:::-;21968:25;;22007:20;22025:1;22007:20;:::i;:::-;22002:25;;22050:1;22047;22043:9;22036:16;;22071:3;22068:1;22065:10;22062:36;;;22078:18;;:::i;:::-;22062:36;21914:191;;;;:::o;22111:164::-;22251:16;22247:1;22239:6;22235:14;22228:40;22111:164;:::o;22281:366::-;22423:3;22444:67;22508:2;22503:3;22444:67;:::i;:::-;22437:74;;22520:93;22609:3;22520:93;:::i;:::-;22638:2;22633:3;22629:12;22622:19;;22281:366;;;:::o;22653:419::-;22819:4;22857:2;22846:9;22842:18;22834:26;;22906:9;22900:4;22896:20;22892:1;22881:9;22877:17;22870:47;22934:131;23060:4;22934:131;:::i;:::-;22926:139;;22653:419;;;:::o;23078:179::-;23218:31;23214:1;23206:6;23202:14;23195:55;23078:179;:::o;23263:366::-;23405:3;23426:67;23490:2;23485:3;23426:67;:::i;:::-;23419:74;;23502:93;23591:3;23502:93;:::i;:::-;23620:2;23615:3;23611:12;23604:19;;23263:366;;;:::o;23635:419::-;23801:4;23839:2;23828:9;23824:18;23816:26;;23888:9;23882:4;23878:20;23874:1;23863:9;23859:17;23852:47;23916:131;24042:4;23916:131;:::i;:::-;23908:139;;23635:419;;;:::o;24060:94::-;24093:8;24141:5;24137:2;24133:14;24112:35;;24060:94;;;:::o;24160:::-;24199:7;24228:20;24242:5;24228:20;:::i;:::-;24217:31;;24160:94;;;:::o;24260:100::-;24299:7;24328:26;24348:5;24328:26;:::i;:::-;24317:37;;24260:100;;;:::o;24366:157::-;24471:45;24491:24;24509:5;24491:24;:::i;:::-;24471:45;:::i;:::-;24466:3;24459:58;24366:157;;:::o;24529:256::-;24641:3;24656:75;24727:3;24718:6;24656:75;:::i;:::-;24756:2;24751:3;24747:12;24740:19;;24776:3;24769:10;;24529:256;;;;:::o;24791:181::-;24931:33;24927:1;24919:6;24915:14;24908:57;24791:181;:::o;24978:366::-;25120:3;25141:67;25205:2;25200:3;25141:67;:::i;:::-;25134:74;;25217:93;25306:3;25217:93;:::i;:::-;25335:2;25330:3;25326:12;25319:19;;24978:366;;;:::o;25350:419::-;25516:4;25554:2;25543:9;25539:18;25531:26;;25603:9;25597:4;25593:20;25589:1;25578:9;25574:17;25567:47;25631:131;25757:4;25631:131;:::i;:::-;25623:139;;25350:419;;;:::o;25775:233::-;25814:3;25837:24;25855:5;25837:24;:::i;:::-;25828:33;;25883:66;25876:5;25873:77;25870:103;;25953:18;;:::i;:::-;25870:103;26000:1;25993:5;25989:13;25982:20;;25775:233;;;:::o;26014:232::-;26154:34;26150:1;26142:6;26138:14;26131:58;26223:15;26218:2;26210:6;26206:15;26199:40;26014:232;:::o;26252:366::-;26394:3;26415:67;26479:2;26474:3;26415:67;:::i;:::-;26408:74;;26491:93;26580:3;26491:93;:::i;:::-;26609:2;26604:3;26600:12;26593:19;;26252:366;;;:::o;26624:419::-;26790:4;26828:2;26817:9;26813:18;26805:26;;26877:9;26871:4;26867:20;26863:1;26852:9;26848:17;26841:47;26905:131;27031:4;26905:131;:::i;:::-;26897:139;;26624:419;;;:::o;27049:180::-;27189:32;27185:1;27177:6;27173:14;27166:56;27049:180;:::o;27235:366::-;27377:3;27398:67;27462:2;27457:3;27398:67;:::i;:::-;27391:74;;27474:93;27563:3;27474:93;:::i;:::-;27592:2;27587:3;27583:12;27576:19;;27235:366;;;:::o;27607:419::-;27773:4;27811:2;27800:9;27796:18;27788:26;;27860:9;27854:4;27850:20;27846:1;27835:9;27831:17;27824:47;27888:131;28014:4;27888:131;:::i;:::-;27880:139;;27607:419;;;:::o;28032:230::-;28172:34;28168:1;28160:6;28156:14;28149:58;28241:13;28236:2;28228:6;28224:15;28217:38;28032:230;:::o;28268:366::-;28410:3;28431:67;28495:2;28490:3;28431:67;:::i;:::-;28424:74;;28507:93;28596:3;28507:93;:::i;:::-;28625:2;28620:3;28616:12;28609:19;;28268:366;;;:::o;28640:419::-;28806:4;28844:2;28833:9;28829:18;28821:26;;28893:9;28887:4;28883:20;28879:1;28868:9;28864:17;28857:47;28921:131;29047:4;28921:131;:::i;:::-;28913:139;;28640:419;;;:::o;29065:180::-;29205:32;29201:1;29193:6;29189:14;29182:56;29065:180;:::o;29251:366::-;29393:3;29414:67;29478:2;29473:3;29414:67;:::i;:::-;29407:74;;29490:93;29579:3;29490:93;:::i;:::-;29608:2;29603:3;29599:12;29592:19;;29251:366;;;:::o;29623:419::-;29789:4;29827:2;29816:9;29812:18;29804:26;;29876:9;29870:4;29866:20;29862:1;29851:9;29847:17;29840:47;29904:131;30030:4;29904:131;:::i;:::-;29896:139;;29623:419;;;:::o;30048:174::-;30188:26;30184:1;30176:6;30172:14;30165:50;30048:174;:::o;30228:366::-;30370:3;30391:67;30455:2;30450:3;30391:67;:::i;:::-;30384:74;;30467:93;30556:3;30467:93;:::i;:::-;30585:2;30580:3;30576:12;30569:19;;30228:366;;;:::o;30600:419::-;30766:4;30804:2;30793:9;30789:18;30781:26;;30853:9;30847:4;30843:20;30839:1;30828:9;30824:17;30817:47;30881:131;31007:4;30881:131;:::i;:::-;30873:139;;30600:419;;;:::o;31025:223::-;31165:34;31161:1;31153:6;31149:14;31142:58;31234:6;31229:2;31221:6;31217:15;31210:31;31025:223;:::o;31254:366::-;31396:3;31417:67;31481:2;31476:3;31417:67;:::i;:::-;31410:74;;31493:93;31582:3;31493:93;:::i;:::-;31611:2;31606:3;31602:12;31595:19;;31254:366;;;:::o;31626:419::-;31792:4;31830:2;31819:9;31815:18;31807:26;;31879:9;31873:4;31869:20;31865:1;31854:9;31850:17;31843:47;31907:131;32033:4;31907:131;:::i;:::-;31899:139;;31626:419;;;:::o;32051:176::-;32191:28;32187:1;32179:6;32175:14;32168:52;32051:176;:::o;32233:366::-;32375:3;32396:67;32460:2;32455:3;32396:67;:::i;:::-;32389:74;;32472:93;32561:3;32472:93;:::i;:::-;32590:2;32585:3;32581:12;32574:19;;32233:366;;;:::o;32605:419::-;32771:4;32809:2;32798:9;32794:18;32786:26;;32858:9;32852:4;32848:20;32844:1;32833:9;32829:17;32822:47;32886:131;33012:4;32886:131;:::i;:::-;32878:139;;32605:419;;;:::o;33030:174::-;33170:26;33166:1;33158:6;33154:14;33147:50;33030:174;:::o;33210:366::-;33352:3;33373:67;33437:2;33432:3;33373:67;:::i;:::-;33366:74;;33449:93;33538:3;33449:93;:::i;:::-;33567:2;33562:3;33558:12;33551:19;;33210:366;;;:::o;33582:419::-;33748:4;33786:2;33775:9;33771:18;33763:26;;33835:9;33829:4;33825:20;33821:1;33810:9;33806:17;33799:47;33863:131;33989:4;33863:131;:::i;:::-;33855:139;;33582:419;;;:::o;34007:228::-;34147:34;34143:1;34135:6;34131:14;34124:58;34216:11;34211:2;34203:6;34199:15;34192:36;34007:228;:::o;34241:366::-;34383:3;34404:67;34468:2;34463:3;34404:67;:::i;:::-;34397:74;;34480:93;34569:3;34480:93;:::i;:::-;34598:2;34593:3;34589:12;34582:19;;34241:366;;;:::o;34613:419::-;34779:4;34817:2;34806:9;34802:18;34794:26;;34866:9;34860:4;34856:20;34852:1;34841:9;34837:17;34830:47;34894:131;35020:4;34894:131;:::i;:::-;34886:139;;34613:419;;;:::o;35038:141::-;35087:4;35110:3;35102:11;;35133:3;35130:1;35123:14;35167:4;35164:1;35154:18;35146:26;;35038:141;;;:::o;35185:93::-;35222:6;35269:2;35264;35257:5;35253:14;35249:23;35239:33;;35185:93;;;:::o;35284:107::-;35328:8;35378:5;35372:4;35368:16;35347:37;;35284:107;;;;:::o;35397:393::-;35466:6;35516:1;35504:10;35500:18;35539:97;35569:66;35558:9;35539:97;:::i;:::-;35657:39;35687:8;35676:9;35657:39;:::i;:::-;35645:51;;35729:4;35725:9;35718:5;35714:21;35705:30;;35778:4;35768:8;35764:19;35757:5;35754:30;35744:40;;35473:317;;35397:393;;;;;:::o;35796:60::-;35824:3;35845:5;35838:12;;35796:60;;;:::o;35862:142::-;35912:9;35945:53;35963:34;35972:24;35990:5;35972:24;:::i;:::-;35963:34;:::i;:::-;35945:53;:::i;:::-;35932:66;;35862:142;;;:::o;36010:75::-;36053:3;36074:5;36067:12;;36010:75;;;:::o;36091:269::-;36201:39;36232:7;36201:39;:::i;:::-;36262:91;36311:41;36335:16;36311:41;:::i;:::-;36303:6;36296:4;36290:11;36262:91;:::i;:::-;36256:4;36249:105;36167:193;36091:269;;;:::o;36366:73::-;36411:3;36366:73;:::o;36445:189::-;36522:32;;:::i;:::-;36563:65;36621:6;36613;36607:4;36563:65;:::i;:::-;36498:136;36445:189;;:::o;36640:186::-;36700:120;36717:3;36710:5;36707:14;36700:120;;;36771:39;36808:1;36801:5;36771:39;:::i;:::-;36744:1;36737:5;36733:13;36724:22;;36700:120;;;36640:186;;:::o;36832:543::-;36933:2;36928:3;36925:11;36922:446;;;36967:38;36999:5;36967:38;:::i;:::-;37051:29;37069:10;37051:29;:::i;:::-;37041:8;37037:44;37234:2;37222:10;37219:18;37216:49;;;37255:8;37240:23;;37216:49;37278:80;37334:22;37352:3;37334:22;:::i;:::-;37324:8;37320:37;37307:11;37278:80;:::i;:::-;36937:431;;36922:446;36832:543;;;:::o;37381:117::-;37435:8;37485:5;37479:4;37475:16;37454:37;;37381:117;;;;:::o;37504:169::-;37548:6;37581:51;37629:1;37625:6;37617:5;37614:1;37610:13;37581:51;:::i;:::-;37577:56;37662:4;37656;37652:15;37642:25;;37555:118;37504:169;;;;:::o;37678:295::-;37754:4;37900:29;37925:3;37919:4;37900:29;:::i;:::-;37892:37;;37962:3;37959:1;37955:11;37949:4;37946:21;37938:29;;37678:295;;;;:::o;37978:1395::-;38095:37;38128:3;38095:37;:::i;:::-;38197:18;38189:6;38186:30;38183:56;;;38219:18;;:::i;:::-;38183:56;38263:38;38295:4;38289:11;38263:38;:::i;:::-;38348:67;38408:6;38400;38394:4;38348:67;:::i;:::-;38442:1;38466:4;38453:17;;38498:2;38490:6;38487:14;38515:1;38510:618;;;;39172:1;39189:6;39186:77;;;39238:9;39233:3;39229:19;39223:26;39214:35;;39186:77;39289:67;39349:6;39342:5;39289:67;:::i;:::-;39283:4;39276:81;39145:222;38480:887;;38510:618;38562:4;38558:9;38550:6;38546:22;38596:37;38628:4;38596:37;:::i;:::-;38655:1;38669:208;38683:7;38680:1;38677:14;38669:208;;;38762:9;38757:3;38753:19;38747:26;38739:6;38732:42;38813:1;38805:6;38801:14;38791:24;;38860:2;38849:9;38845:18;38832:31;;38706:4;38703:1;38699:12;38694:17;;38669:208;;;38905:6;38896:7;38893:19;38890:179;;;38963:9;38958:3;38954:19;38948:26;39006:48;39048:4;39040:6;39036:17;39025:9;39006:48;:::i;:::-;38998:6;38991:64;38913:156;38890:179;39115:1;39111;39103:6;39099:14;39095:22;39089:4;39082:36;38517:611;;;38480:887;;38070:1303;;;37978:1395;;:::o;39379:148::-;39481:11;39518:3;39503:18;;39379:148;;;;:::o;39533:390::-;39639:3;39667:39;39700:5;39667:39;:::i;:::-;39722:89;39804:6;39799:3;39722:89;:::i;:::-;39715:96;;39820:65;39878:6;39873:3;39866:4;39859:5;39855:16;39820:65;:::i;:::-;39910:6;39905:3;39901:16;39894:23;;39643:280;39533:390;;;;:::o;39929:435::-;40109:3;40131:95;40222:3;40213:6;40131:95;:::i;:::-;40124:102;;40243:95;40334:3;40325:6;40243:95;:::i;:::-;40236:102;;40355:3;40348:10;;39929:435;;;;;:::o;40370:225::-;40510:34;40506:1;40498:6;40494:14;40487:58;40579:8;40574:2;40566:6;40562:15;40555:33;40370:225;:::o;40601:366::-;40743:3;40764:67;40828:2;40823:3;40764:67;:::i;:::-;40757:74;;40840:93;40929:3;40840:93;:::i;:::-;40958:2;40953:3;40949:12;40942:19;;40601:366;;;:::o;40973:419::-;41139:4;41177:2;41166:9;41162:18;41154:26;;41226:9;41220:4;41216:20;41212:1;41201:9;41197:17;41190:47;41254:131;41380:4;41254:131;:::i;:::-;41246:139;;40973:419;;;:::o;41398:182::-;41538:34;41534:1;41526:6;41522:14;41515:58;41398:182;:::o;41586:366::-;41728:3;41749:67;41813:2;41808:3;41749:67;:::i;:::-;41742:74;;41825:93;41914:3;41825:93;:::i;:::-;41943:2;41938:3;41934:12;41927:19;;41586:366;;;:::o;41958:419::-;42124:4;42162:2;42151:9;42147:18;42139:26;;42211:9;42205:4;42201:20;42197:1;42186:9;42182:17;42175:47;42239:131;42365:4;42239:131;:::i;:::-;42231:139;;41958:419;;;:::o;42383:224::-;42523:34;42519:1;42511:6;42507:14;42500:58;42592:7;42587:2;42579:6;42575:15;42568:32;42383:224;:::o;42613:366::-;42755:3;42776:67;42840:2;42835:3;42776:67;:::i;:::-;42769:74;;42852:93;42941:3;42852:93;:::i;:::-;42970:2;42965:3;42961:12;42954:19;;42613:366;;;:::o;42985:419::-;43151:4;43189:2;43178:9;43174:18;43166:26;;43238:9;43232:4;43228:20;43224:1;43213:9;43209:17;43202:47;43266:131;43392:4;43266:131;:::i;:::-;43258:139;;42985:419;;;:::o;43410:223::-;43550:34;43546:1;43538:6;43534:14;43527:58;43619:6;43614:2;43606:6;43602:15;43595:31;43410:223;:::o;43639:366::-;43781:3;43802:67;43866:2;43861:3;43802:67;:::i;:::-;43795:74;;43878:93;43967:3;43878:93;:::i;:::-;43996:2;43991:3;43987:12;43980:19;;43639:366;;;:::o;44011:419::-;44177:4;44215:2;44204:9;44200:18;44192:26;;44264:9;44258:4;44254:20;44250:1;44239:9;44235:17;44228:47;44292:131;44418:4;44292:131;:::i;:::-;44284:139;;44011:419;;;:::o;44436:175::-;44576:27;44572:1;44564:6;44560:14;44553:51;44436:175;:::o;44617:366::-;44759:3;44780:67;44844:2;44839:3;44780:67;:::i;:::-;44773:74;;44856:93;44945:3;44856:93;:::i;:::-;44974:2;44969:3;44965:12;44958:19;;44617:366;;;:::o;44989:419::-;45155:4;45193:2;45182:9;45178:18;45170:26;;45242:9;45236:4;45232:20;45228:1;45217:9;45213:17;45206:47;45270:131;45396:4;45270:131;:::i;:::-;45262:139;;44989:419;;;:::o;45414:237::-;45554:34;45550:1;45542:6;45538:14;45531:58;45623:20;45618:2;45610:6;45606:15;45599:45;45414:237;:::o;45657:366::-;45799:3;45820:67;45884:2;45879:3;45820:67;:::i;:::-;45813:74;;45896:93;45985:3;45896:93;:::i;:::-;46014:2;46009:3;46005:12;45998:19;;45657:366;;;:::o;46029:419::-;46195:4;46233:2;46222:9;46218:18;46210:26;;46282:9;46276:4;46272:20;46268:1;46257:9;46253:17;46246:47;46310:131;46436:4;46310:131;:::i;:::-;46302:139;;46029:419;;;:::o;46454:180::-;46502:77;46499:1;46492:88;46599:4;46596:1;46589:15;46623:4;46620:1;46613:15;46640:180;46688:77;46685:1;46678:88;46785:4;46782:1;46775:15;46809:4;46806:1;46799:15;46826:194;46866:4;46886:20;46904:1;46886:20;:::i;:::-;46881:25;;46920:20;46938:1;46920:20;:::i;:::-;46915:25;;46964:1;46961;46957:9;46949:17;;46988:1;46982:4;46979:11;46976:37;;;46993:18;;:::i;:::-;46976:37;46826:194;;;;:::o;47026:98::-;47077:6;47111:5;47105:12;47095:22;;47026:98;;;:::o;47130:168::-;47213:11;47247:6;47242:3;47235:19;47287:4;47282:3;47278:14;47263:29;;47130:168;;;;:::o;47304:373::-;47390:3;47418:38;47450:5;47418:38;:::i;:::-;47472:70;47535:6;47530:3;47472:70;:::i;:::-;47465:77;;47551:65;47609:6;47604:3;47597:4;47590:5;47586:16;47551:65;:::i;:::-;47641:29;47663:6;47641:29;:::i;:::-;47636:3;47632:39;47625:46;;47394:283;47304:373;;;;:::o;47683:640::-;47878:4;47916:3;47905:9;47901:19;47893:27;;47930:71;47998:1;47987:9;47983:17;47974:6;47930:71;:::i;:::-;48011:72;48079:2;48068:9;48064:18;48055:6;48011:72;:::i;:::-;48093;48161:2;48150:9;48146:18;48137:6;48093:72;:::i;:::-;48212:9;48206:4;48202:20;48197:2;48186:9;48182:18;48175:48;48240:76;48311:4;48302:6;48240:76;:::i;:::-;48232:84;;47683:640;;;;;;;:::o;48329:141::-;48385:5;48416:6;48410:13;48401:22;;48432:32;48458:5;48432:32;:::i;:::-;48329:141;;;;:::o;48476:349::-;48545:6;48594:2;48582:9;48573:7;48569:23;48565:32;48562:119;;;48600:79;;:::i;:::-;48562:119;48720:1;48745:63;48800:7;48791:6;48780:9;48776:22;48745:63;:::i;:::-;48735:73;;48691:127;48476:349;;;;:::o;48831:182::-;48971:34;48967:1;48959:6;48955:14;48948:58;48831:182;:::o;49019:366::-;49161:3;49182:67;49246:2;49241:3;49182:67;:::i;:::-;49175:74;;49258:93;49347:3;49258:93;:::i;:::-;49376:2;49371:3;49367:12;49360:19;;49019:366;;;:::o;49391:419::-;49557:4;49595:2;49584:9;49580:18;49572:26;;49644:9;49638:4;49634:20;49630:1;49619:9;49615:17;49608:47;49672:131;49798:4;49672:131;:::i;:::-;49664:139;;49391:419;;;:::o;49816:178::-;49956:30;49952:1;49944:6;49940:14;49933:54;49816:178;:::o;50000:366::-;50142:3;50163:67;50227:2;50222:3;50163:67;:::i;:::-;50156:74;;50239:93;50328:3;50239:93;:::i;:::-;50357:2;50352:3;50348:12;50341:19;;50000:366;;;:::o;50372:419::-;50538:4;50576:2;50565:9;50561:18;50553:26;;50625:9;50619:4;50615:20;50611:1;50600:9;50596:17;50589:47;50653:131;50779:4;50653:131;:::i;:::-;50645:139;;50372:419;;;:::o

Swarm Source

ipfs://74f21d851aa2e9fd31f76b8f2fffd070c0f39201497174d3846a9f536978d32d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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