Contract 0x061dc8e41c05207bedd6242ea4b342ef294be359 1

 

Contract Overview

Balance:
2.335285405606913577 FTM

FTM Value:
$0.77 (@ $0.33/FTM)

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x4fdd5b165b8ff5116a8bb211f7ea5974325b420c22df059ada93dfc258e6d587Swap633029792023-05-29 22:43:382 hrs 31 mins ago0xb5136c4991104bac51379798c4a4a8c18b33354c IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.012488093392
0xeacd23c186e432173753673d61e19bb272461d1b6fc4f7bffb621a19132f0549Swap633029622023-05-29 22:42:502 hrs 32 mins ago0xfba2714936b5c85b3e6d6635ede37b4bc2b41d66 IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.010116621886
0x347b48ec91256984b497ae6ffb90dfa8e4a1f23e2e0cb2f1d0864913f0d56e76Swap633029562023-05-29 22:42:332 hrs 32 mins ago0x7038f2387bb59f7241e4e58e55f00cd0384efdec IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.012489471354
0x839b99feb98402820ba498c35a9ab6b5ab9e300aaaf0af620968b999f8a240e7Swap633029492023-05-29 22:42:142 hrs 33 mins ago0xdb06e2f2ee7cc18faa7dcae9eb28964d31be3ea7 IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.034847449578
0x8565d9711e6739ba6bbe65ded7082393329979e5c7085e44760350cada1e7a21Swap633029332023-05-29 22:41:362 hrs 33 mins ago0xbdabb9caf137fa3378945acc21ad41aebbbd7380 IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.010183578616
0x91e180e8e2d2ea9c5f2507d55ed8a35d606b881e2be32b9e5e57939915646125Swap633029232023-05-29 22:41:172 hrs 34 mins ago0x169b2ae3635799d2ec79168891a5873bd69265bf IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.012496552603
0xf5bb05dccb94747d89f14509183ef3726681d553222b6a3b6d0fa3e9285161d5Swap633029132023-05-29 22:40:572 hrs 34 mins ago0x11fff9feb84caba9cb4f53a99dfdbb7ef094c321 IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.012505982439
0xa5bee760ed806b2a3842220362abcee73c7c93ffdcda3685c4f6083e92f64fabSwap633029002023-05-29 22:40:312 hrs 34 mins ago0x44c3b59c8bb713cdc12ca786acf414ab15d4d8d2 IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.012492618652
0x29d6c00306ae25fdee7c247464c031110c7ef3913fe2a1500f0a67e0d9da18e9Swap633028912023-05-29 22:40:112 hrs 35 mins ago0x2abcbfd886451d2642be61b4117d3a096cad0600 IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.012476226538
0x343674ba33a69df2419c56cde6d0142101f3f1835fde65f17920ded926ee3a35Swap633028812023-05-29 22:39:562 hrs 35 mins ago0xf47867d8c05ac495a6f5a6e2c11b5ec2d67d5c8c IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.01012842711
0xfc36d97c24c618d87d61e473ab217cb34f4735d8f64d85800a4bbf8f1df9bb31Swap633028712023-05-29 22:39:352 hrs 35 mins ago0x5c00e211621bb75d56aca986a83b8d72db326c1e IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.012488847777
0xbc09f37ad4ca400f565fb2b534be7c64f6c871ebb894a82c5e49847eb865aa5dSwap633028602023-05-29 22:39:102 hrs 36 mins ago0xc32b3358fed0b25fa0f7a0c82e2f2378aada116c IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.010161063527
0x225f34a523b8df084cc4bd967d9b1c310d4cdc7e0ab84f5046abf0c40fceee02Swap633028552023-05-29 22:38:502 hrs 36 mins ago0x143d801847aba0fc38f6d138b9da6ba6946c21a9 IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.01252472354
0xa8a05ca39b52ac949ab1503d2930a186640969e615b5af67a9d7422e24ed870cSwap633028392023-05-29 22:38:042 hrs 37 mins ago0xa2320772292edab4824ebf7ce91873fb9aca8032 IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.010193766115
0xbc474209dde400affecd8ef9b40857e3bf5bb5871dd6a1f956470add0b132776Swap633028252023-05-29 22:37:312 hrs 37 mins ago0x9f58c49db336b56d51f82f296c5713176c1b1581 IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.010244440104
0xdfadcdd38f7d6eb8e2117f5330eaae82346fff7cad22b42d228e6f4db4690600Swap633028142023-05-29 22:37:082 hrs 38 mins ago0x0edc573dbbe8201443545b837cec3f5757ac8fce IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.010283695182
0x9a5adf7be2ae2322794f937292ecea18996acd48591f13ad9be58445380ac31cSwap633028032023-05-29 22:36:452 hrs 38 mins ago0xc147bf222b5b3b040a9dfdda88d6994cee24bf85 IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.010219547031
0x7e2b0d608dc62efb0551ccd1b8c2e824f16f861d40ce4ac82f5940fef361a292Swap633027882023-05-29 22:36:102 hrs 39 mins ago0x78883f8d9dacfd6ef762d947195795e82f7289f4 IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.010223162675
0x3af4e3516b9112857fb6997510872cc66c501c69771284612e38fd00b6d04ba2Swap633027802023-05-29 22:35:502 hrs 39 mins ago0x3e2500eb0872503ee11ac720fc434fbc5d871bd2 IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.010245529624
0x6e25d71cfefdabb8253cd45e974cddf98d85cc52a02cea611d0419de8ee1a768Swap633027702023-05-29 22:35:252 hrs 39 mins ago0x01bafb5be7b17151c78b716d1300c098acf519b3 IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.010210280475
0xe37cd3030e2fb7f5305dd3ed4462a2413551e0791299bf9d383aedbcd5eba7e7Swap633027612023-05-29 22:35:042 hrs 40 mins ago0xb0828b66f53940b6ea6c85faeb9ca6aaddaa5a4b IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.010181461839
0x70a6e2aed3537f38073bb04fea2253615b4f59f8cdb181c63c9a6726a39dfad1Swap633027532023-05-29 22:34:452 hrs 40 mins ago0x1b03917e56de35889c81346698936a593451464f IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.01015485652
0x159751052ca75b601e52d49821d98718c58fa47f9844a49430d91fa073ba64e3Swap633027442023-05-29 22:34:212 hrs 41 mins ago0xf2ab38a83053947690d3a8515809a303bca6bedb IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.010206713624
0x2c4900d2ff64650f18e0d800c1f6daabe3510fa71d6330b3af5502ba9a1c2403Swap633027272023-05-29 22:33:512 hrs 41 mins ago0x9f38e6e8fcdda38d8d9bf637c7a44ab1c79d7608 IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.009520578186
0x772c2a996a80437a54e6d64dc39957fea34cf665e3b68233bc8d92af78f267eaSwap633027172023-05-29 22:33:322 hrs 41 mins ago0x474e3ca6447187380902b34447806554206ed966 IN  0x061dc8e41c05207bedd6242ea4b342ef294be3590 FTM0.081291373535
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x4fdd5b165b8ff5116a8bb211f7ea5974325b420c22df059ada93dfc258e6d587633029792023-05-29 22:43:382 hrs 31 mins ago 0x061dc8e41c05207bedd6242ea4b342ef294be3590xb5136c4991104bac51379798c4a4a8c18b33354c27.537582557576278264 FTM
0x4fdd5b165b8ff5116a8bb211f7ea5974325b420c22df059ada93dfc258e6d587633029792023-05-29 22:43:382 hrs 31 mins ago 0x700db4494b8ed094f888b4f7ef5dbffddaf267bb 0x061dc8e41c05207bedd6242ea4b342ef294be35927.537582557576278264 FTM
0xeacd23c186e432173753673d61e19bb272461d1b6fc4f7bffb621a19132f0549633029622023-05-29 22:42:502 hrs 32 mins ago 0x061dc8e41c05207bedd6242ea4b342ef294be3590xfba2714936b5c85b3e6d6635ede37b4bc2b41d6631.159916142795743063 FTM
0xeacd23c186e432173753673d61e19bb272461d1b6fc4f7bffb621a19132f0549633029622023-05-29 22:42:502 hrs 32 mins ago 0x700db4494b8ed094f888b4f7ef5dbffddaf267bb 0x061dc8e41c05207bedd6242ea4b342ef294be35931.159916142795743063 FTM
0x347b48ec91256984b497ae6ffb90dfa8e4a1f23e2e0cb2f1d0864913f0d56e76633029562023-05-29 22:42:332 hrs 32 mins ago 0x061dc8e41c05207bedd6242ea4b342ef294be3590x7038f2387bb59f7241e4e58e55f00cd0384efdec28.566550493064901221 FTM
0x347b48ec91256984b497ae6ffb90dfa8e4a1f23e2e0cb2f1d0864913f0d56e76633029562023-05-29 22:42:332 hrs 32 mins ago 0x700db4494b8ed094f888b4f7ef5dbffddaf267bb 0x061dc8e41c05207bedd6242ea4b342ef294be35928.566550493064901221 FTM
0x839b99feb98402820ba498c35a9ab6b5ab9e300aaaf0af620968b999f8a240e7633029492023-05-29 22:42:142 hrs 33 mins ago 0x061dc8e41c05207bedd6242ea4b342ef294be3590xdb06e2f2ee7cc18faa7dcae9eb28964d31be3ea728.11175963203672064 FTM
0x839b99feb98402820ba498c35a9ab6b5ab9e300aaaf0af620968b999f8a240e7633029492023-05-29 22:42:142 hrs 33 mins ago 0x700db4494b8ed094f888b4f7ef5dbffddaf267bb 0x061dc8e41c05207bedd6242ea4b342ef294be35928.11190843932 FTM
0x8565d9711e6739ba6bbe65ded7082393329979e5c7085e44760350cada1e7a21633029332023-05-29 22:41:362 hrs 33 mins ago 0x061dc8e41c05207bedd6242ea4b342ef294be3590xbdabb9caf137fa3378945acc21ad41aebbbd738030.894382147614334976 FTM
0x8565d9711e6739ba6bbe65ded7082393329979e5c7085e44760350cada1e7a21633029332023-05-29 22:41:362 hrs 33 mins ago 0x700db4494b8ed094f888b4f7ef5dbffddaf267bb 0x061dc8e41c05207bedd6242ea4b342ef294be35930.894382147956190822 FTM
0x91e180e8e2d2ea9c5f2507d55ed8a35d606b881e2be32b9e5e57939915646125633029232023-05-29 22:41:172 hrs 34 mins ago 0x061dc8e41c05207bedd6242ea4b342ef294be3590x169b2ae3635799d2ec79168891a5873bd69265bf29.911063698236604151 FTM
0x91e180e8e2d2ea9c5f2507d55ed8a35d606b881e2be32b9e5e57939915646125633029232023-05-29 22:41:172 hrs 34 mins ago 0x700db4494b8ed094f888b4f7ef5dbffddaf267bb 0x061dc8e41c05207bedd6242ea4b342ef294be35929.911063698236604151 FTM
0xf5bb05dccb94747d89f14509183ef3726681d553222b6a3b6d0fa3e9285161d5633029132023-05-29 22:40:572 hrs 34 mins ago 0x061dc8e41c05207bedd6242ea4b342ef294be3590x11fff9feb84caba9cb4f53a99dfdbb7ef094c32130.432575513929855011 FTM
0xf5bb05dccb94747d89f14509183ef3726681d553222b6a3b6d0fa3e9285161d5633029132023-05-29 22:40:572 hrs 34 mins ago 0x700db4494b8ed094f888b4f7ef5dbffddaf267bb 0x061dc8e41c05207bedd6242ea4b342ef294be35930.432575513929855011 FTM
0xa5bee760ed806b2a3842220362abcee73c7c93ffdcda3685c4f6083e92f64fab633029002023-05-29 22:40:312 hrs 34 mins ago 0x061dc8e41c05207bedd6242ea4b342ef294be3590x44c3b59c8bb713cdc12ca786acf414ab15d4d8d226.031083477389412136 FTM
0xa5bee760ed806b2a3842220362abcee73c7c93ffdcda3685c4f6083e92f64fab633029002023-05-29 22:40:312 hrs 34 mins ago 0x700db4494b8ed094f888b4f7ef5dbffddaf267bb 0x061dc8e41c05207bedd6242ea4b342ef294be35926.031083477389412136 FTM
0x29d6c00306ae25fdee7c247464c031110c7ef3913fe2a1500f0a67e0d9da18e9633028912023-05-29 22:40:112 hrs 35 mins ago 0x061dc8e41c05207bedd6242ea4b342ef294be3590x2abcbfd886451d2642be61b4117d3a096cad060026.293800479807682253 FTM
0x29d6c00306ae25fdee7c247464c031110c7ef3913fe2a1500f0a67e0d9da18e9633028912023-05-29 22:40:112 hrs 35 mins ago 0x700db4494b8ed094f888b4f7ef5dbffddaf267bb 0x061dc8e41c05207bedd6242ea4b342ef294be35926.293800479807682253 FTM
0x343674ba33a69df2419c56cde6d0142101f3f1835fde65f17920ded926ee3a35633028812023-05-29 22:39:562 hrs 35 mins ago 0x061dc8e41c05207bedd6242ea4b342ef294be3590xf47867d8c05ac495a6f5a6e2c11b5ec2d67d5c8c26.052995353439546263 FTM
0x343674ba33a69df2419c56cde6d0142101f3f1835fde65f17920ded926ee3a35633028812023-05-29 22:39:562 hrs 35 mins ago 0x700db4494b8ed094f888b4f7ef5dbffddaf267bb 0x061dc8e41c05207bedd6242ea4b342ef294be35926.052995353439546263 FTM
0xfc36d97c24c618d87d61e473ab217cb34f4735d8f64d85800a4bbf8f1df9bb31633028712023-05-29 22:39:352 hrs 35 mins ago 0x061dc8e41c05207bedd6242ea4b342ef294be3590x5c00e211621bb75d56aca986a83b8d72db326c1e26.995479069416936116 FTM
0xfc36d97c24c618d87d61e473ab217cb34f4735d8f64d85800a4bbf8f1df9bb31633028712023-05-29 22:39:352 hrs 35 mins ago 0x700db4494b8ed094f888b4f7ef5dbffddaf267bb 0x061dc8e41c05207bedd6242ea4b342ef294be35926.995479069416936116 FTM
0xbc09f37ad4ca400f565fb2b534be7c64f6c871ebb894a82c5e49847eb865aa5d633028602023-05-29 22:39:102 hrs 36 mins ago 0x061dc8e41c05207bedd6242ea4b342ef294be3590xc32b3358fed0b25fa0f7a0c82e2f2378aada116c25.914833656275617449 FTM
0xbc09f37ad4ca400f565fb2b534be7c64f6c871ebb894a82c5e49847eb865aa5d633028602023-05-29 22:39:102 hrs 36 mins ago 0x700db4494b8ed094f888b4f7ef5dbffddaf267bb 0x061dc8e41c05207bedd6242ea4b342ef294be35925.914833656275617449 FTM
0x225f34a523b8df084cc4bd967d9b1c310d4cdc7e0ab84f5046abf0c40fceee02633028552023-05-29 22:38:502 hrs 36 mins ago 0x061dc8e41c05207bedd6242ea4b342ef294be3590x143d801847aba0fc38f6d138b9da6ba6946c21a930.322266723209567587 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OdosRouter

