{
  "_format": "hh-sol-artifact-1",
  "contractName": "AuthorityManager",
  "sourceName": "contracts/AuthorityManager.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "default_admin",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        }
      ],
      "name": "AccessManagerAlreadyScheduled",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AccessManagerBadConfirmation",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        }
      ],
      "name": "AccessManagerExpired",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "initialAdmin",
          "type": "address"
        }
      ],
      "name": "AccessManagerInvalidInitialAdmin",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        }
      ],
      "name": "AccessManagerLockedRole",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        }
      ],
      "name": "AccessManagerNotReady",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        }
      ],
      "name": "AccessManagerNotScheduled",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "msgsender",
          "type": "address"
        },
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        }
      ],
      "name": "AccessManagerUnauthorizedAccount",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes4",
          "name": "selector",
          "type": "bytes4"
        }
      ],
      "name": "AccessManagerUnauthorizedCall",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "msgsender",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes4",
          "name": "selector",
          "type": "bytes4"
        }
      ],
      "name": "AccessManagerUnauthorizedCancel",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AccessManagerUnauthorizedConsume",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AddressEmptyCode",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "FailedCall",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "balance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "needed",
          "type": "uint256"
        }
      ],
      "name": "InsufficientBalance",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "bits",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "SafeCastOverflowedUintDowncast",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "uint32",
          "name": "nonce",
          "type": "uint32"
        }
      ],
      "name": "OperationCanceled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "uint32",
          "name": "nonce",
          "type": "uint32"
        }
      ],
      "name": "OperationExecuted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "uint32",
          "name": "nonce",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint48",
          "name": "schedule",
          "type": "uint48"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "OperationScheduled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "admin",
          "type": "uint64"
        }
      ],
      "name": "RoleAdminChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "delay",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint48",
          "name": "since",
          "type": "uint48"
        }
      ],
      "name": "RoleGrantDelayChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "delay",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint48",
          "name": "since",
          "type": "uint48"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "newMember",
          "type": "bool"
        }
      ],
      "name": "RoleGranted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "guardian",
          "type": "uint64"
        }
      ],
      "name": "RoleGuardianChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "label",
          "type": "string"
        }
      ],
      "name": "RoleLabel",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "RoleRevoked",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "delay",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint48",
          "name": "since",
          "type": "uint48"
        }
      ],
      "name": "TargetAdminDelayUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "closed",
          "type": "bool"
        }
      ],
      "name": "TargetClosed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes4",
          "name": "selector",
          "type": "bytes4"
        },
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        }
      ],
      "name": "TargetFunctionRoleUpdated",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "PUBLIC_ROLE",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes4",
          "name": "selector",
          "type": "bytes4"
        }
      ],
      "name": "canCall",
      "outputs": [
        {
          "internalType": "bool",
          "name": "immediate",
          "type": "bool"
        },
        {
          "internalType": "uint32",
          "name": "delay",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "cancel",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "consumeScheduledOp",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "execute",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "expiration",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "getAccess",
      "outputs": [
        {
          "internalType": "uint48",
          "name": "since",
          "type": "uint48"
        },
        {
          "internalType": "uint32",
          "name": "currentDelay",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "pendingDelay",
          "type": "uint32"
        },
        {
          "internalType": "uint48",
          "name": "effect",
          "type": "uint48"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "id",
          "type": "bytes32"
        }
      ],
      "name": "getNonce",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        }
      ],
      "name": "getRoleAdmin",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        }
      ],
      "name": "getRoleGrantDelay",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        }
      ],
      "name": "getRoleGuardian",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "role",
          "type": "uint64"
        },
        {
          "internalType": "uint256",
          "name": "index",
          "type": "uint256"
        }
      ],
      "name": "getRoleMember",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "role",
          "type": "uint64"
        }
      ],
      "name": "getRoleMemberCount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "role",
          "type": "uint64"
        }
      ],
      "name": "getRoleMembers",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "id",
          "type": "bytes32"
        }
      ],
      "name": "getSchedule",
      "outputs": [
        {
          "internalType": "uint48",
          "name": "",
          "type": "uint48"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "getTargetAdminDelay",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes4",
          "name": "selector",
          "type": "bytes4"
        }
      ],
      "name": "getTargetFunctionRole",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "executionDelay",
          "type": "uint32"
        }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "isMember",
          "type": "bool"
        },
        {
          "internalType": "uint32",
          "name": "executionDelay",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "caller",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "hashOperation",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "isTargetClosed",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "internalType": "string",
          "name": "label",
          "type": "string"
        }
      ],
      "name": "labelRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "minSetback",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes[]",
          "name": "data",
          "type": "bytes[]"
        }
      ],
      "name": "multicall",
      "outputs": [
        {
          "internalType": "bytes[]",
          "name": "results",
          "type": "bytes[]"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "internalType": "address",
          "name": "callerConfirmation",
          "type": "address"
        }
      ],
      "name": "renounceRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "revokeRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        },
        {
          "internalType": "uint48",
          "name": "when",
          "type": "uint48"
        }
      ],
      "name": "schedule",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        },
        {
          "internalType": "uint32",
          "name": "nonce",
          "type": "uint32"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "internalType": "uint32",
          "name": "newDelay",
          "type": "uint32"
        }
      ],
      "name": "setGrantDelay",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "internalType": "uint64",
          "name": "admin",
          "type": "uint64"
        }
      ],
      "name": "setRoleAdmin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        },
        {
          "internalType": "uint64",
          "name": "guardian",
          "type": "uint64"
        }
      ],
      "name": "setRoleGuardian",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "newDelay",
          "type": "uint32"
        }
      ],
      "name": "setTargetAdminDelay",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "closed",
          "type": "bool"
        }
      ],
      "name": "setTargetClosed",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "bytes4[]",
          "name": "selectors",
          "type": "bytes4[]"
        },
        {
          "internalType": "uint64",
          "name": "roleId",
          "type": "uint64"
        }
      ],
      "name": "setTargetFunctionRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "newAuthority",
          "type": "address"
        }
      ],
      "name": "updateAuthority",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b506040516132b73803806132b783398101604081905261002f916104f4565b806001600160a01b03811661005f57604051630409d6d160e11b8152600060048201526024015b60405180910390fd5b61006c60008281806100a8565b50506000805260046020526100a17f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec826102f3565b505061057d565b60006002600160401b03196001600160401b038616016100e65760405163061c6a4360e21b81526001600160401b0386166004820152602401610056565b6001600160401b03851660009081526001602090815260408083206001600160a01b038816845290915281205465ffffffffffff16159081156101dd5763ffffffff8516610132610311565b61013c919061053a565b905060405180604001604052808265ffffffffffff16815260200161016c8663ffffffff1661032160201b60201c565b6001600160701b039081169091526001600160401b03891660009081526001602090815260408083206001600160a01b038c16845282529091208351815494909201519092166601000000000000026001600160a01b031990931665ffffffffffff90911617919091179055610285565b6001600160401b03871660009081526001602090815260408083206001600160a01b038a16845290915281205461022a9166010000000000009091046001600160701b031690869061032a565b6001600160401b03891660009081526001602090815260408083206001600160a01b038c168452909152902080546001600160701b03909316660100000000000002600160301b600160a01b03199093169290921790915590505b6040805163ffffffff8616815265ffffffffffff831660208201528315158183015290516001600160a01b038816916001600160401b038a16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a35095945050505050565b6000610308836001600160a01b0384166103d3565b90505b92915050565b600061031c42610422565b905090565b63ffffffff1690565b600080806103406001600160701b038716610459565b9050600061037d8563ffffffff168763ffffffff168463ffffffff1611610368576000610372565b6103728885610560565b63ffffffff16610478565b905063ffffffff811661038e610311565b610398919061053a565b925063ffffffff8616602083901b67ffffffff0000000016604085901b6dffffffffffff000000000000000016171793505050935093915050565b600081815260018301602052604081205461041a5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561030b565b50600061030b565b600065ffffffffffff821115610455576040516306dfcc6560e41b81526030600482015260248101839052604401610056565b5090565b60008061046e6001600160701b038416610488565b5090949350505050565b6000828218828411028218610308565b6000808061049d84610498610311565b6104aa565b9250925092509193909250565b6001600160501b03602083901c166001600160701b03831665ffffffffffff604085901c81169084168111156104e2578282826104e7565b816000805b9250925092509250925092565b60006020828403121561050657600080fd5b81516001600160a01b038116811461051d57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b65ffffffffffff81811683821601908082111561055957610559610524565b5092915050565b63ffffffff82811682821603908082111561055957610559610524565b612d2b8061058c6000396000f3fe6080604052600436106102045760003560e01c806375b238fc11610118578063b7d2b162116100a0578063d6bb62c61161006f578063d6bb62c6146106cc578063d78a83b1146106ec578063f801a69814610724578063fc8610d11461075e578063fe0776f51461077e57600080fd5b8063b7d2b16214610656578063cc1b6c8114610676578063d1f856ee1461068c578063d22b5989146106ac57600080fd5b8063a5808e2f116100e7578063a5808e2f14610572578063a64d95ce1461059f578063abd9bd2a146105bf578063ac9650d8146105ed578063b70096131461061a57600080fd5b806375b238fc146104ed578063853551b81461050257806394c7d7ee14610522578063a166aa891461054257600080fd5b806330cae1871161019b5780634665096d1161016a5780634665096d1461043a5780634c1da1e2146104505780635296295214610470578063530dd456146104905780636d5115bd146104cd57600080fd5b806330cae1871461038e5780633adc277a146103ae5780633ca7c02a146103e55780634136a33c1461040057600080fd5b806318ff183c116101d757806318ff183c146102e15780631cff79cd1461030157806325c471a0146103145780633078f1141461033457600080fd5b806308d6122d146102095780630b0a93ba1461022b57806312be87271461028c578063167bd395146102c1575b600080fd5b34801561021557600080fd5b506102296102243660046124fa565b61079e565b005b34801561023757600080fd5b5061026f610246366004612560565b6001600160401b0390811660009081526001602081905260409091200154600160401b90041690565b6040516001600160401b0390911681526020015b60405180910390f35b34801561029857600080fd5b506102ac6102a7366004612560565b6107f1565b60405163ffffffff9091168152602001610283565b3480156102cd57600080fd5b506102296102dc36600461257b565b61082c565b3480156102ed57600080fd5b506102296102fc3660046125b9565b610842565b6102ac61030f366004612628565b6108a9565b34801561032057600080fd5b5061022961032f366004612690565b6109d9565b34801561034057600080fd5b5061035461034f3660046126d5565b610a27565b604051610283949392919065ffffffffffff948516815263ffffffff93841660208201529190921660408201529116606082015260800190565b34801561039a57600080fd5b506102296103a93660046126f1565b610a8c565b3480156103ba57600080fd5b506103ce6103c9366004612724565b610a9e565b60405165ffffffffffff9091168152602001610283565b3480156103f157600080fd5b5061026f6001600160401b0381565b34801561040c57600080fd5b506102ac61041b366004612724565b600090815260026020526040902054600160301b900463ffffffff1690565b34801561044657600080fd5b5062093a806102ac565b34801561045c57600080fd5b506102ac61046b36600461273d565b610ad1565b34801561047c57600080fd5b5061022961048b3660046126f1565b610aff565b34801561049c57600080fd5b5061026f6104ab366004612560565b6001600160401b03908116600090815260016020819052604090912001541690565b3480156104d957600080fd5b5061026f6104e8366004612770565b610b11565b3480156104f957600080fd5b5061026f600081565b34801561050e57600080fd5b5061022961051d36600461279e565b610b4c565b34801561052e57600080fd5b5061022961053d366004612628565b610be3565b34801561054e57600080fd5b5061056261055d36600461273d565b610c8f565b6040519015158152602001610283565b34801561057e57600080fd5b5061059261058d366004612560565b610cb7565b60405161028391906127bc565b3480156105ab57600080fd5b506102296105ba366004612809565b610cdb565b3480156105cb57600080fd5b506105df6105da366004612833565b610ced565b604051908152602001610283565b3480156105f957600080fd5b5061060d610608366004612897565b610d26565b60405161028391906128fc565b34801561062657600080fd5b5061063a610635366004612976565b610e0d565b60408051921515835263ffffffff909116602083015201610283565b34801561066257600080fd5b506102296106713660046126d5565b610e94565b34801561068257600080fd5b50620697806102ac565b34801561069857600080fd5b5061063a6106a73660046126d5565b610ed7565b3480156106b857600080fd5b506102296106c73660046129c1565b610f54565b3480156106d857600080fd5b506102ac6106e7366004612833565b610f66565b3480156106f857600080fd5b5061070c6107073660046129df565b6110c0565b6040516001600160a01b039091168152602001610283565b34801561073057600080fd5b5061074461073f366004612a09565b6110e2565b6040805192835263ffffffff909116602083015201610283565b34801561076a57600080fd5b506105df610779366004612560565b611227565b34801561078a57600080fd5b506102296107993660046126d5565b611248565b6107a6611271565b60005b828110156107ea576107e2858585848181106107c7576107c7612a7b565b90506020020160208101906107dc9190612a91565b846112ec565b6001016107a9565b5050505050565b6001600160401b03811660009081526001602081905260408220015461082690600160801b90046001600160701b031661136e565b92915050565b610834611271565b61083e828261138d565b5050565b61084a611271565b604051637a9e5e4b60e01b81526001600160a01b038281166004830152831690637a9e5e4b90602401600060405180830381600087803b15801561088d57600080fd5b505af11580156108a1573d6000803e3d6000fd5b505050505050565b60003381806108ba838888886113ff565b91509150811580156108d0575063ffffffff8116155b156109235782876108e18888611452565b6040516381c6f24b60e01b81526001600160a01b0393841660048201529290911660248301526001600160e01b03191660448201526064015b60405180910390fd5b600061093184898989610ced565b9050600063ffffffff8316151580610958575061094d82610a9e565b65ffffffffffff1615155b15610969576109668261146a565b90505b60035461097f8a61097a8b8b611452565b61156a565b6003819055506109c78a8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152503492506115ac915050565b506003559450505050505b9392505050565b6109e1611271565b60006109f784846109f1876107f1565b85611650565b90508015610a21576001600160401b03841660009081526004602052604090206107ea908461189b565b50505050565b6001600160401b03821660009081526001602090815260408083206001600160a01b03851684529091528120805465ffffffffffff811692918291829190610a7e90600160301b90046001600160701b03166118b0565b969991985096509350505050565b610a94611271565b61083e82826118d3565b60008181526002602052604081205465ffffffffffff16610abe81611977565b610ac857806109d2565b60009392505050565b6001600160a01b038116600090815260208190526040812060010154610826906001600160701b031661136e565b610b07611271565b61083e82826119a6565b6001600160a01b0382166000908152602081815260408083206001600160e01b0319851684529091529020546001600160401b031692915050565b610b54611271565b6001600160401b0383161580610b7257506001600160401b03838116145b15610b9b5760405163061c6a4360e21b81526001600160401b038416600482015260240161091a565b826001600160401b03167f1256f5b5ecb89caec12db449738f2fbcd1ba5806cf38f35413f4e5c15bf6a4508383604051610bd6929190612ad7565b60405180910390a2505050565b60408051638fb3603760e01b80825291513392918391638fb36037916004808201926020929091908290030181865afa158015610c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c489190612af3565b6001600160e01b03191614610c7b57604051630641fee960e31b81526001600160a01b038216600482015260240161091a565b6107ea610c8a85838686610ced565b61146a565b6001600160a01b0316600090815260208190526040902060010154600160701b900460ff1690565b6001600160401b038116600090815260046020526040902060609061082690611a58565b610ce3611271565b61083e8282611a65565b600084848484604051602001610d069493929190612b10565b604051602081830303815290604052805190602001209050949350505050565b604080516000815260208101909152606090826001600160401b03811115610d5057610d50612b90565b604051908082528060200260200182016040528015610d8357816020015b6060815260200190600190039081610d6e5790505b50915060005b83811015610e0557610de030868684818110610da757610da7612a7b565b9050602002810190610db99190612ba6565b85604051602001610dcc93929190612bec565b604051602081830303815290604052611b76565b838281518110610df257610df2612a7b565b6020908102919091010152600101610d89565b505092915050565b600080610e1984610c8f565b15610e2957506000905080610e8c565b306001600160a01b03861603610e4e57610e438484611bec565b600091509150610e8c565b6000610e5a8585610b11565b9050600080610e698389610ed7565b9150915081610e7a57600080610e84565b63ffffffff811615815b945094505050505b935093915050565b610e9c611271565b6000610ea88383611c03565b90508015610ed2576001600160401b0383166000908152600460205260409020610a219083611cf0565b505050565b60008067fffffffffffffffe196001600160401b03851601610eff5750600190506000610f4d565b600080610f0c8686610a27565b5050915091508165ffffffffffff16600014158015610f425750610f2e611d05565b65ffffffffffff168265ffffffffffff1611155b93509150610f4d9050565b9250929050565b610f5c611271565b61083e8282611d15565b60003381610f748585611452565b90506000610f8488888888610ced565b60008181526002602052604081205491925065ffffffffffff9091169003610fc25760405163060a299b60e41b81526004810182905260240161091a565b826001600160a01b0316886001600160a01b03161461105e576000610fe8600085610ed7565b5090506000611003610ffd6102468b87610b11565b86610ed7565b50905081158015611012575080155b1561105b57604051630ff89d4760e21b81526001600160a01b038087166004830152808c1660248301528a1660448201526001600160e01b03198516606482015260840161091a565b50505b600081815260026020526040808220805465ffffffffffff1916908190559051600160301b90910463ffffffff1691829184917fbd9ac67a6e2f6463b80927326310338bcbb4bdb7936ce1365ea3e01067e7b9f791a398975050505050505050565b6001600160401b03821660009081526004602052604081206109d29083611dd2565b60008033816110f3828989896113ff565b91505060008163ffffffff16611107611d05565b6111119190612c13565b905063ffffffff82161580611148575060008665ffffffffffff1611801561114857508065ffffffffffff168665ffffffffffff16105b156111595782896108e18a8a611452565b6111738665ffffffffffff168265ffffffffffff16611dde565b9550611181838a8a8a610ced565b945061118c85611dee565b60008581526002602052604090819020805465ffffffffffff891669ffffffffffffffffffff19821617600160301b9182900463ffffffff90811660010190811692830291909117909255915190955086907f82a2da5dee54ea8021c6545b4444620291e07ee83be6dd57edb175062715f3b490611213908a9088908f908f908f90612c32565b60405180910390a350505094509492505050565b6001600160401b038116600090815260046020526040812061082690611e3b565b6001600160a01b0381163314610e9c57604051635f159e6360e01b815260040160405180910390fd5b33600080611280838236611e45565b9150915081610ed2578063ffffffff166000036112dc5760006112a38136611f0f565b5060405163f07e038f60e01b81526001600160a01b03871660048201526001600160401b0382166024820152909250604401905061091a565b610a21610c8a8430600036610ced565b6001600160a01b0383166000818152602081815260408083206001600160e01b0319871680855290835292819020805467ffffffffffffffff19166001600160401b038716908117909155905192835292917f9ea6790c7dadfd01c9f8b9762b3682607af2c7e79e05a9f9fdf5580dde949151910160405180910390a3505050565b600080611383836001600160701b03166118b0565b5090949350505050565b6001600160a01b038216600081815260208190526040908190206001018054841515600160701b0260ff60701b19909116179055517f90d4e7bb7e5d933792b3562e1741306f8be94837e1348dacef9b6f1df56eb138906113f390841515815260200190565b60405180910390a25050565b600080306001600160a01b038616036114265761141d868585611e45565b91509150611449565b600483106114425761143d86866106358787611452565b61141d565b5060009050805b94509492505050565b60006114616004828486612b66565b6109d291612c78565b60008181526002602052604081205465ffffffffffff811690600160301b900463ffffffff168183036114b35760405163060a299b60e41b81526004810185905260240161091a565b6114bb611d05565b65ffffffffffff168265ffffffffffff1611156114ee57604051630c65b5bd60e11b81526004810185905260240161091a565b6114f782611977565b1561151857604051631e2975b960e21b81526004810185905260240161091a565b600084815260026020526040808220805465ffffffffffff191690555163ffffffff83169186917f76a2a46953689d4861a5d3f6ed883ad7e6af674a21f8e162707159fc9dde614d9190a39392505050565b604080516001600160a01b03939093166020808501919091526001600160e01b0319929092168382015280518084038201815260609093019052815191012090565b6060814710156115d85760405163cf47918160e01b81524760048201526024810183905260440161091a565b600080856001600160a01b031684866040516115f49190612ca6565b60006040518083038185875af1925050503d8060008114611631576040519150601f19603f3d011682016040523d82523d6000602084013e611636565b606091505b5091509150611646868383612101565b9695505050505050565b600067fffffffffffffffe196001600160401b0386160161168f5760405163061c6a4360e21b81526001600160401b038616600482015260240161091a565b6001600160401b03851660009081526001602090815260408083206001600160a01b038816845290915281205465ffffffffffff1615908115611781578463ffffffff166116db611d05565b6116e59190612c13565b905060405180604001604052808265ffffffffffff1681526020016117138663ffffffff1663ffffffff1690565b6001600160701b039081169091526001600160401b03891660009081526001602090815260408083206001600160a01b038c1684528252909120835181549490920151909216600160301b026001600160a01b031990931665ffffffffffff9091161791909117905561182d565b6001600160401b03871660009081526001602090815260408083206001600160a01b038a1684529091528120546117cb91600160301b9091046001600160701b031690869061215d565b6001600160401b03891660009081526001602090815260408083206001600160a01b038c168452909152902080546001600160701b03909316600160301b0273ffffffffffffffffffffffffffff000000000000199093169290921790915590505b6040805163ffffffff8616815265ffffffffffff831660208201528315158183015290516001600160a01b038816916001600160401b038a16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a35095945050505050565b60006109d2836001600160a01b038416612207565b60008060006118c6846118c1611d05565b612256565b9250925092509193909250565b6001600160401b03821615806118f157506001600160401b03828116145b1561191a5760405163061c6a4360e21b81526001600160401b038316600482015260240161091a565b6001600160401b038281166000818152600160208190526040808320909101805467ffffffffffffffff19169486169485179055517f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63409190a35050565b6000611981611d05565b65ffffffffffff1661199662093a8084612c13565b65ffffffffffff16111592915050565b6001600160401b03821615806119c457506001600160401b03828116145b156119ed5760405163061c6a4360e21b81526001600160401b038316600482015260240161091a565b6001600160401b03828116600081815260016020819052604080832090910180546fffffffffffffffff00000000000000001916600160401b958716958602179055517f7a8059630b897b5de4c08ade69f8b90c3ead1f8596d62d10b6c4d14a0afb4ae29190a35050565b606060006109d2836122a3565b67fffffffffffffffe196001600160401b03831601611aa25760405163061c6a4360e21b81526001600160401b038316600482015260240161091a565b6001600160401b038216600090815260016020819052604082200154611adc90600160801b90046001600160701b0316836206978061215d565b6001600160401b0385166000818152600160208190526040918290200180546001600160701b03909516600160801b026dffffffffffffffffffffffffffff60801b199095169490941790935591519092507ffeb69018ee8b8fd50ea86348f1267d07673379f72cffdeccec63853ee8ce8b4890610bd6908590859063ffffffff92909216825265ffffffffffff16602082015260400190565b6060600080846001600160a01b031684604051611b939190612ca6565b600060405180830381855af49150503d8060008114611bce576040519150601f19603f3d011682016040523d82523d6000602084013e611bd3565b606091505b5091509150611be3858383612101565b95945050505050565b6000611bf8838361156a565b600354149392505050565b600067fffffffffffffffe196001600160401b03841601611c425760405163061c6a4360e21b81526001600160401b038416600482015260240161091a565b6001600160401b03831660009081526001602090815260408083206001600160a01b038616845290915281205465ffffffffffff169003611c8557506000610826565b6001600160401b03831660008181526001602090815260408083206001600160a01b038716808552925280832080546001600160a01b0319169055519092917ff229baa593af28c41b1d16b748cd7688f0c83aaf92d4be41c44005defe84c16691a350600192915050565b60006109d2836001600160a01b0384166122ff565b6000611d10426123f9565b905090565b6001600160a01b038216600090815260208190526040812060010154611d48906001600160701b0316836206978061215d565b6001600160a01b0385166000818152602081815260409182902060010180546dffffffffffffffffffffffffffff19166001600160701b039690961695909517909455805163ffffffff8716815265ffffffffffff841694810194909452919350917fa56b76017453f399ec2327ba00375dbfb1fd070ff854341ad6191e6a2e2de19c9101610bd6565b60006109d28383612430565b60008282188284110282186109d2565b60008181526002602052604090205465ffffffffffff168015801590611e1a5750611e1881611977565b155b1561083e5760405163813e945960e01b81526004810183905260240161091a565b6000610826825490565b6000806004831015611e5c57506000905080610e8c565b306001600160a01b03861603611e7f57610e4330611e7a8686611452565b611bec565b6000806000611e8e8787611f0f565b92509250925082158015611ea65750611ea630610c8f565b15611eba5760008094509450505050610e8c565b600080611ec7848b610ed7565b9150915081611ee157600080965096505050505050610e8c565b611ef78363ffffffff168263ffffffff16611dde565b63ffffffff8116159b909a5098505050505050505050565b600080806004841015611f2a575060009150819050806120fa565b6000611f368686611452565b90506001600160e01b031981166310a6aa3760e31b1480611f6757506001600160e01b031981166330cae18760e01b145b80611f8257506001600160e01b0319811663294b14a960e11b145b80611f9d57506001600160e01b03198116635326cae760e11b145b80611fb857506001600160e01b0319811663d22b598960e01b145b15611fce576001600080935093509350506120fa565b6001600160e01b0319811663063fc60f60e21b1480611ffd57506001600160e01b0319811663167bd39560e01b145b8061201857506001600160e01b031981166308d6122d60e01b145b1561205a57600061202d60246004888a612b66565b81019061203a919061273d565b9050600061204782610ad1565b600196506000955093506120fa92505050565b6001600160e01b0319811663012e238d60e51b148061208957506001600160e01b03198116635be958b160e11b145b156120e457600061209e60246004888a612b66565b8101906120ab9190612560565b905060016120d5826001600160401b03908116600090815260016020819052604090912001541690565b600094509450945050506120fa565b60006120f03083610b11565b6000935093509350505b9250925092565b606082612116576121118261245a565b6109d2565b815115801561212d57506001600160a01b0384163b155b1561215657604051639996b31560e01b81526001600160a01b038516600482015260240161091a565b50806109d2565b6000806000612174866001600160701b031661136e565b905060006121b18563ffffffff168763ffffffff168463ffffffff161161219c5760006121a6565b6121a68885612cc2565b63ffffffff16611dde565b90508063ffffffff166121c2611d05565b6121cc9190612c13565b925063ffffffff8616602083901b67ffffffff0000000016604085901b6dffffffffffff000000000000000016171793505050935093915050565b600081815260018301602052604081205461224e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610826565b506000610826565b69ffffffffffffffffffff602083901c166001600160701b03831665ffffffffffff604085901c811690841681111561229157828282612296565b816000805b9250925092509250925092565b6060816000018054806020026020016040519081016040528092919081815260200182805480156122f357602002820191906000526020600020905b8154815260200190600101908083116122df575b50505050509050919050565b600081815260018301602052604081205480156123e8576000612323600183612b53565b855490915060009061233790600190612b53565b905080821461239c57600086600001828154811061235757612357612a7b565b906000526020600020015490508087600001848154811061237a5761237a612a7b565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806123ad576123ad612cdf565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610826565b6000915050610826565b5092915050565b600065ffffffffffff82111561242c576040516306dfcc6560e41b8152603060048201526024810183905260440161091a565b5090565b600082600001828154811061244757612447612a7b565b9060005260206000200154905092915050565b80511561246957805160208201fd5b60405163d6bda27560e01b815260040160405180910390fd5b50565b6001600160a01b038116811461248257600080fd5b60008083601f8401126124ac57600080fd5b5081356001600160401b038111156124c357600080fd5b6020830191508360208260051b8501011115610f4d57600080fd5b80356001600160401b03811681146124f557600080fd5b919050565b6000806000806060858703121561251057600080fd5b843561251b81612485565b935060208501356001600160401b0381111561253657600080fd5b6125428782880161249a565b90945092506125559050604086016124de565b905092959194509250565b60006020828403121561257257600080fd5b6109d2826124de565b6000806040838503121561258e57600080fd5b823561259981612485565b9150602083013580151581146125ae57600080fd5b809150509250929050565b600080604083850312156125cc57600080fd5b82356125d781612485565b915060208301356125ae81612485565b60008083601f8401126125f957600080fd5b5081356001600160401b0381111561261057600080fd5b602083019150836020828501011115610f4d57600080fd5b60008060006040848603121561263d57600080fd5b833561264881612485565b925060208401356001600160401b0381111561266357600080fd5b61266f868287016125e7565b9497909650939450505050565b803563ffffffff811681146124f557600080fd5b6000806000606084860312156126a557600080fd5b6126ae846124de565b925060208401356126be81612485565b91506126cc6040850161267c565b90509250925092565b600080604083850312156126e857600080fd5b6125d7836124de565b6000806040838503121561270457600080fd5b61270d836124de565b915061271b602084016124de565b90509250929050565b60006020828403121561273657600080fd5b5035919050565b60006020828403121561274f57600080fd5b81356109d281612485565b6001600160e01b03198116811461248257600080fd5b6000806040838503121561278357600080fd5b823561278e81612485565b915060208301356125ae8161275a565b6000806000604084860312156127b357600080fd5b612648846124de565b6020808252825182820181905260009190848201906040850190845b818110156127fd5783516001600160a01b0316835292840192918401916001016127d8565b50909695505050505050565b6000806040838503121561281c57600080fd5b612825836124de565b915061271b6020840161267c565b6000806000806060858703121561284957600080fd5b843561285481612485565b9350602085013561286481612485565b925060408501356001600160401b0381111561287f57600080fd5b61288b878288016125e7565b95989497509550505050565b600080602083850312156128aa57600080fd5b82356001600160401b038111156128c057600080fd5b6128cc8582860161249a565b90969095509350505050565b60005b838110156128f35781810151838201526020016128db565b50506000910152565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561296957878503603f190184528151805180875261294a818989018a85016128d8565b601f01601f191695909501860194509285019290850190600101612923565b5092979650505050505050565b60008060006060848603121561298b57600080fd5b833561299681612485565b925060208401356129a681612485565b915060408401356129b68161275a565b809150509250925092565b600080604083850312156129d457600080fd5b823561282581612485565b600080604083850312156129f257600080fd5b6129fb836124de565b946020939093013593505050565b60008060008060608587031215612a1f57600080fd5b8435612a2a81612485565b935060208501356001600160401b03811115612a4557600080fd5b612a51878288016125e7565b909450925050604085013565ffffffffffff81168114612a7057600080fd5b939692955090935050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612aa357600080fd5b81356109d28161275a565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000612aeb602083018486612aae565b949350505050565b600060208284031215612b0557600080fd5b81516109d28161275a565b6001600160a01b038581168252841660208201526060604082018190526000906116469083018486612aae565b634e487b7160e01b600052601160045260246000fd5b8181038181111561082657610826612b3d565b60008085851115612b7657600080fd5b83861115612b8357600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000808335601e19843603018112612bbd57600080fd5b8301803591506001600160401b03821115612bd757600080fd5b602001915036819003821315610f4d57600080fd5b828482376000838201600081528351612c098183602088016128d8565b0195945050505050565b65ffffffffffff8181168382160190808211156123f2576123f2612b3d565b65ffffffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090612c6d9083018486612aae565b979650505050505050565b6001600160e01b03198135818116916004851015610e055760049490940360031b84901b1690921692915050565b60008251612cb88184602087016128d8565b9190910192915050565b63ffffffff8281168282160390808211156123f2576123f2612b3d565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220a5f431b284777d609a182b1d18254eda749a5abec857d0c186374bdf3db2f9c764736f6c63430008190033",
  "deployedBytecode": "0x6080604052600436106102045760003560e01c806375b238fc11610118578063b7d2b162116100a0578063d6bb62c61161006f578063d6bb62c6146106cc578063d78a83b1146106ec578063f801a69814610724578063fc8610d11461075e578063fe0776f51461077e57600080fd5b8063b7d2b16214610656578063cc1b6c8114610676578063d1f856ee1461068c578063d22b5989146106ac57600080fd5b8063a5808e2f116100e7578063a5808e2f14610572578063a64d95ce1461059f578063abd9bd2a146105bf578063ac9650d8146105ed578063b70096131461061a57600080fd5b806375b238fc146104ed578063853551b81461050257806394c7d7ee14610522578063a166aa891461054257600080fd5b806330cae1871161019b5780634665096d1161016a5780634665096d1461043a5780634c1da1e2146104505780635296295214610470578063530dd456146104905780636d5115bd146104cd57600080fd5b806330cae1871461038e5780633adc277a146103ae5780633ca7c02a146103e55780634136a33c1461040057600080fd5b806318ff183c116101d757806318ff183c146102e15780631cff79cd1461030157806325c471a0146103145780633078f1141461033457600080fd5b806308d6122d146102095780630b0a93ba1461022b57806312be87271461028c578063167bd395146102c1575b600080fd5b34801561021557600080fd5b506102296102243660046124fa565b61079e565b005b34801561023757600080fd5b5061026f610246366004612560565b6001600160401b0390811660009081526001602081905260409091200154600160401b90041690565b6040516001600160401b0390911681526020015b60405180910390f35b34801561029857600080fd5b506102ac6102a7366004612560565b6107f1565b60405163ffffffff9091168152602001610283565b3480156102cd57600080fd5b506102296102dc36600461257b565b61082c565b3480156102ed57600080fd5b506102296102fc3660046125b9565b610842565b6102ac61030f366004612628565b6108a9565b34801561032057600080fd5b5061022961032f366004612690565b6109d9565b34801561034057600080fd5b5061035461034f3660046126d5565b610a27565b604051610283949392919065ffffffffffff948516815263ffffffff93841660208201529190921660408201529116606082015260800190565b34801561039a57600080fd5b506102296103a93660046126f1565b610a8c565b3480156103ba57600080fd5b506103ce6103c9366004612724565b610a9e565b60405165ffffffffffff9091168152602001610283565b3480156103f157600080fd5b5061026f6001600160401b0381565b34801561040c57600080fd5b506102ac61041b366004612724565b600090815260026020526040902054600160301b900463ffffffff1690565b34801561044657600080fd5b5062093a806102ac565b34801561045c57600080fd5b506102ac61046b36600461273d565b610ad1565b34801561047c57600080fd5b5061022961048b3660046126f1565b610aff565b34801561049c57600080fd5b5061026f6104ab366004612560565b6001600160401b03908116600090815260016020819052604090912001541690565b3480156104d957600080fd5b5061026f6104e8366004612770565b610b11565b3480156104f957600080fd5b5061026f600081565b34801561050e57600080fd5b5061022961051d36600461279e565b610b4c565b34801561052e57600080fd5b5061022961053d366004612628565b610be3565b34801561054e57600080fd5b5061056261055d36600461273d565b610c8f565b6040519015158152602001610283565b34801561057e57600080fd5b5061059261058d366004612560565b610cb7565b60405161028391906127bc565b3480156105ab57600080fd5b506102296105ba366004612809565b610cdb565b3480156105cb57600080fd5b506105df6105da366004612833565b610ced565b604051908152602001610283565b3480156105f957600080fd5b5061060d610608366004612897565b610d26565b60405161028391906128fc565b34801561062657600080fd5b5061063a610635366004612976565b610e0d565b60408051921515835263ffffffff909116602083015201610283565b34801561066257600080fd5b506102296106713660046126d5565b610e94565b34801561068257600080fd5b50620697806102ac565b34801561069857600080fd5b5061063a6106a73660046126d5565b610ed7565b3480156106b857600080fd5b506102296106c73660046129c1565b610f54565b3480156106d857600080fd5b506102ac6106e7366004612833565b610f66565b3480156106f857600080fd5b5061070c6107073660046129df565b6110c0565b6040516001600160a01b039091168152602001610283565b34801561073057600080fd5b5061074461073f366004612a09565b6110e2565b6040805192835263ffffffff909116602083015201610283565b34801561076a57600080fd5b506105df610779366004612560565b611227565b34801561078a57600080fd5b506102296107993660046126d5565b611248565b6107a6611271565b60005b828110156107ea576107e2858585848181106107c7576107c7612a7b565b90506020020160208101906107dc9190612a91565b846112ec565b6001016107a9565b5050505050565b6001600160401b03811660009081526001602081905260408220015461082690600160801b90046001600160701b031661136e565b92915050565b610834611271565b61083e828261138d565b5050565b61084a611271565b604051637a9e5e4b60e01b81526001600160a01b038281166004830152831690637a9e5e4b90602401600060405180830381600087803b15801561088d57600080fd5b505af11580156108a1573d6000803e3d6000fd5b505050505050565b60003381806108ba838888886113ff565b91509150811580156108d0575063ffffffff8116155b156109235782876108e18888611452565b6040516381c6f24b60e01b81526001600160a01b0393841660048201529290911660248301526001600160e01b03191660448201526064015b60405180910390fd5b600061093184898989610ced565b9050600063ffffffff8316151580610958575061094d82610a9e565b65ffffffffffff1615155b15610969576109668261146a565b90505b60035461097f8a61097a8b8b611452565b61156a565b6003819055506109c78a8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152503492506115ac915050565b506003559450505050505b9392505050565b6109e1611271565b60006109f784846109f1876107f1565b85611650565b90508015610a21576001600160401b03841660009081526004602052604090206107ea908461189b565b50505050565b6001600160401b03821660009081526001602090815260408083206001600160a01b03851684529091528120805465ffffffffffff811692918291829190610a7e90600160301b90046001600160701b03166118b0565b969991985096509350505050565b610a94611271565b61083e82826118d3565b60008181526002602052604081205465ffffffffffff16610abe81611977565b610ac857806109d2565b60009392505050565b6001600160a01b038116600090815260208190526040812060010154610826906001600160701b031661136e565b610b07611271565b61083e82826119a6565b6001600160a01b0382166000908152602081815260408083206001600160e01b0319851684529091529020546001600160401b031692915050565b610b54611271565b6001600160401b0383161580610b7257506001600160401b03838116145b15610b9b5760405163061c6a4360e21b81526001600160401b038416600482015260240161091a565b826001600160401b03167f1256f5b5ecb89caec12db449738f2fbcd1ba5806cf38f35413f4e5c15bf6a4508383604051610bd6929190612ad7565b60405180910390a2505050565b60408051638fb3603760e01b80825291513392918391638fb36037916004808201926020929091908290030181865afa158015610c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c489190612af3565b6001600160e01b03191614610c7b57604051630641fee960e31b81526001600160a01b038216600482015260240161091a565b6107ea610c8a85838686610ced565b61146a565b6001600160a01b0316600090815260208190526040902060010154600160701b900460ff1690565b6001600160401b038116600090815260046020526040902060609061082690611a58565b610ce3611271565b61083e8282611a65565b600084848484604051602001610d069493929190612b10565b604051602081830303815290604052805190602001209050949350505050565b604080516000815260208101909152606090826001600160401b03811115610d5057610d50612b90565b604051908082528060200260200182016040528015610d8357816020015b6060815260200190600190039081610d6e5790505b50915060005b83811015610e0557610de030868684818110610da757610da7612a7b565b9050602002810190610db99190612ba6565b85604051602001610dcc93929190612bec565b604051602081830303815290604052611b76565b838281518110610df257610df2612a7b565b6020908102919091010152600101610d89565b505092915050565b600080610e1984610c8f565b15610e2957506000905080610e8c565b306001600160a01b03861603610e4e57610e438484611bec565b600091509150610e8c565b6000610e5a8585610b11565b9050600080610e698389610ed7565b9150915081610e7a57600080610e84565b63ffffffff811615815b945094505050505b935093915050565b610e9c611271565b6000610ea88383611c03565b90508015610ed2576001600160401b0383166000908152600460205260409020610a219083611cf0565b505050565b60008067fffffffffffffffe196001600160401b03851601610eff5750600190506000610f4d565b600080610f0c8686610a27565b5050915091508165ffffffffffff16600014158015610f425750610f2e611d05565b65ffffffffffff168265ffffffffffff1611155b93509150610f4d9050565b9250929050565b610f5c611271565b61083e8282611d15565b60003381610f748585611452565b90506000610f8488888888610ced565b60008181526002602052604081205491925065ffffffffffff9091169003610fc25760405163060a299b60e41b81526004810182905260240161091a565b826001600160a01b0316886001600160a01b03161461105e576000610fe8600085610ed7565b5090506000611003610ffd6102468b87610b11565b86610ed7565b50905081158015611012575080155b1561105b57604051630ff89d4760e21b81526001600160a01b038087166004830152808c1660248301528a1660448201526001600160e01b03198516606482015260840161091a565b50505b600081815260026020526040808220805465ffffffffffff1916908190559051600160301b90910463ffffffff1691829184917fbd9ac67a6e2f6463b80927326310338bcbb4bdb7936ce1365ea3e01067e7b9f791a398975050505050505050565b6001600160401b03821660009081526004602052604081206109d29083611dd2565b60008033816110f3828989896113ff565b91505060008163ffffffff16611107611d05565b6111119190612c13565b905063ffffffff82161580611148575060008665ffffffffffff1611801561114857508065ffffffffffff168665ffffffffffff16105b156111595782896108e18a8a611452565b6111738665ffffffffffff168265ffffffffffff16611dde565b9550611181838a8a8a610ced565b945061118c85611dee565b60008581526002602052604090819020805465ffffffffffff891669ffffffffffffffffffff19821617600160301b9182900463ffffffff90811660010190811692830291909117909255915190955086907f82a2da5dee54ea8021c6545b4444620291e07ee83be6dd57edb175062715f3b490611213908a9088908f908f908f90612c32565b60405180910390a350505094509492505050565b6001600160401b038116600090815260046020526040812061082690611e3b565b6001600160a01b0381163314610e9c57604051635f159e6360e01b815260040160405180910390fd5b33600080611280838236611e45565b9150915081610ed2578063ffffffff166000036112dc5760006112a38136611f0f565b5060405163f07e038f60e01b81526001600160a01b03871660048201526001600160401b0382166024820152909250604401905061091a565b610a21610c8a8430600036610ced565b6001600160a01b0383166000818152602081815260408083206001600160e01b0319871680855290835292819020805467ffffffffffffffff19166001600160401b038716908117909155905192835292917f9ea6790c7dadfd01c9f8b9762b3682607af2c7e79e05a9f9fdf5580dde949151910160405180910390a3505050565b600080611383836001600160701b03166118b0565b5090949350505050565b6001600160a01b038216600081815260208190526040908190206001018054841515600160701b0260ff60701b19909116179055517f90d4e7bb7e5d933792b3562e1741306f8be94837e1348dacef9b6f1df56eb138906113f390841515815260200190565b60405180910390a25050565b600080306001600160a01b038616036114265761141d868585611e45565b91509150611449565b600483106114425761143d86866106358787611452565b61141d565b5060009050805b94509492505050565b60006114616004828486612b66565b6109d291612c78565b60008181526002602052604081205465ffffffffffff811690600160301b900463ffffffff168183036114b35760405163060a299b60e41b81526004810185905260240161091a565b6114bb611d05565b65ffffffffffff168265ffffffffffff1611156114ee57604051630c65b5bd60e11b81526004810185905260240161091a565b6114f782611977565b1561151857604051631e2975b960e21b81526004810185905260240161091a565b600084815260026020526040808220805465ffffffffffff191690555163ffffffff83169186917f76a2a46953689d4861a5d3f6ed883ad7e6af674a21f8e162707159fc9dde614d9190a39392505050565b604080516001600160a01b03939093166020808501919091526001600160e01b0319929092168382015280518084038201815260609093019052815191012090565b6060814710156115d85760405163cf47918160e01b81524760048201526024810183905260440161091a565b600080856001600160a01b031684866040516115f49190612ca6565b60006040518083038185875af1925050503d8060008114611631576040519150601f19603f3d011682016040523d82523d6000602084013e611636565b606091505b5091509150611646868383612101565b9695505050505050565b600067fffffffffffffffe196001600160401b0386160161168f5760405163061c6a4360e21b81526001600160401b038616600482015260240161091a565b6001600160401b03851660009081526001602090815260408083206001600160a01b038816845290915281205465ffffffffffff1615908115611781578463ffffffff166116db611d05565b6116e59190612c13565b905060405180604001604052808265ffffffffffff1681526020016117138663ffffffff1663ffffffff1690565b6001600160701b039081169091526001600160401b03891660009081526001602090815260408083206001600160a01b038c1684528252909120835181549490920151909216600160301b026001600160a01b031990931665ffffffffffff9091161791909117905561182d565b6001600160401b03871660009081526001602090815260408083206001600160a01b038a1684529091528120546117cb91600160301b9091046001600160701b031690869061215d565b6001600160401b03891660009081526001602090815260408083206001600160a01b038c168452909152902080546001600160701b03909316600160301b0273ffffffffffffffffffffffffffff000000000000199093169290921790915590505b6040805163ffffffff8616815265ffffffffffff831660208201528315158183015290516001600160a01b038816916001600160401b038a16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a35095945050505050565b60006109d2836001600160a01b038416612207565b60008060006118c6846118c1611d05565b612256565b9250925092509193909250565b6001600160401b03821615806118f157506001600160401b03828116145b1561191a5760405163061c6a4360e21b81526001600160401b038316600482015260240161091a565b6001600160401b038281166000818152600160208190526040808320909101805467ffffffffffffffff19169486169485179055517f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63409190a35050565b6000611981611d05565b65ffffffffffff1661199662093a8084612c13565b65ffffffffffff16111592915050565b6001600160401b03821615806119c457506001600160401b03828116145b156119ed5760405163061c6a4360e21b81526001600160401b038316600482015260240161091a565b6001600160401b03828116600081815260016020819052604080832090910180546fffffffffffffffff00000000000000001916600160401b958716958602179055517f7a8059630b897b5de4c08ade69f8b90c3ead1f8596d62d10b6c4d14a0afb4ae29190a35050565b606060006109d2836122a3565b67fffffffffffffffe196001600160401b03831601611aa25760405163061c6a4360e21b81526001600160401b038316600482015260240161091a565b6001600160401b038216600090815260016020819052604082200154611adc90600160801b90046001600160701b0316836206978061215d565b6001600160401b0385166000818152600160208190526040918290200180546001600160701b03909516600160801b026dffffffffffffffffffffffffffff60801b199095169490941790935591519092507ffeb69018ee8b8fd50ea86348f1267d07673379f72cffdeccec63853ee8ce8b4890610bd6908590859063ffffffff92909216825265ffffffffffff16602082015260400190565b6060600080846001600160a01b031684604051611b939190612ca6565b600060405180830381855af49150503d8060008114611bce576040519150601f19603f3d011682016040523d82523d6000602084013e611bd3565b606091505b5091509150611be3858383612101565b95945050505050565b6000611bf8838361156a565b600354149392505050565b600067fffffffffffffffe196001600160401b03841601611c425760405163061c6a4360e21b81526001600160401b038416600482015260240161091a565b6001600160401b03831660009081526001602090815260408083206001600160a01b038616845290915281205465ffffffffffff169003611c8557506000610826565b6001600160401b03831660008181526001602090815260408083206001600160a01b038716808552925280832080546001600160a01b0319169055519092917ff229baa593af28c41b1d16b748cd7688f0c83aaf92d4be41c44005defe84c16691a350600192915050565b60006109d2836001600160a01b0384166122ff565b6000611d10426123f9565b905090565b6001600160a01b038216600090815260208190526040812060010154611d48906001600160701b0316836206978061215d565b6001600160a01b0385166000818152602081815260409182902060010180546dffffffffffffffffffffffffffff19166001600160701b039690961695909517909455805163ffffffff8716815265ffffffffffff841694810194909452919350917fa56b76017453f399ec2327ba00375dbfb1fd070ff854341ad6191e6a2e2de19c9101610bd6565b60006109d28383612430565b60008282188284110282186109d2565b60008181526002602052604090205465ffffffffffff168015801590611e1a5750611e1881611977565b155b1561083e5760405163813e945960e01b81526004810183905260240161091a565b6000610826825490565b6000806004831015611e5c57506000905080610e8c565b306001600160a01b03861603611e7f57610e4330611e7a8686611452565b611bec565b6000806000611e8e8787611f0f565b92509250925082158015611ea65750611ea630610c8f565b15611eba5760008094509450505050610e8c565b600080611ec7848b610ed7565b9150915081611ee157600080965096505050505050610e8c565b611ef78363ffffffff168263ffffffff16611dde565b63ffffffff8116159b909a5098505050505050505050565b600080806004841015611f2a575060009150819050806120fa565b6000611f368686611452565b90506001600160e01b031981166310a6aa3760e31b1480611f6757506001600160e01b031981166330cae18760e01b145b80611f8257506001600160e01b0319811663294b14a960e11b145b80611f9d57506001600160e01b03198116635326cae760e11b145b80611fb857506001600160e01b0319811663d22b598960e01b145b15611fce576001600080935093509350506120fa565b6001600160e01b0319811663063fc60f60e21b1480611ffd57506001600160e01b0319811663167bd39560e01b145b8061201857506001600160e01b031981166308d6122d60e01b145b1561205a57600061202d60246004888a612b66565b81019061203a919061273d565b9050600061204782610ad1565b600196506000955093506120fa92505050565b6001600160e01b0319811663012e238d60e51b148061208957506001600160e01b03198116635be958b160e11b145b156120e457600061209e60246004888a612b66565b8101906120ab9190612560565b905060016120d5826001600160401b03908116600090815260016020819052604090912001541690565b600094509450945050506120fa565b60006120f03083610b11565b6000935093509350505b9250925092565b606082612116576121118261245a565b6109d2565b815115801561212d57506001600160a01b0384163b155b1561215657604051639996b31560e01b81526001600160a01b038516600482015260240161091a565b50806109d2565b6000806000612174866001600160701b031661136e565b905060006121b18563ffffffff168763ffffffff168463ffffffff161161219c5760006121a6565b6121a68885612cc2565b63ffffffff16611dde565b90508063ffffffff166121c2611d05565b6121cc9190612c13565b925063ffffffff8616602083901b67ffffffff0000000016604085901b6dffffffffffff000000000000000016171793505050935093915050565b600081815260018301602052604081205461224e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610826565b506000610826565b69ffffffffffffffffffff602083901c166001600160701b03831665ffffffffffff604085901c811690841681111561229157828282612296565b816000805b9250925092509250925092565b6060816000018054806020026020016040519081016040528092919081815260200182805480156122f357602002820191906000526020600020905b8154815260200190600101908083116122df575b50505050509050919050565b600081815260018301602052604081205480156123e8576000612323600183612b53565b855490915060009061233790600190612b53565b905080821461239c57600086600001828154811061235757612357612a7b565b906000526020600020015490508087600001848154811061237a5761237a612a7b565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806123ad576123ad612cdf565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610826565b6000915050610826565b5092915050565b600065ffffffffffff82111561242c576040516306dfcc6560e41b8152603060048201526024810183905260440161091a565b5090565b600082600001828154811061244757612447612a7b565b9060005260206000200154905092915050565b80511561246957805160208201fd5b60405163d6bda27560e01b815260040160405180910390fd5b50565b6001600160a01b038116811461248257600080fd5b60008083601f8401126124ac57600080fd5b5081356001600160401b038111156124c357600080fd5b6020830191508360208260051b8501011115610f4d57600080fd5b80356001600160401b03811681146124f557600080fd5b919050565b6000806000806060858703121561251057600080fd5b843561251b81612485565b935060208501356001600160401b0381111561253657600080fd5b6125428782880161249a565b90945092506125559050604086016124de565b905092959194509250565b60006020828403121561257257600080fd5b6109d2826124de565b6000806040838503121561258e57600080fd5b823561259981612485565b9150602083013580151581146125ae57600080fd5b809150509250929050565b600080604083850312156125cc57600080fd5b82356125d781612485565b915060208301356125ae81612485565b60008083601f8401126125f957600080fd5b5081356001600160401b0381111561261057600080fd5b602083019150836020828501011115610f4d57600080fd5b60008060006040848603121561263d57600080fd5b833561264881612485565b925060208401356001600160401b0381111561266357600080fd5b61266f868287016125e7565b9497909650939450505050565b803563ffffffff811681146124f557600080fd5b6000806000606084860312156126a557600080fd5b6126ae846124de565b925060208401356126be81612485565b91506126cc6040850161267c565b90509250925092565b600080604083850312156126e857600080fd5b6125d7836124de565b6000806040838503121561270457600080fd5b61270d836124de565b915061271b602084016124de565b90509250929050565b60006020828403121561273657600080fd5b5035919050565b60006020828403121561274f57600080fd5b81356109d281612485565b6001600160e01b03198116811461248257600080fd5b6000806040838503121561278357600080fd5b823561278e81612485565b915060208301356125ae8161275a565b6000806000604084860312156127b357600080fd5b612648846124de565b6020808252825182820181905260009190848201906040850190845b818110156127fd5783516001600160a01b0316835292840192918401916001016127d8565b50909695505050505050565b6000806040838503121561281c57600080fd5b612825836124de565b915061271b6020840161267c565b6000806000806060858703121561284957600080fd5b843561285481612485565b9350602085013561286481612485565b925060408501356001600160401b0381111561287f57600080fd5b61288b878288016125e7565b95989497509550505050565b600080602083850312156128aa57600080fd5b82356001600160401b038111156128c057600080fd5b6128cc8582860161249a565b90969095509350505050565b60005b838110156128f35781810151838201526020016128db565b50506000910152565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561296957878503603f190184528151805180875261294a818989018a85016128d8565b601f01601f191695909501860194509285019290850190600101612923565b5092979650505050505050565b60008060006060848603121561298b57600080fd5b833561299681612485565b925060208401356129a681612485565b915060408401356129b68161275a565b809150509250925092565b600080604083850312156129d457600080fd5b823561282581612485565b600080604083850312156129f257600080fd5b6129fb836124de565b946020939093013593505050565b60008060008060608587031215612a1f57600080fd5b8435612a2a81612485565b935060208501356001600160401b03811115612a4557600080fd5b612a51878288016125e7565b909450925050604085013565ffffffffffff81168114612a7057600080fd5b939692955090935050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612aa357600080fd5b81356109d28161275a565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000612aeb602083018486612aae565b949350505050565b600060208284031215612b0557600080fd5b81516109d28161275a565b6001600160a01b038581168252841660208201526060604082018190526000906116469083018486612aae565b634e487b7160e01b600052601160045260246000fd5b8181038181111561082657610826612b3d565b60008085851115612b7657600080fd5b83861115612b8357600080fd5b5050820193919092039150565b634e487b7160e01b600052604160045260246000fd5b6000808335601e19843603018112612bbd57600080fd5b8301803591506001600160401b03821115612bd757600080fd5b602001915036819003821315610f4d57600080fd5b828482376000838201600081528351612c098183602088016128d8565b0195945050505050565b65ffffffffffff8181168382160190808211156123f2576123f2612b3d565b65ffffffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090612c6d9083018486612aae565b979650505050505050565b6001600160e01b03198135818116916004851015610e055760049490940360031b84901b1690921692915050565b60008251612cb88184602087016128d8565b9190910192915050565b63ffffffff8281168282160390808211156123f2576123f2612b3d565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220a5f431b284777d609a182b1d18254eda749a5abec857d0c186374bdf3db2f9c764736f6c63430008190033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
