Contract 0xad961758441a99147478c594d70868c1104eb071 2

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x44260073d909d74fa008241d5b969095eff5c2871d80767538c1bdb1d249f810Execute Action203222132022-08-15 14:34:4546 days 1 hr ago0x88532f5e88f6a1ccd9e64681acc63416594000f4 IN  0xad961758441a99147478c594d70868c1104eb0710 ETH0.000067691845 ETH
0xcb727b5d027ec0c6b63ff4378d0c72902d753071eac2c90141838dd8d4207fa9Execute Action203221972022-08-15 14:34:4546 days 1 hr ago0x88532f5e88f6a1ccd9e64681acc63416594000f4 IN  0xad961758441a99147478c594d70868c1104eb0710 ETH0.000063205784 ETH
0xac1e2b2f9045ba0799394eabf3a740f78dfd91d9f1d677eac5f7642bc9e0af11Execute Action203221792022-08-15 14:34:4546 days 1 hr ago0x88532f5e88f6a1ccd9e64681acc63416594000f4 IN  0xad961758441a99147478c594d70868c1104eb0710 ETH0.000139283978 ETH
0x636b707513ee3036082520a72846b9e6014ddfe2869b0460eeba4fc576c176e6Execute Action203221632022-08-15 14:34:4546 days 1 hr ago0x88532f5e88f6a1ccd9e64681acc63416594000f4 IN  0xad961758441a99147478c594d70868c1104eb0710 ETH0.000153464122 ETH
0xb7323fdc6f4c3f0d9ffbe3464165f7f082712de4b64a47d4b08a4bc5566178ffExecute Action203221512022-08-15 14:33:5446 days 1 hr ago0x88532f5e88f6a1ccd9e64681acc63416594000f4 IN  0xad961758441a99147478c594d70868c1104eb0710 ETH0.000081644298 ETH
0x7b697277364fc769ff6247fbcac8b8f49961d06612bebcde6fc3b090290ffea5Execute Action203221412022-08-15 14:33:5446 days 1 hr ago0x88532f5e88f6a1ccd9e64681acc63416594000f4 IN  0xad961758441a99147478c594d70868c1104eb0710 ETH0.000081837906 ETH
0xe591baa7ca82c2f6385d7959b3d0a22405f79afcf2280476d51f06e6fba341acExecute Action203221292022-08-15 14:33:5446 days 1 hr ago0x88532f5e88f6a1ccd9e64681acc63416594000f4 IN  0xad961758441a99147478c594d70868c1104eb0710 ETH0.000095985522 ETH
0x8653b453fd56bea1001eb3e4172cc199d40bc43be8ba4211c234d7fa9acd53840x60806040203220582022-08-15 14:32:4246 days 1 hr ago0x88532f5e88f6a1ccd9e64681acc63416594000f4 IN  Create: Kernel0 ETH0.004463438747 ETH
[ Download CSV Export 
Latest 21 internal transactions
Parent Txn Hash Block From To Value
0xac1e2b2f9045ba0799394eabf3a740f78dfd91d9f1d677eac5f7642bc9e0af11203221792022-08-15 14:34:4546 days 1 hr ago 0xad961758441a99147478c594d70868c1104eb071 0xf6b81e637a51444688d5fbe26d938b7485de9be80 ETH
0xac1e2b2f9045ba0799394eabf3a740f78dfd91d9f1d677eac5f7642bc9e0af11203221792022-08-15 14:34:4546 days 1 hr ago 0xf6b81e637a51444688d5fbe26d938b7485de9be8 0xad961758441a99147478c594d70868c1104eb0710 ETH
0xac1e2b2f9045ba0799394eabf3a740f78dfd91d9f1d677eac5f7642bc9e0af11203221792022-08-15 14:34:4546 days 1 hr ago 0xf6b81e637a51444688d5fbe26d938b7485de9be8 0xad961758441a99147478c594d70868c1104eb0710 ETH
0xac1e2b2f9045ba0799394eabf3a740f78dfd91d9f1d677eac5f7642bc9e0af11203221792022-08-15 14:34:4546 days 1 hr ago 0xad961758441a99147478c594d70868c1104eb071 0xf6b81e637a51444688d5fbe26d938b7485de9be80 ETH
0xac1e2b2f9045ba0799394eabf3a740f78dfd91d9f1d677eac5f7642bc9e0af11203221792022-08-15 14:34:4546 days 1 hr ago 0xad961758441a99147478c594d70868c1104eb071 0xf6b81e637a51444688d5fbe26d938b7485de9be80 ETH
0xac1e2b2f9045ba0799394eabf3a740f78dfd91d9f1d677eac5f7642bc9e0af11203221792022-08-15 14:34:4546 days 1 hr ago 0xad961758441a99147478c594d70868c1104eb071 0xf6b81e637a51444688d5fbe26d938b7485de9be80 ETH
0x636b707513ee3036082520a72846b9e6014ddfe2869b0460eeba4fc576c176e6203221632022-08-15 14:34:4546 days 1 hr ago 0xad961758441a99147478c594d70868c1104eb071 0xf520119d5987e2decf6446da604077edff19bf140 ETH
0x636b707513ee3036082520a72846b9e6014ddfe2869b0460eeba4fc576c176e6203221632022-08-15 14:34:4546 days 1 hr ago 0xf520119d5987e2decf6446da604077edff19bf14 0xad961758441a99147478c594d70868c1104eb0710 ETH
0x636b707513ee3036082520a72846b9e6014ddfe2869b0460eeba4fc576c176e6203221632022-08-15 14:34:4546 days 1 hr ago 0xf520119d5987e2decf6446da604077edff19bf14 0xad961758441a99147478c594d70868c1104eb0710 ETH
0x636b707513ee3036082520a72846b9e6014ddfe2869b0460eeba4fc576c176e6203221632022-08-15 14:34:4546 days 1 hr ago 0xad961758441a99147478c594d70868c1104eb071 0xf520119d5987e2decf6446da604077edff19bf140 ETH
0x636b707513ee3036082520a72846b9e6014ddfe2869b0460eeba4fc576c176e6203221632022-08-15 14:34:4546 days 1 hr ago 0xad961758441a99147478c594d70868c1104eb071 0xf520119d5987e2decf6446da604077edff19bf140 ETH
0x636b707513ee3036082520a72846b9e6014ddfe2869b0460eeba4fc576c176e6203221632022-08-15 14:34:4546 days 1 hr ago 0xad961758441a99147478c594d70868c1104eb071 0xf520119d5987e2decf6446da604077edff19bf140 ETH
0xb7323fdc6f4c3f0d9ffbe3464165f7f082712de4b64a47d4b08a4bc5566178ff203221512022-08-15 14:33:5446 days 1 hr ago 0xad961758441a99147478c594d70868c1104eb071 0x4dad27e63da5fd85babd55b28fce986e725222800 ETH
0xb7323fdc6f4c3f0d9ffbe3464165f7f082712de4b64a47d4b08a4bc5566178ff203221512022-08-15 14:33:5446 days 1 hr ago 0xad961758441a99147478c594d70868c1104eb071 0x4dad27e63da5fd85babd55b28fce986e725222800 ETH
0xb7323fdc6f4c3f0d9ffbe3464165f7f082712de4b64a47d4b08a4bc5566178ff203221512022-08-15 14:33:5446 days 1 hr ago 0xad961758441a99147478c594d70868c1104eb071 0x4dad27e63da5fd85babd55b28fce986e725222800 ETH
0x7b697277364fc769ff6247fbcac8b8f49961d06612bebcde6fc3b090290ffea5203221412022-08-15 14:33:5446 days 1 hr ago 0xad961758441a99147478c594d70868c1104eb071 0x248019827fb4f58ece5c5606891095ae3e43e1f40 ETH
0x7b697277364fc769ff6247fbcac8b8f49961d06612bebcde6fc3b090290ffea5203221412022-08-15 14:33:5446 days 1 hr ago 0xad961758441a99147478c594d70868c1104eb071 0x248019827fb4f58ece5c5606891095ae3e43e1f40 ETH
0x7b697277364fc769ff6247fbcac8b8f49961d06612bebcde6fc3b090290ffea5203221412022-08-15 14:33:5446 days 1 hr ago 0xad961758441a99147478c594d70868c1104eb071 0x248019827fb4f58ece5c5606891095ae3e43e1f40 ETH
0xe591baa7ca82c2f6385d7959b3d0a22405f79afcf2280476d51f06e6fba341ac203221292022-08-15 14:33:5446 days 1 hr ago 0xad961758441a99147478c594d70868c1104eb071 0xef6273937f3fa1c4e616afac0da0279552188e8d0 ETH
0xe591baa7ca82c2f6385d7959b3d0a22405f79afcf2280476d51f06e6fba341ac203221292022-08-15 14:33:5446 days 1 hr ago 0xad961758441a99147478c594d70868c1104eb071 0xef6273937f3fa1c4e616afac0da0279552188e8d0 ETH
0xe591baa7ca82c2f6385d7959b3d0a22405f79afcf2280476d51f06e6fba341ac203221292022-08-15 14:33:5446 days 1 hr ago 0xad961758441a99147478c594d70868c1104eb071 0xef6273937f3fa1c4e616afac0da0279552188e8d0 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Kernel

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion, GNU AGPLv3 license
/**
 *Submitted for verification at Arbiscan on 2022-08-15
*/

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.15;

error TargetNotAContract(address target_);
error InvalidKeycode(Keycode keycode_);
error InvalidRole(Role role_);

function toKeycode(bytes5 keycode_) pure returns (Keycode) {
    return Keycode.wrap(keycode_);
}

function fromKeycode(Keycode keycode_) pure returns (bytes5) {
    return Keycode.unwrap(keycode_);
}

function toRole(bytes32 role_) pure returns (Role) {
    return Role.wrap(role_);
}

function fromRole(Role role_) pure returns (bytes32) {
    return Role.unwrap(role_);
}

function ensureContract(address target_) view {
    uint256 size;
    assembly("memory-safe") {
        size := extcodesize(target_)
    }
    if (size == 0) revert TargetNotAContract(target_);
}

function ensureValidKeycode(Keycode keycode_) pure {
    bytes5 unwrapped = Keycode.unwrap(keycode_);

    for (uint256 i = 0; i < 5; ) {
        bytes1 char = unwrapped[i];

        if (char < 0x41 || char > 0x5A) revert InvalidKeycode(keycode_); // A-Z only

        unchecked {
            i++;
        }
    }
}

function ensureValidRole(Role role_) pure {
    bytes32 unwrapped = Role.unwrap(role_);

    for (uint256 i = 0; i < 32; ) {
        bytes1 char = unwrapped[i];
        if ((char < 0x61 || char > 0x7A) && char != 0x00) {
            revert InvalidRole(role_); // a-z only
        }
        unchecked {
            i++;
        }
    }
}

// ######################## ~ ERRORS ~ ########################

// KERNEL ADAPTER

error KernelAdapter_OnlyKernel(address caller_);

// MODULE

error Module_PolicyNotAuthorized(address policy_);

// POLICY

error Policy_OnlyRole(Role role_);
error Policy_ModuleDoesNotExist(Keycode keycode_);

// KERNEL

error Kernel_OnlyExecutor(address caller_);
error Kernel_OnlyAdmin(address caller_);
error Kernel_ModuleAlreadyInstalled(Keycode module_);
error Kernel_InvalidModuleUpgrade(Keycode module_);
error Kernel_PolicyAlreadyApproved(address policy_);
error Kernel_PolicyNotApproved(address policy_);
error Kernel_AddressAlreadyHasRole(address addr_, Role role_);
error Kernel_AddressDoesNotHaveRole(address addr_, Role role_);
error Kernel_RoleDoesNotExist(Role role_);

// ######################## ~ GLOBAL TYPES ~ ########################

enum Actions {
    InstallModule,
    UpgradeModule,
    ActivatePolicy,
    DeactivatePolicy,
    ChangeExecutor,
    ChangeAdmin,
    MigrateKernel
}

struct Instruction {
    Actions action;
    address target;
}

struct Permissions {
    Keycode keycode;
    bytes4 funcSelector;
}

type Keycode is bytes5;
type Role is bytes32;

// ######################## ~ MODULE ABSTRACT ~ ########################

abstract contract KernelAdapter {
    Kernel public kernel;

    constructor(Kernel kernel_) {
        kernel = kernel_;
    }

    modifier onlyKernel() {
        if (msg.sender != address(kernel)) revert KernelAdapter_OnlyKernel(msg.sender);
        _;
    }

    function changeKernel(Kernel newKernel_) external onlyKernel {
        kernel = newKernel_;
    }
}

abstract contract Module is KernelAdapter {
    event PermissionSet(bytes4 funcSelector_, address policy_, bool permission_);

    constructor(Kernel kernel_) KernelAdapter(kernel_) {}

    modifier permissioned() {
        if (!kernel.modulePermissions(KEYCODE(), Policy(msg.sender), msg.sig))
            revert Module_PolicyNotAuthorized(msg.sender);
        _;
    }

    function KEYCODE() public pure virtual returns (Keycode);

    /// @notice Specify which version of a module is being implemented.
    /// @dev Minor version change retains interface. Major version upgrade indicates
    /// @dev breaking change to the interface.
    function VERSION() external pure virtual returns (uint8 major, uint8 minor) {}

    /// @notice Initialization function for the module.
    /// @dev This function is called when the module is installed or upgraded by the kernel.
    /// @dev Used to encompass any upgrade logic. Must be gated by onlyKernel.
    function INIT() external virtual onlyKernel {}
}

abstract contract Policy is KernelAdapter  {

    bool public isActive;

    constructor(Kernel kernel_) KernelAdapter(kernel_) {}

    modifier onlyRole(bytes32 role_) {
        Role role = toRole(role_);
        if(!kernel.hasRole(msg.sender, role))
            revert Policy_OnlyRole(role);
        _;
    }

    function configureDependencies() external virtual onlyKernel returns (Keycode[] memory dependencies) {}

    function requestPermissions() external view virtual onlyKernel returns (Permissions[] memory requests) {}

    function getModuleAddress(Keycode keycode_) internal view returns (address) {
        address moduleForKeycode = address(kernel.getModuleForKeycode(keycode_));
        if (moduleForKeycode == address(0)) revert Policy_ModuleDoesNotExist(keycode_);
        return moduleForKeycode;
    }

    /// @notice Function to let kernel grant or revoke active status
    function setActiveStatus(bool activate_) external onlyKernel {
        isActive = activate_;
    }
}

contract Kernel {
    // ######################## ~ VARS ~ ########################
    address public executor;
    address public admin;

    // ######################## ~ DEPENDENCY MANAGEMENT ~ ########################

    // Module Management
    Keycode[] public allKeycodes;
    mapping(Keycode => Module) public getModuleForKeycode; // get contract for module keycode
    mapping(Module => Keycode) public getKeycodeForModule; // get module keycode for contract
    
    // Module dependents data. Manages module dependencies for policies
    mapping(Keycode => Policy[]) public moduleDependents;
    mapping(Keycode => mapping(Policy => uint256)) public getDependentIndex;

    // Module <> Policy Permissions. Policy -> Keycode -> Function Selector -> Permission
    mapping(Keycode => mapping(Policy => mapping(bytes4 => bool))) public modulePermissions; // for policy addr, check if they have permission to call the function int he module

    // List of all active policies
    Policy[] public activePolicies;
    mapping(Policy => uint256) public getPolicyIndex;

    // Policy roles data
    mapping(address => mapping(Role => bool)) public hasRole;
    mapping(Role => bool) public isRole;

    // ######################## ~ EVENTS ~ ########################

    event PermissionsUpdated(
        Keycode indexed keycode_,
        Policy indexed policy_,
        bytes4 funcSelector_,
        bool granted_
    );
    event RoleGranted(Role indexed role_, address indexed addr_);
    event RoleRevoked(Role indexed role_, address indexed addr_);
    event ActionExecuted(Actions indexed action_, address indexed target_);

    // ######################## ~ BODY ~ ########################

    constructor() {
        executor = msg.sender;
        admin = msg.sender;
    }

    // ######################## ~ MODIFIERS ~ ########################

    // Role reserved for governor or any executing address
    modifier onlyExecutor() {
        if (msg.sender != executor) revert Kernel_OnlyExecutor(msg.sender);
        _;
    }

    // Role for managing policy roles
    modifier onlyAdmin() {
        if (msg.sender != admin) revert Kernel_OnlyAdmin(msg.sender);
        _;
    }

    // ######################## ~ KERNEL INTERFACE ~ ########################

    function executeAction(Actions action_, address target_) external onlyExecutor {
        if (action_ == Actions.InstallModule) {
            ensureContract(target_);
            ensureValidKeycode(Module(target_).KEYCODE());
            _installModule(Module(target_));
        } else if (action_ == Actions.UpgradeModule) {
            ensureContract(target_);
            ensureValidKeycode(Module(target_).KEYCODE());
            _upgradeModule(Module(target_));
        } else if (action_ == Actions.ActivatePolicy) {
            ensureContract(target_);
            _activatePolicy(Policy(target_));
        } else if (action_ == Actions.DeactivatePolicy) {
            ensureContract(target_);
            _deactivatePolicy(Policy(target_));
        } else if (action_ == Actions.MigrateKernel) {
            ensureContract(target_);
            _migrateKernel(Kernel(target_));
        } else if (action_ == Actions.ChangeExecutor) {
            executor = target_;
        } else if (action_ == Actions.ChangeAdmin) {
            admin = target_;
        }

        emit ActionExecuted(action_, target_);
    }

    // ######################## ~ KERNEL INTERNAL ~ ########################

    function _installModule(Module newModule_) internal {
        Keycode keycode = newModule_.KEYCODE();

        if (address(getModuleForKeycode[keycode]) != address(0))
            revert Kernel_ModuleAlreadyInstalled(keycode);

        getModuleForKeycode[keycode] = newModule_;
        getKeycodeForModule[newModule_] = keycode;
        allKeycodes.push(keycode);

        newModule_.INIT();
    }

    function _upgradeModule(Module newModule_) internal {
        Keycode keycode = newModule_.KEYCODE();
        Module oldModule = getModuleForKeycode[keycode];

        if (address(oldModule) == address(0) || oldModule == newModule_)
            revert Kernel_InvalidModuleUpgrade(keycode);

        getKeycodeForModule[oldModule] = Keycode.wrap(bytes5(0));
        getKeycodeForModule[newModule_] = keycode;
        getModuleForKeycode[keycode] = newModule_;

        newModule_.INIT();

        _reconfigurePolicies(keycode);
    }

    function _activatePolicy(Policy policy_) internal {
        if (policy_.isActive()) revert Kernel_PolicyAlreadyApproved(address(policy_));

        // Grant permissions for policy to access restricted module functions
        Permissions[] memory requests = policy_.requestPermissions();
        _setPolicyPermissions(policy_, requests, true);

        // Add policy to list of active policies
        activePolicies.push(policy_);
        getPolicyIndex[policy_] = activePolicies.length - 1;

        // Record module dependencies
        Keycode[] memory dependencies = policy_.configureDependencies();
        uint256 depLength = dependencies.length;

        for (uint256 i; i < depLength; ) {
            Keycode keycode = dependencies[i];

            moduleDependents[keycode].push(policy_);
            getDependentIndex[keycode][policy_] = moduleDependents[keycode].length - 1;

            unchecked {
                ++i;
            }
        }

        // Set policy status to active
        policy_.setActiveStatus(true);
    }

    function _deactivatePolicy(Policy policy_) internal {
        if (!policy_.isActive()) revert Kernel_PolicyNotApproved(address(policy_));

        // Revoke permissions
        Permissions[] memory requests = policy_.requestPermissions();
        _setPolicyPermissions(policy_, requests, false);

        // Remove policy from all policy data structures
        uint256 idx = getPolicyIndex[policy_];
        Policy lastPolicy = activePolicies[activePolicies.length - 1];

        activePolicies[idx] = lastPolicy;
        activePolicies.pop();
        getPolicyIndex[lastPolicy] = idx;
        delete getPolicyIndex[policy_];

        // Remove policy from module dependents
        _pruneFromDependents(policy_);

        // Set policy status to inactive
        policy_.setActiveStatus(false);
    }

    // WARNING: ACTION WILL BRICK THIS KERNEL. All functionality will move to the new kernel
    // New kernel must add in all of the modules and policies via executeAction
    // NOTE: Data does not get cleared from this kernel
    function _migrateKernel(Kernel newKernel_) internal {
        uint256 keycodeLen = allKeycodes.length;
        for (uint256 i; i < keycodeLen; ) {
            Module module = Module(getModuleForKeycode[allKeycodes[i]]);
            module.changeKernel(newKernel_);
            unchecked {
                ++i;
            }
        }

        uint256 policiesLen = activePolicies.length;
        for (uint256 j; j < policiesLen; ) {
            Policy policy = activePolicies[j];

            // Deactivate before changing kernel
            policy.setActiveStatus(false);
            policy.changeKernel(newKernel_);
            unchecked {
                ++j;
            }
        }
    }

    function _reconfigurePolicies(Keycode keycode_) internal {
        Policy[] memory dependents = moduleDependents[keycode_];
        uint256 depLength = dependents.length;

        for (uint256 i; i < depLength; ) {
            dependents[i].configureDependencies();

            unchecked {
                ++i;
            }
        }
    }

    function _setPolicyPermissions(
        Policy policy_,
        Permissions[] memory requests_,
        bool grant_
    ) internal {
        uint256 reqLength = requests_.length;
        for (uint256 i = 0; i < reqLength; ) {
            Permissions memory request = requests_[i];
            modulePermissions[request.keycode][policy_][request.funcSelector] = grant_;

            emit PermissionsUpdated(request.keycode, policy_, request.funcSelector, grant_);

            unchecked {
                ++i;
            }
        }
    }

    function _pruneFromDependents(Policy policy_) internal {
        Keycode[] memory dependencies = policy_.configureDependencies();
        uint256 depcLength = dependencies.length;

        for (uint256 i; i < depcLength; ) {
            Keycode keycode = dependencies[i];
            Policy[] storage dependents = moduleDependents[keycode];

            uint256 origIndex = getDependentIndex[keycode][policy_];
            Policy lastPolicy = dependents[dependents.length - 1];

            // Swap with last and pop
            dependents[origIndex] = lastPolicy;
            dependents.pop();

            // Record new index and delete terminated policy index
            getDependentIndex[keycode][lastPolicy] = origIndex;
            delete getDependentIndex[keycode][policy_];

            unchecked {
                ++i;
            }
        }
    }

    function grantRole(Role role_, address addr_) public onlyAdmin {
        if (hasRole[addr_][role_]) revert Kernel_AddressAlreadyHasRole(addr_, role_);

        ensureValidRole(role_);
        if (!isRole[role_]) isRole[role_] = true;

        hasRole[addr_][role_] = true;

        emit RoleGranted(role_, addr_);
    }

    function revokeRole(Role role_, address addr_) public onlyAdmin {
        if (!isRole[role_]) revert Kernel_RoleDoesNotExist(role_);
        if (!hasRole[addr_][role_]) revert Kernel_AddressDoesNotHaveRole(addr_, role_);

        hasRole[addr_][role_] = false;

        emit RoleRevoked(role_, addr_);
    }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"Keycode","name":"keycode_","type":"bytes5"}],"name":"InvalidKeycode","type":"error"},{"inputs":[{"internalType":"Role","name":"role_","type":"bytes32"}],"name":"InvalidRole","type":"error"},{"inputs":[{"internalType":"address","name":"addr_","type":"address"},{"internalType":"Role","name":"role_","type":"bytes32"}],"name":"Kernel_AddressAlreadyHasRole","type":"error"},{"inputs":[{"internalType":"address","name":"addr_","type":"address"},{"internalType":"Role","name":"role_","type":"bytes32"}],"name":"Kernel_AddressDoesNotHaveRole","type":"error"},{"inputs":[{"internalType":"Keycode","name":"module_","type":"bytes5"}],"name":"Kernel_InvalidModuleUpgrade","type":"error"},{"inputs":[{"internalType":"Keycode","name":"module_","type":"bytes5"}],"name":"Kernel_ModuleAlreadyInstalled","type":"error"},{"inputs":[{"internalType":"address","name":"caller_","type":"address"}],"name":"Kernel_OnlyAdmin","type":"error"},{"inputs":[{"internalType":"address","name":"caller_","type":"address"}],"name":"Kernel_OnlyExecutor","type":"error"},{"inputs":[{"internalType":"address","name":"policy_","type":"address"}],"name":"Kernel_PolicyAlreadyApproved","type":"error"},{"inputs":[{"internalType":"address","name":"policy_","type":"address"}],"name":"Kernel_PolicyNotApproved","type":"error"},{"inputs":[{"internalType":"Role","name":"role_","type":"bytes32"}],"name":"Kernel_RoleDoesNotExist","type":"error"},{"inputs":[{"internalType":"address","name":"target_","type":"address"}],"name":"TargetNotAContract","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum Actions","name":"action_","type":"uint8"},{"indexed":true,"internalType":"address","name":"target_","type":"address"}],"name":"ActionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"Keycode","name":"keycode_","type":"bytes5"},{"indexed":true,"internalType":"contract Policy","name":"policy_","type":"address"},{"indexed":false,"internalType":"bytes4","name":"funcSelector_","type":"bytes4"},{"indexed":false,"internalType":"bool","name":"granted_","type":"bool"}],"name":"PermissionsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"Role","name":"role_","type":"bytes32"},{"indexed":true,"internalType":"address","name":"addr_","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"Role","name":"role_","type":"bytes32"},{"indexed":true,"internalType":"address","name":"addr_","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"activePolicies","outputs":[{"internalType":"contract Policy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allKeycodes","outputs":[{"internalType":"Keycode","name":"","type":"bytes5"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Actions","name":"action_","type":"uint8"},{"internalType":"address","name":"target_","type":"address"}],"name":"executeAction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"Keycode","name":"","type":"bytes5"},{"internalType":"contract Policy","name":"","type":"address"}],"name":"getDependentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Module","name":"","type":"address"}],"name":"getKeycodeForModule","outputs":[{"internalType":"Keycode","name":"","type":"bytes5"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"Keycode","name":"","type":"bytes5"}],"name":"getModuleForKeycode","outputs":[{"internalType":"contract Module","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Policy","name":"","type":"address"}],"name":"getPolicyIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"Role","name":"role_","type":"bytes32"},{"internalType":"address","name":"addr_","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"Role","name":"","type":"bytes32"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"Role","name":"","type":"bytes32"}],"name":"isRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"Keycode","name":"","type":"bytes5"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"moduleDependents","outputs":[{"internalType":"contract Policy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"Keycode","name":"","type":"bytes5"},{"internalType":"contract Policy","name":"","type":"address"},{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"modulePermissions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"Role","name":"role_","type":"bytes32"},{"internalType":"address","name":"addr_","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5060008054336001600160a01b0319918216811783556001805490921617905561264190819061004090396000f3fe608060405234801561001057600080fd5b50600436106100f45760003560e01c8063ae5f76fa11610097578063d547741f11610066578063d547741f146102d5578063dbb61ee7146102e8578063f166d9eb146102fb578063f851a4401461032f57600080fd5b8063ae5f76fa14610218578063b4dc00b41461026c578063c34c08e5146102a2578063c4d1f8f1146102c257600080fd5b80632f2ff15d116100d35780632f2ff15d146101a25780635af099c9146101b757806363a6e3b5146101ca578063ac4ab3fb146101ea57600080fd5b80620dd95d146100f957806303c02f421461013657806311f944e11461016f575b600080fd5b61010c61010736600461211a565b61034f565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610161610144366004612168565b600660209081526000928352604080842090915290825290205481565b60405190815260200161012d565b61019261017d3660046121a1565b600b6020526000908152604090205460ff1681565b604051901515815260200161012d565b6101b56101b03660046121ba565b610394565b005b61010c6101c53660046121a1565b610551565b6101616101d83660046121df565b60096020526000908152604090205481565b6101926101f8366004612203565b600a60209081526000928352604080842090915290825290205460ff1681565b61023b6102263660046121df565b60046020526000908152604090205460d81b81565b6040517fffffffffff000000000000000000000000000000000000000000000000000000909116815260200161012d565b61010c61027a366004612221565b60036020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60005461010c9073ffffffffffffffffffffffffffffffffffffffff1681565b6101b56102d036600461223e565b610588565b6101b56102e33660046121ba565b610889565b61023b6102f63660046121a1565b610a31565b61019261030936600461228e565b600760209081526000938452604080852082529284528284209052825290205460ff1681565b60015461010c9073ffffffffffffffffffffffffffffffffffffffff1681565b6005602052816000526040600020818154811061036b57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146103ec576040517f07dda43b0000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a6020908152604080832085845290915290205460ff1615610476576040517f1ad5d88100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044016103e3565b61047f82610a68565b6000828152600b602052604090205460ff166104cd576000828152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b73ffffffffffffffffffffffffffffffffffffffff81166000818152600a6020908152604080832086845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555184917f2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f391a35050565b6008818154811061056157600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105da576040517e37c7b30000000000000000000000000000000000000000000000000000000081523360048201526024016103e3565b60008260068111156105ee576105ee6122d9565b03610681576105fc81610b95565b6106738173ffffffffffffffffffffffffffffffffffffffff16631ae7ec2e6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066e9190612308565b610bee565b61067c81610d0a565b610833565b6001826006811115610695576106956122d9565b036106fa576106a381610b95565b6106f18173ffffffffffffffffffffffffffffffffffffffff16631ae7ec2e6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561064a573d6000803e3d6000fd5b61067c81610f91565b600282600681111561070e5761070e6122d9565b036107255761071c81610b95565b61067c81611207565b6003826006811115610739576107396122d9565b036107505761074781610b95565b61067c8161164a565b6006826006811115610764576107646122d9565b0361077b5761077281610b95565b61067c8161196d565b600482600681111561078f5761078f6122d9565b036107d957600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316179055610833565b60058260068111156107ed576107ed6122d9565b0361083357600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b8073ffffffffffffffffffffffffffffffffffffffff1682600681111561085c5761085c6122d9565b6040517f6560dd86d70bf03c0005b3533cc115fa8b8a12b4ee11c7342ae7b32d82267c9090600090a35050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146108dc576040517f07dda43b0000000000000000000000000000000000000000000000000000000081523360048201526024016103e3565b6000828152600b602052604090205460ff16610927576040517f185a6512000000000000000000000000000000000000000000000000000000008152600481018390526024016103e3565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a6020908152604080832085845290915290205460ff166109b0576040517f89ae307e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044016103e3565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600a6020908152604080832086845290915280822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555184917f155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a5291a35050565b60028181548110610a4157600080fd5b9060005260206000209060069182820401919006600502915054906101000a900460d81b81565b8060005b6020811015610b90576000828260208110610a8957610a89612325565b1a60f81b90507f61000000000000000000000000000000000000000000000000000000000000007fff0000000000000000000000000000000000000000000000000000000000000082161080610b2057507f7a000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216115b8015610b4d57507fff00000000000000000000000000000000000000000000000000000000000000811615155b15610b87576040517f125a2bb7000000000000000000000000000000000000000000000000000000008152600481018590526024016103e3565b50600101610a6c565b505050565b803b6000819003610bea576040517f6f46ea7400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016103e3565b5050565b8060005b6005811015610b90576000828260058110610c0f57610c0f612325565b1a60f81b90507f41000000000000000000000000000000000000000000000000000000000000007fff0000000000000000000000000000000000000000000000000000000000000082161080610ca657507f5a000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216115b15610d01576040517f3afbb8280000000000000000000000000000000000000000000000000000000081527fffffffffff000000000000000000000000000000000000000000000000000000851660048201526024016103e3565b50600101610bf2565b60008173ffffffffffffffffffffffffffffffffffffffff16631ae7ec2e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7b9190612308565b7fffffffffff000000000000000000000000000000000000000000000000000000811660009081526003602052604090205490915073ffffffffffffffffffffffffffffffffffffffff1615610e21576040517f8806c6660000000000000000000000000000000000000000000000000000000081527fffffffffff000000000000000000000000000000000000000000000000000000821660048201526024016103e3565b7fffffffffff0000000000000000000000000000000000000000000000000000008116600090815260036020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871690811790915580845260049283905281842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001660d887901c908117909155600280546001810182559086527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace600680830491909101805464ffffffffff929093066005026101000a91820219909216920291909117905581517fea6439140000000000000000000000000000000000000000000000000000000081529151909363ea643914938381019391929182900301818387803b158015610f7557600080fd5b505af1158015610f89573d6000803e3d6000fd5b505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16631ae7ec2e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fde573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110029190612308565b7fffffffffff000000000000000000000000000000000000000000000000000000811660009081526003602052604090205490915073ffffffffffffffffffffffffffffffffffffffff1680158061108557508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156110e0576040517f073e07310000000000000000000000000000000000000000000000000000000081527fffffffffff000000000000000000000000000000000000000000000000000000831660048201526024016103e3565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260046020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000908116909155948816808552818520805490961660d889901c179095557fffffffffff00000000000000000000000000000000000000000000000000000087168452600390915280832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168517905580517fea643914000000000000000000000000000000000000000000000000000000008152905163ea6439149382840193909282900301818387803b1580156111e657600080fd5b505af11580156111fa573d6000803e3d6000fd5b50505050610b9082611bbe565b8073ffffffffffffffffffffffffffffffffffffffff166322f3e2d46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611252573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112769190612354565b156112c5576040517fc35db78c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016103e3565b60008173ffffffffffffffffffffffffffffffffffffffff16635924be706040518163ffffffff1660e01b8152600401600060405180830381865afa158015611312573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526113589190810190612441565b905061136682826001611d19565b600880546001808201835560008390527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee390910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861617905590546113e4919061250f565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600960205260408082209390935582517f9459b87500000000000000000000000000000000000000000000000000000000815292519092639459b8759160048083019286929190829003018183875af1158015611461573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526114a7919081019061254d565b805190915060005b818110156115c25760008382815181106114cb576114cb612325565b6020908102919091018101517fffffffffff0000000000000000000000000000000000000000000000000000008116600081815260058452604081208054600180820183558284529583200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8d1617905591905254909250611566919061250f565b7fffffffffff000000000000000000000000000000000000000000000000000000909116600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a1684529091529020556001016114af565b506040517fec7404b10000000000000000000000000000000000000000000000000000000081526001600482015273ffffffffffffffffffffffffffffffffffffffff85169063ec7404b1906024015b600060405180830381600087803b15801561162c57600080fd5b505af1158015611640573d6000803e3d6000fd5b5050505050505050565b8073ffffffffffffffffffffffffffffffffffffffff166322f3e2d46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611695573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b99190612354565b611707576040517f2507c40c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016103e3565b60008173ffffffffffffffffffffffffffffffffffffffff16635924be706040518163ffffffff1660e01b8152600401600060405180830381865afa158015611754573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261179a9190810190612441565b90506117a882826000611d19565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260096020526040812054600880549192916117e19060019061250f565b815481106117f1576117f1612325565b6000918252602090912001546008805473ffffffffffffffffffffffffffffffffffffffff909216925082918490811061182d5761182d612325565b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506008805480611886576118866125dc565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff838116835260099091526040808320859055908616825281205561191a84611e4d565b6040517fec7404b10000000000000000000000000000000000000000000000000000000081526000600482015273ffffffffffffffffffffffffffffffffffffffff85169063ec7404b190602401611612565b60025460005b81811015611a79576000600360006002848154811061199457611994612325565b6000918252602080832060068084049091015492066005026101000a90910460d81b7fffffffffff00000000000000000000000000000000000000000000000000000016835282019290925260409081019091205490517f4657b36c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015290911691508190634657b36c90602401600060405180830381600087803b158015611a5557600080fd5b505af1158015611a69573d6000803e3d6000fd5b5050505081600101915050611973565b5060085460005b81811015611bb857600060088281548110611a9d57611a9d612325565b60009182526020822001546040517fec7404b1000000000000000000000000000000000000000000000000000000008152600481019290925273ffffffffffffffffffffffffffffffffffffffff169150819063ec7404b190602401600060405180830381600087803b158015611b1357600080fd5b505af1158015611b27573d6000803e3d6000fd5b50506040517f4657b36c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015284169250634657b36c9150602401600060405180830381600087803b158015611b9457600080fd5b505af1158015611ba8573d6000803e3d6000fd5b5050505081600101915050611a80565b50505050565b7fffffffffff0000000000000000000000000000000000000000000000000000008116600090815260056020908152604080832080548251818502810185019093528083529192909190830182828015611c4e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611c23575b505083519394506000925050505b81811015611bb857828181518110611c7657611c76612325565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16639459b8756040518163ffffffff1660e01b81526004016000604051808303816000875af1158015611cca573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611d10919081019061254d565b50600101611c5c565b815160005b81811015611e46576000848281518110611d3a57611d3a612325565b60209081029190910181015180517fffffffffff000000000000000000000000000000000000000000000000000000908116600090815260078452604080822073ffffffffffffffffffffffffffffffffffffffff8c1680845290865281832085870180517fffffffff0000000000000000000000000000000000000000000000000000000090811686529188529383902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168c1515908117909155865194518451921682529681019690965293955092939116917ff3cdd20c5574ce87c347ea71e37b8fa7a095894be4b7f2bb1533e8d2342965f1910160405180910390a350600101611d1e565b5050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16639459b8756040518163ffffffff1660e01b81526004016000604051808303816000875af1158015611e9c573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611ee2919081019061254d565b805190915060005b81811015611bb8576000838281518110611f0657611f06612325565b6020908102919091018101517fffffffffff000000000000000000000000000000000000000000000000000000811660009081526005835260408082206006855281832073ffffffffffffffffffffffffffffffffffffffff8b1684529094528120548354929450918390611f7d9060019061250f565b81548110611f8d57611f8d612325565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080838381548110611fcd57611fcd612325565b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082805480612025576120256125dc565b600082815260208082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908401810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559092019092557fffffffffff00000000000000000000000000000000000000000000000000000095909516815260068552604080822073ffffffffffffffffffffffffffffffffffffffff938416835290955284812092909255871681529182209190915550600101611eea565b7fffffffffff0000000000000000000000000000000000000000000000000000008116811461211757600080fd5b50565b6000806040838503121561212d57600080fd5b8235612138816120e9565b946020939093013593505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461211757600080fd5b6000806040838503121561217b57600080fd5b8235612186816120e9565b9150602083013561219681612146565b809150509250929050565b6000602082840312156121b357600080fd5b5035919050565b600080604083850312156121cd57600080fd5b82359150602083013561219681612146565b6000602082840312156121f157600080fd5b81356121fc81612146565b9392505050565b6000806040838503121561221657600080fd5b823561213881612146565b60006020828403121561223357600080fd5b81356121fc816120e9565b6000806040838503121561225157600080fd5b82356007811061218657600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461211757600080fd5b6000806000606084860312156122a357600080fd5b83356122ae816120e9565b925060208401356122be81612146565b915060408401356122ce81612260565b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60006020828403121561231a57600080fd5b81516121fc816120e9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561236657600080fd5b815180151581146121fc57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156123c8576123c8612376565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561241557612415612376565b604052919050565b600067ffffffffffffffff82111561243757612437612376565b5060051b60200190565b6000602080838503121561245457600080fd5b825167ffffffffffffffff81111561246b57600080fd5b8301601f8101851361247c57600080fd5b805161248f61248a8261241d565b6123ce565b81815260069190911b820183019083810190878311156124ae57600080fd5b928401925b8284101561250457604084890312156124cc5760008081fd5b6124d46123a5565b84516124df816120e9565b8152848601516124ee81612260565b81870152825260409390930192908401906124b3565b979650505050505050565b600082821015612548577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500390565b6000602080838503121561256057600080fd5b825167ffffffffffffffff81111561257757600080fd5b8301601f8101851361258857600080fd5b805161259661248a8261241d565b81815260059190911b820183019083810190878311156125b557600080fd5b928401925b828410156125045783516125cd816120e9565b825292840192908401906125ba565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122014cdd19a28bbec9f41bb1c8aec93ac664e3efc9cc1bd4f7cc7851b9cc4845f7464736f6c634300080f0033

Deployed ByteCode Sourcemap

5214:9874:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5779:52;;;;;;:::i;:::-;;:::i;:::-;;;776:42:1;764:55;;;746:74;;734:2;719:18;5779:52:0;;;;;;;;5838:71;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;1607:25:1;;;1595:2;1580:18;5838:71:0;1461:177:1;6409:35:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2017:14:1;;2010:22;1992:41;;1980:2;1965:18;6409:35:0;1852:187:1;14435:328:0;;;;;;:::i;:::-;;:::i;:::-;;6226:30;;;;;;:::i;:::-;;:::i;6263:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;6346:56;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;5605:53;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3683:66:1;3671:79;;;3653:98;;3641:2;3626:18;5605:53:0;3481:276:1;5510:53:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5304:23;;;;;;;;;7561:1143;;;;;;:::i;:::-;;:::i;14771:314::-;;;;;;:::i;:::-;;:::i;5475:28::-;;;;;;:::i;:::-;;:::i;6009:87::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5334:20;;;;;;;;;5779:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5779:52:0;;-1:-1:-1;5779:52:0:o;14435:328::-;7410:5;;;;7396:10;:19;7392:60;;7424:28;;;;;7441:10;7424:28;;;746:74:1;719:18;;7424:28:0;;;;;;;;7392:60;14513:14:::1;::::0;::::1;;::::0;;;:7:::1;:14;::::0;;;;;;;:21;;;;;;;;;::::1;;14509:76;;;14543:42;::::0;::::1;::::0;;5971::1;5959:55;;14543:42:0::1;::::0;::::1;5941:74:1::0;6031:18;;;6024:34;;;5914:18;;14543:42:0::1;5743:321:1::0;14509:76:0::1;14598:22;14614:5;14598:15;:22::i;:::-;14636:13;::::0;;;:6:::1;:13;::::0;;;;;::::1;;14631:40;;14651:13;::::0;;;:6:::1;:13;::::0;;;;:20;;;::::1;14667:4;14651:20;::::0;;14631:40:::1;14684:14;::::0;::::1;;::::0;;;:7:::1;:14;::::0;;;;;;;:21;;;;;;;;;:28;;;::::1;14708:4;14684:28;::::0;;14730:25;14699:5;;14730:25:::1;::::0;::::1;14435:328:::0;;:::o;6226:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6226:30:0;:::o;7561:1143::-;7245:8;;;;7231:10;:22;7227:66;;7262:31;;;;;7282:10;7262:31;;;746:74:1;719:18;;7262:31:0;586:240:1;7227:66:0;7666:21:::1;7655:7;:32;;;;;;;;:::i;:::-;::::0;7651:996:::1;;7704:23;7719:7;7704:14;:23::i;:::-;7742:45;7768:7;7761:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7742:18;:45::i;:::-;7802:31;7824:7;7802:14;:31::i;:::-;7651:996;;;7866:21;7855:7;:32;;;;;;;;:::i;:::-;::::0;7851:796:::1;;7904:23;7919:7;7904:14;:23::i;:::-;7942:45;7968:7;7961:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;7942:45;8002:31;8024:7;8002:14;:31::i;7851:796::-;8066:22;8055:7;:33;;;;;;;;:::i;:::-;::::0;8051:596:::1;;8105:23;8120:7;8105:14;:23::i;:::-;8143:32;8166:7;8143:15;:32::i;8051:596::-;8208:24;8197:7;:35;;;;;;;;:::i;:::-;::::0;8193:454:::1;;8249:23;8264:7;8249:14;:23::i;:::-;8287:34;8312:7;8287:17;:34::i;8193:454::-;8354:21;8343:7;:32;;;;;;;;:::i;:::-;::::0;8339:308:::1;;8392:23;8407:7;8392:14;:23::i;:::-;8430:31;8452:7;8430:14;:31::i;8339:308::-;8494:22;8483:7;:33;;;;;;;;:::i;:::-;::::0;8479:168:::1;;8533:8;:18:::0;;;::::1;;::::0;::::1;;::::0;;8479:168:::1;;;8584:19;8573:7;:30;;;;;;;;:::i;:::-;::::0;8569:78:::1;;8620:5;:15:::0;;;::::1;;::::0;::::1;;::::0;;8569:78:::1;8688:7;8664:32;;8679:7;8664:32;;;;;;;;:::i;:::-;;::::0;::::1;::::0;;;::::1;7561:1143:::0;;:::o;14771:314::-;7410:5;;;;7396:10;:19;7392:60;;7424:28;;;;;7441:10;7424:28;;;746:74:1;719:18;;7424:28:0;586:240:1;7392:60:0;14851:13:::1;::::0;;;:6:::1;:13;::::0;;;;;::::1;;14846:57;;14873:30;::::0;::::1;::::0;;::::1;::::0;::::1;1607:25:1::0;;;1580:18;;14873:30:0::1;1461:177:1::0;14846:57:0::1;14919:14;::::0;::::1;;::::0;;;:7:::1;:14;::::0;;;;;;;:21;;;;;;;;;::::1;;14914:78;;14949:43;::::0;::::1;::::0;;5971:42:1;5959:55;;14949:43:0::1;::::0;::::1;5941:74:1::0;6031:18;;;6024:34;;;5914:18;;14949:43:0::1;5743:321:1::0;14914:78:0::1;15005:14;::::0;::::1;15029:5;15005:14:::0;;;:7:::1;:14;::::0;;;;;;;:21;;;;;;;;;:29;;;::::1;::::0;;15052:25;15020:5;;15052:25:::1;::::0;::::1;14771:314:::0;;:::o;5475:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1118:348::-;1199:5;1167:17;1214:249;1238:2;1234:1;:6;1214:249;;;1255:11;1269:9;1279:1;1269:12;;;;;;;:::i;:::-;;;;;-1:-1:-1;1297:11:0;;;;;;:26;;-1:-1:-1;1312:11:0;;;;;1297:26;1296:44;;;;-1:-1:-1;1328:12:0;;;;;1296:44;1292:114;;;1364:18;;;;;;;;1607:25:1;;;1580:18;;1364::0;1461:177:1;1292:114:0;-1:-1:-1;1441:3:0;;1214:249;;;;1160:306;1118:348;:::o;582:201::-;697:20;;635:12;734:9;;;730:49;;752:27;;;;;776:42:1;764:55;;752:27:0;;;746:74:1;719:18;;752:27:0;586:240:1;730:49:0;628:155;582:201;:::o;787:327::-;879:8;845:16;897:214;921:1;917;:5;897:214;;;937:11;951:9;961:1;951:12;;;;;;;:::i;:::-;;;;;-1:-1:-1;980:11:0;;;;;;:26;;-1:-1:-1;995:11:0;;;;;980:26;976:63;;;1015:24;;;;;3683:66:1;3671:79;;1015:24:0;;;3653:98:1;3626:18;;1015:24:0;3481:276:1;976:63:0;-1:-1:-1;1089:3:0;;897:214;;8792:409;8855:15;8873:10;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8918:28;;;8959:1;8918:28;;;:19;:28;;;;;;8855:38;;-1:-1:-1;8910:51:0;8918:28;8910:51;8906:115;;8983:38;;;;;3683:66:1;3671:79;;8983:38:0;;;3653:98:1;3626:18;;8983:38:0;3481:276:1;8906:115:0;9034:28;;;;;;;:19;:28;;;;;;;;:41;;;;;;;;;;;;;9086:31;;;:19;:31;;;;;;;:41;;;;;;;;;;;;;;9138:11;:25;;-1:-1:-1;9138:25:0;;;;;;;;;;;;;;;;;;9086:41;9138:25;;;;;;9034:41;9138:25;;;;;;;;;;;;;;;;9176:17;;;;;;;9034:41;;9176:15;;:17;;;;9034:28;;9176:17;;;;;;9034:28;:41;9176:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8844:357;8792:409;:::o;9209:546::-;9272:15;9290:10;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9340:28;;;9321:16;9340:28;;;:19;:28;;;;;;9272:38;;-1:-1:-1;9340:28:0;;9385:32;;;:59;;;9434:10;9421:23;;:9;:23;;;9385:59;9381:121;;;9466:36;;;;;3683:66:1;3671:79;;9466:36:0;;;3653:98:1;3626:18;;9466:36:0;3481:276:1;9381:121:0;9515:30;;;;9568:1;9515:30;;;:19;:30;;;;;;;;:56;;;;;;;;;9582:31;;;;;;;;;:41;;;;;9561:9;9582:41;;;;;;;9634:28;;;;;:19;:28;;;;;;:41;;;;;;;;9688:17;;;;;;;:15;;:17;;;;9568:1;;9688:17;;;;;9568:1;9582:31;9688:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9718:29;9739:7;9718:20;:29::i;9763:1069::-;9828:7;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9824:77;;;9855:46;;;;;776:42:1;764:55;;9855:46:0;;;746:74:1;719:18;;9855:46:0;586:240:1;9824:77:0;9993:29;10025:7;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9993:60;;10064:46;10086:7;10095:8;10105:4;10064:21;:46::i;:::-;10173:14;:28;;;;;;;;-1:-1:-1;10173:28:0;;;;;;;;;;;;;;;;;10238:21;;:25;;10173:28;10238:25;:::i;:::-;10212:23;;;;;;;:14;:23;;;;;;:51;;;;10347:31;;;;;;;10212:23;;10347:29;;:31;;;;;10212:23;;10347:31;;;;;;;10212:23;;10347:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10409:19;;10315:63;;-1:-1:-1;10389:17:0;10441:302;10461:9;10457:1;:13;10441:302;;;10489:15;10507:12;10520:1;10507:15;;;;;;;;:::i;:::-;;;;;;;;;;;;10539:25;;;;;;;:16;:25;;;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;10631:25;;;:32;10507:15;;-1:-1:-1;10631:36:0;;10539:39;10631:36;:::i;:::-;10593:26;;;;;;;;:17;:26;;;;;;;;:35;;;;;;;;;;:74;10713:3;;10441:302;;;-1:-1:-1;10795:29:0;;;;;10819:4;10795:29;;;1992:41:1;10795:23:0;;;;;;1965:18:1;;10795:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9813:1019;;;9763:1069;:::o;10840:823::-;10908:7;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10903:74;;10935:42;;;;;776::1;764:55;;10935:42:0;;;746:74:1;719:18;;10935:42:0;586:240:1;10903:74:0;11021:29;11053:7;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11021:60;;11092:47;11114:7;11123:8;11133:5;11092:21;:47::i;:::-;11224:23;;;11210:11;11224:23;;;:14;:23;;;;;;11278:14;11293:21;;11224:23;;11210:11;11293:25;;11317:1;;11293:25;:::i;:::-;11278:41;;;;;;;;:::i;:::-;;;;;;;;;;;11332:14;:19;;11278:41;;;;;-1:-1:-1;11278:41:0;;11347:3;;11332:19;;;;;;:::i;:::-;;;;;;;;;:32;;;;;;;;;;;;;;;;;;11375:14;:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;11406:26;;;;;:14;:26;;;;;;;:32;;;11456:23;;;;;;;11449:30;11541:29;11471:7;11541:20;:29::i;:::-;11625:30;;;;;11649:5;11625:30;;;1992:41:1;11625:23:0;;;;;;1965:18:1;;11625:30:0;1852:187:1;11903:713:0;11987:11;:18;11966;12016:228;12036:10;12032:1;:14;12016:228;;;12065:13;12088:19;:35;12108:11;12120:1;12108:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;12088:35;;;;;;;;;;;;;;;;;;12139:31;;;;;12088:35;764:55:1;;;12139:31:0;;;746:74:1;12088:35:0;;;;-1:-1:-1;12088:35:0;;12139:19;;719:18:1;;12139:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12214:3;;;;;12050:194;12016:228;;;-1:-1:-1;12278:14:0;:21;12256:19;12310:299;12330:11;12326:1;:15;12310:299;;;12360:13;12376:14;12391:1;12376:17;;;;;;;;:::i;:::-;;;;;;;;;;12460:29;;;;;;;;1992:41:1;;;;12376:17:0;;;-1:-1:-1;12376:17:0;;12460:22;;1965:18:1;;12460:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12504:31:0;;;;;:19;764:55:1;;;12504:31:0;;;746:74:1;12504:19:0;;;-1:-1:-1;12504:19:0;;-1:-1:-1;719:18:1;;12504:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12579:3;;;;;12345:264;12310:299;;;;11955:661;;11903:713;:::o;12624:352::-;12721:26;;;12692;12721;;;:16;:26;;;;;;;;12692:55;;;;;;;;;;;;;;;;;;;12721:26;;12692:55;;;12721:26;12692:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12778:17:0;;12692:55;;-1:-1:-1;12758:17:0;;-1:-1:-1;;;12808:161:0;12828:9;12824:1;:13;12808:161;;;12856:10;12867:1;12856:13;;;;;;;;:::i;:::-;;;;;;;:35;;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;12939:3:0;;12808:161;;12984:554;13150:16;;13130:17;13177:354;13201:9;13197:1;:13;13177:354;;;13229:26;13258:9;13268:1;13258:12;;;;;;;;:::i;:::-;;;;;;;;;;;;13303:15;;13285:34;;;;;;;;:17;:34;;;;;;:43;;;;;;;;;;;;13329:20;;;;;13285:65;;;;;;;;;;;;;:74;;;;;;;;;;;;;13400:15;;13426:20;;13381:74;;11528:79:1;;11510:98;;11624:18;;;11617:50;;;;13258:12:0;;-1:-1:-1;13285:43:0;;13381:74;;;;;11483:18:1;13381:74:0;;;;;;;-1:-1:-1;13501:3:0;;13177:354;;;;13119:419;12984:554;;;:::o;13546:881::-;13612:29;13644:7;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13707:19;;13612:63;;-1:-1:-1;13686:18:0;13739:681;13759:10;13755:1;:14;13739:681;;;13788:15;13806:12;13819:1;13806:15;;;;;;;;:::i;:::-;;;;;;;;;;;;13866:25;;;13836:27;13866:25;;;:16;:25;;;;;;13928:17;:26;;;;;:35;;;;;;;;;;;14009:17;;13806:15;;-1:-1:-1;13928:35:0;13866:25;;14009:21;;14029:1;;14009:21;:::i;:::-;13998:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;13978:53;;14111:10;14087;14098:9;14087:21;;;;;;;;:::i;:::-;;;;;;;;;:34;;;;;;;;;;;;;;;;;;14136:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;14237:26;;;;;;;:17;:26;;;;;;14136:16;14237:38;;;;;;;;;;;:50;;;;14309:35;;;;;;;14302:42;;;;-1:-1:-1;;14390:3:0;13739:681;;14:199:1;121:66;114:5;110:78;103:5;100:89;90:117;;203:1;200;193:12;90:117;14:199;:::o;218:363::-;313:6;321;374:2;362:9;353:7;349:23;345:32;342:52;;;390:1;387;380:12;342:52;429:9;416:23;448:52;494:5;448:52;:::i;:::-;519:5;571:2;556:18;;;;543:32;;-1:-1:-1;;;218:363:1:o;831:162::-;925:42;918:5;914:54;907:5;904:65;894:93;;983:1;980;973:12;998:458;1107:6;1115;1168:2;1156:9;1147:7;1143:23;1139:32;1136:52;;;1184:1;1181;1174:12;1136:52;1223:9;1210:23;1242:52;1288:5;1242:52;:::i;:::-;1313:5;-1:-1:-1;1370:2:1;1355:18;;1342:32;1383:41;1342:32;1383:41;:::i;:::-;1443:7;1433:17;;;998:458;;;;;:::o;1643:204::-;1726:6;1779:2;1767:9;1758:7;1754:23;1750:32;1747:52;;;1795:1;1792;1785:12;1747:52;-1:-1:-1;1818:23:1;;1643:204;-1:-1:-1;1643:204:1:o;2044:347::-;2136:6;2144;2197:2;2185:9;2176:7;2172:23;2168:32;2165:52;;;2213:1;2210;2203:12;2165:52;2249:9;2236:23;2226:33;;2309:2;2298:9;2294:18;2281:32;2322:39;2355:5;2322:39;:::i;2581:269::-;2654:6;2707:2;2695:9;2686:7;2682:23;2678:32;2675:52;;;2723:1;2720;2713:12;2675:52;2762:9;2749:23;2781:39;2814:5;2781:39;:::i;:::-;2839:5;2581:269;-1:-1:-1;;;2581:269:1:o;2855:347::-;2947:6;2955;3008:2;2996:9;2987:7;2983:23;2979:32;2976:52;;;3024:1;3021;3014:12;2976:52;3063:9;3050:23;3082:39;3115:5;3082:39;:::i;3762:295::-;3848:6;3901:2;3889:9;3880:7;3876:23;3872:32;3869:52;;;3917:1;3914;3907:12;3869:52;3956:9;3943:23;3975:52;4021:5;3975:52;:::i;4538:416::-;4617:6;4625;4678:2;4666:9;4657:7;4653:23;4649:32;4646:52;;;4694:1;4691;4684:12;4646:52;4733:9;4720:23;4772:1;4765:5;4762:12;4752:40;;4788:1;4785;4778:12;4959:177;5044:66;5037:5;5033:78;5026:5;5023:89;5013:117;;5126:1;5123;5116:12;5141:597;5258:6;5266;5274;5327:2;5315:9;5306:7;5302:23;5298:32;5295:52;;;5343:1;5340;5333:12;5295:52;5382:9;5369:23;5401:52;5447:5;5401:52;:::i;:::-;5472:5;-1:-1:-1;5529:2:1;5514:18;;5501:32;5542:41;5501:32;5542:41;:::i;:::-;5602:7;-1:-1:-1;5661:2:1;5646:18;;5633:32;5674;5633;5674;:::i;:::-;5725:7;5715:17;;;5141:597;;;;;:::o;6069:184::-;6121:77;6118:1;6111:88;6218:4;6215:1;6208:15;6242:4;6239:1;6232:15;6258:299;6355:6;6408:2;6396:9;6387:7;6383:23;6379:32;6376:52;;;6424:1;6421;6414:12;6376:52;6456:9;6450:16;6475:52;6521:5;6475:52;:::i;6768:184::-;6820:77;6817:1;6810:88;6917:4;6914:1;6907:15;6941:4;6938:1;6931:15;6957:277;7024:6;7077:2;7065:9;7056:7;7052:23;7048:32;7045:52;;;7093:1;7090;7083:12;7045:52;7125:9;7119:16;7178:5;7171:13;7164:21;7157:5;7154:32;7144:60;;7200:1;7197;7190:12;7239:184;7291:77;7288:1;7281:88;7388:4;7385:1;7378:15;7412:4;7409:1;7402:15;7428:257;7500:4;7494:11;;;7532:17;;7579:18;7564:34;;7600:22;;;7561:62;7558:88;;;7626:18;;:::i;:::-;7662:4;7655:24;7428:257;:::o;7690:334::-;7761:2;7755:9;7817:2;7807:13;;7822:66;7803:86;7791:99;;7920:18;7905:34;;7941:22;;;7902:62;7899:88;;;7967:18;;:::i;:::-;8003:2;7996:22;7690:334;;-1:-1:-1;7690:334:1:o;8029:194::-;8100:4;8133:18;8125:6;8122:30;8119:56;;;8155:18;;:::i;:::-;-1:-1:-1;8200:1:1;8196:14;8212:4;8192:25;;8029:194::o;8228:1372::-;8351:6;8382:2;8425;8413:9;8404:7;8400:23;8396:32;8393:52;;;8441:1;8438;8431:12;8393:52;8474:9;8468:16;8507:18;8499:6;8496:30;8493:50;;;8539:1;8536;8529:12;8493:50;8562:22;;8615:4;8607:13;;8603:27;-1:-1:-1;8593:55:1;;8644:1;8641;8634:12;8593:55;8673:2;8667:9;8696:71;8712:54;8763:2;8712:54;:::i;:::-;8696:71;:::i;:::-;8801:15;;;8883:1;8879:10;;;;8871:19;;8867:28;;;8832:12;;;;8907:19;;;8904:39;;;8939:1;8936;8929:12;8904:39;8963:11;;;;8983:587;8999:6;8994:3;8991:15;8983:587;;;9081:4;9075:3;9066:7;9062:17;9058:28;9055:118;;;9127:1;9156:2;9152;9145:14;9055:118;9199:22;;:::i;:::-;9255:3;9249:10;9272:54;9318:7;9272:54;:::i;:::-;9339:22;;9395:12;;;9389:19;9421:32;9389:19;9421:32;:::i;:::-;9473:14;;;9466:31;9510:18;;9025:4;9016:14;;;;;9548:12;;;;8983:587;;;9589:5;8228:1372;-1:-1:-1;;;;;;;8228:1372:1:o;9605:279::-;9645:4;9673:1;9670;9667:8;9664:188;;;9708:77;9705:1;9698:88;9809:4;9806:1;9799:15;9837:4;9834:1;9827:15;9664:188;-1:-1:-1;9869:9:1;;9605:279::o;9889:1015::-;10011:6;10042:2;10085;10073:9;10064:7;10060:23;10056:32;10053:52;;;10101:1;10098;10091:12;10053:52;10134:9;10128:16;10167:18;10159:6;10156:30;10153:50;;;10199:1;10196;10189:12;10153:50;10222:22;;10275:4;10267:13;;10263:27;-1:-1:-1;10253:55:1;;10304:1;10301;10294:12;10253:55;10333:2;10327:9;10356:71;10372:54;10423:2;10372:54;:::i;10356:71::-;10461:15;;;10543:1;10539:10;;;;10531:19;;10527:28;;;10492:12;;;;10567:19;;;10564:39;;;10599:1;10596;10589:12;10564:39;10623:11;;;;10643:231;10659:6;10654:3;10651:15;10643:231;;;10732:3;10726:10;10749:52;10795:5;10749:52;:::i;:::-;10814:18;;10676:12;;;;10852;;;;10643:231;;10909:184;10961:77;10958:1;10951:88;11058:4;11055:1;11048:15;11082:4;11079:1;11072:15

Metadata Hash

14cdd19a28bbec9f41bb1c8aec93ac664e3efc9cc1bd4f7cc7851b9cc4845f74
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.