Compiler Version
v0.8.8+commit.dddeac2f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2023-04-30
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.8;

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

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

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

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [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 functionCall(target, data, "Address: low-level call failed");
    }

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason 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 {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _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);
    }
}

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

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

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

// @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

interface IOdosExecutor {
  function executePath (
    bytes calldata bytecode,
    uint256[] memory inputAmount
  ) external payable;
}

interface IDaiStylePermit {
    function permit(
      address holder,
      address spender,
      uint256 nonce,
      uint256 expiry,
      bool allowed,
      uint8 v,
      bytes32 r,
      bytes32 s
    ) external;
}

/// @title Routing contract for Odos SOR
/// @author Semiotic AI
/// @notice Wrapper with security gaurentees around execution of arbitrary operations on user tokens
contract OdosRouter is Ownable {
  using SafeERC20 for IERC20;

  /// @dev The zero address is uniquely used to represent eth since it is already
  /// recognized as an invalid ERC20, and due to its gas efficiency
  address constant _ETH = address(0);

  /// @dev Contains all information needed to describe an input token being swapped from
  struct inputToken {
    address tokenAddress;
    uint256 amountIn;
    address receiver;
    bytes permit;
  }
  /// @dev Contains all information needed to describe an output token being swapped to
  struct outputToken {
    address tokenAddress;
    uint256 relativeValue;
    address receiver;
  }
  /// @dev Swap event logging
  event Swapped(
    address sender,
    uint256[] amountsIn,
    address[] tokensIn,
    uint256[] amountsOut,
    outputToken[] outputs,
    uint256 valueOutQuote
  );
  /// @dev Must exist in order for contract to receive eth
  receive() external payable { }

  /// @notice Performs a swap for a given value of some combination of specified output tokens
  /// @param inputs list of input token structs for the path being executed
  /// @param outputs list of output token structs for the path being executed
  /// @param valueOutQuote value of destination tokens quoted for the path
  /// @param valueOutMin minimum amount of value out the user will accept
  /// @param executor Address of contract that will execute the path
  /// @param pathDefinition Encoded path definition for executor
  function swap(
    inputToken[] memory inputs,
    outputToken[] memory outputs,
    uint256 valueOutQuote,
    uint256 valueOutMin,
    address executor,
    bytes calldata pathDefinition
  )
    external
    payable
    returns (uint256[] memory amountsOut, uint256 gasLeft)
  {
    // Check for valid output specifications
    require(valueOutMin <= valueOutQuote, "Minimum greater than quote");
    require(valueOutMin > 0, "Slippage limit too low");

    // Check input specification validity and transfer input tokens to executor
    {
      uint256 expected_msg_value = 0;
      for (uint256 i = 0; i < inputs.length; i++) {
        for (uint256 j = 0; j < i; j++) {
          require(
            inputs[i].tokenAddress != inputs[j].tokenAddress,
            "Duplicate source tokens"
          );
        }
        for (uint256 j = 0; j < outputs.length; j++) {
          require(
            inputs[i].tokenAddress != outputs[j].tokenAddress,
            "Arbitrage not supported"
          );
        }
        if (inputs[i].tokenAddress == _ETH) {
          expected_msg_value = inputs[i].amountIn;
        }
        else {
          _permit(inputs[i].tokenAddress, inputs[i].permit);
          IERC20(inputs[i].tokenAddress).safeTransferFrom(
            msg.sender,
            inputs[i].receiver,
            inputs[i].amountIn
          );
        }
      }
      require(msg.value == expected_msg_value, "Invalid msg.value");
    }
    // Check outputs for duplicates and record balances before swap
    uint256[] memory balancesBefore = new uint256[](outputs.length);
    for (uint256 i = 0; i < outputs.length; i++) {
      for (uint256 j = 0; j < i; j++) {
        require(
          outputs[i].tokenAddress != outputs[j].tokenAddress,
          "Duplicate destination tokens"
        );
      }
      balancesBefore[i] = _universalBalance(outputs[i].tokenAddress);
    }

    // Extract arrays of input amount values and tokens from the inputs struct list
    uint256[] memory amountsIn = new uint256[](inputs.length);
    address[] memory tokensIn = new address[](inputs.length);
    {
      for (uint256 i = 0; i < inputs.length; i++) {
        amountsIn[i] = inputs[i].amountIn;
        tokensIn[i] = inputs[i].tokenAddress;
      }
    }
    // Delegate the execution of the path to the specified Odos Executor
    IOdosExecutor(executor).executePath{value: msg.value}(pathDefinition, amountsIn);
    {
      uint256 valueOut;
      amountsOut = new uint256[](outputs.length);
      for (uint256 i = 0; i < outputs.length; i++) {
        if (valueOut == valueOutQuote) break;

        // Record the destination token balance before the path is executed
        amountsOut[i] = _universalBalance(outputs[i].tokenAddress) - balancesBefore[i];
        valueOut += amountsOut[i] * outputs[i].relativeValue;

        // If the value out excedes the quoted value out, transfer enough to
        // fulfil the quote and break the loop (any other tokens will be over quote)
        if (valueOut > valueOutQuote) {
          amountsOut[i] -= (valueOut - valueOutQuote) / outputs[i].relativeValue;
          valueOut = valueOutQuote;
        }
        _universalTransfer(
          outputs[i].tokenAddress,
          outputs[i].receiver,
          amountsOut[i]
        );
      }
      require(valueOut > valueOutMin, "Slippage Limit Exceeded");
    }
    emit Swapped(
      msg.sender,
      amountsIn,
      tokensIn,
      amountsOut,
      outputs,
      valueOutQuote
    );
    gasLeft = gasleft();
  }
  /// @notice Allows the owner to transfer funds held by the router contract
  /// @param tokens List of token address to be transferred
  /// @param amounts List of amounts of each token to be transferred
  /// @param dest Address to which the funds should be sent
  function transferFunds(
    address[] calldata tokens,
    uint256[] calldata amounts,
    address dest
  )
    external
    onlyOwner
  {
    require(tokens.length == amounts.length, "Invalid funds transfer");
    for (uint256 i = 0; i < tokens.length; i++) {
      _universalTransfer(tokens[i], dest, amounts[i]);
    }
  }
  /// @notice helper function to get balance of ERC20 or native coin for this contract
  /// @param token address of the token to check, null for native coin
  /// @return balance of specified coin or token
  function _universalBalance(address token) private view returns(uint256) {
    if (token == _ETH) {
      return address(this).balance;
    } else {
      return IERC20(token).balanceOf(address(this));
    }
  }
  /// @notice helper function to transfer ERC20 or native coin
  /// @param token address of the token being transferred, null for native coin
  /// @param to address to transfer to
  /// @param amount to transfer
  function _universalTransfer(address token, address to, uint256 amount) private {
    if (token == _ETH) {
      (bool success,) = payable(to).call{value: amount}("");
      require(success, "ETH transfer failed");
    } else {
      IERC20(token).safeTransfer(to, amount);
    }
  }
  /// @notice Executes an ERC20 or Dai Style Permit
  /// @param token address of token permit is for
  /// @param permit the byte information for permit execution, 0 for no operation
  function _permit(address token, bytes memory permit) internal {
    if (permit.length > 0) {
      if (permit.length == 32 * 7) {
        (bool success,) = token.call(abi.encodePacked(IERC20Permit.permit.selector, permit));
        require(success, "IERC20Permit failed");
      } else if (permit.length == 32 * 8) {
        (bool success,) = token.call(abi.encodePacked(IDaiStylePermit.permit.selector, permit));
        require(success, "Dai Style Permit failed");
      } else {
        revert("Invalid Permit");
      }
    }
  }
}

