S Price: $0.484147 (+4.00%)
    /

    Contract

    0x8b56c25b0D09b3E6EA3aD706969944C724D2BE45

    Overview

    S Balance

    Sonic LogoSonic LogoSonic Logo0 S

    S Value

    $0.00

    Token Holdings

    Multichain Info

    No addresses found
    Transaction Hash
    Method
    Block
    Age
    From
    To
    Amount
    Set Approval Col...210540462025-04-19 15:51:2844 hrs ago1745077888IN
    0x8b56c25b...724D2BE45
    0 S0.0026768555
    Approve208243292025-04-18 1:54:053 days ago1744941245IN
    0x8b56c25b...724D2BE45
    0 S0.0014058355.01
    Approve206539612025-04-17 1:31:354 days ago1744853495IN
    0x8b56c25b...724D2BE45
    0 S0.0026638555.01
    Approve189305052025-04-08 12:27:5812 days ago1744115278IN
    0x8b56c25b...724D2BE45
    0 S0.0026797555.01
    Approve189300262025-04-08 12:24:3912 days ago1744115079IN
    0x8b56c25b...724D2BE45
    0 S0.0026638555.01
    Approve169887472025-03-30 10:30:1022 days ago1743330610IN
    0x8b56c25b...724D2BE45
    0 S0.0026631455.01

    Latest 1 internal transaction

    Parent Transaction Hash Block Age From To Amount
    146115482025-03-19 10:44:2833 days ago1742381068
     Contract Creation
    0 S
    Loading...
    Loading

    Similar Match Source Code
    This contract matches the deployed Bytecode of the Source Code for Contract 0xC998A3de...7126456c4
    The constructor portion of the code might be different and could alter the actual behaviour of the contract

    Contract Name:
    PrincipalToken

    Compiler Version
    v0.8.24+commit.e11b9ed9

    Optimization Enabled:
    Yes with 1 runs

    Other Settings:
    cancun EvmVersion, GNU GPLv3 license
    File 1 of 53 : PrincipalToken.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.24;
    import {FixedPointMathLib} from "solady/src/utils/FixedPointMathLib.sol";
    import {SafeTransferLib} from "solady/src/utils/SafeTransferLib.sol";
    import {DynamicArrayLib} from "solady/src/utils/DynamicArrayLib.sol";
    import {SafeCastLib} from "solady/src/utils/SafeCastLib.sol";
    import {LibString} from "solady/src/utils/LibString.sol";
    import {ECDSA} from "solady/src/utils/ECDSA.sol";
    // Interfaces
    import "../Types.sol";
    import {IHook} from "../interfaces/IHook.sol";
    import {FeeModule} from "../modules/FeeModule.sol";
    import {IRewardProxy} from "../interfaces/IRewardProxy.sol";
    import {VerifierModule} from "../modules/VerifierModule.sol";
    import {VaultInfoResolver} from "../modules/resolvers/VaultInfoResolver.sol";
    import {Factory} from "../Factory.sol";
    import {YieldToken} from "./YieldToken.sol";
    // Libraries
    import {LibRewardProxy} from "../utils/LibRewardProxy.sol";
    import {ModuleAccessor} from "../utils/ModuleAccessor.sol";
    import {TokenNameLib} from "../utils/TokenNameLib.sol";
    import {CustomRevert} from "../utils/CustomRevert.sol";
    import {LibExpiry} from "../utils/LibExpiry.sol";
    import {Events} from "../Events.sol";
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 2 of 53 : FixedPointMathLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    /// @notice Arithmetic library with operations for fixed-point numbers.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/FixedPointMathLib.sol)
    /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol)
    library FixedPointMathLib {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* CUSTOM ERRORS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev The operation failed, as the output exceeds the maximum value of uint256.
    error ExpOverflow();
    /// @dev The operation failed, as the output exceeds the maximum value of uint256.
    error FactorialOverflow();
    /// @dev The operation failed, due to an overflow.
    error RPowOverflow();
    /// @dev The mantissa is too big to fit.
    error MantissaOverflow();
    /// @dev The operation failed, due to an multiplication overflow.
    error MulWadFailed();
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 3 of 53 : SafeTransferLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeTransferLib.sol)
    /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
    /// @author Permit2 operations from (https://github.com/Uniswap/permit2/blob/main/src/libraries/Permit2Lib.sol)
    ///
    /// @dev Note:
    /// - For ETH transfers, please use `forceSafeTransferETH` for DoS protection.
    library SafeTransferLib {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* CUSTOM ERRORS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev The ETH transfer has failed.
    error ETHTransferFailed();
    /// @dev The ERC20 `transferFrom` has failed.
    error TransferFromFailed();
    /// @dev The ERC20 `transfer` has failed.
    error TransferFailed();
    /// @dev The ERC20 `approve` has failed.
    error ApproveFailed();
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 4 of 53 : DynamicArrayLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    /// @notice Library for memory arrays with automatic capacity resizing.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/DynamicArrayLib.sol)
    library DynamicArrayLib {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* STRUCTS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev Type to represent a dynamic array in memory.
    /// You can directly assign to `data`, and the `p` function will
    /// take care of the memory allocation.
    struct DynamicArray {
    uint256[] data;
    }
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* CONSTANTS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev The constant returned when the element is not found in the array.
    uint256 internal constant NOT_FOUND = type(uint256).max;
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* UINT256 ARRAY OPERATIONS */
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 5 of 53 : SafeCastLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    /// @notice Safe integer casting library that reverts on overflow.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeCastLib.sol)
    /// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeCast.sol)
    /// @dev Optimized for runtime gas for very high number of optimizer runs (i.e. >= 1000000).
    library SafeCastLib {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* CUSTOM ERRORS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev Unable to cast to the target type due to overflow.
    error Overflow();
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* UNSIGNED INTEGER SAFE CASTING OPERATIONS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev Casts `x` to a uint8. Reverts on overflow.
    function toUint8(uint256 x) internal pure returns (uint8) {
    if (x >= 1 << 8) _revertOverflow();
    return uint8(x);
    }
    /// @dev Casts `x` to a uint16. Reverts on overflow.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 6 of 53 : LibString.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    import {LibBytes} from "./LibBytes.sol";
    /// @notice Library for converting numbers into strings and other string operations.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol)
    /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibString.sol)
    ///
    /// @dev Note:
    /// For performance and bytecode compactness, most of the string operations are restricted to
    /// byte strings (7-bit ASCII), except where otherwise specified.
    /// Usage of byte string operations on charsets with runes spanning two or more bytes
    /// can lead to undefined behavior.
    library LibString {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* STRUCTS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev Goated string storage struct that totally MOGs, no cap, fr.
    /// Uses less gas and bytecode than Solidity's native string storage. It's meta af.
    /// Packs length with the first 31 bytes if <255 bytes, so it’s mad tight.
    struct StringStorage {
    bytes32 _spacer;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 7 of 53 : ECDSA.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    /// @notice Gas optimized ECDSA wrapper.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ECDSA.sol)
    /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/ECDSA.sol)
    /// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/ECDSA.sol)
    ///
    /// @dev Note:
    /// - The recovery functions use the ecrecover precompile (0x1).
    /// - As of Solady version 0.0.68, the `recover` variants will revert upon recovery failure.
    /// This is for more safety by default.
    /// Use the `tryRecover` variants if you need to get the zero address back
    /// upon recovery failure instead.
    /// - As of Solady version 0.0.134, all `bytes signature` variants accept both
    /// regular 65-byte `(r, s, v)` and EIP-2098 `(r, vs)` short form signatures.
    /// See: https://eips.ethereum.org/EIPS/eip-2098
    /// This is for calldata efficiency on smart accounts prevalent on L2s.
    ///
    /// WARNING! Do NOT directly use signatures as unique identifiers:
    /// - The recovery operations do NOT check if a signature is non-malleable.
    /// - Use a nonce in the digest to prevent replay attacks on the same contract.
    /// - Use EIP-712 for the digest to prevent replay attacks across different chains and contracts.
    /// EIP-712 also enables readable signing of typed data for better user safety.
    /// - If you need a unique hash from a signature, please use the `canonicalHash` functions.
    library ECDSA {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 8 of 53 : Types.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.24;
    import "./types/Token.sol" as TokenType;
    import "./types/FeePcts.sol" as FeePctsType;
    import "./types/ApproxValue.sol" as ApproxValueType;
    import "./types/TwoCrypto.sol" as TwoCryptoType;
    import "./types/ModuleIndex.sol" as ModuleIndexType;
    /// The `FeePcts` type is 256 bits long, and packs the following:
    ///
    /// ```
    /// | [uint176]: reserved for future use
    /// | | [uint16]: postSettlementFeePct
    /// | ↓ | [uint16]: redemptionFeePct
    /// | ↓ ↓ | [uint16]: performanceFeePct
    /// | ↓ ↓ ↓ | [uint16]: issuanceFeePct
    /// | ↓ ↓ ↓ ↓ ↓ [uint16]: splitPctBps
    /// 0x00000000000000000000000000000000000000000000AAAABBBBCCCCDDDDEEEE
    /// ```
    type FeePcts is uint256;
    using {FeePctsType.unwrap} for FeePcts global;
    /// The `ApproxValue` type represents an approximate value from off-chain sources or `Quoter` contract.
    type ApproxValue is uint256;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 9 of 53 : IHook.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.10;
    interface ISupplyHook {
    function onSupply(uint256 shares, uint256 principal, bytes calldata data) external;
    }
    interface IUniteHook {
    function onUnite(uint256 shares, uint256 principal, bytes calldata data) external;
    }
    interface IHook is ISupplyHook, IUniteHook {}
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 10 of 53 : FeeModule.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.10;
    import {SafeCastLib} from "solady/src/utils/SafeCastLib.sol";
    import {LibClone} from "solady/src/utils/LibClone.sol";
    import {FeeParameters, FeePcts} from "../Types.sol";
    import {FeePctsLib} from "../utils/FeePctsLib.sol";
    import {Errors} from "../Errors.sol";
    import {Factory} from "../Factory.sol";
    import {BaseModule} from "./BaseModule.sol";
    /// @notice FeeModule is responsible for managing fee settings
    abstract contract FeeModule is BaseModule {
    function getFeePcts() external view virtual returns (FeePcts);
    }
    /// @notice ConstantFeeModule is an implementation of FeeModule where all fees except split ratio are set once at initialization
    contract ConstantFeeModule is FeeModule {
    using SafeCastLib for uint256;
    bytes32 public constant override VERSION = "2.0.0";
    uint256 private constant MAX_FEE_BPS = 10_000;
    uint256 private constant MAX_SPLIT_RATIO_BPS = 9_500;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 11 of 53 : IRewardProxy.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.10;
    import {TokenReward} from "src/Types.sol";
    interface IRewardProxy {
    function rewardTokens() external view returns (address[] memory);
    function collectReward(address rewardProxy) external returns (TokenReward[] memory);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 12 of 53 : VerifierModule.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.10;
    import {LibClone} from "solady/src/utils/LibClone.sol";
    import {SafeTransferLib} from "solady/src/utils/SafeTransferLib.sol";
    import {FixedPointMathLib} from "solady/src/utils/FixedPointMathLib.sol";
    import {VerificationStatus} from "../Types.sol";
    import {BaseModule} from "./BaseModule.sol";
    import {PrincipalToken} from "src/tokens/PrincipalToken.sol";
    /// @notice VerifierModule is used to restrict access to certain functions based on account and deposit cap.
    /// @dev Integrators can extend this module to implement custom verification logic.
    abstract contract VerifierModule is BaseModule {
    bytes4 constant SUPPLY_SELECTOR = 0x674032b8;
    bytes4 constant SUPPLY_WITH_CALLBACK_SELECTOR = 0x5f04dfe2;
    bytes4 constant ISSUE_SELECTOR = 0xb696a6ad;
    bytes4 constant ISSUE_WITH_CALLBACK_SELECTOR = 0x6d4b055c;
    /// @dev MUST NOT revert.
    /// @dev Key points: to distinguish between verification failure and unexpected error, the function
    /// must return verification status to indicate whether the transaction is allowed or not.
    /// @dev The function MUST return VerificationStatus.Success if the transaction is allowed.
    function verify(bytes4 sig, address caller, uint256 shares, uint256 principal, address receiver)
    external
    view
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 13 of 53 : VaultInfoResolver.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.24;
    /// @title VaultInfoResolver
    /// @notice Abstract contract for resolving vault information.
    abstract contract VaultInfoResolver {
    function asset() public view virtual returns (address);
    function target() public view virtual returns (address);
    function scale() public view virtual returns (uint256);
    function assetDecimals() public view virtual returns (uint8);
    function decimals() public view virtual returns (uint8);
    function label() public pure virtual returns (bytes32);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 14 of 53 : Factory.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.24;
    import {SSTORE2} from "solady/src/utils/SSTORE2.sol";
    import {LibClone} from "solady/src/utils/LibClone.sol";
    import {LibTransient} from "solady/src/utils/LibTransient.sol";
    import {UUPSUpgradeable} from "solady/src/utils/UUPSUpgradeable.sol";
    import {EfficientHashLib} from "solady/src/utils/EfficientHashLib.sol";
    // Interfaces
    import "./Types.sol";
    import {IPoolDeployer} from "./interfaces/IPoolDeployer.sol";
    // Modules
    import {BaseModule} from "./modules/BaseModule.sol";
    import {PrincipalToken} from "./tokens/PrincipalToken.sol";
    import {AccessManager, AccessManaged} from "./modules/AccessManager.sol";
    import {VaultInfoResolver} from "./modules/resolvers/VaultInfoResolver.sol";
    // Libraries
    import {LibBlueprint} from "./utils/LibBlueprint.sol";
    import {ModuleAccessor} from "./utils/ModuleAccessor.sol";
    import {Errors} from "./Errors.sol";
    import {Events} from "./Events.sol";
    import "src/Constants.sol" as Constants;
    /// @notice Deployment Suite
    /// - Factory is responsible for deploying PrincipalToken, YT and Pool instances.
    /// - Factory is agnostic to type of AMM by supporting multiple pool deployers implementations.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 15 of 53 : YieldToken.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.24;
    import {ERC20} from "solady/src/tokens/ERC20.sol";
    import {PrincipalToken} from "./PrincipalToken.sol";
    import {TokenNameLib} from "../utils/TokenNameLib.sol";
    import {Errors} from "../Errors.sol";
    contract YieldToken is ERC20 {
    PrincipalToken public immutable i_principalToken;
    constructor(address _pt) {
    i_principalToken = PrincipalToken(_pt);
    }
    function name() public view override returns (string memory) {
    address underlying = _underlying();
    uint256 expiry = _maturity();
    return TokenNameLib.yieldTokenName(underlying, expiry);
    }
    function symbol() public view override returns (string memory) {
    address underlying = _underlying();
    uint256 expiry = _maturity();
    return TokenNameLib.yieldTokenSymbol(underlying, expiry);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 16 of 53 : LibRewardProxy.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.10;
    // https://gist.github.com/Vectorized/ebb23b2b5395b6d6aa83fc36af98a18c
    import {TokenReward} from "../Types.sol";
    library LibRewardProxy {
    function delegateCallCollectReward(address rewardProxy) internal returns (TokenReward[] memory rewards) {
    assembly {
    mstore(0x14, rewardProxy) // Store the argument.
    mstore(0x00, 0x82c97b8d000000000000000000000000) // `collectReward(address)`.
    if iszero(delegatecall(gas(), rewardProxy, 0x10, 0x24, codesize(), 0x00)) {
    mstore(0x00, 0x3f12e961) // `PrincipalToken_CollectRewardFailed()`
    revert(0x1c, 0x04)
    }
    let m := mload(0x40) // Grab the free memory pointer.
    returndatacopy(m, 0x00, returndatasize()) // Just copy all of the return data.
    let t := add(m, mload(m)) // Pointer to `rewards` in the returndata.
    let n := mload(t) // `rewards.length`.
    let r := add(t, 0x20) // Pointer to `rewards[0]` in the returndata.
    // Skip the copied data.
    // We will initialize rewards as an array of pointers into the copied data.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 17 of 53 : ModuleAccessor.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.10;
    import {SSTORE2} from "solady/src/utils/SSTORE2.sol";
    import {ModuleIndex} from "../Types.sol";
    library ModuleAccessor {
    error ModuleOutOfBounds();
    function read(address pointer) internal view returns (address[] memory m) {
    // The first 32 bytes of the data is the offset to the start of the contents of the `data`. 0x20 is expected here.
    // The contents of the `data` is an address[] array.
    bytes memory data = SSTORE2.read(pointer);
    assembly {
    m := add(data, 0x40) // Grab the encoded array
    }
    }
    /// @notice Get a module address by index.
    /// @dev Note: The module index is zero-based. Reverts with ModuleOutOfBounds if index is out of range.
    function get(address[] memory m, ModuleIndex idx) internal pure returns (address module) {
    assembly {
    if iszero(lt(idx, mload(m))) {
    mstore(0x00, 0x13bec8a3) // `ModuleOutOfBounds()`.
    revert(0x1c, 0x04)
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 18 of 53 : TokenNameLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.10;
    import {MetadataReaderLib} from "solady/src/utils/MetadataReaderLib.sol";
    import {DateTimeLib} from "solady/src/utils/DateTimeLib.sol";
    import {LibString} from "solady/src/utils/LibString.sol";
    /// @dev Inputs `expiry` that exceed maximum timestamp results in undefined behavior.
    library TokenNameLib {
    using LibString for uint256;
    string constant PY_NAME_PREFIX = "NapierV2-";
    function principalTokenName(address target, uint256 expiry) internal view returns (string memory) {
    string memory underlyingName = MetadataReaderLib.readName(target);
    return string.concat(PY_NAME_PREFIX, "PT-", underlyingName, "@", expiryToDate(expiry));
    }
    function principalTokenSymbol(address target, uint256 expiry) internal view returns (string memory) {
    string memory underlyingSymbol = MetadataReaderLib.readSymbol(target);
    return string.concat("PT-", underlyingSymbol, "@", expiryToDate(expiry));
    }
    function yieldTokenName(address target, uint256 expiry) internal view returns (string memory) {
    string memory underlyingName = MetadataReaderLib.readName(target);
    return string.concat(PY_NAME_PREFIX, "YT-", underlyingName, "@", expiryToDate(expiry));
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 19 of 53 : CustomRevert.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.0;
    /// @notice Forked from https://github.com/Uniswap/v4-core/blob/c8173143cf1e6f1c6c7b682a3563b263f149255f/src/libraries/CustomRevert.sol
    /// @title Library for reverting with custom errors efficiently
    /// @notice Contains functions for reverting with custom errors with different argument types efficiently
    /// @dev To use this library, declare `using CustomRevert for bytes4;` and replace `revert CustomError()` with
    /// `CustomError.selector.revertWith()`
    /// @dev The functions may tamper with the free memory pointer but it is fine since the call context is exited immediately
    library CustomRevert {
    /// @dev Reverts with the selector of a custom error in the scratch space
    function revertWith(bytes4 selector) internal pure {
    assembly ("memory-safe") {
    mstore(0, selector)
    revert(0, 0x04)
    }
    }
    function revertWith(bytes4 selector, uint256 value) internal pure {
    assembly ("memory-safe") {
    mstore(0, selector)
    mstore(0x04, value)
    revert(0, 0x24)
    }
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 20 of 53 : LibExpiry.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.10;
    import {EIP5095} from "../interfaces/EIP5095.sol";
    library LibExpiry {
    function isExpired(uint256 expiry) internal view returns (bool) {
    return block.timestamp >= expiry;
    }
    function isExpired(EIP5095 pt) internal view returns (bool) {
    return block.timestamp >= pt.maturity();
    }
    function isNotExpired(EIP5095 pt) internal view returns (bool) {
    return block.timestamp < pt.maturity();
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 21 of 53 : Events.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.10;
    import "./Types.sol";
    library Events {
    /// @dev `keccak256(bytes("YieldFeeAccrued(uint256)"))`.
    uint256 constant _YIELD_FEE_ACCRUED_EVENT_SIGNATURE =
    0xac693c1b946bcf3ad16baa51b744b990b94ea9c79ac71f2d1b5369a823a7d065;
    /// @dev `keccak256(bytes("YieldAccrued(address,uint256,uint256)"))`.
    uint256 constant _YIELD_ACCRUED_EVENT_SIGNATURE = 0xaced61c86c507aa3c2be43553434c6ff191ea7cbbd812491a6ae59abc99d29dc;
    /// @dev `keccak256(bytes("Supply(address,address,uint256,uint256)"))`.
    uint256 constant _SUPPLY_EVENT_SIGNATURE = 0x69a3ea8e6d6819646fbf2b98e9e8dd6d9cd343852550621038b4d72e4aa6dd37;
    /// @dev `keccak256(bytes("Unite(address,address,uint256,uint256)"))`.
    uint256 constant _UNITE_EVENT_SIGNATURE = 0xc78456d21b5d71405d0daba05157c90a4a412d7379fd21c3bc8a679b65b13b5f;
    /// @dev `keccak256(bytes("Redeem(address,address,address,uint256,uint256)"))`.
    uint256 constant _REDEEM_EVENT_SIGNATURE = 0xaee47cdf925cf525fdae94f9777ee5a06cac37e1c41220d0a8a89ed154f62d1c;
    /// @dev `keccak256(bytes("InterestCollected(address,address,address,uint256)"))`.
    uint256 constant _INTEREST_COLLECTED_EVENT_SIGNATURE =
    0x54affe52c3988f9c9e1d9d4673ffb7b398832c049d65e63b51326c89255e8529;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 22 of 53 : Errors.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.10;
    library Errors {
    error AccessManaged_Restricted();
    error Expired();
    error NotExpired();
    error PrincipalToken_NotFactory();
    error PrincipalToken_VerificationFailed(uint256 code);
    error PrincipalToken_CollectRewardFailed();
    error PrincipalToken_NotApprovedCollector();
    error PrincipalToken_OnlyYieldToken();
    error PrincipalToken_InsufficientSharesReceived();
    error PrincipalToken_UnderlyingTokenBalanceChanged();
    error PrincipalToken_Unstoppable();
    error PrincipalToken_ProtectedToken();
    error YieldToken_OnlyPrincipalToken();
    // Module
    error Module_CallFailed();
    // FeeModule
    error FeeModule_InvalidFeeParam();
    error FeeModule_SplitFeeExceedsMaximum();
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 23 of 53 : Constants.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.10;
    uint256 constant BASIS_POINTS = 10_000;
    uint256 constant WAD = 1e18;
    address constant NATIVE_ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    // Roles
    uint256 constant FEE_MANAGER_ROLE = 1 << 0;
    uint256 constant FEE_COLLECTOR_ROLE = 1 << 1;
    uint256 constant DEV_ROLE = 1 << 2;
    uint256 constant PAUSER_ROLE = 1 << 3;
    uint256 constant GOVERNANCE_ROLE = 1 << 4;
    uint256 constant CONNECTOR_REGISTRY_ROLE = 1 << 5;
    // TwoCrypto
    uint256 constant TARGET_INDEX = 0;
    uint256 constant PT_INDEX = 1;
    // Currency
    address constant WETH_ETHEREUM_MAINNET = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    // Default fee split ratio (100% to Curator)
    uint16 constant DEFAULT_SPLIT_RATIO_BPS = uint16(BASIS_POINTS);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 24 of 53 : FeePctsLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.10;
    import {FeePcts} from "../Types.sol";
    library FeePctsLib {
    uint256 private constant FEE_MASK = 0xFFFF; // 16 bits mask
    uint256 private constant SPLIT_RATIO_OFFSET = 0;
    function getSplitPctBps(FeePcts self) internal pure returns (uint16) {
    return uint16(FeePcts.unwrap(self));
    }
    function getIssuanceFeePctBps(FeePcts self) internal pure returns (uint16) {
    return uint16(FeePcts.unwrap(self) >> 16);
    }
    function getPerformanceFeePctBps(FeePcts self) internal pure returns (uint16) {
    return uint16(FeePcts.unwrap(self) >> 32);
    }
    function getRedemptionFeePctBps(FeePcts self) internal pure returns (uint16) {
    return uint16(FeePcts.unwrap(self) >> 48);
    }
    function getPostSettlementFeePctBps(FeePcts self) internal pure returns (uint16) {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 25 of 53 : YieldMathLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.24;
    import {FixedPointMathLib} from "solady/src/utils/FixedPointMathLib.sol";
    import {SafeCastLib} from "solady/src/utils/SafeCastLib.sol";
    type YieldIndex is uint128;
    /// @param maxscale The last collected YBT share price in the underlying token.
    /// @param globalIndex The accumulator of the accrued yield per YT.
    struct Snapshot {
    uint128 maxscale;
    YieldIndex globalIndex;
    }
    struct Yield {
    YieldIndex userIndex;
    uint128 accrued;
    }
    using {unwrap} for YieldIndex global;
    using {eq as ==, add as +, sub as -} for YieldIndex global;
    function unwrap(YieldIndex x) pure returns (uint128 result) {
    result = YieldIndex.unwrap(x);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 26 of 53 : RewardMathLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.24;
    import {FixedPointMathLib} from "solady/src/utils/FixedPointMathLib.sol";
    import {SafeCastLib} from "solady/src/utils/SafeCastLib.sol";
    type RewardIndex is uint128;
    /// @notice A struct to store the reward information for a user.
    /// @param userIndex The reward index when the user last accrued reward.
    /// @param accrued The accrued reward since the last time the user accrued reward.
    struct Reward {
    RewardIndex userIndex; // rewardIndex_u(t_1): the reward index when the user last accrued reward
    uint128 accrued; // r_u(t_1): the accrued reward since the last time the user accrued reward
    }
    using {unwrap} for RewardIndex global;
    using {eq as ==, add as +, sub as -} for RewardIndex global;
    function unwrap(RewardIndex x) pure returns (uint128 result) {
    result = RewardIndex.unwrap(x);
    }
    function wrap(uint128 x) pure returns (RewardIndex result) {
    result = RewardIndex.wrap(x);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 27 of 53 : EIP5095.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.0;
    /// @notice Principal tokens (zero-coupon tokens) are redeemable for a single underlying EIP-20 token at a future timestamp.
    /// https://eips.ethereum.org/EIPS/eip-5095
    interface EIP5095 {
    /// @dev We think EIP-5095 `Redeem` event lacks `by` and `principal` fields.
    /// So we emit our own `Redeem` event instead of EIP-5095 `Redeem` event.
    event Redeem(address indexed owner, address indexed receiver, uint256 underlyings);
    /// @notice The address of the underlying token used by the Principal Token for accounting, and redeeming.
    function underlying() external view returns (address);
    /// @notice The unix timestamp (uint256) at or after which Principal Tokens can be redeemed for their underlying deposit.
    function maturity() external view returns (uint256 timestamp);
    /// @notice The amount of underlying that would be exchanged for the amount of PTs provided, in an ideal scenario where all the conditions are met
            .
    /// @notice Before maturity, the amount of underlying returned is as if the PTs would be at maturity.
    /// @notice MUST NOT be inclusive of any fees that are charged against redemptions.
    /// @notice MUST NOT show any variations depending on the caller.
    /// @notice MUST NOT reflect slippage or other on-chain conditions, when performing the actual redemption.
    /// @notice MUST NOT revert unless due to integer overflow caused by an unreasonably large input.
    /// @notice MUST round down towards 0.
    /// @notice This calculation MAY NOT reflect the “per-user” price-per-principal-token, and instead should reflect the “average-user’s” price-per
            -principal-token, meaning what the average user should expect to see when exchanging to and from.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 28 of 53 : Pausable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol)
    pragma solidity ^0.8.20;
    import {Context} from "../utils/Context.sol";
    /**
    * @dev Contract module which allows children to implement an emergency stop
    * mechanism that can be triggered by an authorized account.
    *
    * This module is used through inheritance. It will make available the
    * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
    * the functions of your contract. Note that they will not be pausable by
    * simply including this module, only once the modifiers are put in place.
    */
    abstract contract Pausable is Context {
    bool private _paused;
    /**
    * @dev Emitted when the pause is triggered by `account`.
    */
    event Paused(address account);
    /**
    * @dev Emitted when the pause is lifted by `account`.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 29 of 53 : ReentrancyGuard.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    /// @notice Reentrancy guard mixin.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ReentrancyGuard.sol)
    abstract contract ReentrancyGuard {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* CUSTOM ERRORS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev Unauthorized reentrant call.
    error Reentrancy();
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* STORAGE */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev Equivalent to: `uint72(bytes9(keccak256("_REENTRANCY_GUARD_SLOT")))`.
    /// 9 bytes is large enough to avoid collisions with lower slots,
    /// but not too large to result in excessive bytecode bloat.
    uint256 private constant _REENTRANCY_GUARD_SLOT = 0x929eee149b4bd21268;
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* REENTRANCY GUARD */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 30 of 53 : ERC20.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    /// @notice Simple ERC20 + EIP-2612 implementation.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC20.sol)
    /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
    /// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol)
    ///
    /// @dev Note:
    /// - The ERC20 standard allows minting and transferring to and from the zero address,
    /// minting and transferring zero tokens, as well as self-approvals.
    /// For performance, this implementation WILL NOT revert for such actions.
    /// Please add any checks with overrides if desired.
    /// - The `permit` function uses the ecrecover precompile (0x1).
    ///
    /// If you are overriding:
    /// - NEVER violate the ERC20 invariant:
    /// the total sum of all balances must be equal to `totalSupply()`.
    /// - Check that the overridden function is actually used in the function you want to
    /// change the behavior of. Much of the code has been manually inlined for performance.
    abstract contract ERC20 {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* CUSTOM ERRORS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev The total supply has overflowed.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 31 of 53 : AccessManager.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.10;
    import {OwnableRoles} from "solady/src/auth/OwnableRoles.sol";
    import {Initializable} from "solady/src/utils/Initializable.sol";
    import {Multicallable} from "solady/src/utils/Multicallable.sol";
    import "../Constants.sol" as Constants;
    import {Errors} from "../Errors.sol";
    /// @notice Access Manager module for managing single owner and multiple roles for multiple contracts and functions.
    /// @dev Each PrincipalToken instance will have its own AccessManager instance to manage access control.
    /// @dev AccessManager is a minimal proxy implementation to reduce deployment costs.
    /// @dev Note: AccessManager must be initialized after deployment to set initial owner.
    contract AccessManager is OwnableRoles, Initializable, Multicallable {
    /// @notice Mapping of target contracts to their function selectors and roles that are allowed to call the function
    mapping(address target => mapping(bytes4 selector => uint256 roles)) private s_targets;
    /// @notice Emitted when roles are granted for a target function
    /// @param target The address of the target contract
    /// @param selector The function selector
    /// @param roles The roles being granted
    event TargetFunctionRolesGranted(address indexed target, bytes4 indexed selector, uint256 indexed roles);
    /// @notice Emitted when roles are revoked for a target function
    /// @param target The address of the target contract
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 32 of 53 : LibApproval.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.24;
    import {SafeTransferLib} from "solady/src/utils/SafeTransferLib.sol";
    abstract contract LibApproval {
    /// @dev The approval slot of (`src`, `spender`) is given by:
    /// ```
    /// mstore(0x20, spender)
    /// mstore(0x0c, _IS_APPROVED_SLOT_SEED)
    /// mstore(0x00, src)
    /// let allowanceSlot := keccak256(0x0c, 0x34)
    /// ```
    /// @dev Optimized storage slot for approval flags
    /// `mapping (address src => mapping (address spender => uint256 approved)) isApproved;`
    uint256 constant _IS_APPROVED_SLOT_SEED = 0xa8fe4407;
    /// @dev Get the approval status of the `spender` for the `src`. Return true if approved, 0 otherwise.
    function isApproved(address src, address spender) internal view returns (bool approved) {
    /// @solidity memory-safe-assembly
    assembly {
    mstore(0x20, spender)
    mstore(0x0c, _IS_APPROVED_SLOT_SEED)
    mstore(0x00, src)
    approved := sload(keccak256(0x0c, 0x34))
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 33 of 53 : LibBytes.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    /// @notice Library for byte related operations.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibBytes.sol)
    library LibBytes {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* STRUCTS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev Goated bytes storage struct that totally MOGs, no cap, fr.
    /// Uses less gas and bytecode than Solidity's native bytes storage. It's meta af.
    /// Packs length with the first 31 bytes if <255 bytes, so it’s mad tight.
    struct BytesStorage {
    bytes32 _spacer;
    }
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* CONSTANTS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev The constant returned when the `search` is not found in the bytes.
    uint256 internal constant NOT_FOUND = type(uint256).max;
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* BYTE STORAGE OPERATIONS */
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 34 of 53 : Token.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.24;
    import {ERC20} from "solady/src/tokens/ERC20.sol";
    import {Token} from "../Types.sol";
    import {NATIVE_ETH} from "../Constants.sol";
    function unwrap(Token x) pure returns (address result) {
    result = Token.unwrap(x);
    }
    function erc20(Token token) pure returns (ERC20 result) {
    result = ERC20(Token.unwrap(token));
    }
    function isNative(Token x) pure returns (bool result) {
    result = Token.unwrap(x) == NATIVE_ETH;
    }
    function isNotNative(Token x) pure returns (bool result) {
    result = Token.unwrap(x) != NATIVE_ETH;
    }
    function eq(Token token0, address token1) pure returns (bool result) {
    result = Token.unwrap(token0) == token1;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 35 of 53 : FeePcts.sol
    1
    2
    3
    4
    5
    6
    7
    8
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.24;
    import {FeePcts} from "../Types.sol";
    function unwrap(FeePcts x) pure returns (uint256 result) {
    result = FeePcts.unwrap(x);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 36 of 53 : ApproxValue.sol
    1
    2
    3
    4
    5
    6
    7
    8
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.24;
    import {ApproxValue} from "../Types.sol";
    function unwrap(ApproxValue x) pure returns (uint256 result) {
    result = ApproxValue.unwrap(x);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 37 of 53 : TwoCrypto.sol
    1
    2
    3
    4
    5
    6
    7
    8
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.24;
    import {TwoCrypto} from "../Types.sol";
    function unwrap(TwoCrypto x) pure returns (address result) {
    result = TwoCrypto.unwrap(x);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 38 of 53 : ModuleIndex.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.24;
    import {ModuleIndex, MAX_MODULES} from "../Types.sol";
    function unwrap(ModuleIndex x) pure returns (uint256 result) {
    result = ModuleIndex.unwrap(x);
    }
    /// @dev Checks if the given module index is supported by Factory.
    /// @dev Even if Factory supports the module, Principal Token instance may not support it due to the length of the array mismatch.
    function isSupportedByFactory(ModuleIndex x) pure returns (bool result) {
    result = ModuleIndex.unwrap(x) < MAX_MODULES;
    }
    function eq(ModuleIndex x, ModuleIndex y) pure returns (bool result) {
    result = ModuleIndex.unwrap(x) == ModuleIndex.unwrap(y);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 39 of 53 : LibClone.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    /// @notice Minimal proxy library.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibClone.sol)
    /// @author Minimal proxy by 0age (https://github.com/0age)
    /// @author Clones with immutable args by wighawag, zefram.eth, Saw-mon & Natalie
    /// (https://github.com/Saw-mon-and-Natalie/clones-with-immutable-args)
    /// @author Minimal ERC1967 proxy by jtriley-eth (https://github.com/jtriley-eth/minimum-viable-proxy)
    ///
    /// @dev Minimal proxy:
    /// Although the sw0nt pattern saves 5 gas over the ERC1167 pattern during runtime,
    /// it is not supported out-of-the-box on Etherscan. Hence, we choose to use the 0age pattern,
    /// which saves 4 gas over the ERC1167 pattern during runtime, and has the smallest bytecode.
    /// - Automatically verified on Etherscan.
    ///
    /// @dev Minimal proxy (PUSH0 variant):
    /// This is a new minimal proxy that uses the PUSH0 opcode introduced during Shanghai.
    /// It is optimized first for minimal runtime gas, then for minimal bytecode.
    /// The PUSH0 clone functions are intentionally postfixed with a jarring "_PUSH0" as
    /// many EVM chains may not support the PUSH0 opcode in the early months after Shanghai.
    /// Please use with caution.
    /// - Automatically verified on Etherscan.
    ///
    /// @dev Clones with immutable args (CWIA):
    /// The implementation of CWIA here is does NOT append the immutable args into the calldata
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 40 of 53 : BaseModule.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.10;
    import {LibClone} from "solady/src/utils/LibClone.sol";
    import {Initializable} from "solady/src/utils/Initializable.sol";
    import {Factory} from "../Factory.sol";
    import {AccessManager, AccessManaged} from "./AccessManager.sol";
    import {Errors} from "../Errors.sol";
    /// @dev Minimal proxy with CWIA implementation for modules. (LibClone.clone(implementation, args))
    /// args = abi.encode(principalToken, data) where data is module specific bytes-type data
    abstract contract BaseModule is AccessManaged, Initializable {
    uint256 constant CWIA_ARG_OFFSET = 0x00;
    function VERSION() external pure virtual returns (bytes32);
    function i_factory() public view returns (Factory) {
    (bool s, bytes memory ret) = i_principalToken().staticcall(abi.encodeWithSignature("i_factory()"));
    if (!s) revert Errors.Module_CallFailed();
    return Factory(abi.decode(ret, (address)));
    }
    function i_accessManager() public view override returns (AccessManager) {
    (bool s, bytes memory ret) = i_principalToken().staticcall(abi.encodeWithSignature("i_accessManager()"));
    if (!s) revert Errors.Module_CallFailed();
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 41 of 53 : SSTORE2.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    /// @notice Read and write to persistent storage at a fraction of the cost.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SSTORE2.sol)
    /// @author Saw-mon-and-Natalie (https://github.com/Saw-mon-and-Natalie)
    /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SSTORE2.sol)
    /// @author Modified from 0xSequence (https://github.com/0xSequence/sstore2/blob/master/contracts/SSTORE2.sol)
    /// @author Modified from SSTORE3 (https://github.com/Philogy/sstore3)
    library SSTORE2 {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* CONSTANTS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev The proxy initialization code.
    uint256 private constant _CREATE3_PROXY_INITCODE = 0x67363d3d37363d34f03d5260086018f3;
    /// @dev Hash of the `_CREATE3_PROXY_INITCODE`.
    /// Equivalent to `keccak256(abi.encodePacked(hex"67363d3d37363d34f03d5260086018f3"))`.
    bytes32 internal constant CREATE3_PROXY_INITCODE_HASH =
    0x21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f;
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* CUSTOM ERRORS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 42 of 53 : LibTransient.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    /// @notice Library for transient storage operations.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibTransient.sol)
    /// @author Modified from Transient Goodies by Philogy (https://github.com/Philogy/transient-goodies/blob/main/src/TransientBytesLib.sol)
    ///
    /// @dev Note: The functions postfixed with `Compat` will only use transient storage on L1.
    /// L2s are super cheap anyway.
    /// For best safety, always clear the storage after use.
    library LibTransient {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* STRUCTS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev Pointer struct to a `uint256` in transient storage.
    struct TUint256 {
    uint256 _spacer;
    }
    /// @dev Pointer struct to a `int256` in transient storage.
    struct TInt256 {
    uint256 _spacer;
    }
    /// @dev Pointer struct to a `bytes32` in transient storage.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 43 of 53 : UUPSUpgradeable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    /// @notice UUPS proxy mixin.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/UUPSUpgradeable.sol)
    /// @author Modified from OpenZeppelin
    /// (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/proxy/utils/UUPSUpgradeable.sol)
    ///
    /// @dev Note:
    /// - This implementation is intended to be used with ERC1967 proxies.
    /// See: `LibClone.deployERC1967` and related functions.
    /// - This implementation is NOT compatible with legacy OpenZeppelin proxies
    /// which do not store the implementation at `_ERC1967_IMPLEMENTATION_SLOT`.
    abstract contract UUPSUpgradeable {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* CUSTOM ERRORS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev The upgrade failed.
    error UpgradeFailed();
    /// @dev The call is from an unauthorized call context.
    error UnauthorizedCallContext();
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* IMMUTABLES */
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 44 of 53 : EfficientHashLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    /// @notice Library for efficiently performing keccak256 hashes.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/EfficientHashLib.sol)
    /// @dev To avoid stack-too-deep, you can use:
    /// ```
    /// bytes32[] memory buffer = EfficientHashLib.malloc(10);
    /// EfficientHashLib.set(buffer, 0, value0);
    /// ..
    /// EfficientHashLib.set(buffer, 9, value9);
    /// bytes32 finalHash = EfficientHashLib.hash(buffer);
    /// ```
    library EfficientHashLib {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* MALLOC-LESS HASHING OPERATIONS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev Returns `keccak256(abi.encode(v0))`.
    function hash(bytes32 v0) internal pure returns (bytes32 result) {
    /// @solidity memory-safe-assembly
    assembly {
    mstore(0x00, v0)
    result := keccak256(0x00, 0x20)
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 45 of 53 : IPoolDeployer.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.10;
    /// @notice Standard interface for deploying pools
    interface IPoolDeployer {
    function deploy(address target, address principalToken, bytes calldata initArgs)
    external
    payable
    returns (address);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 46 of 53 : LibBlueprint.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity ^0.8.10;
    import {LibBytes} from "solady/src/utils/LibBytes.sol";
    import {SafeCastLib} from "solady/src/utils/SafeCastLib.sol";
    library LibBlueprint {
    using SafeCastLib for uint256;
    error DeploymentFailed();
    error InvalidBlueprint();
    /// @dev Deploy contract from blueprint using CREATE
    /// @param _blueprint Address of the blueprint contract
    /// @return The address of the deployed contract
    function create(address _blueprint) internal returns (address) {
    return _create(_blueprint, "");
    }
    /// @dev Return address(0) if deployment fails
    function tryCreate(address _blueprint, bytes memory args) internal returns (address deployed) {
    bytes memory initcode = extractCreationCode(_blueprint);
    // Combine initcode with constructor arguments
    bytes memory deployCode = LibBytes.concat(initcode, args);
    // Deploy the contract
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 47 of 53 : MetadataReaderLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    /// @notice Library for reading contract metadata robustly.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/MetadataReaderLib.sol)
    library MetadataReaderLib {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* CONSTANTS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev Default gas stipend for contract reads. High enough for most practical use cases
    /// (able to SLOAD about 1000 bytes of data), but low enough to prevent griefing.
    uint256 internal constant GAS_STIPEND_NO_GRIEF = 100000;
    /// @dev Default string byte length limit.
    uint256 internal constant STRING_LIMIT_DEFAULT = 1000;
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* METADATA READING OPERATIONS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    // Best-effort string reading operations.
    // Should NOT revert as long as sufficient gas is provided.
    //
    // Performs the following in order:
    // 1. Returns the empty string for the following cases:
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 48 of 53 : DateTimeLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    /// @notice Library for date time operations.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/DateTimeLib.sol)
    /// @author Modified from BokkyPooBahsDateTimeLibrary (https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary)
    /// @dev
    /// Conventions:
    /// --------------------------------------------------------------------+
    /// Unit | Range | Notes |
    /// --------------------------------------------------------------------|
    /// timestamp | 0..0x1e18549868c76ff | Unix timestamp. |
    /// epochDay | 0..0x16d3e098039 | Days since 1970-01-01. |
    /// year | 1970..0xffffffff | Gregorian calendar year. |
    /// month | 1..12 | Gregorian calendar month. |
    /// day | 1..31 | Gregorian calendar day of month. |
    /// weekday | 1..7 | The day of the week (1-indexed). |
    /// --------------------------------------------------------------------+
    /// All timestamps of days are rounded down to 00:00:00 UTC.
    library DateTimeLib {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* CONSTANTS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    // Weekdays are 1-indexed, adhering to ISO 8601.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 49 of 53 : Context.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
    pragma solidity ^0.8.20;
    /**
    * @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;
    }
    function _contextSuffixLength() internal view virtual returns (uint256) {
    return 0;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 50 of 53 : OwnableRoles.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    import {Ownable} from "./Ownable.sol";
    /// @notice Simple single owner and multiroles authorization mixin.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/OwnableRoles.sol)
    ///
    /// @dev Note:
    /// This implementation does NOT auto-initialize the owner to `msg.sender`.
    /// You MUST call the `_initializeOwner` in the constructor / initializer.
    ///
    /// While the ownable portion follows
    /// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility,
    /// the nomenclature for the 2-step ownership handover may be unique to this codebase.
    abstract contract OwnableRoles is Ownable {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* EVENTS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev The `user`'s roles is updated to `roles`.
    /// Each bit of `roles` represents whether the role is set.
    event RolesUpdated(address indexed user, uint256 indexed roles);
    /// @dev `keccak256(bytes("RolesUpdated(address,uint256)"))`.
    uint256 private constant _ROLES_UPDATED_EVENT_SIGNATURE =
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 51 of 53 : Initializable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    /// @notice Initializable mixin for the upgradeable contracts.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/Initializable.sol)
    /// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/proxy/utils/Initializable.sol)
    abstract contract Initializable {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* CUSTOM ERRORS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev The contract is already initialized.
    error InvalidInitialization();
    /// @dev The contract is not initializing.
    error NotInitializing();
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* EVENTS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev Triggered when the contract has been initialized.
    event Initialized(uint64 version);
    /// @dev `keccak256(bytes("Initialized(uint64)"))`.
    bytes32 private constant _INTIALIZED_EVENT_SIGNATURE =
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 52 of 53 : Multicallable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    /// @notice Contract that enables a single call to call multiple methods on itself.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/Multicallable.sol)
    /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/Multicallable.sol)
    ///
    /// WARNING:
    /// This implementation is NOT to be used with ERC2771 out-of-the-box.
    /// https://blog.openzeppelin.com/arbitrary-address-spoofing-vulnerability-erc2771context-multicall-public-disclosure
    /// This also applies to potentially other ERCs / patterns appending to the back of calldata.
    ///
    /// We do NOT have a check for ERC2771, as we do not inherit from OpenZeppelin's context.
    /// Moreover, it is infeasible and inefficient for us to add checks and mitigations
    /// for all possible ERC / patterns appending to the back of calldata.
    ///
    /// We would highly recommend using an alternative pattern such as
    /// https://github.com/Vectorized/multicaller
    /// which is more flexible, futureproof, and safer by default.
    abstract contract Multicallable {
    /// @dev Apply `delegatecall` with the current contract to each calldata in `data`,
    /// and store the `abi.encode` formatted results of each `delegatecall` into `results`.
    /// If any of the `delegatecall`s reverts, the entire context is reverted,
    /// and the error is bubbled up.
    ///
    /// By default, this function directly returns the results and terminates the call context.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 53 of 53 : Ownable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    /// @notice Simple single owner authorization mixin.
    /// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol)
    ///
    /// @dev Note:
    /// This implementation does NOT auto-initialize the owner to `msg.sender`.
    /// You MUST call the `_initializeOwner` in the constructor / initializer.
    ///
    /// While the ownable portion follows
    /// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility,
    /// the nomenclature for the 2-step ownership handover may be unique to this codebase.
    abstract contract Ownable {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /* CUSTOM ERRORS */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
    /// @dev The caller is not authorized to call the function.
    error Unauthorized();
    /// @dev The `newOwner` cannot be the zero address.
    error NewOwnerIsZeroAddress();
    /// @dev The `pendingOwner` does not have a valid handover request.
    error NoHandoverRequest();
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Settings
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    {
    "remappings": [
    "@openzeppelin/=node_modules/@openzeppelin/",
    "forge-std/=node_modules/forge-std/",
    "halmos-cheatcodes/=node_modules/halmos-cheatcodes/",
    "solady/=node_modules/solady/"
    ],
    "optimizer": {
    "enabled": true,
    "runs": 1
    },
    "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
    },
    "outputSelection": {
    "*": {
    "*": [
    "evm.bytecode",
    "evm.deployedBytecode",
    "abi"
    ]
    }
    },
    "evmVersion": "cancun",
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Contract Security Audit

    Contract ABI

    API
    [{"inputs":[],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"AccessManaged_Restricted","type":"error"},{"inputs":[],"name":"AllowanceOverflow","type":"error"},{"inputs":[],"name":"AllowanceUnderflow","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"InsufficientAllowance","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidPermit","type":"error"},{"inputs":[],"name":"Permit2AllowanceIsFixedAtInfinity","type":"error"},{"inputs":[],"name":"PermitExpired","type":"error"},{"inputs":[],"name":"PrincipalToken_Unstoppable","type":"error"},{"inputs":[],"name":"Reentrancy","type":"error"},{"inputs":[],"name":"TotalSupplyOverflow","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"indexed":false,"internalType":"struct TokenReward[]","name":"rewards","type":"tuple[]"}],"name":"CuratorFeesCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"indexed":false,"internalType":"struct TokenReward[]","name":"rewards","type":"tuple[]"}],"name":"ProtocolFeesCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"underlyings","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"result","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"collect","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct TokenReward[]","name":"rewards","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"additionalTokens","type":"address[]"},{"internalType":"address","name":"feeReceiver","type":"address"}],"name":"collectCuratorFees","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct TokenReward[]","name":"rewards","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"additionalTokens","type":"address[]"}],"name":"collectProtocolFees","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct TokenReward[]","name":"rewards","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"collectRewards","outputs":[{"internalType":"uint256[]","name":"result","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"combine","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"combine","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"convertToPrincipal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"principal","type":"uint256"}],"name":"convertToUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reward","type":"address"}],"name":"getFeeRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reward","type":"address"}],"name":"getRewardGlobalIndex","outputs":[{"internalType":"RewardIndex","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSnapshot","outputs":[{"components":[{"internalType":"uint128","name":"maxscale","type":"uint128"},{"internalType":"YieldIndex","name":"globalIndex","type":"uint128"}],"internalType":"struct Snapshot","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reward","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"getUserReward","outputs":[{"components":[{"internalType":"RewardIndex","name":"userIndex","type":"uint128"},{"internalType":"uint128","name":"accrued","type":"uint128"}],"internalType":"struct Reward","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getUserYield","outputs":[{"components":[{"internalType":"YieldIndex","name":"userIndex","type":"uint128"},{"internalType":"uint128","name":"accrued","type":"uint128"}],"internalType":"struct Yield","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"i_accessManager","outputs":[{"internalType":"contract AccessManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"i_asset","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"i_factory","outputs":[{"internalType":"contract Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"i_resolver","outputs":[{"internalType":"contract VaultInfoResolver","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"i_yt","outputs":[{"internalType":"contract YieldToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"collector","type":"address"}],"name":"isApprovedCollector","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSettled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"issue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"issue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maturity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"maxIssue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"balanceOfOwner","type":"uint256"},{"internalType":"uint256","name":"balanceOfReceiver","type":"uint256"}],"name":"onYtTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"collector","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permitCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"previewCollect","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"principal","type":"uint256"}],"name":"previewCombine","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"principal","type":"uint256"}],"name":"previewIssue","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"principal","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewSupply","outputs":[{"internalType":"uint256","name":"principal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewUnite","outputs":[{"internalType":"uint256","name":"principal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"principal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"s_modules","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collector","type":"address"},{"internalType":"bool","name":"isApproved","type":"bool"}],"name":"setApprovalCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"modules","type":"address"}],"name":"setModules","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlying","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"unite","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"unite","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

    Deployed Bytecode

    0x608060405234801561000f575f80fd5b50600436106102d2575f3560e01c8062aa45a5146102d6578063064f853f1461030057806306fdde0314610334578063095ea7b3146103495780630a28a4771461036c5780630b5c090c1461038d578063147eefd0146103a557806318160ddd146103b85780631dc7f521146103c8578063204f83f9146103db57806323b872dd1461040157806325a8d87d14610414578063313ce567146104275780633270bb5b146104415780633644e515146104495780633f4ba83a146104515780634229abdd1461045b57806349a2c466146104ca5780634cdad506146104dd578063597fa895146104f05780635ab764ed146105035780635b5936961461056d5780635c975abb146105945780635f04dfe21461059e57806361dcf131146105b157806363851e4a146105c4578063674032b8146105d75780636d4b055c146105ea5780636f307dc3146105fd57806370a082311461062357806371b74a9914610636578063722aa7a3146106495780637ecebe001461065c57806381dddb0e1461066f578063827fd1f1146106825780638456cb59146106ce57806395832897146106d657806395d89b41146106de5780639c54297c146106e65780639cc7becf14610738578063a12ef25e1461074b578063a1818b6e1461075e578063a199bf721461077e578063a9059cbb146107a5578063b286de41146107b8578063b37257ec146107cb578063b460af94146107de578063b696a6ad146107f1578063b77b47a914610804578063ba0876521461082b578063bdffbdf61461083e578063c999d90614610851578063ce79fc3914610864578063ce96cb77146108b9578063d505accf146108cc578063d77175d2146108df578063d905777e146108f2578063db8d55f114610905578063dd62ed3e14610921578063e807aa7914610934578063f550dd3514610947578063fafe6cad1461095a578063ffa1ad741461096d575b5f80fd5b6102e96102e43660046146c1565b61097c565b6040516102f79291906146ff565b60405180910390f35b6103277f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b6040516102f79190614761565b61033c610b36565b6040516102f791906147b8565b61035c6103573660046147de565b610b47565b60405190151581526020016102f7565b61037f61037a366004614808565b610bb4565b6040519081526020016102f7565b5f54610327906201000090046001600160a01b031681565b61037f6103b3366004614808565b610ca4565b6805345cdf77eb68f44c5461037f565b61037f6103d6366004614808565b610cc3565b7f000000000000000000000000000000000000000000000000000000006853da8c61037f565b61035c61040f36600461481f565b610d73565b61037f610422366004614808565b610e2f565b61042f610e9d565b60405160ff90911681526020016102f7565b61035c610f1e565b61037f610f4b565b610459610fac565b005b6104bd61046936600461485d565b604080518082019091525f8082526020820152506001600160a01b03165f908152600460209081526040918290208251808401909352546001600160801b038082168452600160801b909104169082015290565b6040516102f79190614878565b6104596104d83660046148a9565b610fc6565b61037f6104eb366004614808565b610fd5565b61037f6104fe366004614808565b6110b8565b6104bd6105113660046148e0565b6040805180820182525f80825260209182018190526001600160a01b03948516815260068252828120939094168452918252918290208251808401909352546001600160801b038082168452600160801b909104169082015290565b6103277f00000000000000000000000000a2f2659151fe682a0627c0e1c767507dfa2d5f81565b5f5460ff1661035c565b61037f6105ac366004614950565b6110d7565b61037f6105bf36600461485d565b6112de565b6104596105d236600461485d565b611305565b61037f6105e53660046149f9565b61136e565b61037f6105f8366004614950565b611388565b7f000000000000000000000000e5da20f15420ad15de0fa650600afc998bbe3955610327565b61037f61063136600461485d565b611572565b61037f610644366004614808565b611589565b61037f610657366004614950565b61166d565b61037f61066a36600461485d565b611870565b61037f61067d3660046149f9565b611887565b6106b661069036600461485d565b6001600160a01b03165f908152600660205260409020600201546001600160801b031690565b6040516001600160801b0390911681526020016102f7565b6104596118a1565b610327611943565b61033c611967565b6040805180820182525f808252602091820152815180830183526001546001600160801b03808216808452600160801b90920481169284019283528451918252915190911691810191909152016102f7565b61037f61074636600461485d565b611973565b6102e96107593660046148e0565b611a32565b61077161076c366004614a1c565b611ce9565b6040516102f79190614a7f565b6103277f000000000000000000000000565c0f7181cdec7a54d7f598a6ccf9dc3a6e50df81565b61035c6107b33660046147de565b611dd0565b6104596107c6366004614ac2565b611e34565b61035c6107d93660046148e0565b61200f565b61037f6107ec366004614b05565b61202d565b61037f6107ff3660046149f9565b612154565b6103277f0000000000000000000000000000001afbca1e8cf82fe458b33c9954a65b987b81565b61037f610839366004614b05565b61216e565b61037f61084c366004614950565b612288565b61037f61085f366004614808565b612441565b6108a461087236600461485d565b6001600160a01b03165f908152600660205260409020600101546001600160801b0380821692600160801b9092041690565b604080519283526020830191909152016102f7565b61037f6108c736600461485d565b612525565b6104596108da366004614b52565b612545565b6104596108ed366004614bbe565b6126cd565b61037f61090036600461485d565b6127bf565b6005546001600160801b0380821691600160801b9004166108a4565b61037f61092f3660046148e0565b6127dc565b6102e9610942366004614c1f565b612820565b61037f6109553660046149f9565b6128da565b61037f61096836600461485d565b6128f4565b61037f640322e302e360dc1b81565b5f60607f0000000000000000000000000000001afbca1e8cf82fe458b33c9954a65b987b6001600160a01b031663958328976040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109ff9190614c66565b610a0881612a50565b5f7f0000000000000000000000000000001afbca1e8cf82fe458b33c9954a65b987b6001600160a01b031663b0eacef06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a899190614c66565b600580546001600160801b03808216909255600160801b90041694509050610ab38686835f612b0e565b9250610ae07f000000000000000000000000e5da20f15420ad15de0fa650600afc998bbe39558286612d90565b806001600160a01b0316336001600160a01b03167f34e4121734ea24c5a809467b9b240905cbd91636805cb1e5e36cc9f498c09a1a8686604051610b259291906146ff565b60405180910390a350509250929050565b6060610b426002612dda565b905090565b5f6001600160a01b0383166e22d473030f116ddee9f6b43ac78ba31882191517610b7857633f68539a5f526004601cfd5b82602052637f5e9f20600c52335f52816034600c2055815f52602c5160601c335f80516020614f2883398151915260205fa35060015b92915050565b5f3068929eee149b4bd212685403610bd35763ab143c065f526004601cfd5b610bdb612de5565b610be657505f919050565b604080518082019091526001546001600160801b038082168352600160801b9091041660208201525f8054610c9d9291610c3891610c32906201000090046001600160a01b0316612e0c565b90612e22565b6001600160a01b0316631143367f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c73573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c979190614c81565b84612e30565b5092915050565b5f3068929eee149b4bd212685403610be65763ab143c065f526004601cfd5b5f80610d5f7f000000000000000000000000565c0f7181cdec7a54d7f598a6ccf9dc3a6e50df6001600160a01b031663f51e181a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d489190614c81565b6001546001600160801b0316808218908210021890565b9050610d6c83825f612ec1565b9392505050565b5f8360601b6e22d473030f116ddee9f6b43ac78ba33314610dc85733602052637f5e9f208117600c526034600c208054801915610dc55780851115610dbf576313be252b5f526004601cfd5b84810382555b50505b6387a211a28117600c526020600c20805480851115610dee5763f4d678b85f526004601cfd5b84810382555050835f526020600c208381540181555082602052600c5160601c8160601c5f80516020614f08833981519152602080a3505060019392505050565b5f80610e907f000000000000000000000000565c0f7181cdec7a54d7f598a6ccf9dc3a6e50df6001600160a01b031663f51e181a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d24573d5f803e3d5ffd5b9050610d6c83825f612ef3565b5f7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610efa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b429190614c98565b5f3068929eee149b4bd212685403610f3d5763ab143c065f526004601cfd5b505f54610100900460ff1690565b5f80610f55612f0c565b905080610f6e57610f64610b36565b8051906020012090505b5f610f77612f30565b604080515f80516020614f48833981519152815260208101949094528301525046606082015230608082015260a09020919050565b610fbc610fb7611943565b612a50565b610fc4612f54565b565b610fd1338383612f9f565b5050565b5f3068929eee149b4bd212685403610ff45763ab143c065f526004601cfd5b610ffc612de5565b61100757505f919050565b604080518082019091526001546001600160801b038082168352600160801b9091041660208201525f8054610c9d929161105391610c32906201000090046001600160a01b0316612e0c565b6001600160a01b0316631143367f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561108e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110b29190614c81565b84612fc4565b5f3068929eee149b4bd2126854036110075763ab143c065f526004601cfd5b5f3068929eee149b4bd2126854036110f65763ab143c065f526004601cfd5b3068929eee149b4bd212685561110a613040565b611112612de5565b1561112757611127630407b05b60e31b613063565b5f8054611142906201000090046001600160a01b0316612e0c565b604080518082019091526001546001600160801b038082168352600160801b9091041660208201529091505f6111788382612e22565b6001600160a01b0316631143367f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d79190614c81565b90505f806111e684848b61306b565b915091505f7f00000000000000000000000000a2f2659151fe682a0627c0e1c767507dfa2d5f6001600160a01b03166370a082318a6040518263ffffffff1660e01b81526004016112379190614761565b602060405180830381865afa158015611252573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112769190614c81565b9050611284868b858c6130ce565b61128f8585846131c8565b61129a858a83613288565b5f6112a4876132c3565b90506112b485825f808e87613366565b6112c1338b8d878d6135fa565b5091955050505050505b3868929eee149b4bd21268559392505050565b5f806112e983611973565b90505f1981036112fc57505f1992915050565b610d6c81610e2f565b336001600160a01b037f0000000000000000000000000000001afbca1e8cf82fe458b33c9954a65b987b16146113455761134563090f8f0360e01b613063565b5f80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b5f610d6c838360405180602001604052805f8152506110d7565b5f3068929eee149b4bd2126854036113a75763ab143c065f526004601cfd5b3068929eee149b4bd21268556113bb613040565b6113c3612de5565b156113d8576113d8630407b05b60e31b613063565b5f80546113f3906201000090046001600160a01b0316612e0c565b604080518082019091526001546001600160801b038082168352600160801b9091041660208201529091505f6114298382612e22565b6001600160a01b0316631143367f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611464573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114889190614c81565b90505f8061149784848b613728565b915091505f7f00000000000000000000000000a2f2659151fe682a0627c0e1c767507dfa2d5f6001600160a01b03166370a082318a6040518263ffffffff1660e01b81526004016114e89190614761565b602060405180830381865afa158015611503573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115279190614c81565b905061153586848c8c6130ce565b6115408585846131c8565b61154b858a83613288565b5f611555876132c3565b905061156585825f808e87613366565b6112c1338b868e8d6135fa565b6387a211a2600c9081525f91909152602090205490565b5f3068929eee149b4bd2126854036115a85763ab143c065f526004601cfd5b6115b0613770565b156115bc57505f919050565b604080518082019091526001546001600160801b038082168352600160801b9091041660208201525f8054610c9d929161160891610c32906201000090046001600160a01b0316612e0c565b6001600160a01b0316631143367f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611643573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116679190614c81565b84613728565b5f3068929eee149b4bd21268540361168c5763ab143c065f526004601cfd5b3068929eee149b4bd21268555f80546116b3906201000090046001600160a01b0316612e0c565b604080518082019091526001546001600160801b038082168352600160801b9091041660208201529091505f6116e98382612e22565b6001600160a01b0316631143367f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611724573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117489190614c81565b90505f7f00000000000000000000000000a2f2659151fe682a0627c0e1c767507dfa2d5f6001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016117979190614761565b602060405180830381865afa1580156117b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d69190614c81565b90505f806117e585858c612fc4565b915091506117f48585836131c8565b6117ff853385613288565b5f611809876132c3565b9050611819858233875f80613366565b611826338b858e8d613788565b509095505050505050611837612de5565b801561184a57505f54610100900460ff16155b156112cb575f805461ff0019166101001790553868929eee149b4bd21268559392505050565b6338377508600c9081525f91909152602090205490565b5f610d6c838360405180602001604052805f81525061166d565b6118ac610fb7611943565b5f6118b5611943565b6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118f0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119149190614c66565b6001600160a01b03160361193b57604051633be94ab960e01b815260040160405180910390fd5b610fc46138a5565b7f000000000000000000000000912aaa74a3701a6e09cd1113d55fd683e6c2b17e90565b6060610b426003612dda565b5f61197c613770565b1561198857505f919050565b5f80546119ae906119a7906201000090046001600160a01b0316612e0c565b60026138e1565b90506001600160a01b0381166119c757505f1992915050565b604051639cc7becf60e01b81526001600160a01b03821690639cc7becf906119f3908690600401614761565b602060405180830381865afa158015611a0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d6c9190614c81565b5f60603068929eee149b4bd212685403611a535763ab143c065f526004601cfd5b3068929eee149b4bd212685582611a69816138fa565b5f8054611a84906201000090046001600160a01b0316612e0c565b604080518082019091526001546001600160801b038082168352600160801b9091041660208201529091505f611aba8382612e22565b6001600160a01b0316631143367f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611af5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b199190614c81565b90505f7f00000000000000000000000000a2f2659151fe682a0627c0e1c767507dfa2d5f6001600160a01b03166370a08231896040518263ffffffff1660e01b8152600401611b689190614761565b602060405180830381865afa158015611b83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ba79190614c81565b90505f80611bb785858c8661392f565b91509150611bc68585836131c8565b611bd1858b85613288565b6001600160a01b038a165f90815260046020526040902080546001600160801b03169055611c01338c8c856139bc565b611c0a866132c3565b9750611c1a84898c865f80613366565b5f5b88518114611c7357611c4b898281518110611c3957611c39614cb3565b60200260200101515f01518d8d6139f9565b898281518110611c5d57611c5d614cb3565b6020908102919091018101510152600101611c1c565b50611c9f7f000000000000000000000000e5da20f15420ad15de0fa650600afc998bbe39558c84612d90565b50965050505050611cae612de5565b8015611cc157505f54610100900460ff16155b15611cd5575f805461ff0019166101001790555b503868929eee149b4bd21268559250929050565b60603068929eee149b4bd212685403611d095763ab143c065f526004601cfd5b3068929eee149b4bd212685581611d1f816138fa565b846001600160401b03811115611d3757611d3761490c565b604051908082528060200260200182016040528015611d60578160200160208202803683370190505b5091505f5b808614611dba57611db18382611da28a8a86818110611d8657611d86614cb3565b9050602002016020810190611d9b919061485d565b89896139f9565b60059190911b82016020015290565b50600101611d65565b50503868929eee149b4bd2126855949350505050565b5f6387a211a2600c52335f526020600c20805480841115611df85763f4d678b85f526004601cfd5b83810382555050825f526020600c208281540181555081602052600c5160601c335f80516020614f08833981519152602080a350600192915050565b3068929eee149b4bd212685403611e525763ab143c065f526004601cfd5b3068929eee149b4bd2126855336001600160a01b037f00000000000000000000000000a2f2659151fe682a0627c0e1c767507dfa2d5f1614611e9e57611e9e632a15dec960e01b613063565b5f8054611eb9906201000090046001600160a01b0316612e0c565b604080518082019091526001546001600160801b038082168352600160801b9091041660208201529091505f611eef8382612e22565b6001600160a01b0316631143367f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f4e9190614c81565b5f805491925090610100900460ff16611f7057611f6b8260201c90565b611f7a565b611f7a8260401c90565b61ffff1690505f611f8b8483613aa1565b9050611f988484836131c8565b611fa3848a89613288565b611fae848988613288565b50505f611fba846132c3565b9050611fca82828a898b8a613366565b50505050611fd6612de5565b8015611fe957505f54610100900460ff16155b15611ffd575f805461ff0019166101001790555b3868929eee149b4bd212685550505050565b602081905263a8fe4407600c9081525f838152603490912054610d6c565b5f3068929eee149b4bd21268540361204c5763ab143c065f526004601cfd5b3068929eee149b4bd2126855612060612de5565b6120745761207463d0404f8560e01b613063565b604080518082019091526001546001600160801b038082168352600160801b9091041660208201525f80546120bd908290610c32906201000090046001600160a01b0316612e0c565b6001600160a01b0316631143367f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061211c9190614c81565b90505f8061212b84848a612e30565b9150915061213a8484836131c8565b6121473387898b86613b6c565b5092505050611837612de5565b5f610d6c838360405180602001604052805f815250611388565b5f3068929eee149b4bd21268540361218d5763ab143c065f526004601cfd5b3068929eee149b4bd21268556121a1612de5565b6121b5576121b563d0404f8560e01b613063565b604080518082019091526001546001600160801b038082168352600160801b9091041660208201525f80546121fe908290610c32906201000090046001600160a01b0316612e0c565b6001600160a01b0316631143367f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612239573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061225d9190614c81565b90505f8061226c84848a612fc4565b9150915061227b8484836131c8565b612147338789858c613b6c565b5f3068929eee149b4bd2126854036122a75763ab143c065f526004601cfd5b3068929eee149b4bd21268555f80546122ce906201000090046001600160a01b0316612e0c565b604080518082019091526001546001600160801b038082168352600160801b9091041660208201529091505f6123048382612e22565b6001600160a01b0316631143367f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561233f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123639190614c81565b90505f7f00000000000000000000000000a2f2659151fe682a0627c0e1c767507dfa2d5f6001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016123b29190614761565b602060405180830381865afa1580156123cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123f19190614c81565b90505f8061240085858c612e30565b9150915061240f8585836131c8565b61241a853385613288565b5f612424876132c3565b9050612434858233875f80613366565b611826338b8d868d613788565b5f3068929eee149b4bd2126854036124605763ab143c065f526004601cfd5b612468613770565b1561247457505f919050565b604080518082019091526001546001600160801b038082168352600160801b9091041660208201525f8054610c9d92916124c091610c32906201000090046001600160a01b0316612e0c565b6001600160a01b0316631143367f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061251f9190614c81565b8461306b565b5f61252e612de5565b61253957505f919050565b610bae6103d683611572565b6001600160a01b0386166e22d473030f116ddee9f6b43ac78ba3188519151761257557633f68539a5f526004601cfd5b5f61257e612f0c565b9050806125975761258d610b36565b8051906020012090505b5f6125a0612f30565b9050854211156125b757631a15a3cc5f526004601cfd5b6040518960601b60601c99508860601b60601c985065383775081901600e52895f526020600c2080545f80516020614f48833981519152835284602084015283604084015246606084015230608084015260a08320602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c983528b60208401528a60408401528960608401528060808401528860a084015260c08320604e526042602c205f528760ff16602052866040528560605260208060805f60015afa8c3d511461268c5763ddafbaef5f526004601cfd5b0190556303faf4f960a51b89176040526034602c20889055888a5f80516020614f28833981519152602060608501a360405250505f60605250505050505050565b834211156126e257631a15a3cc5f526004601cfd5b5f6126ec87611870565b90505f6126f7610f4b565b90505f6040517fabaa81be0e21ab93788e05cd5409517fd2908fd1c16213aab992c623ac2cf0a4815289602082015288604082015283606082015287608082015260a08120905061190160301b5f5282601a5280603a5250604260182090505f603a525f61276782888888613bd0565b9050896001600160a01b0316816001600160a01b0316146127925761279263ddafbaef60e01b613063565b6338377508600c52895f52600184016020600c20556127b38a8a6001612f9f565b50505050505050505050565b5f6127c8612de5565b6127d357505f919050565b610bae82611572565b5f6e22d473030f116ddee9f6b43ac78ba2196001600160a01b0383160161280557505f19610bae565b50602052637f5e9f20600c9081525f91909152603490205490565b5f606061282e610fb7611943565b600580546001600160801b031981169091556001600160801b031691506128588585856001612b0e565b90506128857f000000000000000000000000e5da20f15420ad15de0fa650600afc998bbe39558484612d90565b826001600160a01b0316336001600160a01b03167f0562ba6de49a83ceb76e48ca97646748a8b943775cb1141dae72fbde60713a5884846040516128ca9291906146ff565b60405180910390a3935093915050565b5f610d6c838360405180602001604052805f815250612288565b5f3068929eee149b4bd2126854036129135763ab143c065f526004601cfd5b604080518082019091526001546001600160801b038082168352600160801b9091041660208201525f8054610c9d929161295f91610c32906201000090046001600160a01b0316612e0c565b6001600160a01b0316631143367f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561299a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129be9190614c81565b6040516370a0823160e01b815285906001600160a01b037f00000000000000000000000000a2f2659151fe682a0627c0e1c767507dfa2d5f16906370a0823190612a0c908490600401614761565b602060405180830381865afa158015612a27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a4b9190614c81565b61392f565b6001600160a01b03811663b70096133330612a6e60045f3681614cc7565b612a7791614cee565b60405160e085901b6001600160e01b031990811682526001600160a01b039485166004830152929093166024840152166044820152606401602060405180830381865afa158015612aca573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aee9190614d1e565b612b0b57604051630804ee0360e11b815260040160405180910390fd5b50565b6060805f612b3a6001612b345f60029054906101000a90046001600160a01b0316612e0c565b906138e1565b90506001600160a01b03811615612bb057806001600160a01b031663c2b18aa06040518163ffffffff1660e01b81526004015f60405180830381865afa158015612b86573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bad9190810190614d39565b91505b8151612bbc8782614df9565b6001600160401b03811115612bd357612bd361490c565b604051908082528060200260200182016040528015612c1757816020015b604080518082019091525f8082526020820152815260200190600190039081612bf15790505b5093505f5b84518114612d84575f828210612c5a578989848403818110612c4057612c40614cb3565b9050602002016020810190612c55919061485d565b612c66565b6020600583901b860101515b6001600160a01b0381165f9081526006602052604090208751919250908290889085908110612c9757612c97614cb3565b60209081029190910101516001600160a01b0390911690528715612cff57600181015487516001600160801b0390911690889085908110612cda57612cda614cb3565b60209081029190910181015101526001810180546001600160801b0319169055612d52565b8060010160109054906101000a90046001600160801b03166001600160801b0316878481518110612d3257612d32614cb3565b60209081029190910181015101526001810180546001600160801b031690555b612d7a828a898681518110612d6957612d69614cb3565b602002602001015160200151612d90565b5050600101612c1c565b50505050949350505050565b816014528060345263a9059cbb60601b5f5260205f604460105f875af18060015f511416612dd057803d853b151710612dd0576390b8ec185f526004601cfd5b505f603452505050565b6060610bae82613c15565b7f000000000000000000000000000000000000000000000000000000006853da8c42101590565b60605f612e1883613c7b565b6040019392505050565b602090810291909101015190565b5f805481908190610100900460ff16612e5257612e4d8560201c90565b612e5c565b612e5c8560401c90565b61ffff1690505f612e6d8783613aa1565b90505f612e8786612e7e8960301c90565b61ffff16613ca7565b9050612ea8612e968288614df9565b89516001600160801b03166001612ef3565b9450612eb48183614df9565b9350505050935093915050565b5f612ee682612ed08686613cb5565b612eda8787613cff565b81189115919091021890565b949350505050565b505050565b5f612ee682612f028686613d41565b612eda8787613d77565b7fba49d6273554ebffef990dae3d74fefbcb632c3df76b4d619fa1eca00e956d8890565b7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc690565b612f5c613da6565b5f805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051612f959190614761565b60405180910390a1565b602082905263a8fe4407600c9081525f84905260349020819055612eee838383613dc8565b5f805481908190610100900460ff16612fe657612fe18560201c90565b612ff0565b612ff08560401c90565b61ffff1690505f6130018783613aa1565b905061301a85885f01516001600160801b03165f612ec1565b93505f6130348561302b8960301c90565b61ffff16613e03565b9050612ea88186614e0c565b5f5460ff1615610fc45760405163d93c066560e01b815260040160405180910390fd5b805f5260045ffd5b5f805f6130858661307c8760201c90565b61ffff16613aa1565b90505f6130968561302b8860101c90565b90506130b66130a58287614e0c565b88516001600160801b03165f612ef3565b93506130c28183614df9565b92505050935093915050565b5f6130da8560026138e1565b90506001600160a01b0381166130f057506131c2565b604051635dd6ca8760e01b81525f80356001600160e01b031916600483015233602483015260448201869052606482018590526001600160a01b038481166084840152909190831690635dd6ca879060a401602060405180830381865afa15801561315d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131819190614e1f565b9050600181600481111561319757613197614e3d565b146131bf576131bf8160048111156131b1576131b1614e3d565b6309a88d2360e31b90613e1a565b50505b50505050565b5f6127106131da61ffff851684614e51565b6131e49190614e68565b845160208601516001600160801b03908116600160801b02918116919091176001556005549192506132219161321c91849116614df9565b613e26565b600580546001600160801b0319166001600160801b039283161790819055613262918391613258918691600160801b900416614df9565b61321c9190614e0c565b600580546001600160801b03928316600160801b0292169190911790556131c282613e3e565b5f61329a600485602001518585613e69565b90506131c283826132b587602001516001600160801b031690565b6001600160801b0316613f0e565b60605f6132d18360016138e1565b90506001600160a01b0381166132e75750919050565b5f6133127f000000000000000000000000e5da20f15420ad15de0fa650600afc998bbe395530613f48565b905061331d82613f72565b92508061334a7f000000000000000000000000e5da20f15420ad15de0fa650600afc998bbe395530613f48565b1461335f5761335f6326668c8b60e21b613063565b5050919050565b5f7f00000000000000000000000000a2f2659151fe682a0627c0e1c767507dfa2d5f6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133e79190614c81565b5f805491925061010090910460ff16905b875181146135ef575f60065f8a848151811061341657613416614cb3565b60200260200101515f01516001600160a01b03166001600160a01b031681526020019081526020015f2090508215613550575f6134538b60401c90565b61ffff1690505f8a848151811061346c5761346c614cb3565b60200260200101516020015190505f6134888284612710614020565b90505f6127108e61349d9061ffff1684614e51565b6134a79190614e68565b60018601549091506001600160801b0380821691600160801b9004166134cd8486614e0c565b8f89815181106134df576134df614cb3565b60209081029190910181015101526134fa61321c8484614df9565b6001880180546001600160801b0319166001600160801b039290921691909117905561352a836132588684614df9565b6001880180546001600160801b03928316600160801b0292169190911790555050505050505b5f61358f826002015f9054906101000a90046001600160801b0316868c868151811061357e5761357e614cb3565b60200260200101516020015161404d565b506002830180546001600160801b0319166001600160801b03831617905590506001600160a01b038916156135ca576135ca82828b8b6140b8565b6001600160a01b038716156135e5576135e5828289896140b8565b50506001016133f8565b505050505050505050565b5f836136267f000000000000000000000000e5da20f15420ad15de0fa650600afc998bbe395530613f48565b6136309190614df9565b905061363e86868686614181565b8151156136b15761364f85846141bf565b6040516393a4c94d60e01b81526001600160a01b038716906393a4c94d9061367f90879087908790600401614e87565b5f604051808303815f87803b158015613696575f80fd5b505af11580156136a8573d5f803e3d5ffd5b505050506136e7565b6136dd7f000000000000000000000000e5da20f15420ad15de0fa650600afc998bbe3955873087614240565b6136e785846141bf565b806137127f000000000000000000000000e5da20f15420ad15de0fa650600afc998bbe395530613f48565b10156131bf576131bf63ef5ab5eb60e01b613063565b5f805f6137398661307c8760201c90565b905061375384875f01516001600160801b03166001612ec1565b92505f61376484612e7e8860101c90565b90506130b68185614df9565b5f613779612de5565b80610b425750505f5460ff1690565b61379485858585614299565b6137bf7f000000000000000000000000e5da20f15420ad15de0fa650600afc998bbe39558585612d90565b80511561382457604051630ba3359b60e41b81526001600160a01b0386169063ba3359b0906137f690869086908690600401614e87565b5f604051808303815f87803b15801561380d575f80fd5b505af115801561381f573d5f803e3d5ffd5b505050505b61382e85836142d7565b604051632770a7eb60e21b81526001600160a01b037f00000000000000000000000000a2f2659151fe682a0627c0e1c767507dfa2d5f1690639dc29fac9061387c9088908690600401614eae565b5f604051808303815f87803b158015613893575f80fd5b505af11580156135ef573d5f803e3d5ffd5b6138ad613040565b5f805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612f883390565b5f8251821015610bae5750602090810291909101015190565b336001600160a01b0382161480159061391a5750613918813361200f565b155b15612b0b57612b0b63194c285560e31b613063565b5f805481908190610100900460ff166139515761394c8660201c90565b61395b565b61395b8660401c90565b61ffff16905061396b8782613aa1565b915061397e600488602001518787614338565b6001600160a01b0386165f908152600460205260409020546139b09190600160801b90046001600160801b0316614df9565b92505094509492505050565b805f525f1960601c8281168482168683167f54affe52c3988f9c9e1d9d4673ffb7b398832c049d65e63b51326c89255e852960205fa45050505050565b5f7f000000000000000000000000e5da20f15420ad15de0fa650600afc998bbe39556001600160a01b0316846001600160a01b031603613a4357613a43630555489160e01b613063565b506001600160a01b038084165f90815260066020908152604080832093851683529290522080546001600160801b038082168355600160801b9091041690613a8e3385858886614371565b613a99858584612d90565b509392505050565b5f612ee6837f000000000000000000000000565c0f7181cdec7a54d7f598a6ccf9dc3a6e50df6001600160a01b031663f51e181a613ae66805345cdf77eb68f44c5490565b7f00000000000000000000000000a2f2659151fe682a0627c0e1c767507dfa2d5f6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b669190614c81565b876143b5565b613b798584868585614490565b336001600160a01b03851614613b9457613b948433836144d2565b613b9e84826142d7565b613bc97f000000000000000000000000e5da20f15420ad15de0fa650600afc998bbe39558484612d90565b5050505050565b5f604051855f5260ff851660205283604052826060526020600160805f60015afa5191503d613c0657638baa579f5f526004601cfd5b5f606052604052949350505050565b60405181546020820190600881901c5f8260ff841714613c4357505080825260ff8116601f80821115613c65575b855f5260205f205b8160051c81015482860152602082019150828210613c4b57505b508084525f920191825250602001604052919050565b60405164ffffffffff5f19833b0116602181015f601f8401853c80825260408201810160405250919050565b5f610d6c8383612710614020565b5f7812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f2283108202613ce557637c5f487d5f526004601cfd5b50670de0b6b3a76400009190910281810615159190040190565b5f7812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f2283108202613d2f57637c5f487d5f526004601cfd5b50670de0b6b3a7640000919091020490565b8181028181048314613d60578115613d605763bac65e5b5f526004601cfd5b670de0b6b3a7640000808206151591040192915050565b5f815f1904831115613d96578115613d965763bac65e5b5f526004601cfd5b50670de0b6b3a764000091020490565b5f5460ff16610fc457604051638dfc202b60e01b815260040160405180910390fd5b8015155f525f1960601c8281168482167fa3b5109b351b1b1c9b05310b3176941fadf2a0c23d9bd59f5107f23d888202af60205fa350505050565b5f610d6c8383613e1561271082614df9565b614020565b815f528060045260245ffd5b5f600160801b8210613e3a57613e3a614533565b5090565b805f527fac693c1b946bcf3ad16baa51b744b990b94ea9c79ac71f2d1b5369a823a7d06560205fa150565b5f613e7685858585614338565b9050613e8181613e26565b6001600160a01b0384165f9081526020879052604090208054601090613eb8908490600160801b90046001600160801b0316614ec7565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03949094165f90815260209690965250604090942080546001600160801b031916939092169290921790555090565b815f52806020525f1960601c8381167faced61c86c507aa3c2be43553434c6ff191ea7cbbd812491a6ae59abc99d29dc60405fa250505050565b5f816014526370a0823160601b5f5260208060246010865afa601f3d111660205102905092915050565b6060816014526382c97b8d60601b5f525f3860246010855af4613f9c57633f12e9615f526004601cfd5b6040513d5f823e8051810180516020820191503d8301808260061b84011160203d1017845160401c1715613fce575f38fd5b8115614017578181526020810193508160051b84016040528094505f5b8060061b8401805160a01c15613fff575f38fd5b808260051b87015250600181019050828103613feb57505b50505050919050565b8282028315848204841417820261403e5763ad251c275f526004601cfd5b81810615159190040192915050565b5f80835f036140605750839050816140b0565b6140768561407161321c8688613cff565b614540565b91506140a384614095614089858961455d565b6001600160801b031690565b6001600160801b0316613d77565b6140ad9084614e0c565b90505b935093915050565b6001600160a01b0382165f908152602085905260408120546001600160801b0316906140e883614095878561455d565b90506140f381613e26565b6001600160a01b0385165f908152602088905260409020805460109061412a908490600160801b90046001600160801b0316614ec7565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03959095165f9081526020979097525050604090942080546001600160801b031916939092169290921790555050565b815f52806020525f1960601c8381168582167f69a3ea8e6d6819646fbf2b98e9e8dd6d9cd343852550621038b4d72e4aa6dd3760405fa35050505050565b6141c98282614577565b6040516340c10f1960e01b81526001600160a01b037f00000000000000000000000000a2f2659151fe682a0627c0e1c767507dfa2d5f16906340c10f19906142179085908590600401614eae565b5f604051808303815f87803b15801561422e575f80fd5b505af11580156131bf573d5f803e3d5ffd5b60405181606052826040528360601b602c526323b872dd60601b600c5260205f6064601c5f895af18060015f51141661428b57803d873b15171061428b57637939f4245f526004601cfd5b505f60605260405250505050565b815f52806020525f1960601c8381168582167fc78456d21b5d71405d0daba05157c90a4a412d7379fd21c3bc8a679b65b13b5f60405fa35050505050565b6387a211a2600c52815f526020600c208054808311156142fe5763f4d678b85f526004601cfd5b82900390556805345cdf77eb68f44c805482900390555f8181526001600160a01b0383165f80516020614f08833981519152602083a35050565b6001600160a01b0382165f908152602085905260408120546001600160801b031661436783614095878461455d565b9695505050505050565b5f1960601c8281165f52816020528381168582168783167fc295ddd3f2581ded7ee79ef613567c637f9eabc1c1cf6c107bffaf63461614aa60405fa4505050505050565b5f805f885f01516001600160801b031690505f61442989896040518163ffffffff1660e01b8152600401602060405180830381865afa1580156143fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061441e9190614c81565b838110818518021890565b9050614437828289886145e0565b909450925061444581613e26565b6001600160801b03168a525f86900361445f575050614485565b6144748a6020015161407161321c878a613cff565b6001600160801b031660208b015250505b965096945050505050565b815f52806020525f1960601c8381168582168783167faee47cdf925cf525fdae94f9777ee5a06cac37e1c41220d0a8a89ed154f62d1c60405fa4505050505050565b6e22d473030f116ddee9f6b43ac78ba2196001600160a01b038316016144f757505050565b81602052637f5e9f20600c52825f526034600c208054801915613bc95780831115614529576313be252b5f526004601cfd5b9190910390555050565b6335278d125f526004601cfd5b5f610d6c61455a6001600160801b03848116908616614ec7565b90565b5f610d6c61455a6001600160801b03848116908616614ee7565b6805345cdf77eb68f44c548181018181101561459a5763e5cfe9575f526004601cfd5b806805345cdf77eb68f44c5550506387a211a2600c52815f526020600c208181540181555080602052600c5160601c5f5f80516020614f08833981519152602080a35050565b5f80855f036145f357505f90508061461a565b5f6145ff878787614623565b905061460e8185612710614020565b91506139b08282614e0c565b94509492505050565b5f82841061463257505f610d6c565b835f0361464057505f610d6c565b61464a8385614e51565b6146548585614e0c565b61465e9084614e51565b61467090670de0b6b3a7640000614e51565b612ee69190614e68565b5f8083601f84011261468a575f80fd5b5081356001600160401b038111156146a0575f80fd5b6020830191508360208260051b85010111156146ba575f80fd5b9250929050565b5f80602083850312156146d2575f80fd5b82356001600160401b038111156146e7575f80fd5b6146f38582860161467a565b90969095509350505050565b5f60408083018584526020604060208601528186518084526060870191506020880193505f5b8181101561475357845180516001600160a01b03168452840151848401529383019391850191600101614725565b509098975050505050505050565b6001600160a01b0391909116815260200190565b5f81518084525f5b818110156147995760208185018101518683018201520161477d565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610d6c6020830184614775565b6001600160a01b0381168114612b0b575f80fd5b5f80604083850312156147ef575f80fd5b82356147fa816147ca565b946020939093013593505050565b5f60208284031215614818575f80fd5b5035919050565b5f805f60608486031215614831575f80fd5b833561483c816147ca565b9250602084013561484c816147ca565b929592945050506040919091013590565b5f6020828403121561486d575f80fd5b8135610d6c816147ca565b60408101610bae828480516001600160801b03908116835260209182015116910152565b8015158114612b0b575f80fd5b5f80604083850312156148ba575f80fd5b82356148c5816147ca565b915060208301356148d58161489c565b809150509250929050565b5f80604083850312156148f1575f80fd5b82356148fc816147ca565b915060208301356148d5816147ca565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156149485761494861490c565b604052919050565b5f805f60608486031215614962575f80fd5b83359250602080850135614975816147ca565b925060408501356001600160401b0380821115614990575f80fd5b818701915087601f8301126149a3575f80fd5b8135818111156149b5576149b561490c565b6149c7601f8201601f19168501614920565b915080825288848285010111156149dc575f80fd5b80848401858401375f848284010152508093505050509250925092565b5f8060408385031215614a0a575f80fd5b8235915060208301356148d5816147ca565b5f805f8060608587031215614a2f575f80fd5b84356001600160401b03811115614a44575f80fd5b614a508782880161467a565b9095509350506020850135614a64816147ca565b91506040850135614a74816147ca565b939692955090935050565b602080825282518282018190525f9190848201906040850190845b81811015614ab657835183529284019291840191600101614a9a565b50909695505050505050565b5f805f8060808587031215614ad5575f80fd5b8435614ae0816147ca565b93506020850135614af0816147ca565b93969395505050506040820135916060013590565b5f805f60608486031215614b17575f80fd5b833592506020840135614b29816147ca565b91506040840135614b39816147ca565b809150509250925092565b60ff81168114612b0b575f80fd5b5f805f805f805f60e0888a031215614b68575f80fd5b8735614b73816147ca565b96506020880135614b83816147ca565b955060408801359450606088013593506080880135614ba181614b44565b9699959850939692959460a0840135945060c09093013592915050565b5f805f805f8060c08789031215614bd3575f80fd5b8635614bde816147ca565b95506020870135614bee816147ca565b9450604087013593506060870135614c0581614b44565b9598949750929560808101359460a0909101359350915050565b5f805f60408486031215614c31575f80fd5b83356001600160401b03811115614c46575f80fd5b614c528682870161467a565b9094509250506020840135614b39816147ca565b5f60208284031215614c76575f80fd5b8151610d6c816147ca565b5f60208284031215614c91575f80fd5b5051919050565b5f60208284031215614ca8575f80fd5b8151610d6c81614b44565b634e487b7160e01b5f52603260045260245ffd5b5f8085851115614cd5575f80fd5b83861115614ce1575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015614d165780818660040360031b1b83161692505b505092915050565b5f60208284031215614d2e575f80fd5b8151610d6c8161489c565b5f6020808385031215614d4a575f80fd5b82516001600160401b0380821115614d60575f80fd5b818501915085601f830112614d73575f80fd5b815181811115614d8557614d8561490c565b8060051b9150614d96848301614920565b8181529183018401918481019088841115614daf575f80fd5b938501935b83851015614dd95784519250614dc9836147ca565b8282529385019390850190614db4565b98975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610bae57610bae614de5565b81810381811115610bae57610bae614de5565b5f60208284031215614e2f575f80fd5b815160058110610d6c575f80fd5b634e487b7160e01b5f52602160045260245ffd5b8082028115828204841417610bae57610bae614de5565b5f82614e8257634e487b7160e01b5f52601260045260245ffd5b500490565b838152826020820152606060408201525f614ea56060830184614775565b95945050505050565b6001600160a01b03929092168252602082015260400190565b6001600160801b03818116838216019080821115610c9d57610c9d614de5565b6001600160801b03828116828216039080821115610c9d57610c9d614de556feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400fa2646970667358221220ae817a6e576e78f77be7d1068f3caccb55e0d3d184566deda1586c9ebf0cfabc64736f6c63430008180033

    Deployed Bytecode Sourcemap

    6204:44094:36:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44610:594;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;7534:30;;;;;;;;;;;;:::i;48223:113::-;;;:::i;:::-;;;;;;;:::i;8175:1029:4:-;;;;;;:::i;:::-;;:::i;:::-;;;3224:14:53;;3217:22;3199:41;;3187:2;3172:18;8175:1029:4;3059:187:53;39467:287:36;;;;;;:::i;:::-;;:::i;:::-;;;3582:25:53;;;3570:2;3555:18;39467:287:36;3436:177:53;8058:24:36;;;;;;;;-1:-1:-1;;;;;8058:24:36;;;38648:244;;;;;;:::i;:::-;;:::i;6907:195:4:-;7067:18;7061:25;6907:195;;40049:253:36;;;;;;:::i;:::-;;:::i;48133:84::-;48202:8;48133:84;;11165:4753:4;;;;;;:::i;:::-;;:::i;40308:245:36:-;;;;;;:::i;:::-;;:::i;48469:99::-;;;:::i;:::-;;;4459:4:53;4447:17;;;4429:36;;4417:2;4402:18;48469:99:36;4287:184:53;48685:102:36;;;:::i;21458:737:4:-;;;:::i;47677:66:36:-;;;:::i;:::-;;42043:117;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;42134:19:36;;;;;:12;:19;;;;;;;;;42127:26;;;;;;;;;-1:-1:-1;;;;;42127:26:36;;;;;-1:-1:-1;;;42127:26:36;;;;;;;;;42043:117;;;;;;;;:::i;24405:148::-;;;;;;:::i;:::-;;:::i;39760:283::-;;;;;;:::i;:::-;;:::i;38898:248::-;;;;;;:::i;:::-;;:::i;42351:158::-;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;42460:23:36;;;;;:15;:23;;;;;:42;;;;;;;;;;;;;42453:49;;;;;;;;;-1:-1:-1;;;;;42453:49:36;;;;;-1:-1:-1;;;42453:49:36;;;;;;;;;42351:158;7310:32;;;;;1850:84:1;1897:4;1920:7;;;1850:84;;10371:1251:36;;;;;;:::i;:::-;;:::i;41460:256::-;;;;;;:::i;:::-;;:::i;46926:184::-;;;;;;:::i;:::-;;:::i;10236:129::-;;;;;;:::i;:::-;;:::i;11865:1211::-;;;;;;:::i;:::-;;:::i;48032:95::-;48111:8;48032:95;;7168:286:4;;;;;;:::i;:::-;;:::i;38353:289:36:-;;;;;;:::i;:::-;;:::i;15780:884::-;;;;;;:::i;:::-;;:::i;17137:340:4:-;;;;;;:::i;:::-;;:::i;15637:137:36:-;;;;;;:::i;:::-;;:::i;42823:141::-;;;;;;:::i;:::-;-1:-1:-1;;;;;42922:23:36;42892:11;42922:23;;;:15;:23;;;;;:35;;;-1:-1:-1;;;;;42922:35:36;;42823:141;;;;-1:-1:-1;;;;;8644:32:53;;;8626:51;;8614:2;8599:18;42823:141:36;8447:236:53;47329:159:36;;;:::i;50184:112::-;;;:::i;48342:121::-;;;:::i;48793:97::-;-1:-1:-1;;;;;;;;;;;;;;;;;48866:17:36;;;;;;;48873:10;48866:17;-1:-1:-1;;;;;48866:17:36;;;;;;-1:-1:-1;;;48866:17:36;;;;;;;;;;;48793:97;;9157:41:53;;;9240:24;;9236:33;;;9214:20;;;9207:63;;;;9092:18;48793:97:36;8919:357:53;40957:353:36;;;;;;:::i;:::-;;:::i;17349:1483::-;;;;;;:::i;:::-;;:::i;19043:529::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7418:45::-;;;;;9391:1406:4;;;;;;:::i;:::-;;:::i;20581:1133:36:-;;;;;;:::i;:::-;;:::i;37908:142::-;;;;;;:::i;:::-;;:::i;21796:708::-;;;;;;:::i;:::-;;:::i;11628:133::-;;;;;;:::i;:::-;;:::i;7198:34::-;;;;;22864:878;;;;;;:::i;:::-;;:::i;14409:880::-;;;;;;:::i;:::-;;:::i;38056:291::-;;;;;;:::i;:::-;;:::i;42515:183::-;;;;;;:::i;:::-;-1:-1:-1;;;;;42613:23:36;42577:7;42613:23;;;:15;:23;;;;;:37;;;-1:-1:-1;;;;;42613:37:36;;;;-1:-1:-1;;;42652:38:36;;;;;42515:183;;;;;12261:25:53;;;12317:2;12302:18;;12295:34;;;;12234:18;42515:183:36;12087:248:53;41871:166:36;;;;;;:::i;:::-;;:::i;17661:3716:4:-;;;;;;:::i;:::-;;:::i;24901:1969:36:-;;;;;;:::i;:::-;;:::i;41722:143::-;;;;;;:::i;:::-;;:::i;42704:113::-;42782:12;;-1:-1:-1;;;;;42782:12:36;;;;-1:-1:-1;;;42796:13:36;;;42704:113;;7549:495:4;;;;;;:::i;:::-;;:::i;43664:536:36:-;;;;;;:::i;:::-;;:::i;13953:127::-;;;;;;:::i;:::-;;:::i;39152:309::-;;;;;;:::i;:::-;;:::i;6586:41::-;;-1:-1:-1;;;6586:41:36;;44610:594;44760:14;44776:28;44714:9;-1:-1:-1;;;;;44714:25:36;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5716:31:31;5733:13;5716:16;:31::i;:::-;44820:16:36::1;44839:9;-1:-1:-1::0;;;;;44839:20:36::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44881:13;::::0;;-1:-1:-1;;;;;44904:17:36;;::::1;::::0;;;-1:-1:-1;;;44881:13:36;::::1;;::::0;-1:-1:-1;44820:41:36;-1:-1:-1;44942:97:36::1;44980:16:::0;;44820:41;44920:1:::1;44942:18;:97::i;:::-;44932:107;;45049:65;45086:8;45097;45107:6;45049:28;:65::i;:::-;45171:8;-1:-1:-1::0;;;;;45130:67:36::1;45159:10;-1:-1:-1::0;;;;;45130:67:36::1;;45181:6;45189:7;45130:67;;;;;;;:::i;:::-;;;;;;;;44810:394;44610:594:::0;;;;;;:::o;48223:113::-;48269:19;48308:21;48322:6;48308:13;:21::i;:::-;48300:29;;48223:113;:::o;8175:1029:4:-;8249:4;-1:-1:-1;;;;;8483:25:4;;8510:8;8479:40;8528:11;;8521:19;8476:65;8466:222;;8578:10;8572:4;8565:24;8665:4;8659;8652:18;8466:222;8864:7;8858:4;8851:21;8898:20;8892:4;8885:34;8945:8;8939:4;8932:22;8997:6;8990:4;8984;8974:21;8967:37;9072:6;9066:4;9059:20;9160:4;9154:11;9150:2;9146:20;9136:8;-1:-1:-1;;;;;;;;;;;9103:4:4;9097;9092:75;-1:-1:-1;9193:4:4;8175:1029;;;;;:::o;39467:287:36:-;39548:17;2182:9:17;2157:22;2151:29;2148:44;2145:158;;2224:10;2218:4;2211:24;2284:4;2278;2271:18;2145:158;39582:12:36::1;:10;:12::i;:::-;39577:27;;-1:-1:-1::0;39603:1:36::1;39467:287:::0;;;:::o;39577:27::-:1;39641:106;::::0;;;;::::1;::::0;;;39658:10:::1;39641:106:::0;-1:-1:-1;;;;;39641:106:36;;::::1;::::0;;-1:-1:-1;;;39641:106:36;;::::1;;;::::0;::::1;::::0;-1:-1:-1;39680:9:36;;39641:106:::1;::::0;;39680:44:::1;::::0;:16:::1;::::0;:9;;::::1;-1:-1:-1::0;;;;;39680:9:36::1;:14;:16::i;:::-;:26:::0;::::1;:44::i;:::-;-1:-1:-1::0;;;;;39670:66:36::1;;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39740:6;39641:16;:106::i;:::-;-1:-1:-1::0;39614:133:36;39467:287;-1:-1:-1;;39467:287:36:o;38648:244::-;38726:17;2182:9:17;2157:22;2151:29;2148:44;2145:158;;2224:10;2218:4;2211:24;2284:4;2278;2271:18;40049:253:36;40118:7;40137:16;40156:62;40178:10;-1:-1:-1;;;;;40178:16:36;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40198:10;:19;-1:-1:-1;;;;;40198:19:36;47492:9:9;;;47503:8;;-1:-1:-1;47488:24:9;47481:32;;47331:198;40156:62:36;40137:81;;40235:60;40268:9;40279:8;40289:5;40235:32;:60::i;:::-;40228:67;40049:253;-1:-1:-1;;;40049:253:36:o;11165:4753:4:-;11253:4;11533;11529:2;11525:13;11578:8;11568;11565:22;11555:928;;11694:8;11688:4;11681:22;11747:20;11740:5;11737:31;11731:4;11724:45;11827:4;11821;11811:21;11877:13;11871:20;11993:10;11989:15;11986:479;;;12134:10;12126:6;12123:22;12120:183;;;12189:10;12183:4;12176:24;12272:4;12266;12259:18;12120:183;12435:6;12423:10;12419:23;12404:13;12397:46;11986:479;;;11555:928;12587:18;12580:5;12577:29;12571:4;12564:43;12663:4;12657;12647:21;12710:15;12704:22;12808:11;12800:6;12797:23;12794:158;;;12856:10;12850:4;12843:24;12929:4;12923;12916:18;12794:158;13069:6;13056:11;13052:24;13035:15;13028:49;;;13160:2;13154:4;13147:16;13217:4;13211;13201:21;13483:6;13467:13;13461:20;13457:33;13442:13;13435:56;;13567:6;13561:4;13554:20;13665:4;13659:11;13655:2;13651:20;13643:5;13639:2;13635:14;-1:-1:-1;;;;;;;;;;;13602:4:4;13596;13591:81;;-1:-1:-1;15907:4:4;11165:4753;;;;;:::o;40308:245:36:-;40373:7;40392:16;40411:62;40433:10;-1:-1:-1;;;;;40433:16:36;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40411:62;40392:81;;40490:56;40522:6;40530:8;40540:5;40490:31;:56::i;48469:99::-;48519:5;48543:7;-1:-1:-1;;;;;48543:16:36;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;48685:102::-;48746:4;2182:9:17;2157:22;2151:29;2148:44;2145:158;;2224:10;2218:4;2211:24;2284:4;2278;2271:18;2145:158;-1:-1:-1;48769:11:36::1;::::0;::::1;::::0;::::1;;;::::0;48685:102::o;21458:737:4:-;21515:14;21541:16;21560:19;:17;:19::i;:::-;21541:38;-1:-1:-1;21541:38:4;21683:63;;21738:6;:4;:6::i;:::-;21722:24;;;;;;21711:35;;21683:63;21756:19;21778:14;:12;:14::i;:::-;21883:4;21877:11;;-1:-1:-1;;;;;;;;;;;21934:27:4;;21988:4;21981:12;;21974:30;;;;22024:12;;22017:33;-1:-1:-1;22084:9:4;22077:4;22070:12;;22063:31;22128:9;22121:4;22114:12;;22107:31;22174:4;22161:18;;;21458:737;-1:-1:-1;21458:737:4:o;47677:66:36:-;5596:35:31;5613:17;:15;:17::i;:::-;5596:16;:35::i;:::-;47726:10:36::1;:8;:10::i;:::-;47677:66::o:0;24405:148::-;24490:56;24512:10;24524:9;24535:10;24490:21;:56::i;:::-;24405:148;;:::o;39760:283::-;39842:14;2182:9:17;2157:22;2151:29;2148:44;2145:158;;2224:10;2218:4;2211:24;2284:4;2278;2271:18;2145:158;39873:12:36::1;:10;:12::i;:::-;39868:27;;-1:-1:-1::0;39894:1:36::1;39467:287:::0;;;:::o;39868:27::-:1;39929:107;::::0;;;;::::1;::::0;;;39944:10:::1;39929:107:::0;-1:-1:-1;;;;;39929:107:36;;::::1;::::0;;-1:-1:-1;;;39929:107:36;;::::1;;;::::0;::::1;::::0;-1:-1:-1;39966:9:36;;39929:107:::1;::::0;;39966:44:::1;::::0;:16:::1;::::0;:9;;::::1;-1:-1:-1::0;;;;;39966:9:36::1;:14;:16::i;:44::-;-1:-1:-1::0;;;;;39956:66:36::1;;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40026:9;39929:14;:107::i;38898:248::-:0;38981:14;2182:9:17;2157:22;2151:29;2148:44;2145:158;;2224:10;2218:4;2211:24;2284:4;2278;2271:18;10371:1251:36;10534:7;1635:9:17;1610:22;1604:29;1601:44;1598:158;;1677:10;1671:4;1664:24;1737:4;1731;1724:18;1598:158;1800:9;1776:22;1769:41;1474:19:1::1;:17;:19::i;:::-;49999:12:36::2;:10;:12::i;:::-;49995:54;;;50013:36;-1:-1:-1::0;;;50013:34:36::2;:36::i;:::-;10557:18:::3;10598:9:::0;;10578:30:::3;::::0;10598:9;;::::3;-1:-1:-1::0;;;;;10598:9:36::3;10578:19;:30::i;:::-;10618:37;::::0;;;;::::3;::::0;;;10645:10:::3;10618:37:::0;-1:-1:-1;;;;;10618:37:36;;::::3;::::0;;-1:-1:-1;;;10618:37:36;;::::3;;;::::0;::::3;::::0;10557:51;;-1:-1:-1;10618:24:36::3;10694:29;10557:51:::0;10618:24;10694:11:::3;:29::i;:::-;-1:-1:-1::0;;;;;10684:51:36::3;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10666:71;;10954:17;10973:11:::0;10988:41:::3;11003:8;11013:7;11022:6;10988:14;:41::i;:::-;10953:76;;;;11040:17;11060:4;-1:-1:-1::0;;;;;11060:14:36::3;;11075:8;11060:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11040:44;;11145:39;11153:1;11156:6;11164:9;11175:8;11145:7;:39::i;:::-;11195:35;11207:8;11217:7;11226:3;11195:11;:35::i;:::-;11241:43;11254:8;11264;11274:9;11241:12;:43::i;:::-;11328:28;11359:27;11384:1;11359:24;:27::i;:::-;11328:58;;11396:68;11411:7;11420;11437:1;11441::::0;11444:8:::3;11454:9;11396:14;:68::i;:::-;11526:62;11542:10;11554:8;11564:6;11572:9;11583:4;11526:15;:62::i;:::-;-1:-1:-1::0;11606:9:36;;-1:-1:-1;;;;;;50059:1:36::3;1937:10:17::0;1913:22;1906:42;10371:1251:36;;;;;:::o;41460:256::-;41519:7;41538:17;41558:19;41568:8;41558:9;:19::i;:::-;41538:39;;-1:-1:-1;;41591:9:36;:30;41587:60;;-1:-1:-1;;;41630:17:36;41460:256;-1:-1:-1;;41460:256:36:o;41587:60::-;41664:29;41683:9;41664:18;:29::i;46926:184::-;46986:10;-1:-1:-1;;;;;47008:9:36;46986:32;;46982:92;;47020:54;-1:-1:-1;;;47020:52:36;:54::i;:::-;47084:9;:19;;-1:-1:-1;;;;;47084:19:36;;;;;-1:-1:-1;;;;;;47084:19:36;;;;;;;;;46926:184::o;10236:129::-;10304:7;10330:28;10337:6;10345:8;10330:28;;;;;;;;;;;;:6;:28::i;11865:1211::-;12030:7;1635:9:17;1610:22;1604:29;1601:44;1598:158;;1677:10;1671:4;1664:24;1737:4;1731;1724:18;1598:158;1800:9;1776:22;1769:41;1474:19:1::1;:17;:19::i;:::-;49999:12:36::2;:10;:12::i;:::-;49995:54;;;50013:36;-1:-1:-1::0;;;50013:34:36::2;:36::i;:::-;12053:18:::3;12094:9:::0;;12074:30:::3;::::0;12094:9;;::::3;-1:-1:-1::0;;;;;12094:9:36::3;12074:19;:30::i;:::-;12114:37;::::0;;;;::::3;::::0;;;12141:10:::3;12114:37:::0;-1:-1:-1;;;;;12114:37:36;;::::3;::::0;;-1:-1:-1;;;12114:37:36;;::::3;;;::::0;::::3;::::0;12053:51;;-1:-1:-1;12114:24:36::3;12190:29;12053:51:::0;12114:24;12190:11:::3;:29::i;:::-;-1:-1:-1::0;;;;;12180:51:36::3;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12162:71;;12412:14;12428:11:::0;12443:43:::3;12457:8;12467:7;12476:9;12443:13;:43::i;:::-;12411:75;;;;12497:17;12517:4;-1:-1:-1::0;;;;;12517:14:36::3;;12532:8;12517:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12497:44;;12602:39;12610:1;12613:6;12621:9;12632:8;12602:7;:39::i;:::-;12652:35;12664:8;12674:7;12683:3;12652:11;:35::i;:::-;12698:43;12711:8;12721;12731:9;12698:12;:43::i;:::-;12785:28;12816:27;12841:1;12816:24;:27::i;:::-;12785:58;;12853:68;12868:7;12877;12894:1;12898::::0;12901:8:::3;12911:9;12853:14;:68::i;:::-;12983:62;12999:10;13011:8;13021:6;13029:9;13040:4;12983:15;:62::i;7168:286:4:-:0;7336:18;7330:4;7323:32;;;7231:14;7368:19;;;;7432:4;7416:21;;7410:28;;7168:286::o;38353:289:36:-;38434:14;2182:9:17;2157:22;2151:29;2148:44;2145:158;;2224:10;2218:4;2211:24;2284:4;2278;2271:18;2145:158;38464:21:36::1;:19;:21::i;:::-;38460:35;;;-1:-1:-1::0;38494:1:36::1;39467:287:::0;;;:::o;38460:35::-:1;38529:106;::::0;;;;::::1;::::0;;;38543:10:::1;38529:106:::0;-1:-1:-1;;;;;38529:106:36;;::::1;::::0;;-1:-1:-1;;;38529:106:36;;::::1;;;::::0;::::1;::::0;-1:-1:-1;38565:9:36;;38529:106:::1;::::0;;38565:44:::1;::::0;:16:::1;::::0;:9;;::::1;-1:-1:-1::0;;;;;38565:9:36::1;:14;:16::i;:44::-;-1:-1:-1::0;;;;;38555:66:36::1;;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38625:9;38529:13;:106::i;15780:884::-:0;15930:7;1635:9:17;1610:22;1604:29;1601:44;1598:158;;1677:10;1671:4;1664:24;1737:4;1731;1724:18;1598:158;1800:9;1776:22;1769:41;15953:18:36::2;15994:9:::0;;15974:30:::2;::::0;15994:9;;::::2;-1:-1:-1::0;;;;;15994:9:36::2;15974:19;:30::i;:::-;16014:37;::::0;;;;::::2;::::0;;;16041:10:::2;16014:37:::0;-1:-1:-1;;;;;16014:37:36;;::::2;::::0;;-1:-1:-1;;;16014:37:36;;::::2;;;::::0;::::2;::::0;15953:51;;-1:-1:-1;16014:24:36::2;16090:29;15953:51:::0;16014:24;16090:11:::2;:29::i;:::-;-1:-1:-1::0;;;;;16080:51:36::2;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16062:71;;16143:17;16163:4;-1:-1:-1::0;;;;;16163:14:36::2;;16178:10;16163:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16143:46;;16201:14;16217:11:::0;16232:45:::2;16248:8;16258:7;16267:9;16232:15;:45::i;:::-;16200:77;;;;16288:35;16300:8;16310:7;16319:3;16288:11;:35::i;:::-;16334:45;16347:8;16357:10;16369:9;16334:12;:45::i;:::-;16423:28;16454:27;16479:1;16454:24;:27::i;:::-;16423:58;;16491:70;16506:7;16515;16524:10;16536:9;16555:1;16559::::0;16491:14:::2;:70::i;:::-;16572:61;16587:10;16599:8;16609:6;16617:9;16628:4;16572:14;:61::i;:::-;-1:-1:-1::0;16651:6:36;;-1:-1:-1;;;;;;37357:12:36::1;:10;:12::i;:::-;:28;;;;-1:-1:-1::0;37374:11:36::1;::::0;::::1;::::0;::::1;;;37373:12;37357:28;37353:52;;;37387:11;:18:::0;;-1:-1:-1;;37387:18:36::1;;;::::0;;1937:10:17;1913:22;1906:42;15780:884:36;;;;;:::o;17137:340:4:-;17360:17;17354:4;17347:31;;;17197:14;17391:19;;;;17455:4;17439:21;;17433:28;;17137:340::o;15637:137:36:-;15709:7;15735:32;15743:9;15754:8;15735:32;;;;;;;;;;;;:7;:32::i;47329:159::-;5596:35:31;5613:17;:15;:17::i;5596:35::-;47417:1:36::1;47380:17;:15;:17::i;:::-;-1:-1:-1::0;;;;;47380:23:36::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47380:39:36::1;::::0;47376:87:::1;;47428:35;;-1:-1:-1::0;;;47428:35:36::1;;;;;;;;;;;47376:87;47473:8;:6;:8::i;50184:112::-:0;50273:16;;50184:112::o;48342:121::-;48390:21;48433:23;48447:8;48433:13;:23::i;40957:353::-;41015:7;41038:21;:19;:21::i;:::-;41034:35;;;-1:-1:-1;41068:1:36;;40957:353;-1:-1:-1;40957:353:36:o;41034:35::-;41079:16;41146:9;;41098:82;;41126:30;;41146:9;;;-1:-1:-1;;;;;41146:9:36;41126:19;:30::i;:::-;3779:1:26;41098:27:36;:82::i;:::-;41079:101;-1:-1:-1;;;;;;41194:22:36;;41190:52;;-1:-1:-1;;;41225:17:36;40957:353;-1:-1:-1;;40957:353:36:o;41190:52::-;41259:44;;-1:-1:-1;;;41259:44:36;;-1:-1:-1;;;;;41259:34:36;;;;;:44;;41294:8;;41259:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17349:1483::-;17518:7;17527:28;1635:9:17;1610:22;1604:29;1601:44;1598:158;;1677:10;1671:4;1664:24;1737:4;1731;1724:18;1598:158;1800:9;1776:22;1769:41;17470:5:36::1;49348:37;49379:5;49348:30;:37::i;:::-;17571:18:::3;17612:9:::0;;17592:30:::3;::::0;17612:9;;::::3;-1:-1:-1::0;;;;;17612:9:36::3;17592:19;:30::i;:::-;17632:37;::::0;;;;::::3;::::0;;;17659:10:::3;17632:37:::0;-1:-1:-1;;;;;17632:37:36;;::::3;::::0;;-1:-1:-1;;;17632:37:36;;::::3;;;::::0;::::3;::::0;17571:51;;-1:-1:-1;17632:24:36::3;17707:29;17571:51:::0;17632:24;17707:11:::3;:29::i;:::-;-1:-1:-1::0;;;;;17697:51:36::3;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17679:71;;17761:17;17781:4;-1:-1:-1::0;;;;;17781:14:36::3;;17796:5;17781:21;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17761:41;;17906:14;17922:11:::0;17937:52:::3;17953:8;17963:7;17972:5;17979:9;17937:15;:52::i;:::-;17905:84;;;;18000:35;18012:8;18022:7;18031:3;18000:11;:35::i;:::-;18113:40;18126:8;18136:5;18143:9;18113:12;:40::i;:::-;-1:-1:-1::0;;;;;18170:19:36;::::3;;::::0;;;:12:::3;:19;::::0;;;;18163:34;;-1:-1:-1;;;;;18163:34:36::3;::::0;;18208:96:::3;18242:10;18278:8:::0;18183:5;18296:6;18208:28:::3;:96::i;:::-;18379:27;18404:1;18379:24;:27::i;:::-;18369:37;;18416:65;18431:7;18440;18449:5;18456:9;18475:1;18479::::0;18416:14:::3;:65::i;:::-;18497:9;18492:224;18513:7;:14;18508:1;:19;18492:224;;18564:50;18580:7;18588:1;18580:10;;;;;;;;:::i;:::-;;;;;;;:16;;;18598:8;18608:5;18564:15;:50::i;:::-;18544:7;18552:1;18544:10;;;;;;;;:::i;:::-;;::::0;;::::3;::::0;;;;;;;:17:::3;:70:::0;18688:3:::3;;18492:224;;;;18726:65;18763:8;18774;18784:6;18726:28;:65::i;:::-;-1:-1:-1::0;18809:6:36;-1:-1:-1;;;;;37357:12:36::2;:10;:12::i;:::-;:28;;;;-1:-1:-1::0;37374:11:36::2;::::0;::::2;::::0;::::2;;;37373:12;37357:28;37353:52;;;37387:11;:18:::0;;-1:-1:-1;;37387:18:36::2;;;::::0;;37353:52:::2;1829:1:17::1;1937:10:::0;1913:22;1906:42;17349:1483:36;;;;;:::o;19043:529::-;19228:23;1635:9:17;1610:22;1604:29;1601:44;1598:158;;1677:10;1671:4;1664:24;1737:4;1731;1724:18;1598:158;1800:9;1776:22;1769:41;19204:5:36::1;49348:37;49379:5;49348:30;:37::i;:::-;19290:12:::0;-1:-1:-1;;;;;19276:34:36;::::2;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;19276:34:36::2;;19267:43;;19325:9;19320:246;19336:24:::0;;::::2;19320:246;;19377:81;19397:6;19405:1;19408:49;19424:12;;19437:1;19424:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;19441:8;19451:5;19408:15;:49::i;:::-;4264:1:6::0;4260:9;;;;4237:33;;4253:4;4237:33;4230:47;4153:1;4000:293;19377:81:36::2;-1:-1:-1::0;19538:3:36::2;;19320:246;;;;1829:1:17::1;1937:10:::0;1913:22;1906:42;19043:529:36;;;;;;:::o;9391:1406:4:-;9461:4;9670:18;9664:4;9657:32;9715:8;9709:4;9702:22;9776:4;9770;9760:21;9819:15;9813:22;9909:11;9901:6;9898:23;9895:146;;;9953:10;9947:4;9940:24;10022:4;10016;10009:18;9895:146;10150:6;10137:11;10133:24;10116:15;10109:49;;;10233:2;10227:4;10220:16;10286:4;10280;10270:21;10536:6;10520:13;10514:20;10510:33;10495:13;10488:56;;10612:6;10606:4;10599:20;10700:4;10694:11;10690:2;10686:20;10676:8;-1:-1:-1;;;;;;;;;;;10643:4:4;10637;10632:75;-1:-1:-1;10786:4:4;9391:1406;;;;:::o;20581:1133:36:-;1635:9:17;1610:22;1604:29;1601:44;1598:158;;1677:10;1671:4;1664:24;1737:4;1731;1724:18;1598:158;1800:9;1776:22;1769:41;20767:10:36::2;-1:-1:-1::0;;;;;20789:4:36::2;20767:27;;20763:91;;20796:58;-1:-1:-1::0;;;20796:56:36::2;:58::i;:::-;20865:18;20906:9:::0;;20886:30:::2;::::0;20906:9;;::::2;-1:-1:-1::0;;;;;20906:9:36::2;20886:19;:30::i;:::-;20926:37;::::0;;;;::::2;::::0;;;20953:10:::2;20926:37:::0;-1:-1:-1;;;;;20926:37:36;;::::2;::::0;;-1:-1:-1;;;20926:37:36;;::::2;;;::::0;::::2;::::0;20865:51;;-1:-1:-1;20926:24:36::2;21002:29;20865:51:::0;20926:24;21002:11:::2;:29::i;:::-;-1:-1:-1::0;;;;;20992:51:36::2;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21138:18;21159:11:::0;;20974:71;;-1:-1:-1;21138:18:36;21159:11:::2;::::0;::::2;;;:86;;21212:33;:7;636:2:44::0;612:26;;510:136;21212:33:36::2;21159:86;;;21173:36;:7;922:2:44::0;898:26;;793:139;21173:36:36::2;21138:107;;;;21260:11;21274:34;21287:8;21297:10;21274:12;:34::i;:::-;21260:48;;21323:35;21335:8;21345:7;21354:3;21323:11;:35::i;:::-;21424:45;21437:8;21447:5;21454:14;21424:12;:45::i;:::-;21483:51;21496:8;21506;21516:17;21483:12;:51::i;:::-;21055:490;;21555:28;21586:27;21611:1;21586:24;:27::i;:::-;21555:58;;21623:84;21638:7;21647;21656:5;21663:14;21679:8;21689:17;21623:14;:84::i;:::-;20753:961;;;;37357:12:::1;:10;:12::i;:::-;:28;;;;-1:-1:-1::0;37374:11:36::1;::::0;::::1;::::0;::::1;;;37373:12;37357:28;37353:52;;;37387:11;:18:::0;;-1:-1:-1;;37387:18:36::1;;;::::0;;37353:52:::1;1937:10:17::0;1913:22;1906:42;20581:1133:36;;;;:::o;37908:142::-;912:4:45;905:21;;;952:22;946:4;939:36;;;37992:4:36;988:17:45;;;1052:4;1036:21;;;1030:28;38015::36;741:333:45;21796:708:36;21958:7;1635:9:17;1610:22;1604:29;1601:44;1598:158;;1677:10;1671:4;1664:24;1737:4;1731;1724:18;1598:158;1800:9;1776:22;1769:41;50107:12:36::1;:10;:12::i;:::-;50102:58;;50121:39;-1:-1:-1::0;;;50121:37:36::1;:39::i;:::-;21981:37:::3;::::0;;;;::::3;::::0;;;22008:10:::3;21981:37:::0;-1:-1:-1;;;;;21981:37:36;;::::3;::::0;;-1:-1:-1;;;21981:37:36;;::::3;;;::::0;::::3;::::0;-1:-1:-1;22076:9:36;;22056:58:::3;::::0;-1:-1:-1;;22056:30:36::3;::::0;22076:9;;::::3;-1:-1:-1::0;;;;;22076:9:36::3;22056:19;:30::i;:58::-;-1:-1:-1::0;;;;;22046:80:36::3;;:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22028:100;;22245:17;22264:11:::0;22279:43:::3;22296:8;22306:7;22315:6;22279:16;:43::i;:::-;22244:78;;;;22369:35;22381:8;22391:7;22400:3;22369:11;:35::i;:::-;22415:55;22423:10;22435:5;22442:8;22452:6;22460:9;22415:7;:55::i;:::-;-1:-1:-1::0;22488:9:36;-1:-1:-1;;;37357:12:36::2;:10;:12::i;11628:133::-:0;11698:7;11724:30;11730:9;11741:8;11724:30;;;;;;;;;;;;:5;:30::i;22864:878::-;23027:7;1635:9:17;1610:22;1604:29;1601:44;1598:158;;1677:10;1671:4;1664:24;1737:4;1731;1724:18;1598:158;1800:9;1776:22;1769:41;50107:12:36::1;:10;:12::i;:::-;50102:58;;50121:39;-1:-1:-1::0;;;50121:37:36::1;:39::i;:::-;23050:37:::3;::::0;;;;::::3;::::0;;;23077:10:::3;23050:37:::0;-1:-1:-1;;;;;23050:37:36;;::::3;::::0;;-1:-1:-1;;;23050:37:36;;::::3;;;::::0;::::3;::::0;-1:-1:-1;23145:9:36;;23125:58:::3;::::0;-1:-1:-1;;23125:30:36::3;::::0;23145:9;;::::3;-1:-1:-1::0;;;;;23145:9:36::3;23125:19;:30::i;:58::-;-1:-1:-1::0;;;;;23115:80:36::3;;:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23097:100;;23333:14;23349:11:::0;23364:44:::3;23379:8;23389:7;23398:9;23364:14;:44::i;:::-;23332:76;;;;23455:35;23467:8;23477:7;23486:3;23455:11;:35::i;:::-;23656:55;23664:10;23676:5;23683:8;23693:6;23701:9;23656:7;:55::i;14409:880::-:0;14554:7;1635:9:17;1610:22;1604:29;1601:44;1598:158;;1677:10;1671:4;1664:24;1737:4;1731;1724:18;1598:158;1800:9;1776:22;1769:41;14577:18:36::2;14618:9:::0;;14598:30:::2;::::0;14618:9;;::::2;-1:-1:-1::0;;;;;14618:9:36::2;14598:19;:30::i;:::-;14638:37;::::0;;;;::::2;::::0;;;14665:10:::2;14638:37:::0;-1:-1:-1;;;;;14638:37:36;;::::2;::::0;;-1:-1:-1;;;14638:37:36;;::::2;;;::::0;::::2;::::0;14577:51;;-1:-1:-1;14638:24:36::2;14714:29;14577:51:::0;14638:24;14714:11:::2;:29::i;:::-;-1:-1:-1::0;;;;;14704:51:36::2;;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14686:71;;14767:17;14787:4;-1:-1:-1::0;;;;;14787:14:36::2;;14802:10;14787:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14767:46;;14825:17;14844:11:::0;14859:40:::2;14873:8;14883:7;14892:6;14859:13;:40::i;:::-;14824:75;;;;14910:35;14922:8;14932:7;14941:3;14910:11;:35::i;:::-;14956:45;14969:8;14979:10;14991:9;14956:12;:45::i;:::-;15045:28;15076:27;15101:1;15076:24;:27::i;:::-;15045:58;;15113:70;15128:7;15137;15146:10;15158:9;15177:1;15181::::0;15113:14:::2;:70::i;:::-;15194:61;15209:10;15221:8;15231:6;15239:9;15250:4;15194:14;:61::i;38056:291::-:0;38135:17;2182:9:17;2157:22;2151:29;2148:44;2145:158;;2224:10;2218:4;2211:24;2284:4;2278;2271:18;2145:158;38168:21:36::1;:19;:21::i;:::-;38164:35;;;-1:-1:-1::0;38198:1:36::1;39467:287:::0;;;:::o;38164:35::-:1;38236:104;::::0;;;;::::1;::::0;;;38251:10:::1;38236:104:::0;-1:-1:-1;;;;;38236:104:36;;::::1;::::0;;-1:-1:-1;;;38236:104:36;;::::1;;;::::0;::::1;::::0;-1:-1:-1;38273:9:36;;38236:104:::1;::::0;;38273:44:::1;::::0;:16:::1;::::0;:9;;::::1;-1:-1:-1::0;;;;;38273:9:36::1;:14;:16::i;:44::-;-1:-1:-1::0;;;;;38263:66:36::1;;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38333:6;38236:14;:104::i;41871:166::-:0;41930:7;41954:12;:10;:12::i;:::-;41949:27;;-1:-1:-1;41975:1:36;;41871:166;-1:-1:-1;41871:166:36:o;41949:27::-;41993:37;42013:16;42023:5;42013:9;:16::i;17661:3716:4:-;-1:-1:-1;;;;;18077:25:4;;18104:8;18073:40;18122:10;;18115:18;18070:64;18060:221;;18171:10;18165:4;18158:24;18258:4;18252;18245:18;18060:221;18314:16;18333:19;:17;:19::i;:::-;18314:38;-1:-1:-1;18314:38:4;18456:63;;18511:6;:4;:6::i;:::-;18495:24;;;;;;18484:35;;18456:63;18529:19;18551:14;:12;:14::i;:::-;18529:36;;18733:8;18720:11;18717:25;18714:142;;;18774:10;18768:4;18761:24;18837:4;18831;18824:18;18714:142;18884:4;18878:11;19000:5;18996:2;18992:14;18988:2;18984:23;18975:32;;19047:7;19043:2;19039:16;19035:2;19031:25;19020:36;;19140:39;19134:4;19127:53;19206:5;19200:4;19193:19;19258:4;19252;19242:21;19300:9;19294:16;-1:-1:-1;;;;;;;;;;;19375:1:4;19368:27;19429:8;19422:4;19419:1;19415:12;19408:30;19472:11;19465:4;19462:1;19458:12;19451:33;19518:9;19511:4;19508:1;19504:12;19497:31;19562:9;19555:4;19552:1;19548:12;19541:31;19611:4;19608:1;19598:18;19592:4;19585:32;19680:16;19677:1;19670:27;19731:5;19724:4;19721:1;19717:12;19710:27;19771:7;19764:4;19761:1;19757:12;19750:29;19813:5;19806:4;19803:1;19799:12;19792:27;19853:10;19846:4;19843:1;19839:12;19832:32;19898:8;19891:4;19888:1;19884:12;19877:30;19946:4;19943:1;19933:18;19927:4;19920:32;20041:4;20035;20025:21;20019:4;20012:35;20083:1;20077:4;20073:12;20067:4;20060:26;20112:1;20106:4;20099:15;20140:1;20134:4;20127:15;20203:4;20197;20191;20185;20182:1;20175:5;20164:44;20624:5;20605:16;20599:23;20596:34;20586:159;;20663:10;20657:4;20650:24;20726:4;20720;20713:18;20586:159;20830:18;20812:37;;-1:-1:-1;;;21025:43:4;;21019:4;21012:57;21105:4;21099;21089:21;21082:36;;;21060:7;21225:5;-1:-1:-1;;;;;;;;;;;;21185:4:4;21178:12;;21173:67;21260:4;21253:15;-1:-1:-1;;21330:1:4;21324:4;21317:15;-1:-1:-1;;;;;;;17661:3716:4:o;24901:1969:36:-;25155:8;25142:11;25139:25;25136:142;;;25196:10;25190:4;25183:24;25259:4;25253;25246:18;25136:142;25298:13;25314;25321:5;25314:6;:13::i;:::-;25298:29;;25337:23;25363:18;:16;:18::i;:::-;25337:44;;25392:14;25592:4;25586:11;25693:25;25690:1;25683:36;25753:5;25746:4;25743:1;25739:12;25732:27;25829:9;25822:4;25819:1;25815:12;25808:31;25909:5;25902:4;25899:1;25895:12;25888:27;25949:8;25942:4;25939:1;25935:12;25928:30;26002:4;25999:1;25989:18;25971:36;;-1:-1:-1;;;26077:4:36;26070:32;26149:15;26143:4;26136:29;26222:10;26216:4;26209:24;;26298:4;26292;26282:21;26272:31;;26407:1;26401:4;26394:15;26429:14;26446:30;26460:6;26468:1;26471;26474;26446:13;:30::i;:::-;26429:47;;26500:5;-1:-1:-1;;;;;26490:15:36;:6;-1:-1:-1;;;;;26490:15:36;;26486:56;;26507:35;-1:-1:-1;;;26507:33:36;:35::i;:::-;26692:17;26686:4;26679:31;26736:5;26730:4;26723:19;26796:1;26789:5;26785:13;26778:4;26772;26762:21;26755:44;26818:45;26840:5;26847:9;26858:4;26818:21;:45::i;:::-;25030:1840;;;;24901:1969;;;;;;:::o;41722:143::-;41779:7;41803:12;:10;:12::i;:::-;41798:27;;-1:-1:-1;41824:1:36;;41722:143;-1:-1:-1;41722:143:36:o;41798:27::-;41842:16;41852:5;41842:9;:16::i;7549:495:4:-;7661:14;-1:-1:-1;;;;;;;7746:19:4;;;7742:49;;-1:-1:-1;;;7767:24:4;;7742:49;-1:-1:-1;7884:4:4;7877:21;7924:20;7918:4;7911:34;;;7965:4;7958:19;;;;8022:4;8006:21;;8000:28;;7549:495::o;43664:536:36:-;43803:14;43819:28;5596:35:31;5613:17;:15;:17::i;5596:35::-;43872:12:36::1;::::0;;-1:-1:-1;;;;;;43894:16:36;::::1;::::0;;;-1:-1:-1;;;;;43872:12:36::1;::::0;-1:-1:-1;43931:99:36::1;43969:16:::0;;44000:11;43872:12;43931:18:::1;:99::i;:::-;43921:109;;44040:68;44077:8;44088:11;44101:6;44040:28;:68::i;:::-;44164:11;-1:-1:-1::0;;;;;44124:69:36::1;44152:10;-1:-1:-1::0;;;;;44124:69:36::1;;44177:6;44185:7;44124:69;;;;;;;:::i;:::-;;;;;;;;43664:536:::0;;;;;;:::o;13953:127::-;14020:7;14046:27;14052:6;14060:8;14046:27;;;;;;;;;;;;:5;:27::i;39152:309::-;39231:14;2182:9:17;2157:22;2151:29;2148:44;2145:158;;2224:10;2218:4;2211:24;2284:4;2278;2271:18;2145:158;39269:185:36::1;::::0;;;;::::1;::::0;;;39298:10:::1;39269:185:::0;-1:-1:-1;;;;;39269:185:36;;::::1;::::0;;-1:-1:-1;;;39269:185:36;;::::1;;;::::0;::::1;::::0;-1:-1:-1;39332:9:36;;39269:185:::1;::::0;;39332:44:::1;::::0;:16:::1;::::0;:9;;::::1;-1:-1:-1::0;;;;;39332:9:36::1;:14;:16::i;:44::-;-1:-1:-1::0;;;;;39322:66:36::1;;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39423:21;::::0;-1:-1:-1;;;39423:21:36;;39404:5;;-1:-1:-1;;;;;39423:4:36::1;:14;::::0;::::1;::::0;:21:::1;::::0;39404:5;;39423:21:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39269:15;:185::i;5771:228:31:-:0;-1:-1:-1;;;;;5855:21:31;;;5877:10;5897:4;5911:13;5922:1;5911:8;;;:13;:::i;:::-;5904:21;;;:::i;:::-;5855:71;;;;;;-1:-1:-1;;;;;;5855:71:31;;;;;-1:-1:-1;;;;;16825:15:53;;;5855:71:31;;;16807:34:53;16877:15;;;;16857:18;;;16850:43;16929:33;16909:18;;;16902:61;16742:18;;5855:71:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5850:143;;5949:33;;-1:-1:-1;;;5949:33:31;;;;;;;;;;;5850:143;5771:228;:::o;45429:1491:36:-;45565:28;45609:29;45649:19;45671:70;3713:1:26;45671:30:36;45691:9;;;;;;;;;-1:-1:-1;;;;;45691:9:36;45671:19;:30::i;:::-;:43;;:70::i;:::-;45649:92;-1:-1:-1;;;;;;45755:25:36;;;45751:86;;45810:11;-1:-1:-1;;;;;45797:38:36;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45797:40:36;;;;;;;;;;;;:::i;:::-;45782:55;;45751:86;45860:19;;45917:27;45921:16;45860:19;45917:27;:::i;:::-;-1:-1:-1;;;;;45899:46:36;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;45899:46:36;;;;;;;;;;;;;;;;45889:56;;45997:9;45992:922;46013:7;:14;46008:1;:19;45992:922;;46072:13;46092:1;46088;:5;:170;;46235:16;;46256:1;46252;:5;46235:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;46088:170;;;3296:4:6;3307:1;3303:9;;;3285:28;;;3279:35;46116:58:36;-1:-1:-1;;;;;46306:22:36;;46276:27;46306:22;;;:15;:22;;;;;46347:10;;46072:186;;-1:-1:-1;46306:22:36;46072:186;;46347:7;;46355:1;;46347:10;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;46347:24:36;;;;;46389:277;;;;46446:20;;;;46426:10;;-1:-1:-1;;;;;46446:20:36;;;;46426:7;;46434:1;;46426:10;;;;;;:::i;:::-;;;;;;;;;;;;:17;:40;46488:20;;;:24;;-1:-1:-1;;;;;;46488:24:36;;;46389:277;;;46579:6;:21;;;;;;;;;;-1:-1:-1;;;;;46579:21:36;-1:-1:-1;;;;;46559:41:36;:7;46567:1;46559:10;;;;;;;;:::i;:::-;;;;;;;;;;;;:17;:41;46622:21;;;:25;;-1:-1:-1;;;;;46622:25:36;;;46389:277;46800:67;46829:5;46836:11;46849:7;46857:1;46849:10;;;;;;;;:::i;:::-;;;;;;;:17;;;46800:28;:67::i;:::-;-1:-1:-1;;46886:3:36;;45992:922;;;;45599:1321;;;45429:1491;;;;;;:::o;13399:887:20:-;13562:2;13556:4;13549:16;13619:6;13613:4;13606:20;-1:-1:-1;;;13678:4:20;13671:48;13880:4;13874;13868;13862;13859:1;13852:5;13845;13840:45;13932:7;13928:1;13921:4;13915:11;13912:18;13908:32;13898:275;;14023:7;14004:16;13995:5;13983:18;13976:26;13973:48;13970:61;13960:199;;14068:10;14062:4;14055:24;14136:4;14130;14123:18;13960:199;13898:275;14199:1;14193:4;14186:15;13399:887;;;:::o;5086:137:13:-;5147:13;5186:29;5212:1;5186:12;:29::i;49657:104:36:-;49745:8;219:15:47;:25;;;48223:113:36:o;220:404:49:-;274:18;488:17;508:21;521:7;508:12;:21::i;:::-;577:4;567:15;;220:404;-1:-1:-1;;;220:404:49:o;1138:194::-;1309:4;1300:14;;;1282:33;;;;;1276:40;;1138:194::o;33402:695:36:-;33534:17;33601:11;;33534:17;;;;33601:11;;;;;:86;;33654:33;:7;636:2:44;612:26;;510:136;33654:33:36;33601:86;;;33615:36;:7;922:2:44;898:26;;793:139;33615:36:36;33580:107;;;;33698:22;33723:34;33736:8;33746:10;33723:12;:34::i;:::-;33698:59;;33768:21;33792:51;33802:6;33810:32;:7;777:2:44;753:26;;652:135;33810:32:36;33792:51;;:9;:51::i;:::-;33768:75;-1:-1:-1;33964:80:36;33996:22;33768:75;33996:6;:22;:::i;:::-;34020:17;;-1:-1:-1;;;;;33964:80:36;34039:4;33964:31;:80::i;:::-;33952:92;-1:-1:-1;34060:30:36;34077:13;34060:14;:30;:::i;:::-;34054:36;;33570:527;;;33402:695;;;;;;:::o;10654:336:52:-;10757:7;10831:152;10870:7;10879:47;10906:9;10917:8;10879:26;:47::i;:::-;10928:45;10953:9;10964:8;10928:24;:45::i;:::-;30348:9:9;;30359:17;;30344:33;;;;30337:41;;30167:227;10831:152:52;10824:159;10654:336;-1:-1:-1;;;;10654:336:52:o;30066:91:4:-;;;;:::o;10273:326:52:-;10372:7;10446:146;10485:7;10494:44;10521:6;10529:8;10494:26;:44::i;:::-;10540:42;10565:6;10573:8;10540:24;:42::i;49179:104:36:-;49266:10;;49179:104::o;16501:118:4:-;5177:66;;16501:118::o;2710:117:1:-;1721:16;:14;:16::i;:::-;2778:5:::1;2768:15:::0;;-1:-1:-1;;2768:15:1::1;::::0;;2798:22:::1;735:10:0::0;2807:12:1::1;2798:22;;;;;;:::i;:::-;;;;;;;;2710:117::o:0;27159:250:36:-;1372:4:45;1365:21;;;1412:22;1406:4;1399:36;;;1455:4;1448:17;;;1501:4;1485:21;;1478:39;;;27311:91:36;27351:5;27369:9;27390:10;27311:31;:91::i;34103:615::-;34236:14;34300:11;;34236:14;;;;34300:11;;;;;:86;;34353:33;:7;636:2:44;612:26;;510:136;34353:33:36;34300:86;;;34314:36;:7;922:2:44;898:26;;793:139;34314:36:36;34279:107;;;;34397:22;34422:34;34435:8;34445:10;34422:12;:34::i;:::-;34397:59;;34476:69;34509:9;34520:8;:17;;;-1:-1:-1;;;;;34476:69:36;34539:5;34476:32;:69::i;:::-;34467:78;;34555:21;34579:53;34591:6;34599:32;:7;777:2:44;753:26;;652:135;34599:32:36;34579:53;;:11;:53::i;:::-;34555:77;-1:-1:-1;34642:23:36;34555:77;34642:23;;:::i;2002:128:1:-;1897:4;1920:7;;;2063:61;;;2098:15;;-1:-1:-1;;;2098:15:1;;;;;;;;;;;746:163:43;856:8;853:1;846:19;888:4;885:1;878:15;30906:557:36;31036:17;31055:11;31082:22;31107:57;31120:8;31130:33;:7;636:2:44;612:26;;510:136;31130:33:36;31107:57;;:12;:57::i;:::-;31082:82;;31238:19;31260:51;31272:6;31280:30;:7;494:2:44;470:26;;371:133;31260:51:36;31238:73;-1:-1:-1;31333:79:36;31365:20;31238:73;31365:6;:20;:::i;:::-;31387:17;;-1:-1:-1;;;;;31333:79:36;31387:17;31333:31;:79::i;:::-;31321:91;-1:-1:-1;31428:28:36;31445:11;31428:14;:28;:::i;:::-;31422:34;;31072:391;;30906:557;;;;;;:::o;36658:526::-;36772:23;36813:53;36841:1;3779::26;36813:27:36;:53::i;:::-;36772:95;-1:-1:-1;;;;;;36881:31:36;;36877:44;;36914:7;;;36877:44;36959:65;;-1:-1:-1;;;36959:65:36;;36931:25;36975:7;;-1:-1:-1;;;;;;36975:7:36;36959:65;;;18892:52:53;36984:10:36;18998:18:53;;;18991:43;19050:18;;;19043:34;;;19093:18;;;19086:34;;;-1:-1:-1;;;;;19157:15:53;;;19136:19;;;19129:44;36931:25:36;;36959:15;;;;;;18864:19:53;;36959:65:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36931:93;-1:-1:-1;37048:26:36;37038:6;:36;;;;;;;;:::i;:::-;;37034:144;;37090:77;37159:6;37151:15;;;;;;;;:::i;:::-;-1:-1:-1;;;37090:49:36;:60;:77::i;:::-;36762:422;;36658:526;;;;;:::o;27500:424::-;27596:18;94:6:22;27618:30:36;;;;:3;:30;:::i;:::-;27617:47;;;;:::i;:::-;27718:21;;;;;;-1:-1:-1;;;;;27718:21:36;;;-1:-1:-1;;;27718:21:36;;;;;;;;:10;:21;27765:12;;27596:68;;-1:-1:-1;27764:39:36;;27765:25;;27596:68;;27765:12;:25;:::i;:::-;27764:37;:39::i;:::-;27749:12;:54;;-1:-1:-1;;;;;;27749:54:36;-1:-1:-1;;;;;27749:54:36;;;;;;;;27829:46;;27852:10;;27830:19;;27846:3;;-1:-1:-1;;;27830:13:36;;;:19;:::i;:::-;:32;;;;:::i;27829:46::-;27813:13;:62;;-1:-1:-1;;;;;27813:62:36;;;-1:-1:-1;;;27813:62:36;;;;;;;;;27886:31;27913:3;27886:26;:31::i;28017:285::-;28117:15;28135:81;28164:12;28178:8;:20;;;28200:4;28206:9;28135:28;:81::i;:::-;28117:99;;28226:69;28250:4;28256:7;28265:29;:8;:20;;;-1:-1:-1;;;;;28265:27:36;5509:6:13;5282:249;28265:29:36;-1:-1:-1;;;;;28226:69:36;:23;:69::i;35933:719::-;36005:28;36045:19;36067:57;36095:1;3713::26;36067:27:36;:57::i;:::-;36045:79;-1:-1:-1;;;;;;36138:25:36;;36134:45;;36165:14;35933:719;;;:::o;36134:45::-;36190:21;36214:59;36248:8;36267:4;36214:25;:59::i;:::-;36190:83;;36294:53;36335:11;36294:40;:53::i;:::-;36284:63;;36533:13;36470:59;36504:8;36523:4;36470:25;:59::i;:::-;:76;36466:180;;36562:73;-1:-1:-1;;;36562:71:36;:73::i;:::-;36035:617;;35933:719;;;:::o;28593:1658::-;28807:16;28826:4;-1:-1:-1;;;;;28826:16:36;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28854:12;28869:11;;28807:37;;-1:-1:-1;28869:11:36;;;;;;;28891:1354;28912:7;:14;28907:1;:19;28891:1354;;28943:27;28973:15;:33;28989:7;28997:1;28989:10;;;;;;;;:::i;:::-;;;;;;;:16;;;-1:-1:-1;;;;;28973:33:36;-1:-1:-1;;;;;28973:33:36;;;;;;;;;;;;28943:63;;29054:7;29050:735;;;29081:14;29098:36;:7;922:2:44;898:26;;793:139;29098:36:36;29081:53;;;;29153:14;29170:7;29178:1;29170:10;;;;;;;;:::i;:::-;;;;;;;:17;;;29153:34;;29205:11;29219:56;29246:6;29254;94::22;29219:26:36;:56::i;:::-;29205:70;-1:-1:-1;29293:18:36;94:6:22;29321:7:36;29315:30;;;;:3;:30;:::i;:::-;29314:47;;;;:::i;:::-;29431:20;;;;29293:68;;-1:-1:-1;;;;;;29431:20:36;;;;-1:-1:-1;;;29453:21:36;;;29588:12;29597:3;29588:6;:12;:::i;:::-;29568:7;29576:1;29568:10;;;;;;;;:::i;:::-;;;;;;;;;;;;:17;:32;29641:40;29642:26;29658:10;29642:13;:26;:::i;29641:40::-;29618:20;;;:63;;-1:-1:-1;;;;;;29618:63:36;-1:-1:-1;;;;;29618:63:36;;;;;;;;;;29723:47;29747:10;29724:20;29741:3;29724:14;:20;:::i;29723:47::-;29699:21;;;:71;;-1:-1:-1;;;;;29699:71:36;;;-1:-1:-1;;;29699:71:36;;;;;;;;;-1:-1:-1;;;;;;29050:735:36;29800:20;29825:74;29851:6;:18;;;;;;;;;;-1:-1:-1;;;;;29851:18:36;29871:8;29881:7;29889:1;29881:10;;;;;;;;:::i;:::-;;;;;;;:17;;;29825:25;:74::i;:::-;-1:-1:-1;29913:18:36;;;:29;;-1:-1:-1;;;;;;29913:29:36;-1:-1:-1;;;;;29913:29:36;;;;;;-1:-1:-1;;;;;;29960:17:36;;;29956:102;;29979:79;30010:6;30030:8;30040:3;30045:12;29979:30;:79::i;:::-;-1:-1:-1;;;;;30076:17:36;;;30072:102;;30095:79;30126:6;30146:8;30156:3;30161:12;30095:30;:79::i;:::-;-1:-1:-1;;30217:3:36;;28891:1354;;;;28797:1454;;28593:1658;;;;;;:::o;13082:865::-;13222:16;13303:6;13241:59;13275:8;13294:4;13241:25;:59::i;:::-;:68;;;;:::i;:::-;13222:87;;13320:85;13343:2;13357:8;13375:6;13394:9;13320:17;:85::i;:::-;13446:11;;:15;13442:319;;13518:26;13524:8;13534:9;13518:5;:26::i;:::-;13558:43;;-1:-1:-1;;;13558:43:36;;-1:-1:-1;;;;;13558:18:36;;;;;:43;;13577:6;;13585:9;;13596:4;;13558:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13442:319;;;13632:78;13673:8;13684:2;13696:4;13703:6;13632:32;:78::i;:::-;13724:26;13730:8;13740:9;13724:5;:26::i;:::-;13836:8;13774:59;13808:8;13827:4;13774:25;:59::i;:::-;:70;13770:171;;;13860:70;-1:-1:-1;;;13860:68:36;:70::i;31469:508::-;31601:14;31617:11;31644:22;31669:57;31682:8;31692:33;:7;636:2:44;612:26;;510:136;31669:57:36;31644:82;;31746:68;31779:9;31790:8;:17;;;-1:-1:-1;;;;;31746:68:36;31809:4;31746:32;:68::i;:::-;31737:77;;31824:19;31846:49;31856:6;31864:30;:7;494:2:44;470:26;;371:133;31846:49:36;31824:71;-1:-1:-1;31905:21:36;31824:71;31905:21;;:::i;49849:108::-;49903:4;49926:12;:10;:12::i;:::-;:24;;;-1:-1:-1;;1897:4:1;1920:7;;;;48223:113:36:o;16670:467::-;16809:84;16831:2;16845:8;16863:6;16882:9;16809:16;:84::i;:::-;16904:65;16941:8;16952;16962:6;16904:28;:65::i;:::-;16983:11;;:15;16979:88;;17014:42;;-1:-1:-1;;;17014:42:36;;-1:-1:-1;;;;;17014:17:36;;;;;:42;;17032:6;;17040:9;;17051:4;;17014:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16979:88;17076:20;17082:2;17086:9;17076:5;:20::i;:::-;17106:24;;-1:-1:-1;;;17106:24:36;;-1:-1:-1;;;;;17106:4:36;:9;;;;:24;;17116:2;;17120:9;;17106:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2463:115:1;1474:19;:17;:19::i;:::-;2522:7:::1;:14:::0;;-1:-1:-1;;2522:14:1::1;2532:4;2522:14;::::0;;2551:20:::1;2558:12;735:10:0::0;;656:96;1338:222:49;1420:14;1486:1;1480:8;1475:3;1472:17;1469:75;;;-1:-1:-1;1535:4:49;1526:14;;;1508:33;;;;;1502:40;;1338:222::o;49409:242:36:-;49492:10;-1:-1:-1;;;;;49492:19:36;;;;;;:62;;;49516:38;49536:5;49543:10;49516:19;:38::i;:::-;49515:39;49492:62;49488:157;;;49570:64;-1:-1:-1;;;49570:62:36;:64::i;34724:517::-;34878:14;34942:11;;34878:14;;;;34942:11;;;;;:86;;34995:33;:7;636:2:44;612:26;;510:136;34995:33:36;34942:86;;;34956:36;:7;922:2:44;898:26;;793:139;34956:36:36;34921:107;;;;35045:34;35058:8;35068:10;35045:12;:34::i;:::-;35039:40;;35140:94;35176:12;35190:8;:20;;;35212:5;35219:14;35140:35;:94::i;:::-;-1:-1:-1;;;;;35098:19:36;;;;;;:12;:19;;;;;:27;:136;;;-1:-1:-1;;;35098:27:36;;-1:-1:-1;;;;;35098:27:36;:136;:::i;:::-;35089:145;;34911:330;34724:517;;;;;;;:::o;5724:318:24:-;5871:6;5865:4;5858:20;5912:1;5908:6;5904:2;5900:15;6019:5;6016:1;6012:13;6001:8;5998:1;5994:16;5989:2;5986:1;5982:10;5945:35;5939:4;5933;5928:98;;5724:318;;;;:::o;19654:674:36:-;19745:15;19793:8;-1:-1:-1;;;;;19776:26:36;:5;-1:-1:-1;;;;;19776:26:36;;19772:90;;19804:58;-1:-1:-1;;;19804:56:36;:58::i;:::-;-1:-1:-1;;;;;;19944:22:36;;;19916:25;19944:22;;;:15;:22;;;;;;;;:41;;;;;;;;;20005:18;;-1:-1:-1;;;;;20033:25:36;;;;;-1:-1:-1;;;20005:18:36;;;;;20069:187;20115:10;20175:8;19979:5;19960;20005:18;20069:27;:187::i;:::-;20267:54;20296:5;20303:8;20313:7;20267:28;:54::i;:::-;19762:566;19654:674;;;;;:::o;30538:362::-;30636:11;30669:224;30714:8;30745:10;-1:-1:-1;;;;;30745:16:36;;30785:13;7067:18:4;7061:25;;6907:195;30785:13:36;30822:4;-1:-1:-1;;;;;30822:16:36;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30865:17;30669:24;:224::i;23748:531::-;23864:99;23887:2;23915:8;23898:5;23933:6;23952:9;23864:17;:99::i;:::-;24050:10;-1:-1:-1;;;;;24050:19:36;;;24046:70;;24071:45;24087:5;24094:10;24106:9;24071:15;:45::i;:::-;24126:23;24132:5;24139:9;24126:5;:23::i;:::-;24207:65;24244:8;24255;24265:6;24207:28;:65::i;:::-;23748:531;;;;;:::o;6831:835:7:-;6940:14;7051:4;7045:11;7116:4;7110;7103:18;7154:4;7151:1;7147:12;7141:4;7134:26;7186:1;7180:4;7173:15;7214:1;7208:4;7201:15;7284:4;7278;7272;7266;7263:1;7256:5;7245:44;7239:51;7229:61;;7398:16;7388:144;;7447:10;7441:4;7434:24;7513:4;7507;7500:18;7388:144;7558:1;7552:4;7545:15;7606:4;7599:15;6831:835;;-1:-1:-1;;;;6831:835:7:o;4125:1091:11:-;4298:4;4292:11;4369:13;;4337:4;4325:17;;;4408:1;4404:14;;;4446:1;4504:6;4497:4;4489:6;4486:16;4483:28;4473:220;;-1:-1:-1;;4535:17:11;;;4582:4;4578:17;;4621:4;4656:8;;;4646:29;4668:5;4646:29;;4723:6;4717:4;4710:20;4778:4;4772;4762:21;4747:215;4851:1;4848;4844:9;4841:1;4837:17;4831:24;4827:1;4824;4820:9;4813:43;4889:4;4886:1;4882:12;4877:17;;4931:1;4928;4925:8;4747:215;4915:29;4751:34;4431:567;-1:-1:-1;5011:17:11;;;5094:1;5083:9;;5076:20;;;-1:-1:-1;5174:4:11;5159:20;5153:4;5146:34;5018:6;4125:1091;-1:-1:-1;4125:1091:11:o;10291:445:18:-;10454:4;10448:11;10485:12;-1:-1:-1;;10503:20:18;;10499:31;10481:50;10595:4;10588:12;;10582:4;10575;10565:15;;10515:7;10544:57;10627:1;10621:4;10614:15;10693:4;10687;10683:15;10680:1;10676:23;10670:4;10663:37;;10291:445;;;:::o;35359:178:36:-;35440:7;35466:64;35493:6;35501:14;94:6:22;35466:26:36;:64::i;7005:488:9:-;7068:9;7258:24;7252:31;;7245:39;;7235:163;;7317:10;7311:4;7304:24;7379:4;7373;7366:18;7235:163;-1:-1:-1;7468:3:9;7461:11;;;;7434:19;;;7427:27;7420:35;7457:19;;;7416:61;;7005:488::o;5389:444::-;5450:9;5640:24;5634:31;;5627:39;;5617:163;;5699:10;5693:4;5686:24;5761:4;5755;5748:18;5617:163;-1:-1:-1;5809:3:9;5802:11;;;;5798:19;;5389:444::o;4478:523::-;4633:9;;;4746;;;4743:16;;4733:189;;4782:1;4779:129;;;4819:10;4813:4;4806:24;4885:4;4879;4872:18;4779:129;4980:3;4958:11;;;4951:19;4944:27;4973:11;;4940:45;;4478:523;-1:-1:-1;;4478:523:9:o;2809:465::-;2870:9;3056:1;3052;3048:6;3044:14;3041:1;3038:21;3035:186;;;3081:1;3078:129;;;3118:10;3112:4;3105:24;3184:4;3178;3171:18;3078:129;-1:-1:-1;3254:3:9;3243:9;;3239:19;;2809:465::o;2202:126:1:-;1897:4;1920:7;;;2260:62;;2296:15;;-1:-1:-1;;;2296:15:1;;;;;;;;;;;6451:341:24;6603:8;6596:16;6589:24;6583:4;6576:38;6669:1;6665:6;6661:2;6657:15;6765:9;6762:1;6758:17;6750:5;6747:1;6743:13;6702:39;6696:4;6690;6685:91;;6451:341;;;:::o;35630:197:36:-;35713:7;35739:81;35766:6;35774:14;35790:29;94:6:22;35774:14:36;35790:29;:::i;:::-;35739:26;:81::i;915:210:43:-;1040:8;1037:1;1030:19;1075:5;1069:4;1062:19;1104:4;1101:1;1094:15;4215:142:19;4268:7;-1:-1:-1;;;4291:1:19;:13;4287:36;;4306:17;:15;:17::i;:::-;-1:-1:-1;4348:1:19;4215:142::o;4209:182:24:-;4306:3;4300:4;4293:17;4340:34;4334:4;4328;4323:52;4209:182;:::o;8347:409:52:-;8561:15;8598:55;8621:4;8627:5;8634:7;8643:9;8598:22;:55::i;:::-;8588:65;;8689:19;:7;:17;:19::i;:::-;-1:-1:-1;;;;;8664:13:52;;;;;;;;;;;;;:44;;:21;;:44;;;;-1:-1:-1;;;8664:44:52;;-1:-1:-1;;;;;8664:44:52;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;8664:44:52;;;;;;;;;;;;;;;-1:-1:-1;;;;;8718:13:52;;;;-1:-1:-1;8718:13:52;;;;;;;;-1:-1:-1;8718:13:52;;;;:31;;-1:-1:-1;;;;;;8718:31:52;;;;;;;;;;;-1:-1:-1;8718:13:52;8347:409::o;4397:315:24:-;4534:8;4528:4;4521:22;4569:11;4563:4;4556:25;4615:1;4611:6;4607:2;4603:15;4687:7;4684:1;4680:15;4648:30;4642:4;4636;4631:65;;4397:315;;;:::o;19059:739:20:-;19133:14;19238:7;19232:4;19225:21;-1:-1:-1;;;19299:4:20;19292:48;19737:4;19731;19725;19719;19712:5;19705;19694:48;19632:4;19614:16;19611:26;19522:242;19495:4;19489:11;19404:378;19378:404;;19059:739;;;;:::o;206:1824:48:-;280:28;356:11;350:4;343:25;-1:-1:-1;;;411:4:48;404:48;561:4;549:10;543:4;537;524:11;517:5;504:62;494:207;;599:10;593:4;586:24;682:4;676;669:18;494:207;730:4;724:11;805:16;799:4;796:1;781:41;895:1;889:8;886:1;882:16;969:1;963:8;1021:4;1018:1;1014:12;1005:21;;1227:16;1224:1;1220:24;1335:1;1330;1327;1323:9;1320:1;1316:17;1313:24;1306:4;1288:16;1285:26;1282:56;1277:1;1271:8;1267:2;1263:17;1260:79;1257:139;;;1377:4;1365:10;1358:24;1257:139;1413:1;1410:604;;;1443:1;1440;1433:12;1512:4;1509:1;1505:12;1496:21;;1561:1;1558;1554:9;1551:1;1547:17;1541:4;1534:31;1617:1;1606:12;;1650:1;1635:365;1704:1;1701;1697:9;1694:1;1690:17;1824:1;1818:8;1813:3;1809:18;1806:50;;;1849:4;1837:10;1830:24;1806:50;1903:1;1898;1895;1891:9;1888:1;1884:17;1877:28;;1938:1;1935;1931:9;1926:14;;1970:1;1967;1964:8;1635:365;1961:21;1639:14;1410:604;;;;;206:1824;;;:::o;28251:516:9:-;28417:9;;;28546;;28560;;;28557:16;;28543:31;28539:39;;28529:163;;28611:10;28605:4;28598:24;28673:4;28667;28660:18;28529:163;28728:9;;;28721:17;28714:25;28741:9;;;28710:41;;28251:516;-1:-1:-1;;28251:516:9:o;2838:1584:50:-;2965:20;2987:18;3110:8;3122:1;3110:13;3106:47;;-1:-1:-1;3133:5:50;;-1:-1:-1;3140:12:50;3125:28;;3106:47;4209:86;:5;4234:60;:48;4259:12;4273:8;4234:24;:48::i;:60::-;4209:86;:::i;:::-;4198:97;;4333:63;4358:8;4368:27;4369:16;:8;4380:5;4369:16;:::i;:::-;-1:-1:-1;;;;;4368:25:50;5509:6:13;5282:249;4368:27:50;-1:-1:-1;;;;;4333:63:50;:24;:63::i;:::-;4318:78;;:12;:78;:::i;:::-;4305:91;;2838:1584;;;;;;;:::o;4834:756::-;-1:-1:-1;;;;;5093:13:50;;5069:21;5093:13;;;;;;;;;;:23;-1:-1:-1;;;;;5093:23:50;;5368:74;5393:9;5423:17;:5;5093:23;5423:17;:::i;5368:74::-;5350:92;;5489:19;:7;:17;:19::i;:::-;-1:-1:-1;;;;;5464:13:50;;;;;;;;;;;;;:44;;:21;;:44;;;;-1:-1:-1;;;5464:44:50;;-1:-1:-1;;;;;5464:44:50;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;5464:44:50;;;;;;;;;;;;;;;-1:-1:-1;;;;;5552:13:50;;;;-1:-1:-1;5552:13:50;;;;;;;;-1:-1:-1;;5552:13:50;;;;:31;;-1:-1:-1;;;;;;5552:31:50;;;;;;;;;;;-1:-1:-1;;4834:756:50:o;4718:320:24:-;4858:6;4852:4;4845:20;4891:9;4885:4;4878:23;4935:1;4931:6;4927:2;4923:15;5012:8;5009:1;5005:16;5000:2;4997:1;4993:10;4968:23;4962:4;4956;4951:71;;4718:320;;;;:::o;30294:132:36:-;30365:23;30377:2;30381:6;30365:11;:23::i;:::-;30398:21;;-1:-1:-1;;;30398:21:36;;-1:-1:-1;;;;;30398:4:36;:9;;;;:21;;30408:2;;30412:6;;30398:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9261:1026:20;9444:4;9438:11;9509:6;9503:4;9496:20;9574:2;9568:4;9561:16;9639:4;9635:2;9631:13;9625:4;9618:27;-1:-1:-1;;;9695:4:20;9688:48;9848:4;9842;9836;9830;9827:1;9820:5;9813;9808:45;9900:7;9896:1;9889:4;9883:11;9880:18;9876:32;9866:279;;9991:7;9972:16;9963:5;9951:18;9944:26;9941:48;9938:61;9928:203;;10036:10;10030:4;10023:24;10108:4;10102;10095:18;9928:203;-1:-1:-1;10171:1:20;10165:4;10158:15;10227:4;10220:15;-1:-1:-1;;;;9261:1026:20:o;5044:318:24:-;5183:6;5177:4;5170:20;5216:9;5210:4;5203:23;5260:1;5256:6;5252:2;5248:15;5336:8;5333:1;5329:16;5324:2;5321:1;5317:10;5293:22;5287:4;5281;5276:70;;5044:318;;;;:::o;24177:1119:4:-;24444:18;24438:4;24431:32;24489:4;24483;24476:18;24546:4;24540;24530:21;24589:15;24583:22;24679:11;24671:6;24668:23;24665:146;;;24723:10;24717:4;24710:24;24792:4;24786;24779:18;24665:146;24903:24;;;24879:49;;25038:18;25032:25;;25028:38;;;25001:66;;-1:-1:-1;25122:20:4;;;-1:-1:-1;;;;;25199:22:4;;-1:-1:-1;;;;;;;;;;;25166:4:4;-1:-1:-1;25155:70:4;24405:148:36;;:::o;8923:604:52:-;-1:-1:-1;;;;;9404:13:52;;9110:15;9404:13;;;;;;;;;;:23;-1:-1:-1;;;;;9404:23:52;9447:73;9472:9;9501:17;:5;9404:23;9501:17;:::i;9447:73::-;9437:83;8923:604;-1:-1:-1;;;;;;8923:604:52:o;6048:397:24:-;6236:1;6232:6;6228:2;6224:15;6272:11;6269:1;6265:19;6259:4;6252:33;6311:7;6305:4;6298:21;6422:5;6419:1;6415:13;6404:8;6401:1;6397:16;6392:2;6389:1;6385:10;6349:34;6343:4;6337;6332:97;;6048:397;;;;;:::o;6557:1373:52:-;6776:20;6798:11;6881:20;6904:4;:13;;;-1:-1:-1;;;;;6881:36:52;;;6927:19;6949:46;6971:7;;:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;47492:9:9;;;47488:24;47481:32;;47331:198;6949:46:52;6927:68;;7028:65;7046:12;7060:11;7073:8;7083:9;7028:17;:65::i;:::-;7006:87;;-1:-1:-1;7006:87:52;-1:-1:-1;7145:23:52;:11;:21;:23::i;:::-;-1:-1:-1;;;;;7129:39:52;;;:13;7745;;;7741:45;;7760:26;;;;7741:45;7827:96;:4;:16;;;7862:60;:48;7887:12;7901:8;7862:24;:48::i;7827:96::-;-1:-1:-1;;;;;7796:127:52;:16;;;:127;-1:-1:-1;;6557:1373:52;;;;;;;;;;:::o;5368:350:24:-;5523:6;5517:4;5510:20;5556:9;5550:4;5543:23;5600:1;5596:6;5592:2;5588:15;5695:5;5692:1;5688:13;5677:8;5674:1;5670:16;5665:2;5662:1;5658:10;5633:23;5627:4;5621;5616:86;;5368:350;;;;;:::o;27414:1087:4:-;-1:-1:-1;;;;;;;27569:19:4;;;27565:32;;27414:1087;;;:::o;27565:32::-;27798:7;27792:4;27785:21;27832:20;27826:4;27819:34;27879:5;27873:4;27866:19;27935:4;27929;27919:21;27977:13;27971:20;28077:10;28073:15;28070:415;;;28202:10;28194:6;28191:22;28188:159;;;28249:10;28243:4;28236:24;28324:4;28318;28311:18;28188:159;28447:23;;;;28425:46;;-1:-1:-1;;27414:1087:4:o;23502:290:19:-;23691:10;23685:4;23678:24;23771:4;23765;23758:18;1148:132:50;1209:18;1244:33;1249:27;-1:-1:-1;;;;;1264:10:50;;;;1249;;:27;:::i;:::-;5509:6:13;5282:249;1282:132:50;1343:18;1378:33;1383:27;-1:-1:-1;;;;;1398:10:50;;;;1383;;:27;:::i;22599:1172:4:-;22820:18;22814:25;22899:6;22880:17;22876:30;22996:17;22978:16;22975:39;22972:162;;;23046:10;23040:4;23033:24;23115:4;23109;23102:18;22972:162;23221:16;23201:18;23194:44;;;23324:18;23318:4;23311:32;23369:2;23363:4;23356:16;23422:4;23416;23406:21;23538:6;23522:13;23516:20;23512:33;23497:13;23490:56;;23614:6;23608:4;23601:20;23695:4;23689:11;23685:2;23681:20;23678:1;-1:-1:-1;;;;;;;;;;;23645:4:4;23639;23634:68;24405:148:36;;:::o;2422:616:52:-;2574:15;2591:11;2622:12;2638:1;2622:17;2618:36;;-1:-1:-1;2649:1:52;;-1:-1:-1;2649:1:52;2641:13;;2618:36;2757:20;2780:44;2790:12;2804:11;2817:6;2780:9;:44::i;:::-;2757:67;;2901:65;2928:12;2942:9;2035:6;2901:26;:65::i;:::-;2895:71;-1:-1:-1;3013:18:52;2895:71;3013:12;:18;:::i;2422:616::-;;;;;;;;:::o;9633:585::-;9732:7;9771:8;9755:12;:24;9751:38;;-1:-1:-1;9788:1:52;9781:8;;9751:38;9803:12;9819:1;9803:17;9799:31;;-1:-1:-1;9829:1:52;9822:8;;9799:31;10187:23;10202:8;10187:12;:23;:::i;:::-;10150;10161:12;10150:8;:23;:::i;:::-;10139:35;;:7;:35;:::i;:::-;10138:44;;10178:4;10138:44;:::i;:::-;10137:74;;;;:::i;14:367:53:-;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:53;;-1:-1:-1;;;;;214:30:53;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:437::-;472:6;480;533:2;521:9;512:7;508:23;504:32;501:52;;;549:1;546;539:12;501:52;576:23;;-1:-1:-1;;;;;611:30:53;;608:50;;;654:1;651;644:12;608:50;693:70;755:7;746:6;735:9;731:22;693:70;:::i;:::-;782:8;;667:96;;-1:-1:-1;386:437:53;-1:-1:-1;;;;386:437:53:o;828:895::-;1058:4;1087:2;1127;1116:9;1112:18;1157:6;1146:9;1139:25;1183:2;1221;1216;1205:9;1201:18;1194:30;1244:6;1279;1273:13;1310:6;1302;1295:22;1348:2;1337:9;1333:18;1326:25;;1386:2;1378:6;1374:15;1360:29;;1407:1;1417:280;1431:6;1428:1;1425:13;1417:280;;;1490:13;;1532:9;;-1:-1:-1;;;;;1528:35:53;1516:48;;1604:11;;1598:18;1584:12;;;1577:40;1672:15;;;;1637:12;;;;1560:1;1446:9;1417:280;;;-1:-1:-1;1714:3:53;;828:895;-1:-1:-1;;;;;;;;828:895:53:o;1728:217::-;-1:-1:-1;;;;;1906:32:53;;;;1888:51;;1876:2;1861:18;;1728:217::o;1950:423::-;1992:3;2030:5;2024:12;2057:6;2052:3;2045:19;2082:1;2092:162;2106:6;2103:1;2100:13;2092:162;;;2168:4;2224:13;;;2220:22;;2214:29;2196:11;;;2192:20;;2185:59;2121:12;2092:162;;;2096:3;2299:1;2292:4;2283:6;2278:3;2274:16;2270:27;2263:38;2362:4;2355:2;2351:7;2346:2;2338:6;2334:15;2330:29;2325:3;2321:39;2317:50;2310:57;;;1950:423;;;;:::o;2378:220::-;2527:2;2516:9;2509:21;2490:4;2547:45;2588:2;2577:9;2573:18;2565:6;2547:45;:::i;2603:131::-;-1:-1:-1;;;;;2678:31:53;;2668:42;;2658:70;;2724:1;2721;2714:12;2739:315;2807:6;2815;2868:2;2856:9;2847:7;2843:23;2839:32;2836:52;;;2884:1;2881;2874:12;2836:52;2923:9;2910:23;2942:31;2967:5;2942:31;:::i;:::-;2992:5;3044:2;3029:18;;;;3016:32;;-1:-1:-1;;;2739:315:53:o;3251:180::-;3310:6;3363:2;3351:9;3342:7;3338:23;3334:32;3331:52;;;3379:1;3376;3369:12;3331:52;-1:-1:-1;3402:23:53;;3251:180;-1:-1:-1;3251:180:53:o;3826:456::-;3903:6;3911;3919;3972:2;3960:9;3951:7;3947:23;3943:32;3940:52;;;3988:1;3985;3978:12;3940:52;4027:9;4014:23;4046:31;4071:5;4046:31;:::i;:::-;4096:5;-1:-1:-1;4153:2:53;4138:18;;4125:32;4166:33;4125:32;4166:33;:::i;:::-;3826:456;;4218:7;;-1:-1:-1;;;4272:2:53;4257:18;;;;4244:32;;3826:456::o;4658:247::-;4717:6;4770:2;4758:9;4749:7;4745:23;4741:32;4738:52;;;4786:1;4783;4776:12;4738:52;4825:9;4812:23;4844:31;4869:5;4844:31;:::i;5117:242::-;5299:2;5284:18;;5311:42;5288:9;5335:6;5023:12;;-1:-1:-1;;;;;5019:21:53;;;5007:34;;5094:4;5083:16;;;5077:23;5073:32;5057:14;;5050:56;4910:202;5364:118;5450:5;5443:13;5436:21;5429:5;5426:32;5416:60;;5472:1;5469;5462:12;5487:382;5552:6;5560;5613:2;5601:9;5592:7;5588:23;5584:32;5581:52;;;5629:1;5626;5619:12;5581:52;5668:9;5655:23;5687:31;5712:5;5687:31;:::i;:::-;5737:5;-1:-1:-1;5794:2:53;5779:18;;5766:32;5807:30;5766:32;5807:30;:::i;:::-;5856:7;5846:17;;;5487:382;;;;;:::o;5874:388::-;5942:6;5950;6003:2;5991:9;5982:7;5978:23;5974:32;5971:52;;;6019:1;6016;6009:12;5971:52;6058:9;6045:23;6077:31;6102:5;6077:31;:::i;:::-;6127:5;-1:-1:-1;6184:2:53;6169:18;;6156:32;6197:33;6156:32;6197:33;:::i;6744:127::-;6805:10;6800:3;6796:20;6793:1;6786:31;6836:4;6833:1;6826:15;6860:4;6857:1;6850:15;6876:275;6947:2;6941:9;7012:2;6993:13;;-1:-1:-1;;6989:27:53;6977:40;;-1:-1:-1;;;;;7032:34:53;;7068:22;;;7029:62;7026:88;;;7094:18;;:::i;:::-;7130:2;7123:22;6876:275;;-1:-1:-1;6876:275:53:o;7156:966::-;7242:6;7250;7258;7311:2;7299:9;7290:7;7286:23;7282:32;7279:52;;;7327:1;7324;7317:12;7279:52;7363:9;7350:23;7340:33;;7392:2;7444;7433:9;7429:18;7416:32;7457:31;7482:5;7457:31;:::i;:::-;7507:5;-1:-1:-1;7563:2:53;7548:18;;7535:32;-1:-1:-1;;;;;7616:14:53;;;7613:34;;;7643:1;7640;7633:12;7613:34;7681:6;7670:9;7666:22;7656:32;;7726:7;7719:4;7715:2;7711:13;7707:27;7697:55;;7748:1;7745;7738:12;7697:55;7784:2;7771:16;7806:2;7802;7799:10;7796:36;;;7812:18;;:::i;:::-;7854:53;7897:2;7878:13;;-1:-1:-1;;7874:27:53;7870:36;;7854:53;:::i;:::-;7841:66;;7930:2;7923:5;7916:17;7970:7;7965:2;7960;7956;7952:11;7948:20;7945:33;7942:53;;;7991:1;7988;7981:12;7942:53;8046:2;8041;8037;8033:11;8028:2;8021:5;8017:14;8004:45;8090:1;8085:2;8080;8073:5;8069:14;8065:23;8058:34;;8111:5;8101:15;;;;;7156:966;;;;;:::o;8127:315::-;8195:6;8203;8256:2;8244:9;8235:7;8231:23;8227:32;8224:52;;;8272:1;8269;8262:12;8224:52;8308:9;8295:23;8285:33;;8368:2;8357:9;8353:18;8340:32;8381:31;8406:5;8381:31;:::i;9281:713::-;9385:6;9393;9401;9409;9462:2;9450:9;9441:7;9437:23;9433:32;9430:52;;;9478:1;9475;9468:12;9430:52;9505:23;;-1:-1:-1;;;;;9540:30:53;;9537:50;;;9583:1;9580;9573:12;9537:50;9622:70;9684:7;9675:6;9664:9;9660:22;9622:70;:::i;:::-;9711:8;;-1:-1:-1;9596:96:53;-1:-1:-1;;9796:2:53;9781:18;;9768:32;9809:31;9768:32;9809:31;:::i;:::-;9859:5;-1:-1:-1;9916:2:53;9901:18;;9888:32;9929:33;9888:32;9929:33;:::i;:::-;9281:713;;;;-1:-1:-1;9281:713:53;;-1:-1:-1;;9281:713:53:o;9999:632::-;10170:2;10222:21;;;10292:13;;10195:18;;;10314:22;;;10141:4;;10170:2;10393:15;;;;10367:2;10352:18;;;10141:4;10436:169;10450:6;10447:1;10444:13;10436:169;;;10511:13;;10499:26;;10580:15;;;;10545:12;;;;10472:1;10465:9;10436:169;;;-1:-1:-1;10622:3:53;;9999:632;-1:-1:-1;;;;;;9999:632:53:o;10871:525::-;10957:6;10965;10973;10981;11034:3;11022:9;11013:7;11009:23;11005:33;11002:53;;;11051:1;11048;11041:12;11002:53;11090:9;11077:23;11109:31;11134:5;11109:31;:::i;:::-;11159:5;-1:-1:-1;11216:2:53;11201:18;;11188:32;11229:33;11188:32;11229:33;:::i;:::-;10871:525;;11281:7;;-1:-1:-1;;;;11335:2:53;11320:18;;11307:32;;11386:2;11371:18;11358:32;;10871:525::o;11401:456::-;11478:6;11486;11494;11547:2;11535:9;11526:7;11522:23;11518:32;11515:52;;;11563:1;11560;11553:12;11515:52;11599:9;11586:23;11576:33;;11659:2;11648:9;11644:18;11631:32;11672:31;11697:5;11672:31;:::i;:::-;11722:5;-1:-1:-1;11779:2:53;11764:18;;11751:32;11792:33;11751:32;11792:33;:::i;:::-;11844:7;11834:17;;;11401:456;;;;;:::o;12340:114::-;12424:4;12417:5;12413:16;12406:5;12403:27;12393:55;;12444:1;12441;12434:12;12459:801;12570:6;12578;12586;12594;12602;12610;12618;12671:3;12659:9;12650:7;12646:23;12642:33;12639:53;;;12688:1;12685;12678:12;12639:53;12727:9;12714:23;12746:31;12771:5;12746:31;:::i;:::-;12796:5;-1:-1:-1;12853:2:53;12838:18;;12825:32;12866:33;12825:32;12866:33;:::i;:::-;12918:7;-1:-1:-1;12972:2:53;12957:18;;12944:32;;-1:-1:-1;13023:2:53;13008:18;;12995:32;;-1:-1:-1;13079:3:53;13064:19;;13051:33;13093:31;13051:33;13093:31;:::i;:::-;12459:801;;;;-1:-1:-1;12459:801:53;;;;13143:7;13197:3;13182:19;;13169:33;;-1:-1:-1;13249:3:53;13234:19;;;13221:33;;12459:801;-1:-1:-1;;12459:801:53:o;13265:732::-;13367:6;13375;13383;13391;13399;13407;13460:3;13448:9;13439:7;13435:23;13431:33;13428:53;;;13477:1;13474;13467:12;13428:53;13516:9;13503:23;13535:31;13560:5;13535:31;:::i;:::-;13585:5;-1:-1:-1;13642:2:53;13627:18;;13614:32;13655:33;13614:32;13655:33;:::i;:::-;13707:7;-1:-1:-1;13761:2:53;13746:18;;13733:32;;-1:-1:-1;13817:2:53;13802:18;;13789:32;13830:31;13789:32;13830:31;:::i;:::-;13265:732;;;;-1:-1:-1;13265:732:53;;13934:3;13919:19;;13906:33;;13986:3;13971:19;;;13958:33;;-1:-1:-1;13265:732:53;-1:-1:-1;;13265:732:53:o;14002:572::-;14097:6;14105;14113;14166:2;14154:9;14145:7;14141:23;14137:32;14134:52;;;14182:1;14179;14172:12;14134:52;14209:23;;-1:-1:-1;;;;;14244:30:53;;14241:50;;;14287:1;14284;14277:12;14241:50;14326:70;14388:7;14379:6;14368:9;14364:22;14326:70;:::i;:::-;14415:8;;-1:-1:-1;14300:96:53;-1:-1:-1;;14500:2:53;14485:18;;14472:32;14513:31;14472:32;14513:31;:::i;14579:274::-;14672:6;14725:2;14713:9;14704:7;14700:23;14696:32;14693:52;;;14741:1;14738;14731:12;14693:52;14773:9;14767:16;14792:31;14817:5;14792:31;:::i;15114:213::-;15213:6;15266:2;15254:9;15245:7;15241:23;15237:32;15234:52;;;15282:1;15279;15272:12;15234:52;-1:-1:-1;15305:16:53;;15114:213;-1:-1:-1;15114:213:53:o;15521:247::-;15589:6;15642:2;15630:9;15621:7;15617:23;15613:32;15610:52;;;15658:1;15655;15648:12;15610:52;15690:9;15684:16;15709:29;15732:5;15709:29;:::i;15773:127::-;15834:10;15829:3;15825:20;15822:1;15815:31;15865:4;15862:1;15855:15;15889:4;15886:1;15879:15;15905:331;16010:9;16021;16063:8;16051:10;16048:24;16045:44;;;16085:1;16082;16075:12;16045:44;16114:6;16104:8;16101:20;16098:40;;;16134:1;16131;16124:12;16098:40;-1:-1:-1;;16160:23:53;;;16205:25;;;;;-1:-1:-1;15905:331:53:o;16241:323::-;-1:-1:-1;;;;;;16361:19:53;;16437:11;;;;16468:1;16460:10;;16457:101;;;16545:2;16539;16532:3;16529:1;16525:11;16522:1;16518:19;16514:28;16510:2;16506:37;16502:46;16493:55;;16457:101;;;16241:323;;;;:::o;16974:245::-;17041:6;17094:2;17082:9;17073:7;17069:23;17065:32;17062:52;;;17110:1;17107;17100:12;17062:52;17142:9;17136:16;17161:28;17183:5;17161:28;:::i;17224:1011::-;17319:6;17350:2;17393;17381:9;17372:7;17368:23;17364:32;17361:52;;;17409:1;17406;17399:12;17361:52;17436:16;;-1:-1:-1;;;;;17501:14:53;;;17498:34;;;17528:1;17525;17518:12;17498:34;17566:6;17555:9;17551:22;17541:32;;17611:7;17604:4;17600:2;17596:13;17592:27;17582:55;;17633:1;17630;17623:12;17582:55;17662:2;17656:9;17684:2;17680;17677:10;17674:36;;;17690:18;;:::i;:::-;17736:2;17733:1;17729:10;17719:20;;17759:28;17783:2;17779;17775:11;17759:28;:::i;:::-;17821:15;;;17891:11;;;17887:20;;;17852:12;;;;17919:19;;;17916:39;;;17951:1;17948;17941:12;17916:39;17975:11;;;;17995:210;18011:6;18006:3;18003:15;17995:210;;;18084:3;18078:10;18065:23;;18101:31;18126:5;18101:31;:::i;:::-;18145:18;;;18028:12;;;;18183;;;;17995:210;;;18224:5;17224:1011;-1:-1:-1;;;;;;;;17224:1011:53:o;18240:127::-;18301:10;18296:3;18292:20;18289:1;18282:31;18332:4;18329:1;18322:15;18356:4;18353:1;18346:15;18372:125;18437:9;;;18458:10;;;18455:36;;;18471:18;;:::i;18502:128::-;18569:9;;;18590:11;;;18587:37;;;18604:18;;:::i;19184:284::-;19278:6;19331:2;19319:9;19310:7;19306:23;19302:32;19299:52;;;19347:1;19344;19337:12;19299:52;19379:9;19373:16;19418:1;19411:5;19408:12;19398:40;;19434:1;19431;19424:12;19473:127;19534:10;19529:3;19525:20;19522:1;19515:31;19565:4;19562:1;19555:15;19589:4;19586:1;19579:15;19605:168;19678:9;;;19709;;19726:15;;;19720:22;;19706:37;19696:71;;19747:18;;:::i;19778:217::-;19818:1;19844;19834:132;;19888:10;19883:3;19879:20;19876:1;19869:31;19923:4;19920:1;19913:15;19951:4;19948:1;19941:15;19834:132;-1:-1:-1;19980:9:53;;19778:217::o;20000:360::-;20203:6;20192:9;20185:25;20246:6;20241:2;20230:9;20226:18;20219:34;20289:2;20284;20273:9;20269:18;20262:30;20166:4;20309:45;20350:2;20339:9;20335:18;20327:6;20309:45;:::i;:::-;20301:53;20000:360;-1:-1:-1;;;;;20000:360:53:o;20365:274::-;-1:-1:-1;;;;;20557:32:53;;;;20539:51;;20621:2;20606:18;;20599:34;20527:2;20512:18;;20365:274::o;20644:182::-;-1:-1:-1;;;;;20751:10:53;;;20763;;;20747:27;;20786:11;;;20783:37;;;20800:18;;:::i;20831:185::-;-1:-1:-1;;;;;20952:10:53;;;20940;;;20936:27;;20975:12;;;20972:38;;;20990:18;;:::i

    Swarm Source

    ipfs://ae817a6e576e78f77be7d1068f3caccb55e0d3d184566deda1586c9ebf0cfabc

    Block Age Transaction Gas Used Reward
    view all blocks ##produced##

    Block Age Uncle Number Difficulty Gas Used Reward
    View All Uncles
    Loading...
    Loading
    Loading...
    Loading

    Validator Index Block Age Amount
    View All Withdrawals

    Transaction Hash Block Age Value Eth2 PubKey Valid
    View All Deposits
    [ Download: CSV Export  ]
    [ Download: CSV Export  ]

    A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.