Contract Security Audit

Contract ABI

[{"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":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"amountsIn","type":"uint256[]"},{"indexed":false,"internalType":"address[]","name":"tokensIn","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amountsOut","type":"uint256[]"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"relativeValue","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"indexed":false,"internalType":"struct OdosRouter.outputToken[]","name":"outputs","type":"tuple[]"},{"indexed":false,"internalType":"uint256","name":"valueOutQuote","type":"uint256"}],"name":"Swapped","type":"event"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"permit","type":"bytes"}],"internalType":"struct OdosRouter.inputToken[]","name":"inputs","type":"tuple[]"},{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"relativeValue","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"internalType":"struct OdosRouter.outputToken[]","name":"outputs","type":"tuple[]"},{"internalType":"uint256","name":"valueOutQuote","type":"uint256"},{"internalType":"uint256","name":"valueOutMin","type":"uint256"},{"internalType":"address","name":"executor","type":"address"},{"internalType":"bytes","name":"pathDefinition","type":"bytes"}],"name":"swap","outputs":[{"internalType":"uint256[]","name":"amountsOut","type":"uint256[]"},{"internalType":"uint256","name":"gasLeft","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address","name":"dest","type":"address"}],"name":"transferFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5062000032620000266200003860201b60201c565b6200004060201b60201c565b62000104565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612da180620001146000396000f3fe60806040526004361061004e5760003560e01c806341de5a851461005a578063715018a6146100835780638da5cb5b1461009a578063f17a4546146100c5578063f2fde38b146100f657610055565b3661005557005b600080fd5b34801561006657600080fd5b50610081600480360381019061007c919061173d565b61011f565b005b34801561008f57600080fd5b50610098610257565b005b3480156100a657600080fd5b506100af6102df565b6040516100bc91906117e1565b60405180910390f35b6100df60048036038101906100da9190611c6f565b610308565b6040516100ed929190611e23565b60405180910390f35b34801561010257600080fd5b5061011d60048036038101906101189190611e53565b610cc3565b005b610127610dbb565b73ffffffffffffffffffffffffffffffffffffffff166101456102df565b73ffffffffffffffffffffffffffffffffffffffff161461019b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290611edd565b60405180910390fd5b8282905085859050146101e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101da90611f49565b60405180910390fd5b60005b8585905081101561024f5761023c86868381811061020757610206611f69565b5b905060200201602081019061021c9190611e53565b838686858181106102305761022f611f69565b5b90506020020135610dc3565b808061024790611fc7565b9150506101e6565b505050505050565b61025f610dbb565b73ffffffffffffffffffffffffffffffffffffffff1661027d6102df565b73ffffffffffffffffffffffffffffffffffffffff16146102d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102ca90611edd565b60405180910390fd5b6102dd6000610edb565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060008686111561034f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103469061205c565b60405180910390fd5b60008611610392576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610389906120c8565b60405180910390fd5b6000805b8a5181101561068e5760005b81811015610468578b81815181106103bd576103bc611f69565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff168c83815181106103f2576103f1611f69565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161415610455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044c90612134565b60405180910390fd5b808061046090611fc7565b9150506103a2565b5060005b8a51811015610533578a818151811061048857610487611f69565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff168c83815181106104bd576104bc611f69565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161415610520576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610517906121a0565b60405180910390fd5b808061052b90611fc7565b91505061046c565b50600073ffffffffffffffffffffffffffffffffffffffff168b828151811061055f5761055e611f69565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614156105ad578a818151811061059a57610599611f69565b5b602002602001015160200151915061067b565b6105f38b82815181106105c3576105c2611f69565b5b6020026020010151600001518c83815181106105e2576105e1611f69565b5b602002602001015160600151610f9f565b61067a338c838151811061060a57610609611f69565b5b6020026020010151604001518d848151811061062957610628611f69565b5b6020026020010151602001518e858151811061064857610647611f69565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff166111b5909392919063ffffffff16565b5b808061068690611fc7565b915050610396565b508034146106d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c89061220c565b60405180910390fd5b506000885167ffffffffffffffff8111156106ef576106ee61180d565b5b60405190808252806020026020018201604052801561071d5781602001602082028036833780820191505090505b50905060005b895181101561084f5760005b818110156107f5578a818151811061074a57610749611f69565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff168b838151811061077f5761077e611f69565b5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614156107e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d990612278565b60405180910390fd5b80806107ed90611fc7565b91505061072f565b5061081d8a828151811061080c5761080b611f69565b5b60200260200101516000015161123e565b8282815181106108305761082f611f69565b5b602002602001018181525050808061084790611fc7565b915050610723565b5060008a5167ffffffffffffffff81111561086d5761086c61180d565b5b60405190808252806020026020018201604052801561089b5781602001602082028036833780820191505090505b50905060008b5167ffffffffffffffff8111156108bb576108ba61180d565b5b6040519080825280602002602001820160405280156108e95781602001602082028036833780820191505090505b50905060005b8c518110156109b5578c818151811061090b5761090a611f69565b5b60200260200101516020015183828151811061092a57610929611f69565b5b6020026020010181815250508c818151811061094957610948611f69565b5b60200260200101516000015182828151811061096857610967611f69565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806109ad90611fc7565b9150506108ef565b508773ffffffffffffffffffffffffffffffffffffffff1663849df53d348989866040518563ffffffff1660e01b81526004016109f4939291906122d6565b6000604051808303818588803b158015610a0d57600080fd5b505af1158015610a21573d6000803e3d6000fd5b505050505060008b5167ffffffffffffffff811115610a4357610a4261180d565b5b604051908082528060200260200182016040528015610a715781602001602082028036833780820191505090505b50955060005b8c51811015610c2c578b821415610a8d57610c2c565b848181518110610aa057610a9f611f69565b5b6020026020010151610acf8e8381518110610abe57610abd611f69565b5b60200260200101516000015161123e565b610ad9919061230f565b878281518110610aec57610aeb611f69565b5b6020026020010181815250508c8181518110610b0b57610b0a611f69565b5b602002602001015160200151878281518110610b2a57610b29611f69565b5b6020026020010151610b3c9190612343565b82610b47919061239d565b91508b821115610bb8578c8181518110610b6457610b63611f69565b5b6020026020010151602001518c83610b7c919061230f565b610b869190612422565b878281518110610b9957610b98611f69565b5b60200260200101818151610bad919061230f565b915081815250508b91505b610c198d8281518110610bce57610bcd611f69565b5b6020026020010151600001518e8381518110610bed57610bec611f69565b5b602002602001015160400151898481518110610c0c57610c0b611f69565b5b6020026020010151610dc3565b8080610c2490611fc7565b915050610a77565b50898111610c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c669061249f565b60405180910390fd5b507fe87568fe5934cb7524b96e16b225ee2e7e738ccbb706c7bee52ce07bf0360e69338383888f8f604051610ca99695949392919061266e565b60405180910390a15a935050505097509795505050505050565b610ccb610dbb565b73ffffffffffffffffffffffffffffffffffffffff16610ce96102df565b73ffffffffffffffffffffffffffffffffffffffff1614610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3690611edd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da69061275d565b60405180910390fd5b610db881610edb565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610eaa5760008273ffffffffffffffffffffffffffffffffffffffff1682604051610e1e906127ae565b60006040518083038185875af1925050503d8060008114610e5b576040519150601f19603f3d011682016040523d82523d6000602084013e610e60565b606091505b5050905080610ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9b9061280f565b60405180910390fd5b50610ed6565b610ed582828573ffffffffffffffffffffffffffffffffffffffff1661130d9092919063ffffffff16565b5b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000815111156111b15760e08151141561108e5760008273ffffffffffffffffffffffffffffffffffffffff1663d505accf60e01b83604051602001610fe69291906128eb565b6040516020818303038152906040526040516110029190612913565b6000604051808303816000865af19150503d806000811461103f576040519150601f19603f3d011682016040523d82523d6000602084013e611044565b606091505b5050905080611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f90612976565b60405180910390fd5b506111b0565b610100815114156111745760008273ffffffffffffffffffffffffffffffffffffffff16638fcbaf0c60e01b836040516020016110cc9291906128eb565b6040516020818303038152906040526040516110e89190612913565b6000604051808303816000865af19150503d8060008114611125576040519150601f19603f3d011682016040523d82523d6000602084013e61112a565b606091505b505090508061116e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611165906129e2565b60405180910390fd5b506111af565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a690612a4e565b60405180910390fd5b5b5b5050565b611238846323b872dd60e01b8585856040516024016111d693929190612a6e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611393565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561127c57479050611308565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112b591906117e1565b60206040518083038186803b1580156112cd57600080fd5b505afa1580156112e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113059190612aba565b90505b919050565b61138e8363a9059cbb60e01b848460405160240161132c929190612ae7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611393565b505050565b60006113f5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661145a9092919063ffffffff16565b905060008151111561145557808060200190518101906114159190612b48565b611454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144b90612be7565b60405180910390fd5b5b505050565b60606114698484600085611472565b90509392505050565b6060824710156114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90612c79565b60405180910390fd5b6114c085611586565b6114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690612ce5565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516115289190612913565b60006040518083038185875af1925050503d8060008114611565576040519150601f19603f3d011682016040523d82523d6000602084013e61156a565b606091505b509150915061157a8282866115a9565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156115b957829050611609565b6000835111156115cc5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116009190612d49565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261164957611648611624565b5b8235905067ffffffffffffffff81111561166657611665611629565b5b6020830191508360208202830111156116825761168161162e565b5b9250929050565b60008083601f84011261169f5761169e611624565b5b8235905067ffffffffffffffff8111156116bc576116bb611629565b5b6020830191508360208202830111156116d8576116d761162e565b5b9250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061170a826116df565b9050919050565b61171a816116ff565b811461172557600080fd5b50565b60008135905061173781611711565b92915050565b6000806000806000606086880312156117595761175861161a565b5b600086013567ffffffffffffffff8111156117775761177661161f565b5b61178388828901611633565b9550955050602086013567ffffffffffffffff8111156117a6576117a561161f565b5b6117b288828901611689565b935093505060406117c588828901611728565b9150509295509295909350565b6117db816116ff565b82525050565b60006020820190506117f660008301846117d2565b92915050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611845826117fc565b810181811067ffffffffffffffff821117156118645761186361180d565b5b80604052505050565b6000611877611610565b9050611883828261183c565b919050565b600067ffffffffffffffff8211156118a3576118a261180d565b5b602082029050602081019050919050565b600080fd5b600080fd5b6000819050919050565b6118d1816118be565b81146118dc57600080fd5b50565b6000813590506118ee816118c8565b92915050565b600080fd5b600067ffffffffffffffff8211156119145761191361180d565b5b61191d826117fc565b9050602081019050919050565b82818337600083830152505050565b600061194c611947846118f9565b61186d565b905082815260208101848484011115611968576119676118f4565b5b61197384828561192a565b509392505050565b600082601f8301126119905761198f611624565b5b81356119a0848260208601611939565b91505092915050565b6000608082840312156119bf576119be6118b4565b5b6119c9608061186d565b905060006119d984828501611728565b60008301525060206119ed848285016118df565b6020830152506040611a0184828501611728565b604083015250606082013567ffffffffffffffff811115611a2557611a246118b9565b5b611a318482850161197b565b60608301525092915050565b6000611a50611a4b84611888565b61186d565b90508083825260208201905060208402830185811115611a7357611a7261162e565b5b835b81811015611aba57803567ffffffffffffffff811115611a9857611a97611624565b5b808601611aa589826119a9565b85526020850194505050602081019050611a75565b5050509392505050565b600082601f830112611ad957611ad8611624565b5b8135611ae9848260208601611a3d565b91505092915050565b600067ffffffffffffffff821115611b0d57611b0c61180d565b5b602082029050602081019050919050565b600060608284031215611b3457611b336118b4565b5b611b3e606061186d565b90506000611b4e84828501611728565b6000830152506020611b62848285016118df565b6020830152506040611b7684828501611728565b60408301525092915050565b6000611b95611b9084611af2565b61186d565b90508083825260208201905060608402830185811115611bb857611bb761162e565b5b835b81811015611be15780611bcd8882611b1e565b845260208401935050606081019050611bba565b5050509392505050565b600082601f830112611c0057611bff611624565b5b8135611c10848260208601611b82565b91505092915050565b60008083601f840112611c2f57611c2e611624565b5b8235905067ffffffffffffffff811115611c4c57611c4b611629565b5b602083019150836001820283011115611c6857611c6761162e565b5b9250929050565b600080600080600080600060c0888a031215611c8e57611c8d61161a565b5b600088013567ffffffffffffffff811115611cac57611cab61161f565b5b611cb88a828b01611ac4565b975050602088013567ffffffffffffffff811115611cd957611cd861161f565b5b611ce58a828b01611beb565b9650506040611cf68a828b016118df565b9550506060611d078a828b016118df565b9450506080611d188a828b01611728565b93505060a088013567ffffffffffffffff811115611d3957611d3861161f565b5b611d458a828b01611c19565b925092505092959891949750929550565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611d8b816118be565b82525050565b6000611d9d8383611d82565b60208301905092915050565b6000602082019050919050565b6000611dc182611d56565b611dcb8185611d61565b9350611dd683611d72565b8060005b83811015611e07578151611dee8882611d91565b9750611df983611da9565b925050600181019050611dda565b5085935050505092915050565b611e1d816118be565b82525050565b60006040820190508181036000830152611e3d8185611db6565b9050611e4c6020830184611e14565b9392505050565b600060208284031215611e6957611e6861161a565b5b6000611e7784828501611728565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611ec7602083611e80565b9150611ed282611e91565b602082019050919050565b60006020820190508181036000830152611ef681611eba565b9050919050565b7f496e76616c69642066756e6473207472616e7366657200000000000000000000600082015250565b6000611f33601683611e80565b9150611f3e82611efd565b602082019050919050565b60006020820190508181036000830152611f6281611f26565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611fd2826118be565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561200557612004611f98565b5b600182019050919050565b7f4d696e696d756d2067726561746572207468616e2071756f7465000000000000600082015250565b6000612046601a83611e80565b915061205182612010565b602082019050919050565b6000602082019050818103600083015261207581612039565b9050919050565b7f536c697070616765206c696d697420746f6f206c6f7700000000000000000000600082015250565b60006120b2601683611e80565b91506120bd8261207c565b602082019050919050565b600060208201905081810360008301526120e1816120a5565b9050919050565b7f4475706c696361746520736f7572636520746f6b656e73000000000000000000600082015250565b600061211e601783611e80565b9150612129826120e8565b602082019050919050565b6000602082019050818103600083015261214d81612111565b9050919050565b7f417262697472616765206e6f7420737570706f72746564000000000000000000600082015250565b600061218a601783611e80565b915061219582612154565b602082019050919050565b600060208201905081810360008301526121b98161217d565b9050919050565b7f496e76616c6964206d73672e76616c7565000000000000000000000000000000600082015250565b60006121f6601183611e80565b9150612201826121c0565b602082019050919050565b60006020820190508181036000830152612225816121e9565b9050919050565b7f4475706c69636174652064657374696e6174696f6e20746f6b656e7300000000600082015250565b6000612262601c83611e80565b915061226d8261222c565b602082019050919050565b6000602082019050818103600083015261229181612255565b9050919050565b600082825260208201905092915050565b60006122b58385612298565b93506122c283858461192a565b6122cb836117fc565b840190509392505050565b600060408201905081810360008301526122f18185876122a9565b905081810360208301526123058184611db6565b9050949350505050565b600061231a826118be565b9150612325836118be565b92508282101561233857612337611f98565b5b828203905092915050565b600061234e826118be565b9150612359836118be565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561239257612391611f98565b5b828202905092915050565b60006123a8826118be565b91506123b3836118be565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156123e8576123e7611f98565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061242d826118be565b9150612438836118be565b925082612448576124476123f3565b5b828204905092915050565b7f536c697070616765204c696d6974204578636565646564000000000000000000600082015250565b6000612489601783611e80565b915061249482612453565b602082019050919050565b600060208201905081810360008301526124b88161247c565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6124f4816116ff565b82525050565b600061250683836124eb565b60208301905092915050565b6000602082019050919050565b600061252a826124bf565b61253481856124ca565b935061253f836124db565b8060005b8381101561257057815161255788826124fa565b975061256283612512565b925050600181019050612543565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6060820160008201516125bf60008501826124eb565b5060208201516125d26020850182611d82565b5060408201516125e560408501826124eb565b50505050565b60006125f783836125a9565b60608301905092915050565b6000602082019050919050565b600061261b8261257d565b6126258185612588565b935061263083612599565b8060005b8381101561266157815161264888826125eb565b975061265383612603565b925050600181019050612634565b5085935050505092915050565b600060c08201905061268360008301896117d2565b81810360208301526126958188611db6565b905081810360408301526126a9818761251f565b905081810360608301526126bd8186611db6565b905081810360808301526126d18185612610565b90506126e060a0830184611e14565b979650505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612747602683611e80565b9150612752826126eb565b604082019050919050565b600060208201905081810360008301526127768161273a565b9050919050565b600081905092915050565b50565b600061279860008361277d565b91506127a382612788565b600082019050919050565b60006127b98261278b565b9150819050919050565b7f455448207472616e73666572206661696c656400000000000000000000000000600082015250565b60006127f9601383611e80565b9150612804826127c3565b602082019050919050565b60006020820190508181036000830152612828816127ec565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b6128766128718261282f565b61285b565b82525050565b600081519050919050565b60005b838110156128a557808201518184015260208101905061288a565b838111156128b4576000848401525b50505050565b60006128c58261287c565b6128cf818561277d565b93506128df818560208601612887565b80840191505092915050565b60006128f78285612865565b60048201915061290782846128ba565b91508190509392505050565b600061291f82846128ba565b915081905092915050565b7f4945524332305065726d6974206661696c656400000000000000000000000000600082015250565b6000612960601383611e80565b915061296b8261292a565b602082019050919050565b6000602082019050818103600083015261298f81612953565b9050919050565b7f446169205374796c65205065726d6974206661696c6564000000000000000000600082015250565b60006129cc601783611e80565b91506129d782612996565b602082019050919050565b600060208201905081810360008301526129fb816129bf565b9050919050565b7f496e76616c6964205065726d6974000000000000000000000000000000000000600082015250565b6000612a38600e83611e80565b9150612a4382612a02565b602082019050919050565b60006020820190508181036000830152612a6781612a2b565b9050919050565b6000606082019050612a8360008301866117d2565b612a9060208301856117d2565b612a9d6040830184611e14565b949350505050565b600081519050612ab4816118c8565b92915050565b600060208284031215612ad057612acf61161a565b5b6000612ade84828501612aa5565b91505092915050565b6000604082019050612afc60008301856117d2565b612b096020830184611e14565b9392505050565b60008115159050919050565b612b2581612b10565b8114612b3057600080fd5b50565b600081519050612b4281612b1c565b92915050565b600060208284031215612b5e57612b5d61161a565b5b6000612b6c84828501612b33565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612bd1602a83611e80565b9150612bdc82612b75565b604082019050919050565b60006020820190508181036000830152612c0081612bc4565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612c63602683611e80565b9150612c6e82612c07565b604082019050919050565b60006020820190508181036000830152612c9281612c56565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612ccf601d83611e80565b9150612cda82612c99565b602082019050919050565b60006020820190508181036000830152612cfe81612cc2565b9050919050565b600081519050919050565b6000612d1b82612d05565b612d258185611e80565b9350612d35818560208601612887565b612d3e816117fc565b840191505092915050565b60006020820190508181036000830152612d638184612d10565b90509291505056fea2646970667358221220b2a87e50507f671691bcb073c27cdbb13ef83b5888e6ee3b5f943df11c7f934c64736f6c63430008080033

Deployed ByteCode Sourcemap

21143:7430:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26556:337;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14761:103;;;;;;;;;;;;;:::i;:::-;;14110:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22655:3627;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;15019:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26556:337;14341:12;:10;:12::i;:::-;14330:23;;:7;:5;:7::i;:::-;:23;;;14322:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26732:7:::1;;:14;;26715:6;;:13;;:31;26707:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;26785:9;26780:108;26804:6;;:13;;26800:1;:17;26780:108;;;26833:47;26852:6;;26859:1;26852:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;26863:4;26869:7;;26877:1;26869:10;;;;;;;:::i;:::-;;;;;;;;26833:18;:47::i;:::-;26819:3;;;;;:::i;:::-;;;;26780:108;;;;26556:337:::0;;;;;:::o;14761:103::-;14341:12;:10;:12::i;:::-;14330:23;;:7;:5;:7::i;:::-;:23;;;14322:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14826:30:::1;14853:1;14826:18;:30::i;:::-;14761:103::o:0;14110:87::-;14156:7;14183:6;;;;;;;;;;;14176:13;;14110:87;:::o;22655:3627::-;22896:27;22925:15;23021:13;23006:11;:28;;22998:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;23094:1;23080:11;:15;23072:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;23221:26;23265:9;23260:811;23284:6;:13;23280:1;:17;23260:811;;;23320:9;23315:180;23339:1;23335;:5;23315:180;;;23408:6;23415:1;23408:9;;;;;;;;:::i;:::-;;;;;;;;:22;;;23382:48;;:6;23389:1;23382:9;;;;;;;;:::i;:::-;;;;;;;;:22;;;:48;;;;23360:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;23342:3;;;;;:::i;:::-;;;;23315:180;;;;23510:9;23505:194;23529:7;:14;23525:1;:18;23505:194;;;23611:7;23619:1;23611:10;;;;;;;;:::i;:::-;;;;;;;;:23;;;23585:49;;:6;23592:1;23585:9;;;;;;;;:::i;:::-;;;;;;;;:22;;;:49;;;;23563:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;23545:3;;;;;:::i;:::-;;;;23505:194;;;;21396:1;23713:30;;:6;23720:1;23713:9;;;;;;;;:::i;:::-;;;;;;;;:22;;;:30;;;23709:353;;;23779:6;23786:1;23779:9;;;;;;;;:::i;:::-;;;;;;;;:18;;;23758:39;;23709:353;;;23837:49;23845:6;23852:1;23845:9;;;;;;;;:::i;:::-;;;;;;;;:22;;;23869:6;23876:1;23869:9;;;;;;;;:::i;:::-;;;;;;;;:16;;;23837:7;:49::i;:::-;23899:151;23961:10;23986:6;23993:1;23986:9;;;;;;;;:::i;:::-;;;;;;;;:18;;;24019:6;24026:1;24019:9;;;;;;;;:::i;:::-;;;;;;;;:18;;;23906:6;23913:1;23906:9;;;;;;;;:::i;:::-;;;;;;;;:22;;;23899:47;;;;:151;;;;;;:::i;:::-;23709:353;23299:3;;;;;:::i;:::-;;;;23260:811;;;;24100:18;24087:9;:31;24079:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;23212:936;24223:31;24271:7;:14;24257:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24223:63;;24298:9;24293:309;24317:7;:14;24313:1;:18;24293:309;;;24352:9;24347:177;24371:1;24367;:5;24347:177;;;24437:7;24445:1;24437:10;;;;;;;;:::i;:::-;;;;;;;;:23;;;24410:50;;:7;24418:1;24410:10;;;;;;;;:::i;:::-;;;;;;;;:23;;;:50;;;;24390:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;24374:3;;;;;:::i;:::-;;;;24347:177;;;;24552:42;24570:7;24578:1;24570:10;;;;;;;;:::i;:::-;;;;;;;;:23;;;24552:17;:42::i;:::-;24532:14;24547:1;24532:17;;;;;;;;:::i;:::-;;;;;;;:62;;;;;24333:3;;;;;:::i;:::-;;;;24293:309;;;;24695:26;24738:6;:13;24724:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24695:57;;24759:25;24801:6;:13;24787:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24759:56;;24836:9;24831:145;24855:6;:13;24851:1;:17;24831:145;;;24901:6;24908:1;24901:9;;;;;;;;:::i;:::-;;;;;;;;:18;;;24886:9;24896:1;24886:12;;;;;;;;:::i;:::-;;;;;;;:33;;;;;24944:6;24951:1;24944:9;;;;;;;;:::i;:::-;;;;;;;;:22;;;24930:8;24939:1;24930:11;;;;;;;;:::i;:::-;;;;;;;:36;;;;;;;;;;;24870:3;;;;;:::i;:::-;;;;24831:145;;;;25077:8;25063:35;;;25106:9;25117:14;;25133:9;25063:80;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25159:16;25211:7;:14;25197:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25184:42;;25240:9;25235:805;25259:7;:14;25255:1;:18;25235:805;;;25307:13;25295:8;:25;25291:36;;;25322:5;;25291:36;25478:14;25493:1;25478:17;;;;;;;;:::i;:::-;;;;;;;;25433:42;25451:7;25459:1;25451:10;;;;;;;;:::i;:::-;;;;;;;;:23;;;25433:17;:42::i;:::-;:62;;;;:::i;:::-;25417:10;25428:1;25417:13;;;;;;;;:::i;:::-;;;;;;;:78;;;;;25534:7;25542:1;25534:10;;;;;;;;:::i;:::-;;;;;;;;:24;;;25518:10;25529:1;25518:13;;;;;;;;:::i;:::-;;;;;;;;:40;;;;:::i;:::-;25506:52;;;;;:::i;:::-;;;25750:13;25739:8;:24;25735:162;;;25824:7;25832:1;25824:10;;;;;;;;:::i;:::-;;;;;;;;:24;;;25807:13;25796:8;:24;;;;:::i;:::-;25795:53;;;;:::i;:::-;25778:10;25789:1;25778:13;;;;;;;;:::i;:::-;;;;;;;:70;;;;;;;:::i;:::-;;;;;;;;25872:13;25861:24;;25735:162;25907:123;25938:7;25946:1;25938:10;;;;;;;;:::i;:::-;;;;;;;;:23;;;25974:7;25982:1;25974:10;;;;;;;;:::i;:::-;;;;;;;;:19;;;26006:10;26017:1;26006:13;;;;;;;;:::i;:::-;;;;;;;;25907:18;:123::i;:::-;25275:3;;;;;:::i;:::-;;;;25235:805;;;;26067:11;26056:8;:22;26048:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;25150:964;26125:125;26141:10;26160:9;26178:8;26195:10;26214:7;26230:13;26125:125;;;;;;;;;;;:::i;:::-;;;;;;;;26267:9;26257:19;;22945:3337;;;22655:3627;;;;;;;;;;:::o;15019:201::-;14341:12;:10;:12::i;:::-;14330:23;;:7;:5;:7::i;:::-;:23;;;14322:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15128:1:::1;15108:22;;:8;:22;;;;15100:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15184:28;15203:8;15184:18;:28::i;:::-;15019:201:::0;:::o;647:98::-;700:7;727:10;720:17;;647:98;:::o;27545:289::-;21396:1;27635:13;;:5;:13;;;27631:198;;;27660:12;27685:2;27677:16;;27701:6;27677:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27659:53;;;27729:7;27721:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;27650:118;27631:198;;;27783:38;27810:2;27814:6;27790:5;27783:26;;;;:38;;;;;:::i;:::-;27631:198;27545:289;;;:::o;15380:191::-;15454:16;15473:6;;;;;;;;;;;15454:25;;15499:8;15490:6;;:17;;;;;;;;;;;;;;;;;;15554:8;15523:40;;15544:8;15523:40;;;;;;;;;;;;15443:128;15380:191;:::o;28025:545::-;28114:1;28098:6;:13;:17;28094:471;;;28147:6;28130;:13;:23;28126:432;;;28167:12;28184:5;:10;;28212:28;;;28242:6;28195:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28184:66;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28166:84;;;28269:7;28261:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;28155:155;28126:432;;;28337:6;28320;:13;:23;28316:242;;;28357:12;28374:5;:10;;28402:31;;;28435:6;28385:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28374:69;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28356:87;;;28462:7;28454:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;28345:162;28316:242;;;28524:24;;;;;;;;;;:::i;:::-;;;;;;;;28316:242;28126:432;28094:471;28025:545;;:::o;10065:248::-;10209:96;10229:5;10259:27;;;10288:4;10294:2;10298:5;10236:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10209:19;:96::i;:::-;10065:248;;;;:::o;27107:216::-;27170:7;21396:1;27190:13;;:5;:13;;;27186:132;;;27221:21;27214:28;;;;27186:132;27279:5;27272:23;;;27304:4;27272:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27265:45;;27107:216;;;;:::o;9846:211::-;9963:86;9983:5;10013:23;;;10038:2;10042:5;9990:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9963:19;:86::i;:::-;9846:211;;;:::o;12419:716::-;12843:23;12869:69;12897:4;12869:69;;;;;;;;;;;;;;;;;12877:5;12869:27;;;;:69;;;;;:::i;:::-;12843:95;;12973:1;12953:10;:17;:21;12949:179;;;13050:10;13039:30;;;;;;;;;;;;:::i;:::-;13031:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;12949:179;12489:646;12419:716;;:::o;4733:229::-;4870:12;4902:52;4924:6;4932:4;4938:1;4941:12;4902:21;:52::i;:::-;4895:59;;4733:229;;;;;:::o;5853:510::-;6023:12;6081:5;6056:21;:30;;6048:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;6148:18;6159:6;6148:10;:18::i;:::-;6140:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;6214:12;6228:23;6255:6;:11;;6274:5;6281:4;6255:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6213:73;;;;6304:51;6321:7;6330:10;6342:12;6304:16;:51::i;:::-;6297:58;;;;5853:510;;;;;;:::o;1988:326::-;2048:4;2305:1;2283:7;:19;;;:23;2276:30;;1988:326;;;:::o;8539:712::-;8689:12;8718:7;8714:530;;;8749:10;8742:17;;;;8714:530;8883:1;8863:10;:17;:21;8859:374;;;9061:10;9055:17;9122:15;9109:10;9105:2;9101:19;9094:44;8859:374;9204:12;9197:20;;;;;;;;;;;:::i;:::-;;;;;;;;8539:712;;;;;;:::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:117;443:1;440;433:12;457:117;566:1;563;556:12;580:117;689:1;686;679:12;720:568;793:8;803:6;853:3;846:4;838:6;834:17;830:27;820:122;;861:79;;:::i;:::-;820:122;974:6;961:20;951:30;;1004:18;996:6;993:30;990:117;;;1026:79;;:::i;:::-;990:117;1140:4;1132:6;1128:17;1116:29;;1194:3;1186:4;1178:6;1174:17;1164:8;1160:32;1157:41;1154:128;;;1201:79;;:::i;:::-;1154:128;720:568;;;;;:::o;1311:::-;1384:8;1394:6;1444:3;1437:4;1429:6;1425:17;1421:27;1411:122;;1452:79;;:::i;:::-;1411:122;1565:6;1552:20;1542:30;;1595:18;1587:6;1584:30;1581:117;;;1617:79;;:::i;:::-;1581:117;1731:4;1723:6;1719:17;1707:29;;1785:3;1777:4;1769:6;1765:17;1755:8;1751:32;1748:41;1745:128;;;1792:79;;:::i;:::-;1745:128;1311:568;;;;;:::o;1885:126::-;1922:7;1962:42;1955:5;1951:54;1940:65;;1885:126;;;:::o;2017:96::-;2054:7;2083:24;2101:5;2083:24;:::i;:::-;2072:35;;2017:96;;;:::o;2119:122::-;2192:24;2210:5;2192:24;:::i;:::-;2185:5;2182:35;2172:63;;2231:1;2228;2221:12;2172:63;2119:122;:::o;2247:139::-;2293:5;2331:6;2318:20;2309:29;;2347:33;2374:5;2347:33;:::i;:::-;2247:139;;;;:::o;2392:1079::-;2523:6;2531;2539;2547;2555;2604:2;2592:9;2583:7;2579:23;2575:32;2572:119;;;2610:79;;:::i;:::-;2572:119;2758:1;2747:9;2743:17;2730:31;2788:18;2780:6;2777:30;2774:117;;;2810:79;;:::i;:::-;2774:117;2923:80;2995:7;2986:6;2975:9;2971:22;2923:80;:::i;:::-;2905:98;;;;2701:312;3080:2;3069:9;3065:18;3052:32;3111:18;3103:6;3100:30;3097:117;;;3133:79;;:::i;:::-;3097:117;3246:80;3318:7;3309:6;3298:9;3294:22;3246:80;:::i;:::-;3228:98;;;;3023:313;3375:2;3401:53;3446:7;3437:6;3426:9;3422:22;3401:53;:::i;:::-;3391:63;;3346:118;2392:1079;;;;;;;;:::o;3477:118::-;3564:24;3582:5;3564:24;:::i;:::-;3559:3;3552:37;3477:118;;:::o;3601:222::-;3694:4;3732:2;3721:9;3717:18;3709:26;;3745:71;3813:1;3802:9;3798:17;3789:6;3745:71;:::i;:::-;3601:222;;;;:::o;3829:102::-;3870:6;3921:2;3917:7;3912:2;3905:5;3901:14;3897:28;3887:38;;3829:102;;;:::o;3937:180::-;3985:77;3982:1;3975:88;4082:4;4079:1;4072:15;4106:4;4103:1;4096:15;4123:281;4206:27;4228:4;4206:27;:::i;:::-;4198:6;4194:40;4336:6;4324:10;4321:22;4300:18;4288:10;4285:34;4282:62;4279:88;;;4347:18;;:::i;:::-;4279:88;4387:10;4383:2;4376:22;4166:238;4123:281;;:::o;4410:129::-;4444:6;4471:20;;:::i;:::-;4461:30;;4500:33;4528:4;4520:6;4500:33;:::i;:::-;4410:129;;;:::o;4545:338::-;4649:4;4739:18;4731:6;4728:30;4725:56;;;4761:18;;:::i;:::-;4725:56;4811:4;4803:6;4799:17;4791:25;;4871:4;4865;4861:15;4853:23;;4545:338;;;:::o;4889:117::-;4998:1;4995;4988:12;5012:117;5121:1;5118;5111:12;5135:77;5172:7;5201:5;5190:16;;5135:77;;;:::o;5218:122::-;5291:24;5309:5;5291:24;:::i;:::-;5284:5;5281:35;5271:63;;5330:1;5327;5320:12;5271:63;5218:122;:::o;5346:139::-;5392:5;5430:6;5417:20;5408:29;;5446:33;5473:5;5446:33;:::i;:::-;5346:139;;;;:::o;5491:117::-;5600:1;5597;5590:12;5614:307;5675:4;5765:18;5757:6;5754:30;5751:56;;;5787:18;;:::i;:::-;5751:56;5825:29;5847:6;5825:29;:::i;:::-;5817:37;;5909:4;5903;5899:15;5891:23;;5614:307;;;:::o;5927:154::-;6011:6;6006:3;6001;5988:30;6073:1;6064:6;6059:3;6055:16;6048:27;5927:154;;;:::o;6087:410::-;6164:5;6189:65;6205:48;6246:6;6205:48;:::i;:::-;6189:65;:::i;:::-;6180:74;;6277:6;6270:5;6263:21;6315:4;6308:5;6304:16;6353:3;6344:6;6339:3;6335:16;6332:25;6329:112;;;6360:79;;:::i;:::-;6329:112;6450:41;6484:6;6479:3;6474;6450:41;:::i;:::-;6170:327;6087:410;;;;;:::o;6516:338::-;6571:5;6620:3;6613:4;6605:6;6601:17;6597:27;6587:122;;6628:79;;:::i;:::-;6587:122;6745:6;6732:20;6770:78;6844:3;6836:6;6829:4;6821:6;6817:17;6770:78;:::i;:::-;6761:87;;6577:277;6516:338;;;;:::o;6896:1085::-;6972:5;7016:4;7004:9;6999:3;6995:19;6991:30;6988:117;;;7024:79;;:::i;:::-;6988:117;7123:21;7139:4;7123:21;:::i;:::-;7114:30;;7211:1;7251:49;7296:3;7287:6;7276:9;7272:22;7251:49;:::i;:::-;7244:4;7237:5;7233:16;7226:75;7154:158;7375:2;7416:49;7461:3;7452:6;7441:9;7437:22;7416:49;:::i;:::-;7409:4;7402:5;7398:16;7391:75;7322:155;7540:2;7581:49;7626:3;7617:6;7606:9;7602:22;7581:49;:::i;:::-;7574:4;7567:5;7563:16;7556:75;7487:155;7731:2;7720:9;7716:18;7703:32;7762:18;7754:6;7751:30;7748:117;;;7784:79;;:::i;:::-;7748:117;7904:58;7958:3;7949:6;7938:9;7934:22;7904:58;:::i;:::-;7897:4;7890:5;7886:16;7879:84;7652:322;6896:1085;;;;:::o;8025:996::-;8148:5;8173:108;8189:91;8273:6;8189:91;:::i;:::-;8173:108;:::i;:::-;8164:117;;8301:5;8330:6;8323:5;8316:21;8364:4;8357:5;8353:16;8346:23;;8417:4;8409:6;8405:17;8397:6;8393:30;8446:3;8438:6;8435:15;8432:122;;;8465:79;;:::i;:::-;8432:122;8580:6;8563:452;8597:6;8592:3;8589:15;8563:452;;;8686:3;8673:17;8722:18;8709:11;8706:35;8703:122;;;8744:79;;:::i;:::-;8703:122;8868:11;8860:6;8856:24;8906:64;8966:3;8954:10;8906:64;:::i;:::-;8901:3;8894:77;9000:4;8995:3;8991:14;8984:21;;8639:376;;8623:4;8618:3;8614:14;8607:21;;8563:452;;;8567:21;8154:867;;8025:996;;;;;:::o;9065:424::-;9163:5;9212:3;9205:4;9197:6;9193:17;9189:27;9179:122;;9220:79;;:::i;:::-;9179:122;9337:6;9324:20;9362:121;9479:3;9471:6;9464:4;9456:6;9452:17;9362:121;:::i;:::-;9353:130;;9169:320;9065:424;;;;:::o;9495:339::-;9600:4;9690:18;9682:6;9679:30;9676:56;;;9712:18;;:::i;:::-;9676:56;9762:4;9754:6;9750:17;9742:25;;9822:4;9816;9812:15;9804:23;;9495:339;;;:::o;9877:759::-;9954:5;9998:4;9986:9;9981:3;9977:19;9973:30;9970:117;;;10006:79;;:::i;:::-;9970:117;10105:21;10121:4;10105:21;:::i;:::-;10096:30;;10193:1;10233:49;10278:3;10269:6;10258:9;10254:22;10233:49;:::i;:::-;10226:4;10219:5;10215:16;10208:75;10136:158;10362:2;10403:49;10448:3;10439:6;10428:9;10424:22;10403:49;:::i;:::-;10396:4;10389:5;10385:16;10378:75;10304:160;10527:2;10568:49;10613:3;10604:6;10593:9;10589:22;10568:49;:::i;:::-;10561:4;10554:5;10550:16;10543:75;10474:155;9877:759;;;;:::o;10681:794::-;10805:5;10830:109;10846:92;10931:6;10846:92;:::i;:::-;10830:109;:::i;:::-;10821:118;;10959:5;10988:6;10981:5;10974:21;11022:4;11015:5;11011:16;11004:23;;11075:4;11067:6;11063:17;11055:6;11051:30;11104:3;11096:6;11093:15;11090:122;;;11123:79;;:::i;:::-;11090:122;11238:6;11221:248;11255:6;11250:3;11247:15;11221:248;;;11330:3;11359:65;11420:3;11408:10;11359:65;:::i;:::-;11354:3;11347:78;11454:4;11449:3;11445:14;11438:21;;11297:172;11281:4;11276:3;11272:14;11265:21;;11221:248;;;11225:21;10811:664;;10681:794;;;;;:::o;11520:426::-;11619:5;11668:3;11661:4;11653:6;11649:17;11645:27;11635:122;;11676:79;;:::i;:::-;11635:122;11793:6;11780:20;11818:122;11936:3;11928:6;11921:4;11913:6;11909:17;11818:122;:::i;:::-;11809:131;;11625:321;11520:426;;;;:::o;11965:552::-;12022:8;12032:6;12082:3;12075:4;12067:6;12063:17;12059:27;12049:122;;12090:79;;:::i;:::-;12049:122;12203:6;12190:20;12180:30;;12233:18;12225:6;12222:30;12219:117;;;12255:79;;:::i;:::-;12219:117;12369:4;12361:6;12357:17;12345:29;;12423:3;12415:4;12407:6;12403:17;12393:8;12389:32;12386:41;12383:128;;;12430:79;;:::i;:::-;12383:128;11965:552;;;;;:::o;12523:1785::-;12743:6;12751;12759;12767;12775;12783;12791;12840:3;12828:9;12819:7;12815:23;12811:33;12808:120;;;12847:79;;:::i;:::-;12808:120;12995:1;12984:9;12980:17;12967:31;13025:18;13017:6;13014:30;13011:117;;;13047:79;;:::i;:::-;13011:117;13152:105;13249:7;13240:6;13229:9;13225:22;13152:105;:::i;:::-;13142:115;;12938:329;13334:2;13323:9;13319:18;13306:32;13365:18;13357:6;13354:30;13351:117;;;13387:79;;:::i;:::-;13351:117;13492:106;13590:7;13581:6;13570:9;13566:22;13492:106;:::i;:::-;13482:116;;13277:331;13647:2;13673:53;13718:7;13709:6;13698:9;13694:22;13673:53;:::i;:::-;13663:63;;13618:118;13775:2;13801:53;13846:7;13837:6;13826:9;13822:22;13801:53;:::i;:::-;13791:63;;13746:118;13903:3;13930:53;13975:7;13966:6;13955:9;13951:22;13930:53;:::i;:::-;13920:63;;13874:119;14060:3;14049:9;14045:19;14032:33;14092:18;14084:6;14081:30;14078:117;;;14114:79;;:::i;:::-;14078:117;14227:64;14283:7;14274:6;14263:9;14259:22;14227:64;:::i;:::-;14209:82;;;;14003:298;12523:1785;;;;;;;;;;:::o;14314:114::-;14381:6;14415:5;14409:12;14399:22;;14314:114;;;:::o;14434:184::-;14533:11;14567:6;14562:3;14555:19;14607:4;14602:3;14598:14;14583:29;;14434:184;;;;:::o;14624:132::-;14691:4;14714:3;14706:11;;14744:4;14739:3;14735:14;14727:22;;14624:132;;;:::o;14762:108::-;14839:24;14857:5;14839:24;:::i;:::-;14834:3;14827:37;14762:108;;:::o;14876:179::-;14945:10;14966:46;15008:3;15000:6;14966:46;:::i;:::-;15044:4;15039:3;15035:14;15021:28;;14876:179;;;;:::o;15061:113::-;15131:4;15163;15158:3;15154:14;15146:22;;15061:113;;;:::o;15210:732::-;15329:3;15358:54;15406:5;15358:54;:::i;:::-;15428:86;15507:6;15502:3;15428:86;:::i;:::-;15421:93;;15538:56;15588:5;15538:56;:::i;:::-;15617:7;15648:1;15633:284;15658:6;15655:1;15652:13;15633:284;;;15734:6;15728:13;15761:63;15820:3;15805:13;15761:63;:::i;:::-;15754:70;;15847:60;15900:6;15847:60;:::i;:::-;15837:70;;15693:224;15680:1;15677;15673:9;15668:14;;15633:284;;;15637:14;15933:3;15926:10;;15334:608;;;15210:732;;;;:::o;15948:118::-;16035:24;16053:5;16035:24;:::i;:::-;16030:3;16023:37;15948:118;;:::o;16072:483::-;16243:4;16281:2;16270:9;16266:18;16258:26;;16330:9;16324:4;16320:20;16316:1;16305:9;16301:17;16294:47;16358:108;16461:4;16452:6;16358:108;:::i;:::-;16350:116;;16476:72;16544:2;16533:9;16529:18;16520:6;16476:72;:::i;:::-;16072:483;;;;;:::o;16561:329::-;16620:6;16669:2;16657:9;16648:7;16644:23;16640:32;16637:119;;;16675:79;;:::i;:::-;16637:119;16795:1;16820:53;16865:7;16856:6;16845:9;16841:22;16820:53;:::i;:::-;16810:63;;16766:117;16561:329;;;;:::o;16896:169::-;16980:11;17014:6;17009:3;17002:19;17054:4;17049:3;17045:14;17030:29;;16896:169;;;;:::o;17071:182::-;17211:34;17207:1;17199:6;17195:14;17188:58;17071:182;:::o;17259:366::-;17401:3;17422:67;17486:2;17481:3;17422:67;:::i;:::-;17415:74;;17498:93;17587:3;17498:93;:::i;:::-;17616:2;17611:3;17607:12;17600:19;;17259:366;;;:::o;17631:419::-;17797:4;17835:2;17824:9;17820:18;17812:26;;17884:9;17878:4;17874:20;17870:1;17859:9;17855:17;17848:47;17912:131;18038:4;17912:131;:::i;:::-;17904:139;;17631:419;;;:::o;18056:172::-;18196:24;18192:1;18184:6;18180:14;18173:48;18056:172;:::o;18234:366::-;18376:3;18397:67;18461:2;18456:3;18397:67;:::i;:::-;18390:74;;18473:93;18562:3;18473:93;:::i;:::-;18591:2;18586:3;18582:12;18575:19;;18234:366;;;:::o;18606:419::-;18772:4;18810:2;18799:9;18795:18;18787:26;;18859:9;18853:4;18849:20;18845:1;18834:9;18830:17;18823:47;18887:131;19013:4;18887:131;:::i;:::-;18879:139;;18606:419;;;:::o;19031:180::-;19079:77;19076:1;19069:88;19176:4;19173:1;19166:15;19200:4;19197:1;19190:15;19217:180;19265:77;19262:1;19255:88;19362:4;19359:1;19352:15;19386:4;19383:1;19376:15;19403:233;19442:3;19465:24;19483:5;19465:24;:::i;:::-;19456:33;;19511:66;19504:5;19501:77;19498:103;;;19581:18;;:::i;:::-;19498:103;19628:1;19621:5;19617:13;19610:20;;19403:233;;;:::o;19642:176::-;19782:28;19778:1;19770:6;19766:14;19759:52;19642:176;:::o;19824:366::-;19966:3;19987:67;20051:2;20046:3;19987:67;:::i;:::-;19980:74;;20063:93;20152:3;20063:93;:::i;:::-;20181:2;20176:3;20172:12;20165:19;;19824:366;;;:::o;20196:419::-;20362:4;20400:2;20389:9;20385:18;20377:26;;20449:9;20443:4;20439:20;20435:1;20424:9;20420:17;20413:47;20477:131;20603:4;20477:131;:::i;:::-;20469:139;;20196:419;;;:::o;20621:172::-;20761:24;20757:1;20749:6;20745:14;20738:48;20621:172;:::o;20799:366::-;20941:3;20962:67;21026:2;21021:3;20962:67;:::i;:::-;20955:74;;21038:93;21127:3;21038:93;:::i;:::-;21156:2;21151:3;21147:12;21140:19;;20799:366;;;:::o;21171:419::-;21337:4;21375:2;21364:9;21360:18;21352:26;;21424:9;21418:4;21414:20;21410:1;21399:9;21395:17;21388:47;21452:131;21578:4;21452:131;:::i;:::-;21444:139;;21171:419;;;:::o;21596:173::-;21736:25;21732:1;21724:6;21720:14;21713:49;21596:173;:::o;21775:366::-;21917:3;21938:67;22002:2;21997:3;21938:67;:::i;:::-;21931:74;;22014:93;22103:3;22014:93;:::i;:::-;22132:2;22127:3;22123:12;22116:19;;21775:366;;;:::o;22147:419::-;22313:4;22351:2;22340:9;22336:18;22328:26;;22400:9;22394:4;22390:20;22386:1;22375:9;22371:17;22364:47;22428:131;22554:4;22428:131;:::i;:::-;22420:139;;22147:419;;;:::o;22572:173::-;22712:25;22708:1;22700:6;22696:14;22689:49;22572:173;:::o;22751:366::-;22893:3;22914:67;22978:2;22973:3;22914:67;:::i;:::-;22907:74;;22990:93;23079:3;22990:93;:::i;:::-;23108:2;23103:3;23099:12;23092:19;;22751:366;;;:::o;23123:419::-;23289:4;23327:2;23316:9;23312:18;23304:26;;23376:9;23370:4;23366:20;23362:1;23351:9;23347:17;23340:47;23404:131;23530:4;23404:131;:::i;:::-;23396:139;;23123:419;;;:::o;23548:167::-;23688:19;23684:1;23676:6;23672:14;23665:43;23548:167;:::o;23721:366::-;23863:3;23884:67;23948:2;23943:3;23884:67;:::i;:::-;23877:74;;23960:93;24049:3;23960:93;:::i;:::-;24078:2;24073:3;24069:12;24062:19;;23721:366;;;:::o;24093:419::-;24259:4;24297:2;24286:9;24282:18;24274:26;;24346:9;24340:4;24336:20;24332:1;24321:9;24317:17;24310:47;24374:131;24500:4;24374:131;:::i;:::-;24366:139;;24093:419;;;:::o;24518:178::-;24658:30;24654:1;24646:6;24642:14;24635:54;24518:178;:::o;24702:366::-;24844:3;24865:67;24929:2;24924:3;24865:67;:::i;:::-;24858:74;;24941:93;25030:3;24941:93;:::i;:::-;25059:2;25054:3;25050:12;25043:19;;24702:366;;;:::o;25074:419::-;25240:4;25278:2;25267:9;25263:18;25255:26;;25327:9;25321:4;25317:20;25313:1;25302:9;25298:17;25291:47;25355:131;25481:4;25355:131;:::i;:::-;25347:139;;25074:419;;;:::o;25499:168::-;25582:11;25616:6;25611:3;25604:19;25656:4;25651:3;25647:14;25632:29;;25499:168;;;;:::o;25695:301::-;25791:3;25812:70;25875:6;25870:3;25812:70;:::i;:::-;25805:77;;25892:43;25928:6;25923:3;25916:5;25892:43;:::i;:::-;25960:29;25982:6;25960:29;:::i;:::-;25955:3;25951:39;25944:46;;25695:301;;;;;:::o;26002:590::-;26201:4;26239:2;26228:9;26224:18;26216:26;;26288:9;26282:4;26278:20;26274:1;26263:9;26259:17;26252:47;26316:86;26397:4;26388:6;26380;26316:86;:::i;:::-;26308:94;;26449:9;26443:4;26439:20;26434:2;26423:9;26419:18;26412:48;26477:108;26580:4;26571:6;26477:108;:::i;:::-;26469:116;;26002:590;;;;;;:::o;26598:191::-;26638:4;26658:20;26676:1;26658:20;:::i;:::-;26653:25;;26692:20;26710:1;26692:20;:::i;:::-;26687:25;;26731:1;26728;26725:8;26722:34;;;26736:18;;:::i;:::-;26722:34;26781:1;26778;26774:9;26766:17;;26598:191;;;;:::o;26795:348::-;26835:7;26858:20;26876:1;26858:20;:::i;:::-;26853:25;;26892:20;26910:1;26892:20;:::i;:::-;26887:25;;27080:1;27012:66;27008:74;27005:1;27002:81;26997:1;26990:9;26983:17;26979:105;26976:131;;;27087:18;;:::i;:::-;26976:131;27135:1;27132;27128:9;27117:20;;26795:348;;;;:::o;27149:305::-;27189:3;27208:20;27226:1;27208:20;:::i;:::-;27203:25;;27242:20;27260:1;27242:20;:::i;:::-;27237:25;;27396:1;27328:66;27324:74;27321:1;27318:81;27315:107;;;27402:18;;:::i;:::-;27315:107;27446:1;27443;27439:9;27432:16;;27149:305;;;;:::o;27460:180::-;27508:77;27505:1;27498:88;27605:4;27602:1;27595:15;27629:4;27626:1;27619:15;27646:185;27686:1;27703:20;27721:1;27703:20;:::i;:::-;27698:25;;27737:20;27755:1;27737:20;:::i;:::-;27732:25;;27776:1;27766:35;;27781:18;;:::i;:::-;27766:35;27823:1;27820;27816:9;27811:14;;27646:185;;;;:::o;27837:173::-;27977:25;27973:1;27965:6;27961:14;27954:49;27837:173;:::o;28016:366::-;28158:3;28179:67;28243:2;28238:3;28179:67;:::i;:::-;28172:74;;28255:93;28344:3;28255:93;:::i;:::-;28373:2;28368:3;28364:12;28357:19;;28016:366;;;:::o;28388:419::-;28554:4;28592:2;28581:9;28577:18;28569:26;;28641:9;28635:4;28631:20;28627:1;28616:9;28612:17;28605:47;28669:131;28795:4;28669:131;:::i;:::-;28661:139;;28388:419;;;:::o;28813:114::-;28880:6;28914:5;28908:12;28898:22;;28813:114;;;:::o;28933:184::-;29032:11;29066:6;29061:3;29054:19;29106:4;29101:3;29097:14;29082:29;;28933:184;;;;:::o;29123:132::-;29190:4;29213:3;29205:11;;29243:4;29238:3;29234:14;29226:22;;29123:132;;;:::o;29261:108::-;29338:24;29356:5;29338:24;:::i;:::-;29333:3;29326:37;29261:108;;:::o;29375:179::-;29444:10;29465:46;29507:3;29499:6;29465:46;:::i;:::-;29543:4;29538:3;29534:14;29520:28;;29375:179;;;;:::o;29560:113::-;29630:4;29662;29657:3;29653:14;29645:22;;29560:113;;;:::o;29709:732::-;29828:3;29857:54;29905:5;29857:54;:::i;:::-;29927:86;30006:6;30001:3;29927:86;:::i;:::-;29920:93;;30037:56;30087:5;30037:56;:::i;:::-;30116:7;30147:1;30132:284;30157:6;30154:1;30151:13;30132:284;;;30233:6;30227:13;30260:63;30319:3;30304:13;30260:63;:::i;:::-;30253:70;;30346:60;30399:6;30346:60;:::i;:::-;30336:70;;30192:224;30179:1;30176;30172:9;30167:14;;30132:284;;;30136:14;30432:3;30425:10;;29833:608;;;29709:732;;;;:::o;30447:142::-;30542:6;30576:5;30570:12;30560:22;;30447:142;;;:::o;30595:212::-;30722:11;30756:6;30751:3;30744:19;30796:4;30791:3;30787:14;30772:29;;30595:212;;;;:::o;30813:160::-;30908:4;30931:3;30923:11;;30961:4;30956:3;30952:14;30944:22;;30813:160;;;:::o;31049:698::-;31192:4;31187:3;31183:14;31287:4;31280:5;31276:16;31270:23;31306:63;31363:4;31358:3;31354:14;31340:12;31306:63;:::i;:::-;31207:172;31470:4;31463:5;31459:16;31453:23;31489:63;31546:4;31541:3;31537:14;31523:12;31489:63;:::i;:::-;31389:173;31648:4;31641:5;31637:16;31631:23;31667:63;31724:4;31719:3;31715:14;31701:12;31667:63;:::i;:::-;31572:168;31161:586;31049:698;;:::o;31753:291::-;31878:10;31899:102;31997:3;31989:6;31899:102;:::i;:::-;32033:4;32028:3;32024:14;32010:28;;31753:291;;;;:::o;32050:141::-;32148:4;32180;32175:3;32171:14;32163:22;;32050:141;;;:::o;32271:956::-;32446:3;32475:82;32551:5;32475:82;:::i;:::-;32573:114;32680:6;32675:3;32573:114;:::i;:::-;32566:121;;32711:84;32789:5;32711:84;:::i;:::-;32818:7;32849:1;32834:368;32859:6;32856:1;32853:13;32834:368;;;32935:6;32929:13;32962:119;33077:3;33062:13;32962:119;:::i;:::-;32955:126;;33104:88;33185:6;33104:88;:::i;:::-;33094:98;;32894:308;32881:1;32878;32874:9;32869:14;;32834:368;;;32838:14;33218:3;33211:10;;32451:776;;;32271:956;;;;:::o;33233:1491::-;33722:4;33760:3;33749:9;33745:19;33737:27;;33774:71;33842:1;33831:9;33827:17;33818:6;33774:71;:::i;:::-;33892:9;33886:4;33882:20;33877:2;33866:9;33862:18;33855:48;33920:108;34023:4;34014:6;33920:108;:::i;:::-;33912:116;;34075:9;34069:4;34065:20;34060:2;34049:9;34045:18;34038:48;34103:108;34206:4;34197:6;34103:108;:::i;:::-;34095:116;;34258:9;34252:4;34248:20;34243:2;34232:9;34228:18;34221:48;34286:108;34389:4;34380:6;34286:108;:::i;:::-;34278:116;;34442:9;34436:4;34432:20;34426:3;34415:9;34411:19;34404:49;34470:164;34629:4;34620:6;34470:164;:::i;:::-;34462:172;;34644:73;34712:3;34701:9;34697:19;34688:6;34644:73;:::i;:::-;33233:1491;;;;;;;;;:::o;34730:225::-;34870:34;34866:1;34858:6;34854:14;34847:58;34939:8;34934:2;34926:6;34922:15;34915:33;34730:225;:::o;34961:366::-;35103:3;35124:67;35188:2;35183:3;35124:67;:::i;:::-;35117:74;;35200:93;35289:3;35200:93;:::i;:::-;35318:2;35313:3;35309:12;35302:19;;34961:366;;;:::o;35333:419::-;35499:4;35537:2;35526:9;35522:18;35514:26;;35586:9;35580:4;35576:20;35572:1;35561:9;35557:17;35550:47;35614:131;35740:4;35614:131;:::i;:::-;35606:139;;35333:419;;;:::o;35758:147::-;35859:11;35896:3;35881:18;;35758:147;;;;:::o;35911:114::-;;:::o;36031:398::-;36190:3;36211:83;36292:1;36287:3;36211:83;:::i;:::-;36204:90;;36303:93;36392:3;36303:93;:::i;:::-;36421:1;36416:3;36412:11;36405:18;;36031:398;;;:::o;36435:379::-;36619:3;36641:147;36784:3;36641:147;:::i;:::-;36634:154;;36805:3;36798:10;;36435:379;;;:::o;36820:169::-;36960:21;36956:1;36948:6;36944:14;36937:45;36820:169;:::o;36995:366::-;37137:3;37158:67;37222:2;37217:3;37158:67;:::i;:::-;37151:74;;37234:93;37323:3;37234:93;:::i;:::-;37352:2;37347:3;37343:12;37336:19;;36995:366;;;:::o;37367:419::-;37533:4;37571:2;37560:9;37556:18;37548:26;;37620:9;37614:4;37610:20;37606:1;37595:9;37591:17;37584:47;37648:131;37774:4;37648:131;:::i;:::-;37640:139;;37367:419;;;:::o;37792:149::-;37828:7;37868:66;37861:5;37857:78;37846:89;;37792:149;;;:::o;37947:78::-;37985:7;38014:5;38003:16;;37947:78;;;:::o;38031:153::-;38134:43;38153:23;38170:5;38153:23;:::i;:::-;38134:43;:::i;:::-;38129:3;38122:56;38031:153;;:::o;38190:98::-;38241:6;38275:5;38269:12;38259:22;;38190:98;;;:::o;38294:307::-;38362:1;38372:113;38386:6;38383:1;38380:13;38372:113;;;38471:1;38466:3;38462:11;38456:18;38452:1;38447:3;38443:11;38436:39;38408:2;38405:1;38401:10;38396:15;;38372:113;;;38503:6;38500:1;38497:13;38494:101;;;38583:1;38574:6;38569:3;38565:16;38558:27;38494:101;38343:258;38294:307;;;:::o;38607:373::-;38711:3;38739:38;38771:5;38739:38;:::i;:::-;38793:88;38874:6;38869:3;38793:88;:::i;:::-;38786:95;;38890:52;38935:6;38930:3;38923:4;38916:5;38912:16;38890:52;:::i;:::-;38967:6;38962:3;38958:16;38951:23;;38715:265;38607:373;;;;:::o;38986:407::-;39142:3;39157:73;39226:3;39217:6;39157:73;:::i;:::-;39255:1;39250:3;39246:11;39239:18;;39274:93;39363:3;39354:6;39274:93;:::i;:::-;39267:100;;39384:3;39377:10;;38986:407;;;;;:::o;39399:271::-;39529:3;39551:93;39640:3;39631:6;39551:93;:::i;:::-;39544:100;;39661:3;39654:10;;39399:271;;;;:::o;39676:169::-;39816:21;39812:1;39804:6;39800:14;39793:45;39676:169;:::o;39851:366::-;39993:3;40014:67;40078:2;40073:3;40014:67;:::i;:::-;40007:74;;40090:93;40179:3;40090:93;:::i;:::-;40208:2;40203:3;40199:12;40192:19;;39851:366;;;:::o;40223:419::-;40389:4;40427:2;40416:9;40412:18;40404:26;;40476:9;40470:4;40466:20;40462:1;40451:9;40447:17;40440:47;40504:131;40630:4;40504:131;:::i;:::-;40496:139;;40223:419;;;:::o;40648:173::-;40788:25;40784:1;40776:6;40772:14;40765:49;40648:173;:::o;40827:366::-;40969:3;40990:67;41054:2;41049:3;40990:67;:::i;:::-;40983:74;;41066:93;41155:3;41066:93;:::i;:::-;41184:2;41179:3;41175:12;41168:19;;40827:366;;;:::o;41199:419::-;41365:4;41403:2;41392:9;41388:18;41380:26;;41452:9;41446:4;41442:20;41438:1;41427:9;41423:17;41416:47;41480:131;41606:4;41480:131;:::i;:::-;41472:139;;41199:419;;;:::o;41624:164::-;41764:16;41760:1;41752:6;41748:14;41741:40;41624:164;:::o;41794:366::-;41936:3;41957:67;42021:2;42016:3;41957:67;:::i;:::-;41950:74;;42033:93;42122:3;42033:93;:::i;:::-;42151:2;42146:3;42142:12;42135:19;;41794:366;;;:::o;42166:419::-;42332:4;42370:2;42359:9;42355:18;42347:26;;42419:9;42413:4;42409:20;42405:1;42394:9;42390:17;42383:47;42447:131;42573:4;42447:131;:::i;:::-;42439:139;;42166:419;;;:::o;42591:442::-;42740:4;42778:2;42767:9;42763:18;42755:26;;42791:71;42859:1;42848:9;42844:17;42835:6;42791:71;:::i;:::-;42872:72;42940:2;42929:9;42925:18;42916:6;42872:72;:::i;:::-;42954;43022:2;43011:9;43007:18;42998:6;42954:72;:::i;:::-;42591:442;;;;;;:::o;43039:143::-;43096:5;43127:6;43121:13;43112:22;;43143:33;43170:5;43143:33;:::i;:::-;43039:143;;;;:::o;43188:351::-;43258:6;43307:2;43295:9;43286:7;43282:23;43278:32;43275:119;;;43313:79;;:::i;:::-;43275:119;43433:1;43458:64;43514:7;43505:6;43494:9;43490:22;43458:64;:::i;:::-;43448:74;;43404:128;43188:351;;;;:::o;43545:332::-;43666:4;43704:2;43693:9;43689:18;43681:26;;43717:71;43785:1;43774:9;43770:17;43761:6;43717:71;:::i;:::-;43798:72;43866:2;43855:9;43851:18;43842:6;43798:72;:::i;:::-;43545:332;;;;;:::o;43883:90::-;43917:7;43960:5;43953:13;43946:21;43935:32;;43883:90;;;:::o;43979:116::-;44049:21;44064:5;44049:21;:::i;:::-;44042:5;44039:32;44029:60;;44085:1;44082;44075:12;44029:60;43979:116;:::o;44101:137::-;44155:5;44186:6;44180:13;44171:22;;44202:30;44226:5;44202:30;:::i;:::-;44101:137;;;;:::o;44244:345::-;44311:6;44360:2;44348:9;44339:7;44335:23;44331:32;44328:119;;;44366:79;;:::i;:::-;44328:119;44486:1;44511:61;44564:7;44555:6;44544:9;44540:22;44511:61;:::i;:::-;44501:71;;44457:125;44244:345;;;;:::o;44595:229::-;44735:34;44731:1;44723:6;44719:14;44712:58;44804:12;44799:2;44791:6;44787:15;44780:37;44595:229;:::o;44830:366::-;44972:3;44993:67;45057:2;45052:3;44993:67;:::i;:::-;44986:74;;45069:93;45158:3;45069:93;:::i;:::-;45187:2;45182:3;45178:12;45171:19;;44830:366;;;:::o;45202:419::-;45368:4;45406:2;45395:9;45391:18;45383:26;;45455:9;45449:4;45445:20;45441:1;45430:9;45426:17;45419:47;45483:131;45609:4;45483:131;:::i;:::-;45475:139;;45202:419;;;:::o;45627:225::-;45767:34;45763:1;45755:6;45751:14;45744:58;45836:8;45831:2;45823:6;45819:15;45812:33;45627:225;:::o;45858:366::-;46000:3;46021:67;46085:2;46080:3;46021:67;:::i;:::-;46014:74;;46097:93;46186:3;46097:93;:::i;:::-;46215:2;46210:3;46206:12;46199:19;;45858:366;;;:::o;46230:419::-;46396:4;46434:2;46423:9;46419:18;46411:26;;46483:9;46477:4;46473:20;46469:1;46458:9;46454:17;46447:47;46511:131;46637:4;46511:131;:::i;:::-;46503:139;;46230:419;;;:::o;46655:179::-;46795:31;46791:1;46783:6;46779:14;46772:55;46655:179;:::o;46840:366::-;46982:3;47003:67;47067:2;47062:3;47003:67;:::i;:::-;46996:74;;47079:93;47168:3;47079:93;:::i;:::-;47197:2;47192:3;47188:12;47181:19;;46840:366;;;:::o;47212:419::-;47378:4;47416:2;47405:9;47401:18;47393:26;;47465:9;47459:4;47455:20;47451:1;47440:9;47436:17;47429:47;47493:131;47619:4;47493:131;:::i;:::-;47485:139;;47212:419;;;:::o;47637:99::-;47689:6;47723:5;47717:12;47707:22;;47637:99;;;:::o;47742:364::-;47830:3;47858:39;47891:5;47858:39;:::i;:::-;47913:71;47977:6;47972:3;47913:71;:::i;:::-;47906:78;;47993:52;48038:6;48033:3;48026:4;48019:5;48015:16;47993:52;:::i;:::-;48070:29;48092:6;48070:29;:::i;:::-;48065:3;48061:39;48054:46;;47834:272;47742:364;;;;:::o;48112:313::-;48225:4;48263:2;48252:9;48248:18;48240:26;;48312:9;48306:4;48302:20;48298:1;48287:9;48283:17;48276:47;48340:78;48413:4;48404:6;48340:78;:::i;:::-;48332:86;;48112:313;;;;:::o

Swarm Source

ipfs://b2a87e50507f671691bcb073c27cdbb13ef83b5888e6ee3b5f943df11c7f934c
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.