diff --git a/contracts/artifacts/abi/StakeTableV2.json b/contracts/artifacts/abi/StakeTableV2.json new file mode 100644 index 0000000000..7afbed90c0 --- /dev/null +++ b/contracts/artifacts/abi/StakeTableV2.json @@ -0,0 +1,1919 @@ +[ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "DEFAULT_ADMIN_ROLE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "PAUSER_ROLE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "UPGRADE_INTERFACE_VERSION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "_hashBlsKey", + "inputs": [ + { + "name": "blsVK", + "type": "tuple", + "internalType": "struct BN254.G2Point", + "components": [ + { + "name": "x0", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "x1", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y0", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y1", + "type": "uint256", + "internalType": "BN254.BaseField" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "activeStake", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "blsKeys", + "inputs": [ + { + "name": "blsKeyHash", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "used", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "claimValidatorExit", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "claimWithdrawal", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "commissionTracking", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "commission", + "type": "uint16", + "internalType": "uint16" + }, + { + "name": "lastIncreaseTime", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "delegate", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegations", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + }, + { + "name": "delegator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "deregisterValidator", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "exitEscrowPeriod", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoleAdmin", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getVersion", + "inputs": [], + "outputs": [ + { + "name": "majorVersion", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "minorVersion", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "patchVersion", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "grantRole", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "hasRole", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "_tokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "_lightClientAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "_exitEscrowPeriod", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "_timelock", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "initializeV2", + "inputs": [ + { + "name": "pauser", + "type": "address", + "internalType": "address" + }, + { + "name": "admin", + "type": "address", + "internalType": "address" + }, + { + "name": "initialActiveStake", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "initialCommissions", + "type": "tuple[]", + "internalType": "struct StakeTableV2.InitialCommission[]", + "components": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + }, + { + "name": "commission", + "type": "uint16", + "internalType": "uint16" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "initializedAtBlock", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "lightClient", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "contract ILightClient" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "maxCommissionIncrease", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint16", + "internalType": "uint16" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "minCommissionIncreaseInterval", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "paused", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "proxiableUUID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "registerValidator", + "inputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct BN254.G2Point", + "components": [ + { + "name": "x0", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "x1", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y0", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y1", + "type": "uint256", + "internalType": "BN254.BaseField" + } + ] + }, + { + "name": "", + "type": "tuple", + "internalType": "struct EdOnBN254.EdOnBN254Point", + "components": [ + { + "name": "x", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "y", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "", + "type": "tuple", + "internalType": "struct BN254.G1Point", + "components": [ + { + "name": "x", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y", + "type": "uint256", + "internalType": "BN254.BaseField" + } + ] + }, + { + "name": "", + "type": "uint16", + "internalType": "uint16" + } + ], + "outputs": [], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "registerValidatorV2", + "inputs": [ + { + "name": "blsVK", + "type": "tuple", + "internalType": "struct BN254.G2Point", + "components": [ + { + "name": "x0", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "x1", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y0", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y1", + "type": "uint256", + "internalType": "BN254.BaseField" + } + ] + }, + { + "name": "schnorrVK", + "type": "tuple", + "internalType": "struct EdOnBN254.EdOnBN254Point", + "components": [ + { + "name": "x", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "y", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "blsSig", + "type": "tuple", + "internalType": "struct BN254.G1Point", + "components": [ + { + "name": "x", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y", + "type": "uint256", + "internalType": "BN254.BaseField" + } + ] + }, + { + "name": "schnorrSig", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "commission", + "type": "uint16", + "internalType": "uint16" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renounceRole", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "callerConfirmation", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "revokeRole", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "schnorrKeys", + "inputs": [ + { + "name": "schnorrKey", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "used", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "setMaxCommissionIncrease", + "inputs": [ + { + "name": "newMaxIncrease", + "type": "uint16", + "internalType": "uint16" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMinCommissionUpdateInterval", + "inputs": [ + { + "name": "newInterval", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "supportsInterface", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "token", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "contract ERC20" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "undelegate", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "undelegations", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + }, + { + "name": "delegator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "unlocksAt", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "unpause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateCommission", + "inputs": [ + { + "name": "newCommission", + "type": "uint16", + "internalType": "uint16" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateConsensusKeys", + "inputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct BN254.G2Point", + "components": [ + { + "name": "x0", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "x1", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y0", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y1", + "type": "uint256", + "internalType": "BN254.BaseField" + } + ] + }, + { + "name": "", + "type": "tuple", + "internalType": "struct EdOnBN254.EdOnBN254Point", + "components": [ + { + "name": "x", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "y", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "", + "type": "tuple", + "internalType": "struct BN254.G1Point", + "components": [ + { + "name": "x", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y", + "type": "uint256", + "internalType": "BN254.BaseField" + } + ] + } + ], + "outputs": [], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "updateConsensusKeysV2", + "inputs": [ + { + "name": "blsVK", + "type": "tuple", + "internalType": "struct BN254.G2Point", + "components": [ + { + "name": "x0", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "x1", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y0", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y1", + "type": "uint256", + "internalType": "BN254.BaseField" + } + ] + }, + { + "name": "schnorrVK", + "type": "tuple", + "internalType": "struct EdOnBN254.EdOnBN254Point", + "components": [ + { + "name": "x", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "y", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "blsSig", + "type": "tuple", + "internalType": "struct BN254.G1Point", + "components": [ + { + "name": "x", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y", + "type": "uint256", + "internalType": "BN254.BaseField" + } + ] + }, + { + "name": "schnorrSig", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateExitEscrowPeriod", + "inputs": [ + { + "name": "newExitEscrowPeriod", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "upgradeToAndCall", + "inputs": [ + { + "name": "newImplementation", + "type": "address", + "internalType": "address" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "validatorExits", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "unlocksAt", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "validators", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "delegatedAmount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "status", + "type": "uint8", + "internalType": "enum StakeTable.ValidatorStatus" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "CommissionUpdated", + "inputs": [ + { + "name": "validator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "timestamp", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "oldCommission", + "type": "uint16", + "indexed": false, + "internalType": "uint16" + }, + { + "name": "newCommission", + "type": "uint16", + "indexed": false, + "internalType": "uint16" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsensusKeysUpdated", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "blsVK", + "type": "tuple", + "indexed": false, + "internalType": "struct BN254.G2Point", + "components": [ + { + "name": "x0", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "x1", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y0", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y1", + "type": "uint256", + "internalType": "BN254.BaseField" + } + ] + }, + { + "name": "schnorrVK", + "type": "tuple", + "indexed": false, + "internalType": "struct EdOnBN254.EdOnBN254Point", + "components": [ + { + "name": "x", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "y", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ConsensusKeysUpdatedV2", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "blsVK", + "type": "tuple", + "indexed": false, + "internalType": "struct BN254.G2Point", + "components": [ + { + "name": "x0", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "x1", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y0", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y1", + "type": "uint256", + "internalType": "BN254.BaseField" + } + ] + }, + { + "name": "schnorrVK", + "type": "tuple", + "indexed": false, + "internalType": "struct EdOnBN254.EdOnBN254Point", + "components": [ + { + "name": "x", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "y", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "blsSig", + "type": "tuple", + "indexed": false, + "internalType": "struct BN254.G1Point", + "components": [ + { + "name": "x", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y", + "type": "uint256", + "internalType": "BN254.BaseField" + } + ] + }, + { + "name": "schnorrSig", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Delegated", + "inputs": [ + { + "name": "delegator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "validator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ExitEscrowPeriodUpdated", + "inputs": [ + { + "name": "newExitEscrowPeriod", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MaxCommissionIncreaseUpdated", + "inputs": [ + { + "name": "newMaxIncrease", + "type": "uint16", + "indexed": false, + "internalType": "uint16" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MinCommissionUpdateIntervalUpdated", + "inputs": [ + { + "name": "newInterval", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleAdminChanged", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "previousAdminRole", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "newAdminRole", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleGranted", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "sender", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRevoked", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "sender", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Undelegated", + "inputs": [ + { + "name": "delegator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "validator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Upgraded", + "inputs": [ + { + "name": "implementation", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ValidatorExit", + "inputs": [ + { + "name": "validator", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ValidatorRegistered", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "blsVk", + "type": "tuple", + "indexed": false, + "internalType": "struct BN254.G2Point", + "components": [ + { + "name": "x0", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "x1", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y0", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y1", + "type": "uint256", + "internalType": "BN254.BaseField" + } + ] + }, + { + "name": "schnorrVk", + "type": "tuple", + "indexed": false, + "internalType": "struct EdOnBN254.EdOnBN254Point", + "components": [ + { + "name": "x", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "y", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "commission", + "type": "uint16", + "indexed": false, + "internalType": "uint16" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ValidatorRegisteredV2", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "blsVK", + "type": "tuple", + "indexed": false, + "internalType": "struct BN254.G2Point", + "components": [ + { + "name": "x0", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "x1", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y0", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y1", + "type": "uint256", + "internalType": "BN254.BaseField" + } + ] + }, + { + "name": "schnorrVK", + "type": "tuple", + "indexed": false, + "internalType": "struct EdOnBN254.EdOnBN254Point", + "components": [ + { + "name": "x", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "y", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "commission", + "type": "uint16", + "indexed": false, + "internalType": "uint16" + }, + { + "name": "blsSig", + "type": "tuple", + "indexed": false, + "internalType": "struct BN254.G1Point", + "components": [ + { + "name": "x", + "type": "uint256", + "internalType": "BN254.BaseField" + }, + { + "name": "y", + "type": "uint256", + "internalType": "BN254.BaseField" + } + ] + }, + { + "name": "schnorrSig", + "type": "bytes", + "indexed": false, + "internalType": "bytes" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Withdrawal", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AccessControlBadConfirmation", + "inputs": [] + }, + { + "type": "error", + "name": "AccessControlUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "neededRole", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "BLSSigVerificationFailed", + "inputs": [] + }, + { + "type": "error", + "name": "BN254PairingProdFailed", + "inputs": [] + }, + { + "type": "error", + "name": "BlsKeyAlreadyUsed", + "inputs": [] + }, + { + "type": "error", + "name": "CommissionAlreadyInitialized", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "CommissionIncreaseExceedsMax", + "inputs": [] + }, + { + "type": "error", + "name": "CommissionUnchanged", + "inputs": [] + }, + { + "type": "error", + "name": "CommissionUpdateTooSoon", + "inputs": [] + }, + { + "type": "error", + "name": "DeprecatedFunction", + "inputs": [] + }, + { + "type": "error", + "name": "ERC1967InvalidImplementation", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967NonPayable", + "inputs": [] + }, + { + "type": "error", + "name": "EnforcedPause", + "inputs": [] + }, + { + "type": "error", + "name": "ExitEscrowPeriodInvalid", + "inputs": [] + }, + { + "type": "error", + "name": "ExpectedPause", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "InitialActiveStakeExceedsBalance", + "inputs": [] + }, + { + "type": "error", + "name": "InsufficientAllowance", + "inputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InsufficientBalance", + "inputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidCommission", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidG1", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidInitialization", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidRateLimitParameters", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidSchnorrSig", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidSchnorrVK", + "inputs": [] + }, + { + "type": "error", + "name": "NotInitializing", + "inputs": [] + }, + { + "type": "error", + "name": "NothingToWithdraw", + "inputs": [] + }, + { + "type": "error", + "name": "OwnableInvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "OwnableUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "PowPrecompileFailed", + "inputs": [] + }, + { + "type": "error", + "name": "PrematureWithdrawal", + "inputs": [] + }, + { + "type": "error", + "name": "SchnorrKeyAlreadyUsed", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnauthorizedCallContext", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnsupportedProxiableUUID", + "inputs": [ + { + "name": "slot", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "UndelegationAlreadyExists", + "inputs": [] + }, + { + "type": "error", + "name": "ValidatorAlreadyExited", + "inputs": [] + }, + { + "type": "error", + "name": "ValidatorAlreadyRegistered", + "inputs": [] + }, + { + "type": "error", + "name": "ValidatorInactive", + "inputs": [] + }, + { + "type": "error", + "name": "ValidatorNotExited", + "inputs": [] + }, + { + "type": "error", + "name": "ZeroAddress", + "inputs": [] + }, + { + "type": "error", + "name": "ZeroAmount", + "inputs": [] + } +] diff --git a/contracts/lib/forge-std b/contracts/lib/forge-std index 8ba9031ffc..0768d9c08c 160000 --- a/contracts/lib/forge-std +++ b/contracts/lib/forge-std @@ -1 +1 @@ -Subproject commit 8ba9031ffcbe25aa0d1224d3ca263a995026e477 +Subproject commit 0768d9c08c085c79bb31d88683a78770764fec49 diff --git a/contracts/rust/adapter/src/bindings/stake_table_v2.rs b/contracts/rust/adapter/src/bindings/stake_table_v2.rs index 9064163fc8..bbc6af2fbc 100644 --- a/contracts/rust/adapter/src/bindings/stake_table_v2.rs +++ b/contracts/rust/adapter/src/bindings/stake_table_v2.rs @@ -1414,6 +1414,7 @@ interface StakeTableV2 { error ExitEscrowPeriodInvalid(); error ExpectedPause(); error FailedInnerCall(); + error InitialActiveStakeExceedsBalance(); error InsufficientAllowance(uint256, uint256); error InsufficientBalance(uint256); error InvalidCommission(); @@ -1466,6 +1467,7 @@ interface StakeTableV2 { function PAUSER_ROLE() external view returns (bytes32); function UPGRADE_INTERFACE_VERSION() external view returns (string memory); function _hashBlsKey(BN254.G2Point memory blsVK) external pure returns (bytes32); + function activeStake() external view returns (uint256); function blsKeys(bytes32 blsKeyHash) external view returns (bool used); function claimValidatorExit(address validator) external; function claimWithdrawal(address validator) external; @@ -1479,7 +1481,7 @@ interface StakeTableV2 { function grantRole(bytes32 role, address account) external; function hasRole(bytes32 role, address account) external view returns (bool); function initialize(address _tokenAddress, address _lightClientAddress, uint256 _exitEscrowPeriod, address _timelock) external; - function initializeV2(address pauser, address admin, InitialCommission[] memory initialCommissions) external; + function initializeV2(address pauser, address admin, uint256 initialActiveStake, InitialCommission[] memory initialCommissions) external; function initializedAtBlock() external view returns (uint256); function lightClient() external view returns (address); function maxCommissionIncrease() external view returns (uint16); @@ -1600,6 +1602,19 @@ interface StakeTableV2 { ], "stateMutability": "pure" }, + { + "type": "function", + "name": "activeStake", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "blsKeys", @@ -1857,6 +1872,11 @@ interface StakeTableV2 { "type": "address", "internalType": "address" }, + { + "name": "initialActiveStake", + "type": "uint256", + "internalType": "uint256" + }, { "name": "initialCommissions", "type": "tuple[]", @@ -3254,6 +3274,11 @@ interface StakeTableV2 { "name": "FailedInnerCall", "inputs": [] }, + { + "type": "error", + "name": "InitialActiveStakeExceedsBalance", + "inputs": [] + }, { "type": "error", "name": "InsufficientAllowance", @@ -3424,22 +3449,22 @@ pub mod StakeTableV2 { /// The creation / init bytecode of the contract. /// /// ```text - ///0x60a060405230608052348015610013575f5ffd5b5061001c610031565b610024610031565b61002c610031565b6100e3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100815760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100e05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051613c5a6101095f395f8181611e1601528181611e3f0152611f7e0152613c5a5ff3fe608060405260043610610280575f3560e01c8063715018a611610155578063b3e6ebd5116100be578063d547741f11610078578063d547741f1461084c578063d9cc7d261461086b578063e63ab1e914610880578063f2fde38b146108a0578063fa52c7d8146108bf578063fc0c546a14610902575f5ffd5b8063b3e6ebd514610760578063b5700e681461078e578063b5ecb344146107ad578063be203094146107d8578063c64814dd146107f7578063c75f543e1461082d575f5ffd5b80639ffb6b431161010f5780639ffb6b431461062d578063a217fddf14610680578063a2d78dd514610693578063a3066aab146106e5578063ac5c2ad014610704578063ad3cb1cc14610723575f5ffd5b8063715018a6146105625780638456cb59146105765780638da5cb5b1461058a57806391d14854146105da5780639b30a5e6146105f95780639e9a8f3114610618575f5ffd5b8063394b348f116101f75780634f1ef286116101b15780634f1ef286146104bc57806352d1902d146104cf5780635544c2f1146104e35780635c975abb146104fd5780635f8754a6146105205780636a911ccf1461054e575f5ffd5b8063394b348f1461040a5780633b2b7ffa146104295780633e9df9b5146104485780633f3bb3661461045c5780633f4ba83a146104895780634d99dd161461049d575f5ffd5b80632140fecd116102485780632140fecd14610342578063248a9ca3146103615780632dc9bac61461038e5780632f2ff15d146103ad578063304240bf146103cc57806336568abe146103eb575f5ffd5b806301ffc9a714610284578063026e402b146102b85780630d8e6e2c146102d957806313b9057a146103045780631a20cd6314610323575b5f5ffd5b34801561028f575f5ffd5b506102a361029e3660046131ba565b610921565b60405190151581526020015b60405180910390f35b3480156102c3575f5ffd5b506102d76102d23660046131fc565b610957565b005b3480156102e4575f5ffd5b5060408051600281525f60208201819052918101919091526060016102af565b34801561030f575f5ffd5b506102d761031e366004613300565b61096d565b34801561032e575f5ffd5b506102d761033d36600461336a565b610986565b34801561034d575f5ffd5b506102d761035c366004613385565b610a9a565b34801561036c575f5ffd5b5061038061037b36600461339e565b610bee565b6040519081526020016102af565b348015610399575f5ffd5b506102d76103a83660046133b5565b610c0e565b3480156103b8575f5ffd5b506102d76103c73660046133ce565b610c97565b3480156103d7575f5ffd5b506102d76103e6366004613481565b610cb9565b3480156103f6575f5ffd5b506102d76104053660046133ce565b610ec1565b348015610415575f5ffd5b506102d761042436600461339e565b610ef9565b348015610434575f5ffd5b506102d76104433660046133b5565b610f66565b348015610453575f5ffd5b506103805f5481565b348015610467575f5ffd5b50600a546104769061ffff1681565b60405161ffff90911681526020016102af565b348015610494575f5ffd5b506102d76110c9565b3480156104a8575f5ffd5b506102d76104b73660046131fc565b6110eb565b6102d76104ca366004613501565b6110fd565b3480156104da575f5ffd5b50610380611118565b3480156104ee575f5ffd5b506102d761031e36600461354b565b348015610508575f5ffd5b505f516020613c0e5f395f51905f525460ff166102a3565b34801561052b575f5ffd5b506102a361053a36600461339e565b600c6020525f908152604090205460ff1681565b348015610559575f5ffd5b506102d7611133565b34801561056d575f5ffd5b506102d76111bd565b348015610581575f5ffd5b506102d76111d0565b348015610595575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016102af565b3480156105e5575f5ffd5b506102a36105f43660046133ce565b6111ef565b348015610604575f5ffd5b5061038061061336600461358f565b611225565b348015610623575f5ffd5b5061038060085481565b348015610638575f5ffd5b50610666610647366004613385565b600b6020525f90815260409020805460019091015461ffff9091169082565b6040805161ffff90931683526020830191909152016102af565b34801561068b575f5ffd5b506103805f81565b34801561069e575f5ffd5b506106d06106ad3660046135a9565b600760209081525f92835260408084209091529082529020805460019091015482565b604080519283526020830191909152016102af565b3480156106f0575f5ffd5b506102d76106ff366004613385565b61127f565b34801561070f575f5ffd5b506102d761071e3660046135d1565b611290565b34801561072e575f5ffd5b50610753604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102af919061366e565b34801561076b575f5ffd5b506102a361077a36600461339e565b60046020525f908152604090205460ff1681565b348015610799575f5ffd5b506001546105c2906001600160a01b031681565b3480156107b8575f5ffd5b506103806107c7366004613385565b60056020525f908152604090205481565b3480156107e3575f5ffd5b506102d76107f2366004613680565b611367565b348015610802575f5ffd5b506103806108113660046135a9565b600660209081525f928352604080842090915290825290205481565b348015610838575f5ffd5b506102d76108473660046136bf565b61147e565b348015610857575f5ffd5b506102d76108663660046133ce565b61158d565b348015610876575f5ffd5b5061038060095481565b34801561088b575f5ffd5b506103805f516020613bce5f395f51905f5281565b3480156108ab575f5ffd5b506102d76108ba366004613385565b6115a9565b3480156108ca575f5ffd5b506108f46108d9366004613385565b60036020525f90815260409020805460019091015460ff1682565b6040516102af92919061375e565b34801561090d575f5ffd5b506002546105c2906001600160a01b031681565b5f6001600160e01b03198216637965db0b60e01b148061095157506301ffc9a760e01b6001600160e01b03198316145b92915050565b61095f6115e8565b6109698282611618565b5050565b60405163c2d7f81360e01b815260040160405180910390fd5b61098e6117b6565b60015460408051633c1a081560e21b815290515f926001600160a01b03169163f06820549160048083019260209291908290030181865afa1580156109d5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f9919061378e565b610a0490600f6137bd565b9050621275006001600160401b038083169084161080610a355750806001600160401b0316836001600160401b0316115b15610a535760405163b57e21df60e01b815260040160405180910390fd5b6001600160401b03831660088190556040519081527f793e3b1e1bcd677bb11900c83124d3c44c9946ea8ddf978a0ca250b034ec9dde9060200160405180910390a1505050565b610aa26115e8565b6001600160a01b0381165f908152600560205260408120543391819003610adc576040516379298a5360e11b815260040160405180910390fd5b80421015610afd57604051635a77435760e01b815260040160405180910390fd5b6001600160a01b038084165f90815260066020908152604080832093861683529290529081205490819003610b4557604051630686827b60e51b815260040160405180910390fd5b6001600160a01b038085165f818152600660209081526040808320948816835293815283822082905591815260039091529081208054839290610b899084906137df565b9091555050600254610ba5906001600160a01b03168483611811565b826001600160a01b03167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6582604051610be091815260200190565b60405180910390a250505050565b5f9081525f516020613bee5f395f51905f52602052604090206001015490565b610c166117b6565b5f8161ffff16118015610c2f57506127108161ffff1611155b610c4c5760405163674e8ef360e01b815260040160405180910390fd5b600a805461ffff191661ffff83169081179091556040519081527fbe5b47be76500fea510ce219178b6e63695b6641dad0d3a0486455cea10aedfd906020015b60405180910390a150565b610ca082610bee565b610ca98161189a565b610cb383836118a4565b50505050565b610cc16115e8565b33610ccb8161194c565b610cd485611999565b610cde86866119d4565b604080516001600160a01b03831660208201525f91016040516020818303038152906040529050610d10818689611a4d565b8351604014610d3257604051634247068760e01b815260040160405180910390fd5b6127108361ffff161115610d595760405163dc81db8560e01b815260040160405180910390fd5b600160045f610d678a611225565b81526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600c5f610d9889611ae2565b81526020019081526020015f205f6101000a81548160ff02191690831515021790555060405180604001604052805f815260200160016002811115610ddf57610ddf61374a565b90526001600160a01b0383165f908152600360209081526040909120825181559082015160018083018054909160ff1990911690836002811115610e2557610e2561374a565b02179055505060408051808201825261ffff86811682525f60208084018281526001600160a01b038916808452600b909252918590209351845461ffff191693169290921783555160019092019190915590519091507ff057d4ea81e98628653a8f90788541972078137334a92b42347eaccda80fc40a90610eb0908a908a9088908b908b906137f2565b60405180910390a250505050505050565b6001600160a01b0381163314610eea5760405163334bd91960e11b815260040160405180910390fd5b610ef48282611b06565b505050565b610f016117b6565b5f81118015610f1457506301e133808111155b610f315760405163674e8ef360e01b815260040160405180910390fd5b60098190556040518181527f51d9fefdd48191bc75ab12116d5e5181964799a639e1ee31b0998ffaaf9ef25990602001610c8c565b610f6e6115e8565b33610f7881611b7f565b6127108261ffff161115610f9f5760405163dc81db8560e01b815260040160405180910390fd5b6001600160a01b0381165f908152600b60205260409020805461ffff908116908416819003610fe157604051633082eb2560e21b815260040160405180910390fd5b8061ffff168461ffff16111561106d57600182015480158061100f575060095461100b9082613864565b4210155b61102c576040516316eb94cb60e01b815260040160405180910390fd5b600a5461103d9061ffff1683613877565b61ffff168561ffff161115611065576040516312d6a46560e11b815260040160405180910390fd5b504260018301555b815461ffff191661ffff85811691821784556040805142815291841660208301528101919091526001600160a01b038416907fbd8d76fccab39db7064bc007d9a2c83a98247dcb1087cc12f343b8be90aefd6490606001610be0565b5f516020613bce5f395f51905f526110e08161189a565b6110e8611c00565b50565b6110f36115e8565b6109698282611c59565b611105611e0b565b61110e82611eaf565b6109698282611eb7565b5f611121611f73565b505f516020613bae5f395f51905f5290565b61113b6115e8565b3361114581611b7f565b6001600160a01b0381165f908152600360205260409020600101805460ff191660021790556008546111779042613864565b6001600160a01b0382165f8181526005602052604080822093909355915190917ffb24305354c87762d557487ae4a564e8d03ecbb9a97dd8afff8e1f6fcaf0dd1691a250565b6111c56117b6565b6111ce5f611fbc565b565b5f516020613bce5f395f51905f526111e78161189a565b6110e861202c565b5f9182525f516020613bee5f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f815f0151826020015183604001518460600151604051602001611262949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6112876115e8565b6110e881612074565b6112986115e8565b336112a281611b7f565b6112ab84611999565b6112b585856119d4565b604080516001600160a01b03831660208201525f910160405160208183030381529060405290506112e7818588611a4d565b600160045f6112f589611225565b81526020019081526020015f205f6101000a81548160ff021916908315150217905550816001600160a01b03167fc8c5b37aec7f2ddbd3a13c51361e54a0a8df3bca256ab758a77f5ad741d281e5878787876040516113579493929190613891565b60405180910390a2505050505050565b5f516020613c2e5f395f51905f528054600160401b810460ff1615906001600160401b03165f811580156113985750825b90505f826001600160401b031660011480156113b35750303b155b9050811580156113c1575080155b156113df5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561140957845460ff60401b1916600160401b1785555b61141286612184565b61141a612195565b61142261219d565b61142d89898961228f565b831561147357845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b5f516020613c2e5f395f51905f52805460029190600160401b900460ff16806114b4575080546001600160401b03808416911610155b156114d25760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556114fb612195565b6115055f866118a4565b5061151d5f516020613bce5f395f51905f52876118a4565b5062093a80600955600a805461ffff19166101f417905561153e8484612338565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050565b61159682610bee565b61159f8161189a565b610cb38383611b06565b6115b16117b6565b6001600160a01b0381166115df57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6110e881611fbc565b5f516020613c0e5f395f51905f525460ff16156111ce5760405163d93c066560e01b815260040160405180910390fd5b61162182611b7f565b335f82900361164357604051631f2a200560e01b815260040160405180910390fd5b600254604051636eb1769f60e11b81526001600160a01b0383811660048301523060248301525f92169063dd62ed3e90604401602060405180830381865afa158015611691573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b591906138f7565b9050828110156116e25760405163054365bb60e31b815260048101829052602481018490526044016115d6565b6002546116fa906001600160a01b03168330866124cd565b6001600160a01b0384165f9081526003602052604081208054859290611721908490613864565b90915550506001600160a01b038085165f9081526006602090815260408083209386168352929052908120805485929061175c908490613864565b92505081905550836001600160a01b0316826001600160a01b03167fe5541a6b6103d4fa7e021ed54fad39c66f27a76bd13d374cf6240ae6bd0bb72b856040516117a891815260200190565b60405180910390a350505050565b336117e87f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146111ce5760405163118cdaa760e01b81523360048201526024016115d6565b5f60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af191505080601f3d1160015f51141615161561185b5750823b153d17155b80610cb35760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b60448201526064016115d6565b6110e8813361256a565b5f5f516020613bee5f395f51905f526118bd84846111ef565b61193c575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556118f23390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610951565b5f915050610951565b5092915050565b6001600160a01b0381165f9081526003602052604081206001015460ff16600281111561197b5761197b61374a565b146110e85760405163132e7efb60e31b815260040160405180910390fd5b604080518082019091525f80825260208201526119b682826125a3565b15610969576040516306cf438f60e01b815260040160405180910390fd5b60045f6119e084611225565b815260208101919091526040015f205460ff1615611a105760405162da8a5760e11b815260040160405180910390fd5b600c5f611a1c83611ae2565b815260208101919091526040015f205460ff16156109695760405163ae493b0360e01b815260040160405180910390fd5b611a56826125c4565b5f604051806060016040528060248152602001613b6a6024913990505f8482604051602001611a86929190613925565b60405160208183030381529060405290505f611aa18261262b565b9050611abe8185611ab188612718565b611ab961278f565b61285c565b611ada5760405162ced3e560e41b815260040160405180910390fd5b505050505050565b5f815f01518260200151604051602001611262929190918252602082015260400190565b5f5f516020613bee5f395f51905f52611b1f84846111ef565b1561193c575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610951565b6001600160a01b0381165f9081526003602052604081206001015460ff1690816002811115611bb057611bb061374a565b03611bce5760405163508a793f60e01b815260040160405180910390fd5b6002816002811115611be257611be261374a565b036109695760405163eab4a96360e01b815260040160405180910390fd5b611c0861290b565b5f516020613c0e5f395f51905f52805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b039091168152602001610c8c565b611c6282611b7f565b335f829003611c8457604051631f2a200560e01b815260040160405180910390fd5b6001600160a01b038084165f9081526007602090815260408083209385168352929052205415611cc75760405163d423a4f160e01b815260040160405180910390fd5b6001600160a01b038084165f9081526006602090815260408083209385168352929052205482811015611d1057604051639266535160e01b8152600481018290526024016115d6565b6001600160a01b038085165f90815260066020908152604080832093861683529290529081208054859290611d469084906137df565b92505081905550604051806040016040528084815260200160085442611d6c9190613864565b90526001600160a01b038086165f81815260076020908152604080832094881683529381528382208551815594810151600190950194909455908152600390925281208054859290611dbf9084906137df565b92505081905550836001600160a01b0316826001600160a01b03167f4d10bd049775c77bd7f255195afba5088028ecb3c7c277d393ccff7934f2f92c856040516117a891815260200190565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611e9157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611e855f516020613bae5f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156111ce5760405163703e46dd60e11b815260040160405180910390fd5b6110e86117b6565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f11575060408051601f3d908101601f19168201909252611f0e918101906138f7565b60015b611f3957604051634c9c8ce360e01b81526001600160a01b03831660048201526024016115d6565b5f516020613bae5f395f51905f528114611f6957604051632a87526960e21b8152600481018290526024016115d6565b610ef4838361293a565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111ce5760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6120346115e8565b5f516020613c0e5f395f51905f52805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611c41565b6001600160a01b0381165f90815260076020908152604080832033808552925282205490918190036120b957604051630686827b60e51b815260040160405180910390fd5b6001600160a01b038084165f9081526007602090815260408083209386168352929052206001015442101561210157604051635a77435760e01b815260040160405180910390fd5b6001600160a01b038084165f908152600760209081526040808320868516845290915281208181556001015560025461213c91168383611811565b816001600160a01b03167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b658260405161217791815260200190565b60405180910390a2505050565b61218c61298f565b6110e8816129c5565b6111ce61298f565b5f516020613c2e5f395f51905f528054600160401b810460ff1615906001600160401b03165f811580156121ce5750825b90505f826001600160401b031660011480156121e95750303b155b9050811580156121f7575080155b156122155760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561223f57845460ff60401b1916600160401b1785555b435f55831561228857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b6001600160a01b0383166122b65760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0382166122dd5760405163d92e233d60e01b815260040160405180910390fd5b600280546001600160a01b038086166001600160a01b0319928316179092556001805492851692909116919091179055605a808210156123305760405163b57e21df60e01b815260040160405180910390fd5b506008555050565b5f5b81811015610ef4575f83838381811061235557612355613941565b61236b9260206040909202019081019150613385565b90505f84848481811061238057612380613941565b905060400201602001602081019061239891906133b5565b90506127108161ffff1611156123c15760405163dc81db8560e01b815260040160405180910390fd5b6001600160a01b0382165f9081526003602052604081206001015460ff16908160028111156123f2576123f261374a565b036124105760405163508a793f60e01b815260040160405180910390fd5b6001600160a01b0383165f908152600b602052604090206001015415801561245157506001600160a01b0383165f908152600b602052604090205461ffff16155b839061247c5760405163050814e160e41b81526001600160a01b0390911660048201526024016115d6565b505060408051808201825261ffff92831681525f60208083018281526001600160a01b03969096168252600b9052919091209051815461ffff1916921691909117815590516001918201550161233a565b5f6040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b038416602482015282604482015260205f6064835f8a5af191505080601f3d1160015f5114161516156125265750833b153d17155b806122885760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b60448201526064016115d6565b61257482826111ef565b6109695760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016115d6565b805182515f911480156125bd575081602001518360200151145b9392505050565b805160208201515f915f516020613b8e5f395f51905f529115901516156125ea57505050565b825160208401518260038485858609850908838283091483821084841016169350505081610ef45760405163279e345360e21b815260040160405180910390fd5b604080518082019091525f80825260208201525f612648836129cd565b90505f516020613b8e5f395f51905f5260035f828485099050828061266f5761266f613955565b8482099050828061268257612682613955565b82820890505f5f61269283612bd5565b925090505b806126fb5784806126aa576126aa613955565b60018708955084806126be576126be613955565b868709925084806126d1576126d1613955565b868409925084806126e4576126e4613955565b84840892506126f283612bd5565b92509050612697565b506040805180820190915294855260208501525091949350505050565b604080518082019091525f808252602082015281516020830151159015161561273f575090565b6040518060400160405280835f015181526020015f516020613b8e5f395f51905f5284602001516127709190613969565b612787905f516020613b8e5f395f51905f526137df565b905292915050565b6127b660405180608001604052805f81526020015f81526020015f81526020015f81525090565b60405180608001604052807f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b815250905090565b5f5f5f6040518751815260208801516020820152602087015160408201528651606082015260608701516080820152604087015160a0820152855160c0820152602086015160e0820152602085015161010082015284516101208201526060850151610140820152604085015161016082015260205f6101808360085afa9150505f519150806128ff5760405163c206334f60e01b815260040160405180910390fd5b50151595945050505050565b5f516020613c0e5f395f51905f525460ff166111ce57604051638dfc202b60e01b815260040160405180910390fd5b61294382612c9d565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561298757610ef48282612d00565b610969612d72565b5f516020613c2e5f395f51905f5254600160401b900460ff166111ce57604051631afcd79f60e31b815260040160405180910390fd5b6115b161298f565b5f5f6129d883612d91565b8051909150603081146129ed576129ed613988565b5f816001600160401b03811115612a0657612a06613224565b6040519080825280601f01601f191660200182016040528015612a30576020820181803683370190505b5090505f5b82811015612a9f57836001612a4a83866137df565b612a5491906137df565b81518110612a6457612a64613941565b602001015160f81c60f81b828281518110612a8157612a81613941565b60200101906001600160f81b03191690815f1a905350600101612a35565b5060408051601f80825261040082019092525f9082602082016103e0803683370190505090505f5b82811015612b2f578381612adb85886137df565b612ae59190613864565b81518110612af557612af5613941565b602001015160f81c60f81b60f81c828281518110612b1557612b15613941565b60ff90921660209283029190910190910152600101612ac7565b505f612b3a826130dc565b90506101005f516020613b8e5f395f51905f525f612b5886896137df565b90505f5b81811015612bc5575f886001612b7284866137df565b612b7c91906137df565b81518110612b8c57612b8c613941565b016020015160f81c90508380612ba457612ba4613955565b85870995508380612bb757612bb7613955565b818708955050600101612b5c565b50929a9950505050505050505050565b5f5f5f5f5f7f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f5290505f5f516020613b8e5f395f51905f52905060405160208152602080820152602060408201528760608201528260808201528160a082015260205f60c08360055afa9450505f51925083612c6357604051630c9d3e9960e21b815260040160405180910390fd5b80600184901b1115612c7c57612c7983826137df565b92505b8080612c8a57612c8a613955565b8384099690961496919550909350505050565b806001600160a01b03163b5f03612cd257604051634c9c8ce360e01b81526001600160a01b03821660048201526024016115d6565b5f516020613bae5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b031684604051612d1c919061399c565b5f60405180830381855af49150503d805f8114612d54576040519150601f19603f3d011682016040523d82523d5f602084013e612d59565b606091505b5091509150612d6985838361313c565b95945050505050565b34156111ce5760405163b398979f60e01b815260040160405180910390fd5b604080516030808252606082810190935290602090600160f91b905f90846020820181803683370190505090508086604051602001612dd1929190613925565b6040516020818303038152906040529050808460f81b604051602001612df89291906139a7565b604051602081830303815290604052905080604051602001612e1a91906139d1565b60408051601f1981840301815290829052915061010160f01b90612e4490839083906020016139e9565b60408051808303601f190181528282528051602091820120818401819052600160f81b848401526001600160f01b031985166041850152825160238186030181526043909401909252825190830120919350905f60ff88166001600160401b03811115612eb357612eb3613224565b6040519080825280601f01601f191660200182016040528015612edd576020820181803683370190505b5090505f82604051602001612ef491815260200190565b60408051601f1981840301815291905290505f5b8151811015612f5e57818181518110612f2357612f23613941565b602001015160f81c60f81b838281518110612f4057612f40613941565b60200101906001600160f81b03191690815f1a905350600101612f08565b505f84604051602001612f7391815260200190565b60408051601f19818403018152602083019091525f80835291985091505b89811015613005575f838281518110612fac57612fac613941565b602001015160f81c60f81b838381518110612fc957612fc9613941565b602001015160f81c60f81b1890508881604051602001612fea929190613a0d565b60408051601f19818403018152919052985050600101612f91565b5086888760405160200161301b93929190613a31565b6040516020818303038152906040529650868051906020012093508360405160200161304991815260200190565b60408051601f1981840301815291905291505f5b61306a8a60ff8d166137df565b8110156130cb5782818151811061308357613083613941565b01602001516001600160f81b0319168461309d838d613864565b815181106130ad576130ad613941565b60200101906001600160f81b03191690815f1a90535060010161305d565b50919b9a5050505050505050505050565b5f80805b8351811015611945578381815181106130fb576130fb613941565b602002602001015160ff168160086131139190613a64565b61311e906002613b5e565b6131289190613a64565b6131329083613864565b91506001016130e0565b6060826131515761314c82613191565b6125bd565b815115801561316857506001600160a01b0384163b155b1561194557604051639996b31560e01b81526001600160a01b03851660048201526024016115d6565b8051156131a15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f602082840312156131ca575f5ffd5b81356001600160e01b0319811681146125bd575f5ffd5b80356001600160a01b03811681146131f7575f5ffd5b919050565b5f5f6040838503121561320d575f5ffd5b613216836131e1565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b038111828210171561325a5761325a613224565b60405290565b5f60808284031215613270575f5ffd5b604051608081016001600160401b038111828210171561329257613292613224565b6040908152833582526020808501359083015283810135908201526060928301359281019290925250919050565b5f604082840312156132d0575f5ffd5b6132d8613238565b823581526020928301359281019290925250919050565b803561ffff811681146131f7575f5ffd5b5f5f5f5f6101208587031215613314575f5ffd5b61331e8686613260565b935061332d86608087016132c0565b925061333c8660c087016132c0565b915061334b61010086016132ef565b905092959194509250565b6001600160401b03811681146110e8575f5ffd5b5f6020828403121561337a575f5ffd5b81356125bd81613356565b5f60208284031215613395575f5ffd5b6125bd826131e1565b5f602082840312156133ae575f5ffd5b5035919050565b5f602082840312156133c5575f5ffd5b6125bd826132ef565b5f5f604083850312156133df575f5ffd5b823591506133ef602084016131e1565b90509250929050565b5f82601f830112613407575f5ffd5b81356001600160401b0381111561342057613420613224565b604051601f8201601f19908116603f011681016001600160401b038111828210171561344e5761344e613224565b604052818152838201602001851015613465575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f5f6101408688031215613496575f5ffd5b6134a08787613260565b94506134af87608088016132c0565b93506134be8760c088016132c0565b92506101008601356001600160401b038111156134d9575f5ffd5b6134e5888289016133f8565b9250506134f561012087016132ef565b90509295509295909350565b5f5f60408385031215613512575f5ffd5b61351b836131e1565b915060208301356001600160401b03811115613535575f5ffd5b613541858286016133f8565b9150509250929050565b5f5f5f610100848603121561355e575f5ffd5b6135688585613260565b925061357785608086016132c0565b91506135868560c086016132c0565b90509250925092565b5f6080828403121561359f575f5ffd5b6125bd8383613260565b5f5f604083850312156135ba575f5ffd5b6135c3836131e1565b91506133ef602084016131e1565b5f5f5f5f61012085870312156135e5575f5ffd5b6135ef8686613260565b93506135fe86608087016132c0565b925061360d8660c087016132c0565b91506101008501356001600160401b03811115613628575f5ffd5b613634878288016133f8565b91505092959194509250565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6125bd6020830184613640565b5f5f5f5f60808587031215613693575f5ffd5b61369c856131e1565b93506136aa602086016131e1565b92506040850135915061334b606086016131e1565b5f5f5f5f606085870312156136d2575f5ffd5b6136db856131e1565b93506136e9602086016131e1565b925060408501356001600160401b03811115613703575f5ffd5b8501601f81018713613713575f5ffd5b80356001600160401b03811115613728575f5ffd5b8760208260061b840101111561373c575f5ffd5b949793965060200194505050565b634e487b7160e01b5f52602160045260245ffd5b828152604081016003831061378157634e487b7160e01b5f52602160045260245ffd5b8260208301529392505050565b5f6020828403121561379e575f5ffd5b81516125bd81613356565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160290811690818114611945576119456137a9565b81810381811115610951576109516137a9565b8551815260208087015190820152604080870151908201526060808701519082015284516080820152602085015160a082015261ffff841660c0820152825160e082015260208301516101008201526101406101208201525f613859610140830184613640565b979650505050505050565b80820180821115610951576109516137a9565b61ffff8181168382160190811115610951576109516137a9565b8451815260208086015190820152604080860151908201526060808601519082015283516080820152602084015160a0820152825160c0820152602083015160e08201526101206101008201525f6138ed610120830184613640565b9695505050505050565b5f60208284031215613907575f5ffd5b5051919050565b5f81518060208401855e5f93019283525090919050565b5f613939613933838661390e565b8461390e565b949350505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261398357634e487b7160e01b5f52601260045260245ffd5b500690565b634e487b7160e01b5f52600160045260245ffd5b5f6125bd828461390e565b5f6139b2828561390e565b5f81526001600160f81b03199390931660018401525050600201919050565b5f6139dc828461390e565b5f81526001019392505050565b5f6139f4828561390e565b6001600160f01b03199390931683525050600201919050565b5f613a18828561390e565b6001600160f81b03199390931683525050600101919050565b5f613a3c828661390e565b6001600160f81b031994909416845250506001600160f01b0319166001820152600301919050565b8082028115828204841417610951576109516137a9565b6001815b6001841115613ab657808504811115613a9a57613a9a6137a9565b6001841615613aa857908102905b60019390931c928002613a7f565b935093915050565b5f82613acc57506001610951565b81613ad857505f610951565b8160018114613aee5760028114613af857613b14565b6001915050610951565b60ff841115613b0957613b096137a9565b50506001821b610951565b5060208310610133831016604e8410600b8410161715613b37575081810a610951565b613b435f198484613a7b565b805f1904821115613b5657613b566137a9565b029392505050565b5f6125bd8383613abe56fe424c535f5349475f424e32353447315f584d443a4b454343414b5f4e4354485f4e554c5f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c634300081c000a + ///0x60a060405230608052348015610013575f5ffd5b5061001c610031565b610024610031565b61002c610031565b6100e3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100815760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100e05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051613d6e6101095f395f8181611fa001528181611fc901526123340152613d6e5ff3fe60806040526004361061028b575f3560e01c8063715018a611610155578063b3e6ebd5116100be578063d547741f11610078578063d547741f1461086c578063d9cc7d261461088b578063e63ab1e9146108a0578063f2fde38b146108c0578063fa52c7d8146108df578063fc0c546a14610922575f5ffd5b8063b3e6ebd51461078a578063b5700e68146107b8578063b5ecb344146107d7578063bd49c35f14610802578063be20309414610817578063c64814dd14610836575f5ffd5b80639ffb6b431161010f5780639ffb6b4314610657578063a217fddf146106aa578063a2d78dd5146106bd578063a3066aab1461070f578063ac5c2ad01461072e578063ad3cb1cc1461074d575f5ffd5b8063715018a61461058c5780638456cb59146105a05780638da5cb5b146105b457806391d14854146106045780639b30a5e6146106235780639e9a8f3114610642575f5ffd5b80633b2b7ffa116101f757806352780b6e116101b157806352780b6e146104da57806352d1902d146104f95780635544c2f11461050d5780635c975abb146105275780635f8754a61461054a5780636a911ccf14610578575f5ffd5b80633b2b7ffa146104345780633e9df9b5146104535780633f3bb366146104675780633f4ba83a146104945780634d99dd16146104a85780634f1ef286146104c7575f5ffd5b8063248a9ca311610248578063248a9ca31461036c5780632dc9bac6146103995780632f2ff15d146103b8578063304240bf146103d757806336568abe146103f6578063394b348f14610415575f5ffd5b806301ffc9a71461028f578063026e402b146102c35780630d8e6e2c146102e457806313b9057a1461030f5780631a20cd631461032e5780632140fecd1461034d575b5f5ffd5b34801561029a575f5ffd5b506102ae6102a93660046132c3565b610941565b60405190151581526020015b60405180910390f35b3480156102ce575f5ffd5b506102e26102dd366004613305565b610977565b005b3480156102ef575f5ffd5b5060408051600281525f60208201819052918101919091526060016102ba565b34801561031a575f5ffd5b506102e2610329366004613409565b6109a3565b348015610339575f5ffd5b506102e2610348366004613473565b6109bc565b348015610358575f5ffd5b506102e261036736600461348e565b610ad0565b348015610377575f5ffd5b5061038b6103863660046134a7565b610c24565b6040519081526020016102ba565b3480156103a4575f5ffd5b506102e26103b33660046134be565b610c44565b3480156103c3575f5ffd5b506102e26103d23660046134d7565b610ccd565b3480156103e2575f5ffd5b506102e26103f136600461358a565b610cef565b348015610401575f5ffd5b506102e26104103660046134d7565b610ef7565b348015610420575f5ffd5b506102e261042f3660046134a7565b610f2f565b34801561043f575f5ffd5b506102e261044e3660046134be565b610f9c565b34801561045e575f5ffd5b5061038b5f5481565b348015610472575f5ffd5b50600a546104819061ffff1681565b60405161ffff90911681526020016102ba565b34801561049f575f5ffd5b506102e26110ff565b3480156104b3575f5ffd5b506102e26104c2366004613305565b611121565b6102e26104d536600461360a565b611144565b3480156104e5575f5ffd5b506102e26104f4366004613654565b611163565b348015610504575f5ffd5b5061038b61127c565b348015610518575f5ffd5b506102e26103293660046136ea565b348015610532575f5ffd5b505f516020613d225f395f51905f525460ff166102ae565b348015610555575f5ffd5b506102ae6105643660046134a7565b600d6020525f908152604090205460ff1681565b348015610583575f5ffd5b506102e2611297565b348015610597575f5ffd5b506102e261134f565b3480156105ab575f5ffd5b506102e2611362565b3480156105bf575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016102ba565b34801561060f575f5ffd5b506102ae61061e3660046134d7565b611381565b34801561062e575f5ffd5b5061038b61063d36600461372e565b6113b7565b34801561064d575f5ffd5b5061038b60085481565b348015610662575f5ffd5b5061069061067136600461348e565b600c6020525f90815260409020805460019091015461ffff9091169082565b6040805161ffff90931683526020830191909152016102ba565b3480156106b5575f5ffd5b5061038b5f81565b3480156106c8575f5ffd5b506106fa6106d7366004613748565b600760209081525f92835260408084209091529082529020805460019091015482565b604080519283526020830191909152016102ba565b34801561071a575f5ffd5b506102e261072936600461348e565b611411565b348015610739575f5ffd5b506102e2610748366004613770565b611529565b348015610758575f5ffd5b5061077d604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102ba919061380d565b348015610795575f5ffd5b506102ae6107a43660046134a7565b60046020525f908152604090205460ff1681565b3480156107c3575f5ffd5b506001546105ec906001600160a01b031681565b3480156107e2575f5ffd5b5061038b6107f136600461348e565b60056020525f908152604090205481565b34801561080d575f5ffd5b5061038b600b5481565b348015610822575f5ffd5b506102e261083136600461381f565b611600565b348015610841575f5ffd5b5061038b610850366004613748565b600660209081525f928352604080842090915290825290205481565b348015610877575f5ffd5b506102e26108863660046134d7565b611717565b348015610896575f5ffd5b5061038b60095481565b3480156108ab575f5ffd5b5061038b5f516020613ce25f395f51905f5281565b3480156108cb575f5ffd5b506102e26108da36600461348e565b611733565b3480156108ea575f5ffd5b506109146108f936600461348e565b60036020525f90815260409020805460019091015460ff1682565b6040516102ba929190613872565b34801561092d575f5ffd5b506002546105ec906001600160a01b031681565b5f6001600160e01b03198216637965db0b60e01b148061097157506301ffc9a760e01b6001600160e01b03198316145b92915050565b61097f611772565b61098982826117a2565b80600b5f82825461099a91906138b6565b90915550505050565b60405163c2d7f81360e01b815260040160405180910390fd5b6109c4611940565b60015460408051633c1a081560e21b815290515f926001600160a01b03169163f06820549160048083019260209291908290030181865afa158015610a0b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a2f91906138c9565b610a3a90600f6138e4565b9050621275006001600160401b038083169084161080610a6b5750806001600160401b0316836001600160401b0316115b15610a895760405163b57e21df60e01b815260040160405180910390fd5b6001600160401b03831660088190556040519081527f793e3b1e1bcd677bb11900c83124d3c44c9946ea8ddf978a0ca250b034ec9dde9060200160405180910390a1505050565b610ad8611772565b6001600160a01b0381165f908152600560205260408120543391819003610b12576040516379298a5360e11b815260040160405180910390fd5b80421015610b3357604051635a77435760e01b815260040160405180910390fd5b6001600160a01b038084165f90815260066020908152604080832093861683529290529081205490819003610b7b57604051630686827b60e51b815260040160405180910390fd5b6001600160a01b038085165f818152600660209081526040808320948816835293815283822082905591815260039091529081208054839290610bbf908490613906565b9091555050600254610bdb906001600160a01b0316848361199b565b826001600160a01b03167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6582604051610c1691815260200190565b60405180910390a250505050565b5f9081525f516020613d025f395f51905f52602052604090206001015490565b610c4c611940565b5f8161ffff16118015610c6557506127108161ffff1611155b610c825760405163674e8ef360e01b815260040160405180910390fd5b600a805461ffff191661ffff83169081179091556040519081527fbe5b47be76500fea510ce219178b6e63695b6641dad0d3a0486455cea10aedfd906020015b60405180910390a150565b610cd682610c24565b610cdf81611a24565b610ce98383611a2e565b50505050565b610cf7611772565b33610d0181611ad6565b610d0a85611b23565b610d148686611b5e565b604080516001600160a01b03831660208201525f91016040516020818303038152906040529050610d46818689611bd7565b8351604014610d6857604051634247068760e01b815260040160405180910390fd5b6127108361ffff161115610d8f5760405163dc81db8560e01b815260040160405180910390fd5b600160045f610d9d8a6113b7565b81526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600d5f610dce89611c6c565b81526020019081526020015f205f6101000a81548160ff02191690831515021790555060405180604001604052805f815260200160016002811115610e1557610e1561385e565b90526001600160a01b0383165f908152600360209081526040909120825181559082015160018083018054909160ff1990911690836002811115610e5b57610e5b61385e565b02179055505060408051808201825261ffff86811682525f60208084018281526001600160a01b038916808452600c909252918590209351845461ffff191693169290921783555160019092019190915590519091507ff057d4ea81e98628653a8f90788541972078137334a92b42347eaccda80fc40a90610ee6908a908a9088908b908b90613919565b60405180910390a250505050505050565b6001600160a01b0381163314610f205760405163334bd91960e11b815260040160405180910390fd5b610f2a8282611c90565b505050565b610f37611940565b5f81118015610f4a57506301e133808111155b610f675760405163674e8ef360e01b815260040160405180910390fd5b60098190556040518181527f51d9fefdd48191bc75ab12116d5e5181964799a639e1ee31b0998ffaaf9ef25990602001610cc2565b610fa4611772565b33610fae81611d09565b6127108261ffff161115610fd55760405163dc81db8560e01b815260040160405180910390fd5b6001600160a01b0381165f908152600c60205260409020805461ffff90811690841681900361101757604051633082eb2560e21b815260040160405180910390fd5b8061ffff168461ffff1611156110a3576001820154801580611045575060095461104190826138b6565b4210155b611062576040516316eb94cb60e01b815260040160405180910390fd5b600a546110739061ffff168361398b565b61ffff168561ffff16111561109b576040516312d6a46560e11b815260040160405180910390fd5b504260018301555b815461ffff191661ffff85811691821784556040805142815291841660208301528101919091526001600160a01b038416907fbd8d76fccab39db7064bc007d9a2c83a98247dcb1087cc12f343b8be90aefd6490606001610c16565b5f516020613ce25f395f51905f5261111681611a24565b61111e611d8a565b50565b611129611772565b6111338282611de3565b80600b5f82825461099a9190613906565b61114c611f95565b61115582612039565b61115f8282612041565b5050565b5f516020613d425f395f51905f52805460029190600160401b900460ff1680611199575080546001600160401b03808416911610155b156111b75760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556111e06120fd565b6111ea5f87611a2e565b506112025f516020613ce25f395f51905f5288611a2e565b5062093a80600955600a805461ffff19166101f41790556112238484612105565b61122c8561229a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050505050565b5f611285612329565b505f516020613cc25f395f51905f5290565b61129f611772565b336112a981611d09565b6001600160a01b0381165f908152600360205260409020600101805460ff191660021790556008546112db90426138b6565b6001600160a01b0382165f908152600560209081526040808320939093556003905290812054600b805491929091611314908490613906565b90915550506040516001600160a01b038216907ffb24305354c87762d557487ae4a564e8d03ecbb9a97dd8afff8e1f6fcaf0dd16905f90a250565b611357611940565b6113605f612372565b565b5f516020613ce25f395f51905f5261137981611a24565b61111e6123e2565b5f9182525f516020613d025f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f815f01518260200151836040015184606001516040516020016113f4949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b611419611772565b6001600160a01b0381165f908152600760209081526040808320338085529252822054909181900361145e57604051630686827b60e51b815260040160405180910390fd5b6001600160a01b038084165f908152600760209081526040808320938616835292905220600101544210156114a657604051635a77435760e01b815260040160405180910390fd5b6001600160a01b038084165f90815260076020908152604080832086851684529091528120818155600101556002546114e19116838361199b565b816001600160a01b03167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b658260405161151c91815260200190565b60405180910390a2505050565b611531611772565b3361153b81611d09565b61154484611b23565b61154e8585611b5e565b604080516001600160a01b03831660208201525f91016040516020818303038152906040529050611580818588611bd7565b600160045f61158e896113b7565b81526020019081526020015f205f6101000a81548160ff021916908315150217905550816001600160a01b03167fc8c5b37aec7f2ddbd3a13c51361e54a0a8df3bca256ab758a77f5ad741d281e5878787876040516115f094939291906139a5565b60405180910390a2505050505050565b5f516020613d425f395f51905f528054600160401b810460ff1615906001600160401b03165f811580156116315750825b90505f826001600160401b0316600114801561164c5750303b155b90508115801561165a575080155b156116785760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156116a257845460ff60401b1916600160401b1785555b6116ab8661242a565b6116b36120fd565b6116bb61243b565b6116c689898961252d565b831561170c57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b61172082610c24565b61172981611a24565b610ce98383611c90565b61173b611940565b6001600160a01b03811661176957604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61111e81612372565b5f516020613d225f395f51905f525460ff16156113605760405163d93c066560e01b815260040160405180910390fd5b6117ab82611d09565b335f8290036117cd57604051631f2a200560e01b815260040160405180910390fd5b600254604051636eb1769f60e11b81526001600160a01b0383811660048301523060248301525f92169063dd62ed3e90604401602060405180830381865afa15801561181b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183f9190613a0b565b90508281101561186c5760405163054365bb60e31b81526004810182905260248101849052604401611760565b600254611884906001600160a01b03168330866125d6565b6001600160a01b0384165f90815260036020526040812080548592906118ab9084906138b6565b90915550506001600160a01b038085165f908152600660209081526040808320938616835292905290812080548592906118e69084906138b6565b92505081905550836001600160a01b0316826001600160a01b03167fe5541a6b6103d4fa7e021ed54fad39c66f27a76bd13d374cf6240ae6bd0bb72b8560405161193291815260200190565b60405180910390a350505050565b336119727f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146113605760405163118cdaa760e01b8152336004820152602401611760565b5f60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af191505080601f3d1160015f5114161516156119e55750823b153d17155b80610ce95760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401611760565b61111e8133612673565b5f5f516020613d025f395f51905f52611a478484611381565b611ac6575f848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055611a7c3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610971565b5f915050610971565b5092915050565b6001600160a01b0381165f9081526003602052604081206001015460ff166002811115611b0557611b0561385e565b1461111e5760405163132e7efb60e31b815260040160405180910390fd5b604080518082019091525f8082526020820152611b4082826126ac565b1561115f576040516306cf438f60e01b815260040160405180910390fd5b60045f611b6a846113b7565b815260208101919091526040015f205460ff1615611b9a5760405162da8a5760e11b815260040160405180910390fd5b600d5f611ba683611c6c565b815260208101919091526040015f205460ff161561115f5760405163ae493b0360e01b815260040160405180910390fd5b611be0826126cd565b5f604051806060016040528060248152602001613c7e6024913990505f8482604051602001611c10929190613a39565b60405160208183030381529060405290505f611c2b82612734565b9050611c488185611c3b88612821565b611c43612898565b612965565b611c645760405162ced3e560e41b815260040160405180910390fd5b505050505050565b5f815f015182602001516040516020016113f4929190918252602082015260400190565b5f5f516020613d025f395f51905f52611ca98484611381565b15611ac6575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610971565b6001600160a01b0381165f9081526003602052604081206001015460ff1690816002811115611d3a57611d3a61385e565b03611d585760405163508a793f60e01b815260040160405180910390fd5b6002816002811115611d6c57611d6c61385e565b0361115f5760405163eab4a96360e01b815260040160405180910390fd5b611d92612a14565b5f516020613d225f395f51905f52805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b039091168152602001610cc2565b611dec82611d09565b335f829003611e0e57604051631f2a200560e01b815260040160405180910390fd5b6001600160a01b038084165f9081526007602090815260408083209385168352929052205415611e515760405163d423a4f160e01b815260040160405180910390fd5b6001600160a01b038084165f9081526006602090815260408083209385168352929052205482811015611e9a57604051639266535160e01b815260048101829052602401611760565b6001600160a01b038085165f90815260066020908152604080832093861683529290529081208054859290611ed0908490613906565b92505081905550604051806040016040528084815260200160085442611ef691906138b6565b90526001600160a01b038086165f81815260076020908152604080832094881683529381528382208551815594810151600190950194909455908152600390925281208054859290611f49908490613906565b92505081905550836001600160a01b0316826001600160a01b03167f4d10bd049775c77bd7f255195afba5088028ecb3c7c277d393ccff7934f2f92c8560405161193291815260200190565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061201b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661200f5f516020613cc25f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156113605760405163703e46dd60e11b815260040160405180910390fd5b61111e611940565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561209b575060408051601f3d908101601f1916820190925261209891810190613a0b565b60015b6120c357604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611760565b5f516020613cc25f395f51905f5281146120f357604051632a87526960e21b815260048101829052602401611760565b610f2a8383612a43565b611360612a98565b5f5b81811015610f2a575f83838381811061212257612122613a55565b612138926020604090920201908101915061348e565b90505f84848481811061214d5761214d613a55565b905060400201602001602081019061216591906134be565b90506127108161ffff16111561218e5760405163dc81db8560e01b815260040160405180910390fd5b6001600160a01b0382165f9081526003602052604081206001015460ff16908160028111156121bf576121bf61385e565b036121dd5760405163508a793f60e01b815260040160405180910390fd5b6001600160a01b0383165f908152600c602052604090206001015415801561221e57506001600160a01b0383165f908152600c602052604090205461ffff16155b83906122495760405163050814e160e41b81526001600160a01b039091166004820152602401611760565b505060408051808201825261ffff92831681525f60208083018281526001600160a01b03969096168252600c9052919091209051815461ffff19169216919091178155905160019182015501612107565b6002546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156122e0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123049190613a0b565b81111561232457604051633d934f4960e11b815260040160405180910390fd5b600b55565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113605760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6123ea611772565b5f516020613d225f395f51905f52805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611dcb565b612432612a98565b61111e81612ace565b5f516020613d425f395f51905f528054600160401b810460ff1615906001600160401b03165f8115801561246c5750825b90505f826001600160401b031660011480156124875750303b155b905081158015612495575080155b156124b35760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156124dd57845460ff60401b1916600160401b1785555b435f55831561252657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b6001600160a01b0383166125545760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03821661257b5760405163d92e233d60e01b815260040160405180910390fd5b600280546001600160a01b038086166001600160a01b0319928316179092556001805492851692909116919091179055605a808210156125ce5760405163b57e21df60e01b815260040160405180910390fd5b506008555050565b5f6040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b038416602482015282604482015260205f6064835f8a5af191505080601f3d1160015f51141615161561262f5750833b153d17155b806125265760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606401611760565b61267d8282611381565b61115f5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401611760565b805182515f911480156126c6575081602001518360200151145b9392505050565b805160208201515f915f516020613ca25f395f51905f529115901516156126f357505050565b825160208401518260038485858609850908838283091483821084841016169350505081610f2a5760405163279e345360e21b815260040160405180910390fd5b604080518082019091525f80825260208201525f61275183612ad6565b90505f516020613ca25f395f51905f5260035f828485099050828061277857612778613a69565b8482099050828061278b5761278b613a69565b82820890505f5f61279b83612cde565b925090505b806128045784806127b3576127b3613a69565b60018708955084806127c7576127c7613a69565b868709925084806127da576127da613a69565b868409925084806127ed576127ed613a69565b84840892506127fb83612cde565b925090506127a0565b506040805180820190915294855260208501525091949350505050565b604080518082019091525f8082526020820152815160208301511590151615612848575090565b6040518060400160405280835f015181526020015f516020613ca25f395f51905f5284602001516128799190613a7d565b612890905f516020613ca25f395f51905f52613906565b905292915050565b6128bf60405180608001604052805f81526020015f81526020015f81526020015f81525090565b60405180608001604052807f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b815250905090565b5f5f5f6040518751815260208801516020820152602087015160408201528651606082015260608701516080820152604087015160a0820152855160c0820152602086015160e0820152602085015161010082015284516101208201526060850151610140820152604085015161016082015260205f6101808360085afa9150505f51915080612a085760405163c206334f60e01b815260040160405180910390fd5b50151595945050505050565b5f516020613d225f395f51905f525460ff1661136057604051638dfc202b60e01b815260040160405180910390fd5b612a4c82612da6565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115612a9057610f2a8282612e09565b61115f612e7b565b5f516020613d425f395f51905f5254600160401b900460ff1661136057604051631afcd79f60e31b815260040160405180910390fd5b61173b612a98565b5f5f612ae183612e9a565b805190915060308114612af657612af6613a9c565b5f816001600160401b03811115612b0f57612b0f61332d565b6040519080825280601f01601f191660200182016040528015612b39576020820181803683370190505b5090505f5b82811015612ba857836001612b538386613906565b612b5d9190613906565b81518110612b6d57612b6d613a55565b602001015160f81c60f81b828281518110612b8a57612b8a613a55565b60200101906001600160f81b03191690815f1a905350600101612b3e565b5060408051601f80825261040082019092525f9082602082016103e0803683370190505090505f5b82811015612c38578381612be48588613906565b612bee91906138b6565b81518110612bfe57612bfe613a55565b602001015160f81c60f81b60f81c828281518110612c1e57612c1e613a55565b60ff90921660209283029190910190910152600101612bd0565b505f612c43826131e5565b90506101005f516020613ca25f395f51905f525f612c618689613906565b90505f5b81811015612cce575f886001612c7b8486613906565b612c859190613906565b81518110612c9557612c95613a55565b016020015160f81c90508380612cad57612cad613a69565b85870995508380612cc057612cc0613a69565b818708955050600101612c65565b50929a9950505050505050505050565b5f5f5f5f5f7f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f5290505f5f516020613ca25f395f51905f52905060405160208152602080820152602060408201528760608201528260808201528160a082015260205f60c08360055afa9450505f51925083612d6c57604051630c9d3e9960e21b815260040160405180910390fd5b80600184901b1115612d8557612d828382613906565b92505b8080612d9357612d93613a69565b8384099690961496919550909350505050565b806001600160a01b03163b5f03612ddb57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611760565b5f516020613cc25f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b031684604051612e259190613ab0565b5f60405180830381855af49150503d805f8114612e5d576040519150601f19603f3d011682016040523d82523d5f602084013e612e62565b606091505b5091509150612e72858383613245565b95945050505050565b34156113605760405163b398979f60e01b815260040160405180910390fd5b604080516030808252606082810190935290602090600160f91b905f90846020820181803683370190505090508086604051602001612eda929190613a39565b6040516020818303038152906040529050808460f81b604051602001612f01929190613abb565b604051602081830303815290604052905080604051602001612f239190613ae5565b60408051601f1981840301815290829052915061010160f01b90612f4d9083908390602001613afd565b60408051808303601f190181528282528051602091820120818401819052600160f81b848401526001600160f01b031985166041850152825160238186030181526043909401909252825190830120919350905f60ff88166001600160401b03811115612fbc57612fbc61332d565b6040519080825280601f01601f191660200182016040528015612fe6576020820181803683370190505b5090505f82604051602001612ffd91815260200190565b60408051601f1981840301815291905290505f5b81518110156130675781818151811061302c5761302c613a55565b602001015160f81c60f81b83828151811061304957613049613a55565b60200101906001600160f81b03191690815f1a905350600101613011565b505f8460405160200161307c91815260200190565b60408051601f19818403018152602083019091525f80835291985091505b8981101561310e575f8382815181106130b5576130b5613a55565b602001015160f81c60f81b8383815181106130d2576130d2613a55565b602001015160f81c60f81b18905088816040516020016130f3929190613b21565b60408051601f1981840301815291905298505060010161309a565b5086888760405160200161312493929190613b45565b6040516020818303038152906040529650868051906020012093508360405160200161315291815260200190565b60408051601f1981840301815291905291505f5b6131738a60ff8d16613906565b8110156131d45782818151811061318c5761318c613a55565b01602001516001600160f81b031916846131a6838d6138b6565b815181106131b6576131b6613a55565b60200101906001600160f81b03191690815f1a905350600101613166565b50919b9a5050505050505050505050565b5f80805b8351811015611acf5783818151811061320457613204613a55565b602002602001015160ff1681600861321c9190613b78565b613227906002613c72565b6132319190613b78565b61323b90836138b6565b91506001016131e9565b60608261325a576132558261329a565b6126c6565b815115801561327157506001600160a01b0384163b155b15611acf57604051639996b31560e01b81526001600160a01b0385166004820152602401611760565b8051156132aa5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f602082840312156132d3575f5ffd5b81356001600160e01b0319811681146126c6575f5ffd5b80356001600160a01b0381168114613300575f5ffd5b919050565b5f5f60408385031215613316575f5ffd5b61331f836132ea565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156133635761336361332d565b60405290565b5f60808284031215613379575f5ffd5b604051608081016001600160401b038111828210171561339b5761339b61332d565b6040908152833582526020808501359083015283810135908201526060928301359281019290925250919050565b5f604082840312156133d9575f5ffd5b6133e1613341565b823581526020928301359281019290925250919050565b803561ffff81168114613300575f5ffd5b5f5f5f5f610120858703121561341d575f5ffd5b6134278686613369565b935061343686608087016133c9565b92506134458660c087016133c9565b915061345461010086016133f8565b905092959194509250565b6001600160401b038116811461111e575f5ffd5b5f60208284031215613483575f5ffd5b81356126c68161345f565b5f6020828403121561349e575f5ffd5b6126c6826132ea565b5f602082840312156134b7575f5ffd5b5035919050565b5f602082840312156134ce575f5ffd5b6126c6826133f8565b5f5f604083850312156134e8575f5ffd5b823591506134f8602084016132ea565b90509250929050565b5f82601f830112613510575f5ffd5b81356001600160401b038111156135295761352961332d565b604051601f8201601f19908116603f011681016001600160401b03811182821017156135575761355761332d565b60405281815283820160200185101561356e575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f5f610140868803121561359f575f5ffd5b6135a98787613369565b94506135b887608088016133c9565b93506135c78760c088016133c9565b92506101008601356001600160401b038111156135e2575f5ffd5b6135ee88828901613501565b9250506135fe61012087016133f8565b90509295509295909350565b5f5f6040838503121561361b575f5ffd5b613624836132ea565b915060208301356001600160401b0381111561363e575f5ffd5b61364a85828601613501565b9150509250929050565b5f5f5f5f5f60808688031215613668575f5ffd5b613671866132ea565b945061367f602087016132ea565b93506040860135925060608601356001600160401b038111156136a0575f5ffd5b8601601f810188136136b0575f5ffd5b80356001600160401b038111156136c5575f5ffd5b8860208260061b84010111156136d9575f5ffd5b959894975092955050506020019190565b5f5f5f61010084860312156136fd575f5ffd5b6137078585613369565b925061371685608086016133c9565b91506137258560c086016133c9565b90509250925092565b5f6080828403121561373e575f5ffd5b6126c68383613369565b5f5f60408385031215613759575f5ffd5b613762836132ea565b91506134f8602084016132ea565b5f5f5f5f6101208587031215613784575f5ffd5b61378e8686613369565b935061379d86608087016133c9565b92506137ac8660c087016133c9565b91506101008501356001600160401b038111156137c7575f5ffd5b6137d387828801613501565b91505092959194509250565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6126c660208301846137df565b5f5f5f5f60808587031215613832575f5ffd5b61383b856132ea565b9350613849602086016132ea565b925060408501359150613454606086016132ea565b634e487b7160e01b5f52602160045260245ffd5b828152604081016003831061389557634e487b7160e01b5f52602160045260245ffd5b8260208301529392505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610971576109716138a2565b5f602082840312156138d9575f5ffd5b81516126c68161345f565b6001600160401b038181168382160290811690818114611acf57611acf6138a2565b81810381811115610971576109716138a2565b8551815260208087015190820152604080870151908201526060808701519082015284516080820152602085015160a082015261ffff841660c0820152825160e082015260208301516101008201526101406101208201525f6139806101408301846137df565b979650505050505050565b61ffff8181168382160190811115610971576109716138a2565b8451815260208086015190820152604080860151908201526060808601519082015283516080820152602084015160a0820152825160c0820152602083015160e08201526101206101008201525f613a016101208301846137df565b9695505050505050565b5f60208284031215613a1b575f5ffd5b5051919050565b5f81518060208401855e5f93019283525090919050565b5f613a4d613a478386613a22565b84613a22565b949350505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f82613a9757634e487b7160e01b5f52601260045260245ffd5b500690565b634e487b7160e01b5f52600160045260245ffd5b5f6126c68284613a22565b5f613ac68285613a22565b5f81526001600160f81b03199390931660018401525050600201919050565b5f613af08284613a22565b5f81526001019392505050565b5f613b088285613a22565b6001600160f01b03199390931683525050600201919050565b5f613b2c8285613a22565b6001600160f81b03199390931683525050600101919050565b5f613b508286613a22565b6001600160f81b031994909416845250506001600160f01b0319166001820152600301919050565b8082028115828204841417610971576109716138a2565b6001815b6001841115613bca57808504811115613bae57613bae6138a2565b6001841615613bbc57908102905b60019390931c928002613b93565b935093915050565b5f82613be057506001610971565b81613bec57505f610971565b8160018114613c025760028114613c0c57613c28565b6001915050610971565b60ff841115613c1d57613c1d6138a2565b50506001821b610971565b5060208310610133831016604e8410600b8410161715613c4b575081810a610971565b613c575f198484613b8f565b805f1904821115613c6a57613c6a6138a2565b029392505050565b5f6126c68383613bd256fe424c535f5349475f424e32353447315f584d443a4b454343414b5f4e4354485f4e554c5f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c634300081c000a /// ``` #[rustfmt::skip] #[allow(clippy::all)] pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\xA0`@R0`\x80R4\x80\x15a\0\x13W__\xFD[Pa\0\x1Ca\x001V[a\0$a\x001V[a\0,a\x001V[a\0\xE3V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15a\0\x81W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14a\0\xE0W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[`\x80Qa\x14a\x08-W__\xFD[\x80c\x9F\xFBkC\x11a\x01\x0FW\x80c\x9F\xFBkC\x14a\x06-W\x80c\xA2\x17\xFD\xDF\x14a\x06\x80W\x80c\xA2\xD7\x8D\xD5\x14a\x06\x93W\x80c\xA3\x06j\xAB\x14a\x06\xE5W\x80c\xAC\\*\xD0\x14a\x07\x04W\x80c\xAD<\xB1\xCC\x14a\x07#W__\xFD[\x80cqP\x18\xA6\x14a\x05bW\x80c\x84V\xCBY\x14a\x05vW\x80c\x8D\xA5\xCB[\x14a\x05\x8AW\x80c\x91\xD1HT\x14a\x05\xDAW\x80c\x9B0\xA5\xE6\x14a\x05\xF9W\x80c\x9E\x9A\x8F1\x14a\x06\x18W__\xFD[\x80c9K4\x8F\x11a\x01\xF7W\x80cO\x1E\xF2\x86\x11a\x01\xB1W\x80cO\x1E\xF2\x86\x14a\x04\xBCW\x80cR\xD1\x90-\x14a\x04\xCFW\x80cUD\xC2\xF1\x14a\x04\xE3W\x80c\\\x97Z\xBB\x14a\x04\xFDW\x80c_\x87T\xA6\x14a\x05 W\x80cj\x91\x1C\xCF\x14a\x05NW__\xFD[\x80c9K4\x8F\x14a\x04\nW\x80c;+\x7F\xFA\x14a\x04)W\x80c>\x9D\xF9\xB5\x14a\x04HW\x80c?;\xB3f\x14a\x04\\W\x80c?K\xA8:\x14a\x04\x89W\x80cM\x99\xDD\x16\x14a\x04\x9DW__\xFD[\x80c!@\xFE\xCD\x11a\x02HW\x80c!@\xFE\xCD\x14a\x03BW\x80c$\x8A\x9C\xA3\x14a\x03aW\x80c-\xC9\xBA\xC6\x14a\x03\x8EW\x80c//\xF1]\x14a\x03\xADW\x80c0B@\xBF\x14a\x03\xCCW\x80c6V\x8A\xBE\x14a\x03\xEBW__\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x02\x84W\x80c\x02n@+\x14a\x02\xB8W\x80c\r\x8En,\x14a\x02\xD9W\x80c\x13\xB9\x05z\x14a\x03\x04W\x80c\x1A \xCDc\x14a\x03#W[__\xFD[4\x80\x15a\x02\x8FW__\xFD[Pa\x02\xA3a\x02\x9E6`\x04a1\xBAV[a\t!V[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xC3W__\xFD[Pa\x02\xD7a\x02\xD26`\x04a1\xFCV[a\tWV[\0[4\x80\x15a\x02\xE4W__\xFD[P`@\x80Q`\x02\x81R_` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01a\x02\xAFV[4\x80\x15a\x03\x0FW__\xFD[Pa\x02\xD7a\x03\x1E6`\x04a3\0V[a\tmV[4\x80\x15a\x03.W__\xFD[Pa\x02\xD7a\x03=6`\x04a3jV[a\t\x86V[4\x80\x15a\x03MW__\xFD[Pa\x02\xD7a\x03\\6`\x04a3\x85V[a\n\x9AV[4\x80\x15a\x03lW__\xFD[Pa\x03\x80a\x03{6`\x04a3\x9EV[a\x0B\xEEV[`@Q\x90\x81R` \x01a\x02\xAFV[4\x80\x15a\x03\x99W__\xFD[Pa\x02\xD7a\x03\xA86`\x04a3\xB5V[a\x0C\x0EV[4\x80\x15a\x03\xB8W__\xFD[Pa\x02\xD7a\x03\xC76`\x04a3\xCEV[a\x0C\x97V[4\x80\x15a\x03\xD7W__\xFD[Pa\x02\xD7a\x03\xE66`\x04a4\x81V[a\x0C\xB9V[4\x80\x15a\x03\xF6W__\xFD[Pa\x02\xD7a\x04\x056`\x04a3\xCEV[a\x0E\xC1V[4\x80\x15a\x04\x15W__\xFD[Pa\x02\xD7a\x04$6`\x04a3\x9EV[a\x0E\xF9V[4\x80\x15a\x044W__\xFD[Pa\x02\xD7a\x04C6`\x04a3\xB5V[a\x0FfV[4\x80\x15a\x04SW__\xFD[Pa\x03\x80_T\x81V[4\x80\x15a\x04gW__\xFD[P`\nTa\x04v\x90a\xFF\xFF\x16\x81V[`@Qa\xFF\xFF\x90\x91\x16\x81R` \x01a\x02\xAFV[4\x80\x15a\x04\x94W__\xFD[Pa\x02\xD7a\x10\xC9V[4\x80\x15a\x04\xA8W__\xFD[Pa\x02\xD7a\x04\xB76`\x04a1\xFCV[a\x10\xEBV[a\x02\xD7a\x04\xCA6`\x04a5\x01V[a\x10\xFDV[4\x80\x15a\x04\xDAW__\xFD[Pa\x03\x80a\x11\x18V[4\x80\x15a\x04\xEEW__\xFD[Pa\x02\xD7a\x03\x1E6`\x04a5KV[4\x80\x15a\x05\x08W__\xFD[P_Q` a<\x0E_9_Q\x90_RT`\xFF\x16a\x02\xA3V[4\x80\x15a\x05+W__\xFD[Pa\x02\xA3a\x05:6`\x04a3\x9EV[`\x0C` R_\x90\x81R`@\x90 T`\xFF\x16\x81V[4\x80\x15a\x05YW__\xFD[Pa\x02\xD7a\x113V[4\x80\x15a\x05mW__\xFD[Pa\x02\xD7a\x11\xBDV[4\x80\x15a\x05\x81W__\xFD[Pa\x02\xD7a\x11\xD0V[4\x80\x15a\x05\x95W__\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x02\xAFV[4\x80\x15a\x05\xE5W__\xFD[Pa\x02\xA3a\x05\xF46`\x04a3\xCEV[a\x11\xEFV[4\x80\x15a\x06\x04W__\xFD[Pa\x03\x80a\x06\x136`\x04a5\x8FV[a\x12%V[4\x80\x15a\x06#W__\xFD[Pa\x03\x80`\x08T\x81V[4\x80\x15a\x068W__\xFD[Pa\x06fa\x06G6`\x04a3\x85V[`\x0B` R_\x90\x81R`@\x90 \x80T`\x01\x90\x91\x01Ta\xFF\xFF\x90\x91\x16\x90\x82V[`@\x80Qa\xFF\xFF\x90\x93\x16\x83R` \x83\x01\x91\x90\x91R\x01a\x02\xAFV[4\x80\x15a\x06\x8BW__\xFD[Pa\x03\x80_\x81V[4\x80\x15a\x06\x9EW__\xFD[Pa\x06\xD0a\x06\xAD6`\x04a5\xA9V[`\x07` \x90\x81R_\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 \x80T`\x01\x90\x91\x01T\x82V[`@\x80Q\x92\x83R` \x83\x01\x91\x90\x91R\x01a\x02\xAFV[4\x80\x15a\x06\xF0W__\xFD[Pa\x02\xD7a\x06\xFF6`\x04a3\x85V[a\x12\x7FV[4\x80\x15a\x07\x0FW__\xFD[Pa\x02\xD7a\x07\x1E6`\x04a5\xD1V[a\x12\x90V[4\x80\x15a\x07.W__\xFD[Pa\x07S`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x02\xAF\x91\x90a6nV[4\x80\x15a\x07kW__\xFD[Pa\x02\xA3a\x07z6`\x04a3\x9EV[`\x04` R_\x90\x81R`@\x90 T`\xFF\x16\x81V[4\x80\x15a\x07\x99W__\xFD[P`\x01Ta\x05\xC2\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[4\x80\x15a\x07\xB8W__\xFD[Pa\x03\x80a\x07\xC76`\x04a3\x85V[`\x05` R_\x90\x81R`@\x90 T\x81V[4\x80\x15a\x07\xE3W__\xFD[Pa\x02\xD7a\x07\xF26`\x04a6\x80V[a\x13gV[4\x80\x15a\x08\x02W__\xFD[Pa\x03\x80a\x08\x116`\x04a5\xA9V[`\x06` \x90\x81R_\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 T\x81V[4\x80\x15a\x088W__\xFD[Pa\x02\xD7a\x08G6`\x04a6\xBFV[a\x14~V[4\x80\x15a\x08WW__\xFD[Pa\x02\xD7a\x08f6`\x04a3\xCEV[a\x15\x8DV[4\x80\x15a\x08vW__\xFD[Pa\x03\x80`\tT\x81V[4\x80\x15a\x08\x8BW__\xFD[Pa\x03\x80_Q` a;\xCE_9_Q\x90_R\x81V[4\x80\x15a\x08\xABW__\xFD[Pa\x02\xD7a\x08\xBA6`\x04a3\x85V[a\x15\xA9V[4\x80\x15a\x08\xCAW__\xFD[Pa\x08\xF4a\x08\xD96`\x04a3\x85V[`\x03` R_\x90\x81R`@\x90 \x80T`\x01\x90\x91\x01T`\xFF\x16\x82V[`@Qa\x02\xAF\x92\x91\x90a7^V[4\x80\x15a\t\rW__\xFD[P`\x02Ta\x05\xC2\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[_`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\tQWPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[a\t_a\x15\xE8V[a\ti\x82\x82a\x16\x18V[PPV[`@Qc\xC2\xD7\xF8\x13`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\t\x8Ea\x17\xB6V[`\x01T`@\x80Qc<\x1A\x08\x15`\xE2\x1B\x81R\x90Q_\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\xF0h T\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\t\xD5W=__>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\t\xF9\x91\x90a7\x8EV[a\n\x04\x90`\x0Fa7\xBDV[\x90Pb\x12u\0`\x01`\x01`@\x1B\x03\x80\x83\x16\x90\x84\x16\x10\x80a\n5WP\x80`\x01`\x01`@\x1B\x03\x16\x83`\x01`\x01`@\x1B\x03\x16\x11[\x15a\nSW`@Qc\xB5~!\xDF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`@\x1B\x03\x83\x16`\x08\x81\x90U`@Q\x90\x81R\x7Fy>;\x1E\x1B\xCDg{\xB1\x19\0\xC81$\xD3\xC4L\x99F\xEA\x8D\xDF\x97\x8A\x0C\xA2P\xB04\xEC\x9D\xDE\x90` \x01`@Q\x80\x91\x03\x90\xA1PPPV[a\n\xA2a\x15\xE8V[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x05` R`@\x81 T3\x91\x81\x90\x03a\n\xDCW`@Qcy)\x8AS`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80B\x10\x15a\n\xFDW`@QcZwCW`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x84\x16_\x90\x81R`\x06` \x90\x81R`@\x80\x83 \x93\x86\x16\x83R\x92\x90R\x90\x81 T\x90\x81\x90\x03a\x0BEW`@Qc\x06\x86\x82{`\xE5\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x85\x16_\x81\x81R`\x06` \x90\x81R`@\x80\x83 \x94\x88\x16\x83R\x93\x81R\x83\x82 \x82\x90U\x91\x81R`\x03\x90\x91R\x90\x81 \x80T\x83\x92\x90a\x0B\x89\x90\x84\x90a7\xDFV[\x90\x91UPP`\x02Ta\x0B\xA5\x90`\x01`\x01`\xA0\x1B\x03\x16\x84\x83a\x18\x11V[\x82`\x01`\x01`\xA0\x1B\x03\x16\x7F\x7F\xCFS,\x15\xF0\xA6\xDB\x0B\xD6\xD0\xE08\xBE\xA7\x1D0\xD8\x08\xC7\xD9\x8C\xB3\xBFrh\xA9[\xF5\x08\x1Be\x82`@Qa\x0B\xE0\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2PPPPV[_\x90\x81R_Q` a;\xEE_9_Q\x90_R` R`@\x90 `\x01\x01T\x90V[a\x0C\x16a\x17\xB6V[_\x81a\xFF\xFF\x16\x11\x80\x15a\x0C/WPa'\x10\x81a\xFF\xFF\x16\x11\x15[a\x0CLW`@QcgN\x8E\xF3`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\n\x80Ta\xFF\xFF\x19\x16a\xFF\xFF\x83\x16\x90\x81\x17\x90\x91U`@Q\x90\x81R\x7F\xBE[G\xBEvP\x0F\xEAQ\x0C\xE2\x19\x17\x8Bnci[fA\xDA\xD0\xD3\xA0HdU\xCE\xA1\n\xED\xFD\x90` \x01[`@Q\x80\x91\x03\x90\xA1PV[a\x0C\xA0\x82a\x0B\xEEV[a\x0C\xA9\x81a\x18\x9AV[a\x0C\xB3\x83\x83a\x18\xA4V[PPPPV[a\x0C\xC1a\x15\xE8V[3a\x0C\xCB\x81a\x19LV[a\x0C\xD4\x85a\x19\x99V[a\x0C\xDE\x86\x86a\x19\xD4V[`@\x80Q`\x01`\x01`\xA0\x1B\x03\x83\x16` \x82\x01R_\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90Pa\r\x10\x81\x86\x89a\x1AMV[\x83Q`@\x14a\r2W`@QcBG\x06\x87`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a'\x10\x83a\xFF\xFF\x16\x11\x15a\rYW`@Qc\xDC\x81\xDB\x85`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x04_a\rg\x8Aa\x12%V[\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP`\x01`\x0C_a\r\x98\x89a\x1A\xE2V[\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP`@Q\x80`@\x01`@R\x80_\x81R` \x01`\x01`\x02\x81\x11\x15a\r\xDFWa\r\xDFa7JV[\x90R`\x01`\x01`\xA0\x1B\x03\x83\x16_\x90\x81R`\x03` \x90\x81R`@\x90\x91 \x82Q\x81U\x90\x82\x01Q`\x01\x80\x83\x01\x80T\x90\x91`\xFF\x19\x90\x91\x16\x90\x83`\x02\x81\x11\x15a\x0E%Wa\x0E%a7JV[\x02\x17\x90UPP`@\x80Q\x80\x82\x01\x82Ra\xFF\xFF\x86\x81\x16\x82R_` \x80\x84\x01\x82\x81R`\x01`\x01`\xA0\x1B\x03\x89\x16\x80\x84R`\x0B\x90\x92R\x91\x85\x90 \x93Q\x84Ta\xFF\xFF\x19\x16\x93\x16\x92\x90\x92\x17\x83UQ`\x01\x90\x92\x01\x91\x90\x91U\x90Q\x90\x91P\x7F\xF0W\xD4\xEA\x81\xE9\x86(e:\x8F\x90x\x85A\x97 x\x13s4\xA9+B4~\xAC\xCD\xA8\x0F\xC4\n\x90a\x0E\xB0\x90\x8A\x90\x8A\x90\x88\x90\x8B\x90\x8B\x90a7\xF2V[`@Q\x80\x91\x03\x90\xA2PPPPPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x0E\xEAW`@Qc3K\xD9\x19`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0E\xF4\x82\x82a\x1B\x06V[PPPV[a\x0F\x01a\x17\xB6V[_\x81\x11\x80\x15a\x0F\x14WPc\x01\xE13\x80\x81\x11\x15[a\x0F1W`@QcgN\x8E\xF3`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\t\x81\x90U`@Q\x81\x81R\x7FQ\xD9\xFE\xFD\xD4\x81\x91\xBCu\xAB\x12\x11m^Q\x81\x96G\x99\xA69\xE1\xEE1\xB0\x99\x8F\xFA\xAF\x9E\xF2Y\x90` \x01a\x0C\x8CV[a\x0Fna\x15\xE8V[3a\x0Fx\x81a\x1B\x7FV[a'\x10\x82a\xFF\xFF\x16\x11\x15a\x0F\x9FW`@Qc\xDC\x81\xDB\x85`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x0B` R`@\x90 \x80Ta\xFF\xFF\x90\x81\x16\x90\x84\x16\x81\x90\x03a\x0F\xE1W`@Qc0\x82\xEB%`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80a\xFF\xFF\x16\x84a\xFF\xFF\x16\x11\x15a\x10mW`\x01\x82\x01T\x80\x15\x80a\x10\x0FWP`\tTa\x10\x0B\x90\x82a8dV[B\x10\x15[a\x10,W`@Qc\x16\xEB\x94\xCB`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\nTa\x10=\x90a\xFF\xFF\x16\x83a8wV[a\xFF\xFF\x16\x85a\xFF\xFF\x16\x11\x15a\x10eW`@Qc\x12\xD6\xA4e`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PB`\x01\x83\x01U[\x81Ta\xFF\xFF\x19\x16a\xFF\xFF\x85\x81\x16\x91\x82\x17\x84U`@\x80QB\x81R\x91\x84\x16` \x83\x01R\x81\x01\x91\x90\x91R`\x01`\x01`\xA0\x1B\x03\x84\x16\x90\x7F\xBD\x8Dv\xFC\xCA\xB3\x9D\xB7\x06K\xC0\x07\xD9\xA2\xC8:\x98$}\xCB\x10\x87\xCC\x12\xF3C\xB8\xBE\x90\xAE\xFDd\x90``\x01a\x0B\xE0V[_Q` a;\xCE_9_Q\x90_Ra\x10\xE0\x81a\x18\x9AV[a\x10\xE8a\x1C\0V[PV[a\x10\xF3a\x15\xE8V[a\ti\x82\x82a\x1CYV[a\x11\x05a\x1E\x0BV[a\x11\x0E\x82a\x1E\xAFV[a\ti\x82\x82a\x1E\xB7V[_a\x11!a\x1FsV[P_Q` a;\xAE_9_Q\x90_R\x90V[a\x11;a\x15\xE8V[3a\x11E\x81a\x1B\x7FV[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x03` R`@\x90 `\x01\x01\x80T`\xFF\x19\x16`\x02\x17\x90U`\x08Ta\x11w\x90Ba8dV[`\x01`\x01`\xA0\x1B\x03\x82\x16_\x81\x81R`\x05` R`@\x80\x82 \x93\x90\x93U\x91Q\x90\x91\x7F\xFB$0ST\xC8wb\xD5WHz\xE4\xA5d\xE8\xD0>\xCB\xB9\xA9}\xD8\xAF\xFF\x8E\x1Fo\xCA\xF0\xDD\x16\x91\xA2PV[a\x11\xC5a\x17\xB6V[a\x11\xCE_a\x1F\xBCV[V[_Q` a;\xCE_9_Q\x90_Ra\x11\xE7\x81a\x18\x9AV[a\x10\xE8a ,V[_\x91\x82R_Q` a;\xEE_9_Q\x90_R` \x90\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[_\x81_\x01Q\x82` \x01Q\x83`@\x01Q\x84``\x01Q`@Q` \x01a\x12b\x94\x93\x92\x91\x90\x93\x84R` \x84\x01\x92\x90\x92R`@\x83\x01R``\x82\x01R`\x80\x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[a\x12\x87a\x15\xE8V[a\x10\xE8\x81a tV[a\x12\x98a\x15\xE8V[3a\x12\xA2\x81a\x1B\x7FV[a\x12\xAB\x84a\x19\x99V[a\x12\xB5\x85\x85a\x19\xD4V[`@\x80Q`\x01`\x01`\xA0\x1B\x03\x83\x16` \x82\x01R_\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90Pa\x12\xE7\x81\x85\x88a\x1AMV[`\x01`\x04_a\x12\xF5\x89a\x12%V[\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x01`\x01`\xA0\x1B\x03\x16\x7F\xC8\xC5\xB3z\xEC\x7F-\xDB\xD3\xA1\x84\x84a#8V[\x80T`\xFF`@\x1B\x19\x16\x81U`@Q`\x01`\x01`@\x1B\x03\x83\x16\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1PPPPPPV[a\x15\x96\x82a\x0B\xEEV[a\x15\x9F\x81a\x18\x9AV[a\x0C\xB3\x83\x83a\x1B\x06V[a\x15\xB1a\x17\xB6V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x15\xDFW`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R_`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\x10\xE8\x81a\x1F\xBCV[_Q` a<\x0E_9_Q\x90_RT`\xFF\x16\x15a\x11\xCEW`@Qc\xD9<\x06e`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x16!\x82a\x1B\x7FV[3_\x82\x90\x03a\x16CW`@Qc\x1F* \x05`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02T`@Qcn\xB1v\x9F`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`\x04\x83\x01R0`$\x83\x01R_\x92\x16\x90c\xDDb\xED>\x90`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x16\x91W=__>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x16\xB5\x91\x90a8\xF7V[\x90P\x82\x81\x10\x15a\x16\xE2W`@Qc\x05Ce\xBB`\xE3\x1B\x81R`\x04\x81\x01\x82\x90R`$\x81\x01\x84\x90R`D\x01a\x15\xD6V[`\x02Ta\x16\xFA\x90`\x01`\x01`\xA0\x1B\x03\x16\x830\x86a$\xCDV[`\x01`\x01`\xA0\x1B\x03\x84\x16_\x90\x81R`\x03` R`@\x81 \x80T\x85\x92\x90a\x17!\x90\x84\x90a8dV[\x90\x91UPP`\x01`\x01`\xA0\x1B\x03\x80\x85\x16_\x90\x81R`\x06` \x90\x81R`@\x80\x83 \x93\x86\x16\x83R\x92\x90R\x90\x81 \x80T\x85\x92\x90a\x17\\\x90\x84\x90a8dV[\x92PP\x81\x90UP\x83`\x01`\x01`\xA0\x1B\x03\x16\x82`\x01`\x01`\xA0\x1B\x03\x16\x7F\xE5T\x1Aka\x03\xD4\xFA~\x02\x1E\xD5O\xAD9\xC6o'\xA7k\xD1=7L\xF6$\n\xE6\xBD\x0B\xB7+\x85`@Qa\x17\xA8\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPPV[3a\x17\xE8\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x11\xCEW`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\x15\xD6V[_`@Qc\xA9\x05\x9C\xBB`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x84\x16`\x04\x82\x01R\x82`$\x82\x01R` _`D\x83_\x89Z\xF1\x91PP\x80`\x1F=\x11`\x01_Q\x14\x16\x15\x16\x15a\x18[WP\x82;\x15=\x17\x15[\x80a\x0C\xB3W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0F`$\x82\x01Rn\x15\x14\x90S\x94\xD1\x91T\x97\xD1\x90RS\x11Q`\x8A\x1B`D\x82\x01R`d\x01a\x15\xD6V[a\x10\xE8\x813a%jV[__Q` a;\xEE_9_Q\x90_Ra\x18\xBD\x84\x84a\x11\xEFV[a\x19F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x10\xE8a\x17\xB6V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x1F\x11WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x1F\x0E\x91\x81\x01\x90a8\xF7V[`\x01[a\x1F9W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x15\xD6V[_Q` a;\xAE_9_Q\x90_R\x81\x14a\x1FiW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x15\xD6V[a\x0E\xF4\x83\x83a):V[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x11\xCEW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90_\x90\xA3PPPV[a 4a\x15\xE8V[_Q` a<\x0E_9_Q\x90_R\x80T`\xFF\x19\x16`\x01\x17\x81U\x7Fb\xE7\x8C\xEA\x01\xBE\xE3 \xCDNB\x02p\xB5\xEAt\0\r\x11\xB0\xC9\xF7GT\xEB\xDB\xFCTK\x05\xA2X3a\x1CAV[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x07` \x90\x81R`@\x80\x83 3\x80\x85R\x92R\x82 T\x90\x91\x81\x90\x03a \xB9W`@Qc\x06\x86\x82{`\xE5\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x84\x16_\x90\x81R`\x07` \x90\x81R`@\x80\x83 \x93\x86\x16\x83R\x92\x90R `\x01\x01TB\x10\x15a!\x01W`@QcZwCW`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x84\x16_\x90\x81R`\x07` \x90\x81R`@\x80\x83 \x86\x85\x16\x84R\x90\x91R\x81 \x81\x81U`\x01\x01U`\x02Ta!<\x91\x16\x83\x83a\x18\x11V[\x81`\x01`\x01`\xA0\x1B\x03\x16\x7F\x7F\xCFS,\x15\xF0\xA6\xDB\x0B\xD6\xD0\xE08\xBE\xA7\x1D0\xD8\x08\xC7\xD9\x8C\xB3\xBFrh\xA9[\xF5\x08\x1Be\x82`@Qa!w\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2PPPV[a!\x8Ca)\x8FV[a\x10\xE8\x81a)\xC5V[a\x11\xCEa)\x8FV[_Q` a<._9_Q\x90_R\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16_\x81\x15\x80\x15a!\xCEWP\x82[\x90P_\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a!\xE9WP0;\x15[\x90P\x81\x15\x80\x15a!\xF7WP\x80\x15[\x15a\"\x15W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\"?W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[C_U\x83\x15a\"\x88W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPV[`\x01`\x01`\xA0\x1B\x03\x83\x16a\"\xB6W`@Qc\xD9.#=`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x82\x16a\"\xDDW`@Qc\xD9.#=`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x80T`\x01`\x01`\xA0\x1B\x03\x80\x86\x16`\x01`\x01`\xA0\x1B\x03\x19\x92\x83\x16\x17\x90\x92U`\x01\x80T\x92\x85\x16\x92\x90\x91\x16\x91\x90\x91\x17\x90U`Z\x80\x82\x10\x15a#0W`@Qc\xB5~!\xDF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P`\x08UPPV[_[\x81\x81\x10\x15a\x0E\xF4W_\x83\x83\x83\x81\x81\x10a#UWa#Ua9AV[a#k\x92` `@\x90\x92\x02\x01\x90\x81\x01\x91Pa3\x85V[\x90P_\x84\x84\x84\x81\x81\x10a#\x80Wa#\x80a9AV[\x90P`@\x02\x01` \x01` \x81\x01\x90a#\x98\x91\x90a3\xB5V[\x90Pa'\x10\x81a\xFF\xFF\x16\x11\x15a#\xC1W`@Qc\xDC\x81\xDB\x85`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x82\x16_\x90\x81R`\x03` R`@\x81 `\x01\x01T`\xFF\x16\x90\x81`\x02\x81\x11\x15a#\xF2Wa#\xF2a7JV[\x03a$\x10W`@QcP\x8Ay?`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x83\x16_\x90\x81R`\x0B` R`@\x90 `\x01\x01T\x15\x80\x15a$QWP`\x01`\x01`\xA0\x1B\x03\x83\x16_\x90\x81R`\x0B` R`@\x90 Ta\xFF\xFF\x16\x15[\x83\x90a$|W`@Qc\x05\x08\x14\xE1`\xE4\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x90\x91\x16`\x04\x82\x01R`$\x01a\x15\xD6V[PP`@\x80Q\x80\x82\x01\x82Ra\xFF\xFF\x92\x83\x16\x81R_` \x80\x83\x01\x82\x81R`\x01`\x01`\xA0\x1B\x03\x96\x90\x96\x16\x82R`\x0B\x90R\x91\x90\x91 \x90Q\x81Ta\xFF\xFF\x19\x16\x92\x16\x91\x90\x91\x17\x81U\x90Q`\x01\x91\x82\x01U\x01a#:V[_`@Qc#\xB8r\xDD`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`\x01`\x01`\xA0\x1B\x03\x84\x16`$\x82\x01R\x82`D\x82\x01R` _`d\x83_\x8AZ\xF1\x91PP\x80`\x1F=\x11`\x01_Q\x14\x16\x15\x16\x15a%&WP\x83;\x15=\x17\x15[\x80a\"\x88W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x14`$\x82\x01Rs\x15\x14\x90S\x94\xD1\x91T\x97\xD1\x94\x93\xD3W\xD1\x90RS\x11Q`b\x1B`D\x82\x01R`d\x01a\x15\xD6V[a%t\x82\x82a\x11\xEFV[a\tiW`@Qc\xE2Q}?`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x81\x01\x83\x90R`D\x01a\x15\xD6V[\x80Q\x82Q_\x91\x14\x80\x15a%\xBDWP\x81` \x01Q\x83` \x01Q\x14[\x93\x92PPPV[\x80Q` \x82\x01Q_\x91_Q` a;\x8E_9_Q\x90_R\x91\x15\x90\x15\x16\x15a%\xEAWPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x0E\xF4W`@Qc'\x9E4S`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_a&H\x83a)\xCDV[\x90P_Q` a;\x8E_9_Q\x90_R`\x03_\x82\x84\x85\t\x90P\x82\x80a&oWa&oa9UV[\x84\x82\t\x90P\x82\x80a&\x82Wa&\x82a9UV[\x82\x82\x08\x90P__a&\x92\x83a+\xD5V[\x92P\x90P[\x80a&\xFBW\x84\x80a&\xAAWa&\xAAa9UV[`\x01\x87\x08\x95P\x84\x80a&\xBEWa&\xBEa9UV[\x86\x87\t\x92P\x84\x80a&\xD1Wa&\xD1a9UV[\x86\x84\t\x92P\x84\x80a&\xE4Wa&\xE4a9UV[\x84\x84\x08\x92Pa&\xF2\x83a+\xD5V[\x92P\x90Pa&\x97V[P`@\x80Q\x80\x82\x01\x90\x91R\x94\x85R` \x85\x01RP\x91\x94\x93PPPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a'?WP\x90V[`@Q\x80`@\x01`@R\x80\x83_\x01Q\x81R` \x01_Q` a;\x8E_9_Q\x90_R\x84` \x01Qa'p\x91\x90a9iV[a'\x87\x90_Q` a;\x8E_9_Q\x90_Ra7\xDFV[\x90R\x92\x91PPV[a'\xB6`@Q\x80`\x80\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[___`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` _a\x01\x80\x83`\x08Z\xFA\x91PP_Q\x91P\x80a(\xFFW`@Qc\xC2\x063O`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x15\x15\x95\x94PPPPPV[_Q` a<\x0E_9_Q\x90_RT`\xFF\x16a\x11\xCEW`@Qc\x8D\xFC +`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a)C\x82a,\x9DV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90_\x90\xA2\x80Q\x15a)\x87Wa\x0E\xF4\x82\x82a-\0V[a\tia-rV[_Q` a<._9_Q\x90_RT`\x01`@\x1B\x90\x04`\xFF\x16a\x11\xCEW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x15\xB1a)\x8FV[__a)\xD8\x83a-\x91V[\x80Q\x90\x91P`0\x81\x14a)\xEDWa)\xEDa9\x88V[_\x81`\x01`\x01`@\x1B\x03\x81\x11\x15a*\x06Wa*\x06a2$V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a*0W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P_[\x82\x81\x10\x15a*\x9FW\x83`\x01a*J\x83\x86a7\xDFV[a*T\x91\x90a7\xDFV[\x81Q\x81\x10a*dWa*da9AV[` \x01\x01Q`\xF8\x1C`\xF8\x1B\x82\x82\x81Q\x81\x10a*\x81Wa*\x81a9AV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81_\x1A\x90SP`\x01\x01a*5V[P`@\x80Q`\x1F\x80\x82Ra\x04\0\x82\x01\x90\x92R_\x90\x82` \x82\x01a\x03\xE0\x806\x837\x01\x90PP\x90P_[\x82\x81\x10\x15a+/W\x83\x81a*\xDB\x85\x88a7\xDFV[a*\xE5\x91\x90a8dV[\x81Q\x81\x10a*\xF5Wa*\xF5a9AV[` \x01\x01Q`\xF8\x1C`\xF8\x1B`\xF8\x1C\x82\x82\x81Q\x81\x10a+\x15Wa+\x15a9AV[`\xFF\x90\x92\x16` \x92\x83\x02\x91\x90\x91\x01\x90\x91\x01R`\x01\x01a*\xC7V[P_a+:\x82a0\xDCV[\x90Pa\x01\0_Q` a;\x8E_9_Q\x90_R_a+X\x86\x89a7\xDFV[\x90P_[\x81\x81\x10\x15a+\xC5W_\x88`\x01a+r\x84\x86a7\xDFV[a+|\x91\x90a7\xDFV[\x81Q\x81\x10a+\x8CWa+\x8Ca9AV[\x01` \x01Q`\xF8\x1C\x90P\x83\x80a+\xA4Wa+\xA4a9UV[\x85\x87\t\x95P\x83\x80a+\xB7Wa+\xB7a9UV[\x81\x87\x08\x95PP`\x01\x01a+\\V[P\x92\x9A\x99PPPPPPPPPPV[_____\x7F\x0C\x19\x13\x9C\xB8Lh\nn\x14\x11m\xA0`V\x17e\xE0Z\xA4Z\x1Cr\xA3O\x08#\x05\xB6\x1F?R\x90P__Q` a;\x8E_9_Q\x90_R\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x87``\x82\x01R\x82`\x80\x82\x01R\x81`\xA0\x82\x01R` _`\xC0\x83`\x05Z\xFA\x94PP_Q\x92P\x83a,cW`@Qc\x0C\x9D>\x99`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80`\x01\x84\x90\x1B\x11\x15a,|Wa,y\x83\x82a7\xDFV[\x92P[\x80\x80a,\x8AWa,\x8Aa9UV[\x83\x84\t\x96\x90\x96\x14\x96\x91\x95P\x90\x93PPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;_\x03a,\xD2W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x15\xD6V[_Q` a;\xAE_9_Q\x90_R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[``__\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa-\x1C\x91\x90a9\x9CV[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a-TW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a-YV[``\x91P[P\x91P\x91Pa-i\x85\x83\x83a1 v\xCC75\xA9 \xA3\xCAP]8+\xBCe\xD7\xA2\x8E2e\xB3zdt\x92\x9F3e!\xB32\xC1h\x1B\x93?l\xB9\xF37fsD\r\x86*\x02\xDD{\xC7\xDE\xC4\xDC\xEE\xDD\xA7u\xE5\x8D\xD5A\xE0\x8A\x11llS\x81\\\x0B\xD0(\x19/{bh\0\xCD^\xD1\\n\x18~w\xE9\xAE\xE8\x81\x84\xC2\x1FO!\x82\xABX'\xCB;~\x07\xFB\xED\xCDc\xF03\0\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\xA1dsolcC\0\x08\x1C\0\n", + b"`\xA0`@R0`\x80R4\x80\x15a\0\x13W__\xFD[Pa\0\x1Ca\x001V[a\0$a\x001V[a\0,a\x001V[a\0\xE3V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15a\0\x81W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14a\0\xE0W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[`\x80Qa=na\x01\t_9_\x81\x81a\x1F\xA0\x01R\x81\x81a\x1F\xC9\x01Ra#4\x01Ra=n_\xF3\xFE`\x80`@R`\x046\x10a\x02\x8BW_5`\xE0\x1C\x80cqP\x18\xA6\x11a\x01UW\x80c\xB3\xE6\xEB\xD5\x11a\0\xBEW\x80c\xD5Gt\x1F\x11a\0xW\x80c\xD5Gt\x1F\x14a\x08lW\x80c\xD9\xCC}&\x14a\x08\x8BW\x80c\xE6:\xB1\xE9\x14a\x08\xA0W\x80c\xF2\xFD\xE3\x8B\x14a\x08\xC0W\x80c\xFAR\xC7\xD8\x14a\x08\xDFW\x80c\xFC\x0CTj\x14a\t\"W__\xFD[\x80c\xB3\xE6\xEB\xD5\x14a\x07\x8AW\x80c\xB5p\x0Eh\x14a\x07\xB8W\x80c\xB5\xEC\xB3D\x14a\x07\xD7W\x80c\xBDI\xC3_\x14a\x08\x02W\x80c\xBE 0\x94\x14a\x08\x17W\x80c\xC6H\x14\xDD\x14a\x086W__\xFD[\x80c\x9F\xFBkC\x11a\x01\x0FW\x80c\x9F\xFBkC\x14a\x06WW\x80c\xA2\x17\xFD\xDF\x14a\x06\xAAW\x80c\xA2\xD7\x8D\xD5\x14a\x06\xBDW\x80c\xA3\x06j\xAB\x14a\x07\x0FW\x80c\xAC\\*\xD0\x14a\x07.W\x80c\xAD<\xB1\xCC\x14a\x07MW__\xFD[\x80cqP\x18\xA6\x14a\x05\x8CW\x80c\x84V\xCBY\x14a\x05\xA0W\x80c\x8D\xA5\xCB[\x14a\x05\xB4W\x80c\x91\xD1HT\x14a\x06\x04W\x80c\x9B0\xA5\xE6\x14a\x06#W\x80c\x9E\x9A\x8F1\x14a\x06BW__\xFD[\x80c;+\x7F\xFA\x11a\x01\xF7W\x80cRx\x0Bn\x11a\x01\xB1W\x80cRx\x0Bn\x14a\x04\xDAW\x80cR\xD1\x90-\x14a\x04\xF9W\x80cUD\xC2\xF1\x14a\x05\rW\x80c\\\x97Z\xBB\x14a\x05'W\x80c_\x87T\xA6\x14a\x05JW\x80cj\x91\x1C\xCF\x14a\x05xW__\xFD[\x80c;+\x7F\xFA\x14a\x044W\x80c>\x9D\xF9\xB5\x14a\x04SW\x80c?;\xB3f\x14a\x04gW\x80c?K\xA8:\x14a\x04\x94W\x80cM\x99\xDD\x16\x14a\x04\xA8W\x80cO\x1E\xF2\x86\x14a\x04\xC7W__\xFD[\x80c$\x8A\x9C\xA3\x11a\x02HW\x80c$\x8A\x9C\xA3\x14a\x03lW\x80c-\xC9\xBA\xC6\x14a\x03\x99W\x80c//\xF1]\x14a\x03\xB8W\x80c0B@\xBF\x14a\x03\xD7W\x80c6V\x8A\xBE\x14a\x03\xF6W\x80c9K4\x8F\x14a\x04\x15W__\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x02\x8FW\x80c\x02n@+\x14a\x02\xC3W\x80c\r\x8En,\x14a\x02\xE4W\x80c\x13\xB9\x05z\x14a\x03\x0FW\x80c\x1A \xCDc\x14a\x03.W\x80c!@\xFE\xCD\x14a\x03MW[__\xFD[4\x80\x15a\x02\x9AW__\xFD[Pa\x02\xAEa\x02\xA96`\x04a2\xC3V[a\tAV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xCEW__\xFD[Pa\x02\xE2a\x02\xDD6`\x04a3\x05V[a\twV[\0[4\x80\x15a\x02\xEFW__\xFD[P`@\x80Q`\x02\x81R_` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01a\x02\xBAV[4\x80\x15a\x03\x1AW__\xFD[Pa\x02\xE2a\x03)6`\x04a4\tV[a\t\xA3V[4\x80\x15a\x039W__\xFD[Pa\x02\xE2a\x03H6`\x04a4sV[a\t\xBCV[4\x80\x15a\x03XW__\xFD[Pa\x02\xE2a\x03g6`\x04a4\x8EV[a\n\xD0V[4\x80\x15a\x03wW__\xFD[Pa\x03\x8Ba\x03\x866`\x04a4\xA7V[a\x0C$V[`@Q\x90\x81R` \x01a\x02\xBAV[4\x80\x15a\x03\xA4W__\xFD[Pa\x02\xE2a\x03\xB36`\x04a4\xBEV[a\x0CDV[4\x80\x15a\x03\xC3W__\xFD[Pa\x02\xE2a\x03\xD26`\x04a4\xD7V[a\x0C\xCDV[4\x80\x15a\x03\xE2W__\xFD[Pa\x02\xE2a\x03\xF16`\x04a5\x8AV[a\x0C\xEFV[4\x80\x15a\x04\x01W__\xFD[Pa\x02\xE2a\x04\x106`\x04a4\xD7V[a\x0E\xF7V[4\x80\x15a\x04 W__\xFD[Pa\x02\xE2a\x04/6`\x04a4\xA7V[a\x0F/V[4\x80\x15a\x04?W__\xFD[Pa\x02\xE2a\x04N6`\x04a4\xBEV[a\x0F\x9CV[4\x80\x15a\x04^W__\xFD[Pa\x03\x8B_T\x81V[4\x80\x15a\x04rW__\xFD[P`\nTa\x04\x81\x90a\xFF\xFF\x16\x81V[`@Qa\xFF\xFF\x90\x91\x16\x81R` \x01a\x02\xBAV[4\x80\x15a\x04\x9FW__\xFD[Pa\x02\xE2a\x10\xFFV[4\x80\x15a\x04\xB3W__\xFD[Pa\x02\xE2a\x04\xC26`\x04a3\x05V[a\x11!V[a\x02\xE2a\x04\xD56`\x04a6\nV[a\x11DV[4\x80\x15a\x04\xE5W__\xFD[Pa\x02\xE2a\x04\xF46`\x04a6TV[a\x11cV[4\x80\x15a\x05\x04W__\xFD[Pa\x03\x8Ba\x12|V[4\x80\x15a\x05\x18W__\xFD[Pa\x02\xE2a\x03)6`\x04a6\xEAV[4\x80\x15a\x052W__\xFD[P_Q` a=\"_9_Q\x90_RT`\xFF\x16a\x02\xAEV[4\x80\x15a\x05UW__\xFD[Pa\x02\xAEa\x05d6`\x04a4\xA7V[`\r` R_\x90\x81R`@\x90 T`\xFF\x16\x81V[4\x80\x15a\x05\x83W__\xFD[Pa\x02\xE2a\x12\x97V[4\x80\x15a\x05\x97W__\xFD[Pa\x02\xE2a\x13OV[4\x80\x15a\x05\xABW__\xFD[Pa\x02\xE2a\x13bV[4\x80\x15a\x05\xBFW__\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x02\xBAV[4\x80\x15a\x06\x0FW__\xFD[Pa\x02\xAEa\x06\x1E6`\x04a4\xD7V[a\x13\x81V[4\x80\x15a\x06.W__\xFD[Pa\x03\x8Ba\x06=6`\x04a7.V[a\x13\xB7V[4\x80\x15a\x06MW__\xFD[Pa\x03\x8B`\x08T\x81V[4\x80\x15a\x06bW__\xFD[Pa\x06\x90a\x06q6`\x04a4\x8EV[`\x0C` R_\x90\x81R`@\x90 \x80T`\x01\x90\x91\x01Ta\xFF\xFF\x90\x91\x16\x90\x82V[`@\x80Qa\xFF\xFF\x90\x93\x16\x83R` \x83\x01\x91\x90\x91R\x01a\x02\xBAV[4\x80\x15a\x06\xB5W__\xFD[Pa\x03\x8B_\x81V[4\x80\x15a\x06\xC8W__\xFD[Pa\x06\xFAa\x06\xD76`\x04a7HV[`\x07` \x90\x81R_\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 \x80T`\x01\x90\x91\x01T\x82V[`@\x80Q\x92\x83R` \x83\x01\x91\x90\x91R\x01a\x02\xBAV[4\x80\x15a\x07\x1AW__\xFD[Pa\x02\xE2a\x07)6`\x04a4\x8EV[a\x14\x11V[4\x80\x15a\x079W__\xFD[Pa\x02\xE2a\x07H6`\x04a7pV[a\x15)V[4\x80\x15a\x07XW__\xFD[Pa\x07}`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x02\xBA\x91\x90a8\rV[4\x80\x15a\x07\x95W__\xFD[Pa\x02\xAEa\x07\xA46`\x04a4\xA7V[`\x04` R_\x90\x81R`@\x90 T`\xFF\x16\x81V[4\x80\x15a\x07\xC3W__\xFD[P`\x01Ta\x05\xEC\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[4\x80\x15a\x07\xE2W__\xFD[Pa\x03\x8Ba\x07\xF16`\x04a4\x8EV[`\x05` R_\x90\x81R`@\x90 T\x81V[4\x80\x15a\x08\rW__\xFD[Pa\x03\x8B`\x0BT\x81V[4\x80\x15a\x08\"W__\xFD[Pa\x02\xE2a\x0816`\x04a8\x1FV[a\x16\0V[4\x80\x15a\x08AW__\xFD[Pa\x03\x8Ba\x08P6`\x04a7HV[`\x06` \x90\x81R_\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 T\x81V[4\x80\x15a\x08wW__\xFD[Pa\x02\xE2a\x08\x866`\x04a4\xD7V[a\x17\x17V[4\x80\x15a\x08\x96W__\xFD[Pa\x03\x8B`\tT\x81V[4\x80\x15a\x08\xABW__\xFD[Pa\x03\x8B_Q` a<\xE2_9_Q\x90_R\x81V[4\x80\x15a\x08\xCBW__\xFD[Pa\x02\xE2a\x08\xDA6`\x04a4\x8EV[a\x173V[4\x80\x15a\x08\xEAW__\xFD[Pa\t\x14a\x08\xF96`\x04a4\x8EV[`\x03` R_\x90\x81R`@\x90 \x80T`\x01\x90\x91\x01T`\xFF\x16\x82V[`@Qa\x02\xBA\x92\x91\x90a8rV[4\x80\x15a\t-W__\xFD[P`\x02Ta\x05\xEC\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[_`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\tqWPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[a\t\x7Fa\x17rV[a\t\x89\x82\x82a\x17\xA2V[\x80`\x0B_\x82\x82Ta\t\x9A\x91\x90a8\xB6V[\x90\x91UPPPPV[`@Qc\xC2\xD7\xF8\x13`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\t\xC4a\x19@V[`\x01T`@\x80Qc<\x1A\x08\x15`\xE2\x1B\x81R\x90Q_\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\xF0h T\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\n\x0BW=__>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\n/\x91\x90a8\xC9V[a\n:\x90`\x0Fa8\xE4V[\x90Pb\x12u\0`\x01`\x01`@\x1B\x03\x80\x83\x16\x90\x84\x16\x10\x80a\nkWP\x80`\x01`\x01`@\x1B\x03\x16\x83`\x01`\x01`@\x1B\x03\x16\x11[\x15a\n\x89W`@Qc\xB5~!\xDF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`@\x1B\x03\x83\x16`\x08\x81\x90U`@Q\x90\x81R\x7Fy>;\x1E\x1B\xCDg{\xB1\x19\0\xC81$\xD3\xC4L\x99F\xEA\x8D\xDF\x97\x8A\x0C\xA2P\xB04\xEC\x9D\xDE\x90` \x01`@Q\x80\x91\x03\x90\xA1PPPV[a\n\xD8a\x17rV[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x05` R`@\x81 T3\x91\x81\x90\x03a\x0B\x12W`@Qcy)\x8AS`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80B\x10\x15a\x0B3W`@QcZwCW`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x84\x16_\x90\x81R`\x06` \x90\x81R`@\x80\x83 \x93\x86\x16\x83R\x92\x90R\x90\x81 T\x90\x81\x90\x03a\x0B{W`@Qc\x06\x86\x82{`\xE5\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x85\x16_\x81\x81R`\x06` \x90\x81R`@\x80\x83 \x94\x88\x16\x83R\x93\x81R\x83\x82 \x82\x90U\x91\x81R`\x03\x90\x91R\x90\x81 \x80T\x83\x92\x90a\x0B\xBF\x90\x84\x90a9\x06V[\x90\x91UPP`\x02Ta\x0B\xDB\x90`\x01`\x01`\xA0\x1B\x03\x16\x84\x83a\x19\x9BV[\x82`\x01`\x01`\xA0\x1B\x03\x16\x7F\x7F\xCFS,\x15\xF0\xA6\xDB\x0B\xD6\xD0\xE08\xBE\xA7\x1D0\xD8\x08\xC7\xD9\x8C\xB3\xBFrh\xA9[\xF5\x08\x1Be\x82`@Qa\x0C\x16\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2PPPPV[_\x90\x81R_Q` a=\x02_9_Q\x90_R` R`@\x90 `\x01\x01T\x90V[a\x0CLa\x19@V[_\x81a\xFF\xFF\x16\x11\x80\x15a\x0CeWPa'\x10\x81a\xFF\xFF\x16\x11\x15[a\x0C\x82W`@QcgN\x8E\xF3`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\n\x80Ta\xFF\xFF\x19\x16a\xFF\xFF\x83\x16\x90\x81\x17\x90\x91U`@Q\x90\x81R\x7F\xBE[G\xBEvP\x0F\xEAQ\x0C\xE2\x19\x17\x8Bnci[fA\xDA\xD0\xD3\xA0HdU\xCE\xA1\n\xED\xFD\x90` \x01[`@Q\x80\x91\x03\x90\xA1PV[a\x0C\xD6\x82a\x0C$V[a\x0C\xDF\x81a\x1A$V[a\x0C\xE9\x83\x83a\x1A.V[PPPPV[a\x0C\xF7a\x17rV[3a\r\x01\x81a\x1A\xD6V[a\r\n\x85a\x1B#V[a\r\x14\x86\x86a\x1B^V[`@\x80Q`\x01`\x01`\xA0\x1B\x03\x83\x16` \x82\x01R_\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90Pa\rF\x81\x86\x89a\x1B\xD7V[\x83Q`@\x14a\rhW`@QcBG\x06\x87`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a'\x10\x83a\xFF\xFF\x16\x11\x15a\r\x8FW`@Qc\xDC\x81\xDB\x85`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x04_a\r\x9D\x8Aa\x13\xB7V[\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP`\x01`\r_a\r\xCE\x89a\x1ClV[\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP`@Q\x80`@\x01`@R\x80_\x81R` \x01`\x01`\x02\x81\x11\x15a\x0E\x15Wa\x0E\x15a8^V[\x90R`\x01`\x01`\xA0\x1B\x03\x83\x16_\x90\x81R`\x03` \x90\x81R`@\x90\x91 \x82Q\x81U\x90\x82\x01Q`\x01\x80\x83\x01\x80T\x90\x91`\xFF\x19\x90\x91\x16\x90\x83`\x02\x81\x11\x15a\x0E[Wa\x0E[a8^V[\x02\x17\x90UPP`@\x80Q\x80\x82\x01\x82Ra\xFF\xFF\x86\x81\x16\x82R_` \x80\x84\x01\x82\x81R`\x01`\x01`\xA0\x1B\x03\x89\x16\x80\x84R`\x0C\x90\x92R\x91\x85\x90 \x93Q\x84Ta\xFF\xFF\x19\x16\x93\x16\x92\x90\x92\x17\x83UQ`\x01\x90\x92\x01\x91\x90\x91U\x90Q\x90\x91P\x7F\xF0W\xD4\xEA\x81\xE9\x86(e:\x8F\x90x\x85A\x97 x\x13s4\xA9+B4~\xAC\xCD\xA8\x0F\xC4\n\x90a\x0E\xE6\x90\x8A\x90\x8A\x90\x88\x90\x8B\x90\x8B\x90a9\x19V[`@Q\x80\x91\x03\x90\xA2PPPPPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x0F W`@Qc3K\xD9\x19`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0F*\x82\x82a\x1C\x90V[PPPV[a\x0F7a\x19@V[_\x81\x11\x80\x15a\x0FJWPc\x01\xE13\x80\x81\x11\x15[a\x0FgW`@QcgN\x8E\xF3`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\t\x81\x90U`@Q\x81\x81R\x7FQ\xD9\xFE\xFD\xD4\x81\x91\xBCu\xAB\x12\x11m^Q\x81\x96G\x99\xA69\xE1\xEE1\xB0\x99\x8F\xFA\xAF\x9E\xF2Y\x90` \x01a\x0C\xC2V[a\x0F\xA4a\x17rV[3a\x0F\xAE\x81a\x1D\tV[a'\x10\x82a\xFF\xFF\x16\x11\x15a\x0F\xD5W`@Qc\xDC\x81\xDB\x85`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x0C` R`@\x90 \x80Ta\xFF\xFF\x90\x81\x16\x90\x84\x16\x81\x90\x03a\x10\x17W`@Qc0\x82\xEB%`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80a\xFF\xFF\x16\x84a\xFF\xFF\x16\x11\x15a\x10\xA3W`\x01\x82\x01T\x80\x15\x80a\x10EWP`\tTa\x10A\x90\x82a8\xB6V[B\x10\x15[a\x10bW`@Qc\x16\xEB\x94\xCB`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\nTa\x10s\x90a\xFF\xFF\x16\x83a9\x8BV[a\xFF\xFF\x16\x85a\xFF\xFF\x16\x11\x15a\x10\x9BW`@Qc\x12\xD6\xA4e`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PB`\x01\x83\x01U[\x81Ta\xFF\xFF\x19\x16a\xFF\xFF\x85\x81\x16\x91\x82\x17\x84U`@\x80QB\x81R\x91\x84\x16` \x83\x01R\x81\x01\x91\x90\x91R`\x01`\x01`\xA0\x1B\x03\x84\x16\x90\x7F\xBD\x8Dv\xFC\xCA\xB3\x9D\xB7\x06K\xC0\x07\xD9\xA2\xC8:\x98$}\xCB\x10\x87\xCC\x12\xF3C\xB8\xBE\x90\xAE\xFDd\x90``\x01a\x0C\x16V[_Q` a<\xE2_9_Q\x90_Ra\x11\x16\x81a\x1A$V[a\x11\x1Ea\x1D\x8AV[PV[a\x11)a\x17rV[a\x113\x82\x82a\x1D\xE3V[\x80`\x0B_\x82\x82Ta\t\x9A\x91\x90a9\x06V[a\x11La\x1F\x95V[a\x11U\x82a 9V[a\x11_\x82\x82a AV[PPV[_Q` a=B_9_Q\x90_R\x80T`\x02\x91\x90`\x01`@\x1B\x90\x04`\xFF\x16\x80a\x11\x99WP\x80T`\x01`\x01`@\x1B\x03\x80\x84\x16\x91\x16\x10\x15[\x15a\x11\xB7W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80Th\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01`\x01`@\x1B\x03\x83\x16\x17`\x01`@\x1B\x17\x81Ua\x11\xE0a \xFDV[a\x11\xEA_\x87a\x1A.V[Pa\x12\x02_Q` a<\xE2_9_Q\x90_R\x88a\x1A.V[Pb\t:\x80`\tU`\n\x80Ta\xFF\xFF\x19\x16a\x01\xF4\x17\x90Ua\x12#\x84\x84a!\x05V[a\x12,\x85a\"\x9AV[\x80T`\xFF`@\x1B\x19\x16\x81U`@Q`\x01`\x01`@\x1B\x03\x83\x16\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1PPPPPPPV[_a\x12\x85a#)V[P_Q` a<\xC2_9_Q\x90_R\x90V[a\x12\x9Fa\x17rV[3a\x12\xA9\x81a\x1D\tV[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x03` R`@\x90 `\x01\x01\x80T`\xFF\x19\x16`\x02\x17\x90U`\x08Ta\x12\xDB\x90Ba8\xB6V[`\x01`\x01`\xA0\x1B\x03\x82\x16_\x90\x81R`\x05` \x90\x81R`@\x80\x83 \x93\x90\x93U`\x03\x90R\x90\x81 T`\x0B\x80T\x91\x92\x90\x91a\x13\x14\x90\x84\x90a9\x06V[\x90\x91UPP`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x90\x7F\xFB$0ST\xC8wb\xD5WHz\xE4\xA5d\xE8\xD0>\xCB\xB9\xA9}\xD8\xAF\xFF\x8E\x1Fo\xCA\xF0\xDD\x16\x90_\x90\xA2PV[a\x13Wa\x19@V[a\x13`_a#rV[V[_Q` a<\xE2_9_Q\x90_Ra\x13y\x81a\x1A$V[a\x11\x1Ea#\xE2V[_\x91\x82R_Q` a=\x02_9_Q\x90_R` \x90\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[_\x81_\x01Q\x82` \x01Q\x83`@\x01Q\x84``\x01Q`@Q` \x01a\x13\xF4\x94\x93\x92\x91\x90\x93\x84R` \x84\x01\x92\x90\x92R`@\x83\x01R``\x82\x01R`\x80\x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[a\x14\x19a\x17rV[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x07` \x90\x81R`@\x80\x83 3\x80\x85R\x92R\x82 T\x90\x91\x81\x90\x03a\x14^W`@Qc\x06\x86\x82{`\xE5\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x84\x16_\x90\x81R`\x07` \x90\x81R`@\x80\x83 \x93\x86\x16\x83R\x92\x90R `\x01\x01TB\x10\x15a\x14\xA6W`@QcZwCW`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x84\x16_\x90\x81R`\x07` \x90\x81R`@\x80\x83 \x86\x85\x16\x84R\x90\x91R\x81 \x81\x81U`\x01\x01U`\x02Ta\x14\xE1\x91\x16\x83\x83a\x19\x9BV[\x81`\x01`\x01`\xA0\x1B\x03\x16\x7F\x7F\xCFS,\x15\xF0\xA6\xDB\x0B\xD6\xD0\xE08\xBE\xA7\x1D0\xD8\x08\xC7\xD9\x8C\xB3\xBFrh\xA9[\xF5\x08\x1Be\x82`@Qa\x15\x1C\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2PPPV[a\x151a\x17rV[3a\x15;\x81a\x1D\tV[a\x15D\x84a\x1B#V[a\x15N\x85\x85a\x1B^V[`@\x80Q`\x01`\x01`\xA0\x1B\x03\x83\x16` \x82\x01R_\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90Pa\x15\x80\x81\x85\x88a\x1B\xD7V[`\x01`\x04_a\x15\x8E\x89a\x13\xB7V[\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x01`\x01`\xA0\x1B\x03\x16\x7F\xC8\xC5\xB3z\xEC\x7F-\xDB\xD3\xA1\x90`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x18\x1BW=__>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x18?\x91\x90a:\x0BV[\x90P\x82\x81\x10\x15a\x18lW`@Qc\x05Ce\xBB`\xE3\x1B\x81R`\x04\x81\x01\x82\x90R`$\x81\x01\x84\x90R`D\x01a\x17`V[`\x02Ta\x18\x84\x90`\x01`\x01`\xA0\x1B\x03\x16\x830\x86a%\xD6V[`\x01`\x01`\xA0\x1B\x03\x84\x16_\x90\x81R`\x03` R`@\x81 \x80T\x85\x92\x90a\x18\xAB\x90\x84\x90a8\xB6V[\x90\x91UPP`\x01`\x01`\xA0\x1B\x03\x80\x85\x16_\x90\x81R`\x06` \x90\x81R`@\x80\x83 \x93\x86\x16\x83R\x92\x90R\x90\x81 \x80T\x85\x92\x90a\x18\xE6\x90\x84\x90a8\xB6V[\x92PP\x81\x90UP\x83`\x01`\x01`\xA0\x1B\x03\x16\x82`\x01`\x01`\xA0\x1B\x03\x16\x7F\xE5T\x1Aka\x03\xD4\xFA~\x02\x1E\xD5O\xAD9\xC6o'\xA7k\xD1=7L\xF6$\n\xE6\xBD\x0B\xB7+\x85`@Qa\x192\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPPV[3a\x19r\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x13`W`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\x17`V[_`@Qc\xA9\x05\x9C\xBB`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x84\x16`\x04\x82\x01R\x82`$\x82\x01R` _`D\x83_\x89Z\xF1\x91PP\x80`\x1F=\x11`\x01_Q\x14\x16\x15\x16\x15a\x19\xE5WP\x82;\x15=\x17\x15[\x80a\x0C\xE9W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0F`$\x82\x01Rn\x15\x14\x90S\x94\xD1\x91T\x97\xD1\x90RS\x11Q`\x8A\x1B`D\x82\x01R`d\x01a\x17`V[a\x11\x1E\x813a&sV[__Q` a=\x02_9_Q\x90_Ra\x1AG\x84\x84a\x13\x81V[a\x1A\xC6W_\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x1A|3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x83`\x01`\x01`\xA0\x1B\x03\x16\x85\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4`\x01\x91PPa\tqV[_\x91PPa\tqV[P\x92\x91PPV[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x03` R`@\x81 `\x01\x01T`\xFF\x16`\x02\x81\x11\x15a\x1B\x05Wa\x1B\x05a8^V[\x14a\x11\x1EW`@Qc\x13.~\xFB`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x1B@\x82\x82a&\xACV[\x15a\x11_W`@Qc\x06\xCFC\x8F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x04_a\x1Bj\x84a\x13\xB7V[\x81R` \x81\x01\x91\x90\x91R`@\x01_ T`\xFF\x16\x15a\x1B\x9AW`@Qb\xDA\x8AW`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\r_a\x1B\xA6\x83a\x1ClV[\x81R` \x81\x01\x91\x90\x91R`@\x01_ T`\xFF\x16\x15a\x11_W`@Qc\xAEI;\x03`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x1B\xE0\x82a&\xCDV[_`@Q\x80``\x01`@R\x80`$\x81R` \x01a<~`$\x919\x90P_\x84\x82`@Q` \x01a\x1C\x10\x92\x91\x90a:9V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P_a\x1C+\x82a'4V[\x90Pa\x1CH\x81\x85a\x1C;\x88a(!V[a\x1CCa(\x98V[a)eV[a\x1CdW`@Qb\xCE\xD3\xE5`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPPPV[_\x81_\x01Q\x82` \x01Q`@Q` \x01a\x13\xF4\x92\x91\x90\x91\x82R` \x82\x01R`@\x01\x90V[__Q` a=\x02_9_Q\x90_Ra\x1C\xA9\x84\x84a\x13\x81V[\x15a\x1A\xC6W_\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x87\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4`\x01\x91PPa\tqV[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x03` R`@\x81 `\x01\x01T`\xFF\x16\x90\x81`\x02\x81\x11\x15a\x1D:Wa\x1D:a8^V[\x03a\x1DXW`@QcP\x8Ay?`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x81`\x02\x81\x11\x15a\x1DlWa\x1Dla8^V[\x03a\x11_W`@Qc\xEA\xB4\xA9c`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x1D\x92a*\x14V[_Q` a=\"_9_Q\x90_R\x80T`\xFF\x19\x16\x81U\x7F]\xB9\xEE\nI[\xF2\xE6\xFF\x9C\x91\xA7\x83L\x1B\xA4\xFD\xD2D\xA5\xE8\xAANS{\xD3\x8A\xEA\xE4\xB0s\xAA3[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x0C\xC2V[a\x1D\xEC\x82a\x1D\tV[3_\x82\x90\x03a\x1E\x0EW`@Qc\x1F* \x05`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x84\x16_\x90\x81R`\x07` \x90\x81R`@\x80\x83 \x93\x85\x16\x83R\x92\x90R T\x15a\x1EQW`@Qc\xD4#\xA4\xF1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x84\x16_\x90\x81R`\x06` \x90\x81R`@\x80\x83 \x93\x85\x16\x83R\x92\x90R T\x82\x81\x10\x15a\x1E\x9AW`@Qc\x92fSQ`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x17`V[`\x01`\x01`\xA0\x1B\x03\x80\x85\x16_\x90\x81R`\x06` \x90\x81R`@\x80\x83 \x93\x86\x16\x83R\x92\x90R\x90\x81 \x80T\x85\x92\x90a\x1E\xD0\x90\x84\x90a9\x06V[\x92PP\x81\x90UP`@Q\x80`@\x01`@R\x80\x84\x81R` \x01`\x08TBa\x1E\xF6\x91\x90a8\xB6V[\x90R`\x01`\x01`\xA0\x1B\x03\x80\x86\x16_\x81\x81R`\x07` \x90\x81R`@\x80\x83 \x94\x88\x16\x83R\x93\x81R\x83\x82 \x85Q\x81U\x94\x81\x01Q`\x01\x90\x95\x01\x94\x90\x94U\x90\x81R`\x03\x90\x92R\x81 \x80T\x85\x92\x90a\x1FI\x90\x84\x90a9\x06V[\x92PP\x81\x90UP\x83`\x01`\x01`\xA0\x1B\x03\x16\x82`\x01`\x01`\xA0\x1B\x03\x16\x7FM\x10\xBD\x04\x97u\xC7{\xD7\xF2U\x19Z\xFB\xA5\x08\x80(\xEC\xB3\xC7\xC2w\xD3\x93\xCC\xFFy4\xF2\xF9,\x85`@Qa\x192\x91\x81R` \x01\x90V[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14\x80a \x1BWP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x01`\x01`\xA0\x1B\x03\x16a \x0F_Q` a<\xC2_9_Q\x90_RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x13`W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x11\x1Ea\x19@V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a \x9BWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra \x98\x91\x81\x01\x90a:\x0BV[`\x01[a \xC3W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x17`V[_Q` a<\xC2_9_Q\x90_R\x81\x14a \xF3W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x17`V[a\x0F*\x83\x83a*CV[a\x13`a*\x98V[_[\x81\x81\x10\x15a\x0F*W_\x83\x83\x83\x81\x81\x10a!\"Wa!\"a:UV[a!8\x92` `@\x90\x92\x02\x01\x90\x81\x01\x91Pa4\x8EV[\x90P_\x84\x84\x84\x81\x81\x10a!MWa!Ma:UV[\x90P`@\x02\x01` \x01` \x81\x01\x90a!e\x91\x90a4\xBEV[\x90Pa'\x10\x81a\xFF\xFF\x16\x11\x15a!\x8EW`@Qc\xDC\x81\xDB\x85`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x82\x16_\x90\x81R`\x03` R`@\x81 `\x01\x01T`\xFF\x16\x90\x81`\x02\x81\x11\x15a!\xBFWa!\xBFa8^V[\x03a!\xDDW`@QcP\x8Ay?`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x83\x16_\x90\x81R`\x0C` R`@\x90 `\x01\x01T\x15\x80\x15a\"\x1EWP`\x01`\x01`\xA0\x1B\x03\x83\x16_\x90\x81R`\x0C` R`@\x90 Ta\xFF\xFF\x16\x15[\x83\x90a\"IW`@Qc\x05\x08\x14\xE1`\xE4\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x90\x91\x16`\x04\x82\x01R`$\x01a\x17`V[PP`@\x80Q\x80\x82\x01\x82Ra\xFF\xFF\x92\x83\x16\x81R_` \x80\x83\x01\x82\x81R`\x01`\x01`\xA0\x1B\x03\x96\x90\x96\x16\x82R`\x0C\x90R\x91\x90\x91 \x90Q\x81Ta\xFF\xFF\x19\x16\x92\x16\x91\x90\x91\x17\x81U\x90Q`\x01\x91\x82\x01U\x01a!\x07V[`\x02T`@Qcp\xA0\x821`\xE0\x1B\x81R0`\x04\x82\x01R`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\"\xE0W=__>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a#\x04\x91\x90a:\x0BV[\x81\x11\x15a#$W`@Qc=\x93OI`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x0BUV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x13`W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90_\x90\xA3PPPV[a#\xEAa\x17rV[_Q` a=\"_9_Q\x90_R\x80T`\xFF\x19\x16`\x01\x17\x81U\x7Fb\xE7\x8C\xEA\x01\xBE\xE3 \xCDNB\x02p\xB5\xEAt\0\r\x11\xB0\xC9\xF7GT\xEB\xDB\xFCTK\x05\xA2X3a\x1D\xCBV[a$2a*\x98V[a\x11\x1E\x81a*\xCEV[_Q` a=B_9_Q\x90_R\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16_\x81\x15\x80\x15a$lWP\x82[\x90P_\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a$\x87WP0;\x15[\x90P\x81\x15\x80\x15a$\x95WP\x80\x15[\x15a$\xB3W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a$\xDDW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[C_U\x83\x15a%&W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPV[`\x01`\x01`\xA0\x1B\x03\x83\x16a%TW`@Qc\xD9.#=`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x82\x16a%{W`@Qc\xD9.#=`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x80T`\x01`\x01`\xA0\x1B\x03\x80\x86\x16`\x01`\x01`\xA0\x1B\x03\x19\x92\x83\x16\x17\x90\x92U`\x01\x80T\x92\x85\x16\x92\x90\x91\x16\x91\x90\x91\x17\x90U`Z\x80\x82\x10\x15a%\xCEW`@Qc\xB5~!\xDF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P`\x08UPPV[_`@Qc#\xB8r\xDD`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`\x01`\x01`\xA0\x1B\x03\x84\x16`$\x82\x01R\x82`D\x82\x01R` _`d\x83_\x8AZ\xF1\x91PP\x80`\x1F=\x11`\x01_Q\x14\x16\x15\x16\x15a&/WP\x83;\x15=\x17\x15[\x80a%&W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x14`$\x82\x01Rs\x15\x14\x90S\x94\xD1\x91T\x97\xD1\x94\x93\xD3W\xD1\x90RS\x11Q`b\x1B`D\x82\x01R`d\x01a\x17`V[a&}\x82\x82a\x13\x81V[a\x11_W`@Qc\xE2Q}?`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x81\x01\x83\x90R`D\x01a\x17`V[\x80Q\x82Q_\x91\x14\x80\x15a&\xC6WP\x81` \x01Q\x83` \x01Q\x14[\x93\x92PPPV[\x80Q` \x82\x01Q_\x91_Q` a<\xA2_9_Q\x90_R\x91\x15\x90\x15\x16\x15a&\xF3WPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x0F*W`@Qc'\x9E4S`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_a'Q\x83a*\xD6V[\x90P_Q` a<\xA2_9_Q\x90_R`\x03_\x82\x84\x85\t\x90P\x82\x80a'xWa'xa:iV[\x84\x82\t\x90P\x82\x80a'\x8BWa'\x8Ba:iV[\x82\x82\x08\x90P__a'\x9B\x83a,\xDEV[\x92P\x90P[\x80a(\x04W\x84\x80a'\xB3Wa'\xB3a:iV[`\x01\x87\x08\x95P\x84\x80a'\xC7Wa'\xC7a:iV[\x86\x87\t\x92P\x84\x80a'\xDAWa'\xDAa:iV[\x86\x84\t\x92P\x84\x80a'\xEDWa'\xEDa:iV[\x84\x84\x08\x92Pa'\xFB\x83a,\xDEV[\x92P\x90Pa'\xA0V[P`@\x80Q\x80\x82\x01\x90\x91R\x94\x85R` \x85\x01RP\x91\x94\x93PPPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a(HWP\x90V[`@Q\x80`@\x01`@R\x80\x83_\x01Q\x81R` \x01_Q` a<\xA2_9_Q\x90_R\x84` \x01Qa(y\x91\x90a:}V[a(\x90\x90_Q` a<\xA2_9_Q\x90_Ra9\x06V[\x90R\x92\x91PPV[a(\xBF`@Q\x80`\x80\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[___`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` _a\x01\x80\x83`\x08Z\xFA\x91PP_Q\x91P\x80a*\x08W`@Qc\xC2\x063O`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x15\x15\x95\x94PPPPPV[_Q` a=\"_9_Q\x90_RT`\xFF\x16a\x13`W`@Qc\x8D\xFC +`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a*L\x82a-\xA6V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90_\x90\xA2\x80Q\x15a*\x90Wa\x0F*\x82\x82a.\tV[a\x11_a.{V[_Q` a=B_9_Q\x90_RT`\x01`@\x1B\x90\x04`\xFF\x16a\x13`W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x17;a*\x98V[__a*\xE1\x83a.\x9AV[\x80Q\x90\x91P`0\x81\x14a*\xF6Wa*\xF6a:\x9CV[_\x81`\x01`\x01`@\x1B\x03\x81\x11\x15a+\x0FWa+\x0Fa3-V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a+9W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P_[\x82\x81\x10\x15a+\xA8W\x83`\x01a+S\x83\x86a9\x06V[a+]\x91\x90a9\x06V[\x81Q\x81\x10a+mWa+ma:UV[` \x01\x01Q`\xF8\x1C`\xF8\x1B\x82\x82\x81Q\x81\x10a+\x8AWa+\x8Aa:UV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81_\x1A\x90SP`\x01\x01a+>V[P`@\x80Q`\x1F\x80\x82Ra\x04\0\x82\x01\x90\x92R_\x90\x82` \x82\x01a\x03\xE0\x806\x837\x01\x90PP\x90P_[\x82\x81\x10\x15a,8W\x83\x81a+\xE4\x85\x88a9\x06V[a+\xEE\x91\x90a8\xB6V[\x81Q\x81\x10a+\xFEWa+\xFEa:UV[` \x01\x01Q`\xF8\x1C`\xF8\x1B`\xF8\x1C\x82\x82\x81Q\x81\x10a,\x1EWa,\x1Ea:UV[`\xFF\x90\x92\x16` \x92\x83\x02\x91\x90\x91\x01\x90\x91\x01R`\x01\x01a+\xD0V[P_a,C\x82a1\xE5V[\x90Pa\x01\0_Q` a<\xA2_9_Q\x90_R_a,a\x86\x89a9\x06V[\x90P_[\x81\x81\x10\x15a,\xCEW_\x88`\x01a,{\x84\x86a9\x06V[a,\x85\x91\x90a9\x06V[\x81Q\x81\x10a,\x95Wa,\x95a:UV[\x01` \x01Q`\xF8\x1C\x90P\x83\x80a,\xADWa,\xADa:iV[\x85\x87\t\x95P\x83\x80a,\xC0Wa,\xC0a:iV[\x81\x87\x08\x95PP`\x01\x01a,eV[P\x92\x9A\x99PPPPPPPPPPV[_____\x7F\x0C\x19\x13\x9C\xB8Lh\nn\x14\x11m\xA0`V\x17e\xE0Z\xA4Z\x1Cr\xA3O\x08#\x05\xB6\x1F?R\x90P__Q` a<\xA2_9_Q\x90_R\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x87``\x82\x01R\x82`\x80\x82\x01R\x81`\xA0\x82\x01R` _`\xC0\x83`\x05Z\xFA\x94PP_Q\x92P\x83a-lW`@Qc\x0C\x9D>\x99`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80`\x01\x84\x90\x1B\x11\x15a-\x85Wa-\x82\x83\x82a9\x06V[\x92P[\x80\x80a-\x93Wa-\x93a:iV[\x83\x84\t\x96\x90\x96\x14\x96\x91\x95P\x90\x93PPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;_\x03a-\xDBW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x17`V[_Q` a<\xC2_9_Q\x90_R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[``__\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa.%\x91\x90a:\xB0V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a.]W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a.bV[``\x91P[P\x91P\x91Pa.r\x85\x83\x83a2EV[\x95\x94PPPPPV[4\x15a\x13`W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@\x80Q`0\x80\x82R``\x82\x81\x01\x90\x93R\x90` \x90`\x01`\xF9\x1B\x90_\x90\x84` \x82\x01\x81\x806\x837\x01\x90PP\x90P\x80\x86`@Q` \x01a.\xDA\x92\x91\x90a:9V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x80\x84`\xF8\x1B`@Q` \x01a/\x01\x92\x91\x90a:\xBBV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x80`@Q` \x01a/#\x91\x90a:\xE5V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90R\x91Pa\x01\x01`\xF0\x1B\x90a/M\x90\x83\x90\x83\x90` \x01a:\xFDV[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x82\x82R\x80Q` \x91\x82\x01 \x81\x84\x01\x81\x90R`\x01`\xF8\x1B\x84\x84\x01R`\x01`\x01`\xF0\x1B\x03\x19\x85\x16`A\x85\x01R\x82Q`#\x81\x86\x03\x01\x81R`C\x90\x94\x01\x90\x92R\x82Q\x90\x83\x01 \x91\x93P\x90_`\xFF\x88\x16`\x01`\x01`@\x1B\x03\x81\x11\x15a/\xBCWa/\xBCa3-V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a/\xE6W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P_\x82`@Q` \x01a/\xFD\x91\x81R` \x01\x90V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x90P_[\x81Q\x81\x10\x15a0gW\x81\x81\x81Q\x81\x10a0,Wa0,a:UV[` \x01\x01Q`\xF8\x1C`\xF8\x1B\x83\x82\x81Q\x81\x10a0IWa0Ia:UV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81_\x1A\x90SP`\x01\x01a0\x11V[P_\x84`@Q` \x01a0|\x91\x81R` \x01\x90V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R` \x83\x01\x90\x91R_\x80\x83R\x91\x98P\x91P[\x89\x81\x10\x15a1\x0EW_\x83\x82\x81Q\x81\x10a0\xB5Wa0\xB5a:UV[` \x01\x01Q`\xF8\x1C`\xF8\x1B\x83\x83\x81Q\x81\x10a0\xD2Wa0\xD2a:UV[` \x01\x01Q`\xF8\x1C`\xF8\x1B\x18\x90P\x88\x81`@Q` \x01a0\xF3\x92\x91\x90a;!V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x98PP`\x01\x01a0\x9AV[P\x86\x88\x87`@Q` \x01a1$\x93\x92\x91\x90a;EV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x96P\x86\x80Q\x90` \x01 \x93P\x83`@Q` \x01a1R\x91\x81R` \x01\x90V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x91P_[a1s\x8A`\xFF\x8D\x16a9\x06V[\x81\x10\x15a1\xD4W\x82\x81\x81Q\x81\x10a1\x8CWa1\x8Ca:UV[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16\x84a1\xA6\x83\x8Da8\xB6V[\x81Q\x81\x10a1\xB6Wa1\xB6a:UV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81_\x1A\x90SP`\x01\x01a1fV[P\x91\x9B\x9APPPPPPPPPPPV[_\x80\x80[\x83Q\x81\x10\x15a\x1A\xCFW\x83\x81\x81Q\x81\x10a2\x04Wa2\x04a:UV[` \x02` \x01\x01Q`\xFF\x16\x81`\x08a2\x1C\x91\x90a;xV[a2'\x90`\x02aW__\xFD[a6J\x85\x82\x86\x01a5\x01V[\x91PP\x92P\x92\x90PV[_____`\x80\x86\x88\x03\x12\x15a6hW__\xFD[a6q\x86a2\xEAV[\x94Pa6\x7F` \x87\x01a2\xEAV[\x93P`@\x86\x015\x92P``\x86\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a6\xA0W__\xFD[\x86\x01`\x1F\x81\x01\x88\x13a6\xB0W__\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a6\xC5W__\xFD[\x88` \x82`\x06\x1B\x84\x01\x01\x11\x15a6\xD9W__\xFD[\x95\x98\x94\x97P\x92\x95PPP` \x01\x91\x90V[___a\x01\0\x84\x86\x03\x12\x15a6\xFDW__\xFD[a7\x07\x85\x85a3iV[\x92Pa7\x16\x85`\x80\x86\x01a3\xC9V[\x91Pa7%\x85`\xC0\x86\x01a3\xC9V[\x90P\x92P\x92P\x92V[_`\x80\x82\x84\x03\x12\x15a7>W__\xFD[a&\xC6\x83\x83a3iV[__`@\x83\x85\x03\x12\x15a7YW__\xFD[a7b\x83a2\xEAV[\x91Pa4\xF8` \x84\x01a2\xEAV[____a\x01 \x85\x87\x03\x12\x15a7\x84W__\xFD[a7\x8E\x86\x86a3iV[\x93Pa7\x9D\x86`\x80\x87\x01a3\xC9V[\x92Pa7\xAC\x86`\xC0\x87\x01a3\xC9V[\x91Pa\x01\0\x85\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a7\xC7W__\xFD[a7\xD3\x87\x82\x88\x01a5\x01V[\x91PP\x92\x95\x91\x94P\x92PV[_\x81Q\x80\x84R\x80` \x84\x01` \x86\x01^_` \x82\x86\x01\x01R` `\x1F\x19`\x1F\x83\x01\x16\x85\x01\x01\x91PP\x92\x91PPV[` \x81R_a&\xC6` \x83\x01\x84a7\xDFV[____`\x80\x85\x87\x03\x12\x15a82W__\xFD[a8;\x85a2\xEAV[\x93Pa8I` \x86\x01a2\xEAV[\x92P`@\x85\x015\x91Pa4T``\x86\x01a2\xEAV[cNH{q`\xE0\x1B_R`!`\x04R`$_\xFD[\x82\x81R`@\x81\x01`\x03\x83\x10a8\x95WcNH{q`\xE0\x1B_R`!`\x04R`$_\xFD[\x82` \x83\x01R\x93\x92PPPV[cNH{q`\xE0\x1B_R`\x11`\x04R`$_\xFD[\x80\x82\x01\x80\x82\x11\x15a\tqWa\tqa8\xA2V[_` \x82\x84\x03\x12\x15a8\xD9W__\xFD[\x81Qa&\xC6\x81a4_V[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x02\x90\x81\x16\x90\x81\x81\x14a\x1A\xCFWa\x1A\xCFa8\xA2V[\x81\x81\x03\x81\x81\x11\x15a\tqWa\tqa8\xA2V[\x85Q\x81R` \x80\x87\x01Q\x90\x82\x01R`@\x80\x87\x01Q\x90\x82\x01R``\x80\x87\x01Q\x90\x82\x01R\x84Q`\x80\x82\x01R` \x85\x01Q`\xA0\x82\x01Ra\xFF\xFF\x84\x16`\xC0\x82\x01R\x82Q`\xE0\x82\x01R` \x83\x01Qa\x01\0\x82\x01Ra\x01@a\x01 \x82\x01R_a9\x80a\x01@\x83\x01\x84a7\xDFV[\x97\x96PPPPPPPV[a\xFF\xFF\x81\x81\x16\x83\x82\x16\x01\x90\x81\x11\x15a\tqWa\tqa8\xA2V[\x84Q\x81R` \x80\x86\x01Q\x90\x82\x01R`@\x80\x86\x01Q\x90\x82\x01R``\x80\x86\x01Q\x90\x82\x01R\x83Q`\x80\x82\x01R` \x84\x01Q`\xA0\x82\x01R\x82Q`\xC0\x82\x01R` \x83\x01Q`\xE0\x82\x01Ra\x01 a\x01\0\x82\x01R_a:\x01a\x01 \x83\x01\x84a7\xDFV[\x96\x95PPPPPPV[_` \x82\x84\x03\x12\x15a:\x1BW__\xFD[PQ\x91\x90PV[_\x81Q\x80` \x84\x01\x85^_\x93\x01\x92\x83RP\x90\x91\x90PV[_a:Ma:G\x83\x86a:\"V[\x84a:\"V[\x94\x93PPPPV[cNH{q`\xE0\x1B_R`2`\x04R`$_\xFD[cNH{q`\xE0\x1B_R`\x12`\x04R`$_\xFD[_\x82a:\x97WcNH{q`\xE0\x1B_R`\x12`\x04R`$_\xFD[P\x06\x90V[cNH{q`\xE0\x1B_R`\x01`\x04R`$_\xFD[_a&\xC6\x82\x84a:\"V[_a:\xC6\x82\x85a:\"V[_\x81R`\x01`\x01`\xF8\x1B\x03\x19\x93\x90\x93\x16`\x01\x84\x01RPP`\x02\x01\x91\x90PV[_a:\xF0\x82\x84a:\"V[_\x81R`\x01\x01\x93\x92PPPV[_a;\x08\x82\x85a:\"V[`\x01`\x01`\xF0\x1B\x03\x19\x93\x90\x93\x16\x83RPP`\x02\x01\x91\x90PV[_a;,\x82\x85a:\"V[`\x01`\x01`\xF8\x1B\x03\x19\x93\x90\x93\x16\x83RPP`\x01\x01\x91\x90PV[_a;P\x82\x86a:\"V[`\x01`\x01`\xF8\x1B\x03\x19\x94\x90\x94\x16\x84RPP`\x01`\x01`\xF0\x1B\x03\x19\x16`\x01\x82\x01R`\x03\x01\x91\x90PV[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\tqWa\tqa8\xA2V[`\x01\x81[`\x01\x84\x11\x15a;\xCAW\x80\x85\x04\x81\x11\x15a;\xAEWa;\xAEa8\xA2V[`\x01\x84\x16\x15a;\xBCW\x90\x81\x02\x90[`\x01\x93\x90\x93\x1C\x92\x80\x02a;\x93V[\x93P\x93\x91PPV[_\x82a;\xE0WP`\x01a\tqV[\x81a;\xECWP_a\tqV[\x81`\x01\x81\x14a<\x02W`\x02\x81\x14a<\x0CWa<(V[`\x01\x91PPa\tqV[`\xFF\x84\x11\x15a<\x1DWa<\x1Da8\xA2V[PP`\x01\x82\x1Ba\tqV[P` \x83\x10a\x013\x83\x10\x16`N\x84\x10`\x0B\x84\x10\x16\x17\x15a v\xCC75\xA9 \xA3\xCAP]8+\xBCe\xD7\xA2\x8E2e\xB3zdt\x92\x9F3e!\xB32\xC1h\x1B\x93?l\xB9\xF37fsD\r\x86*\x02\xDD{\xC7\xDE\xC4\xDC\xEE\xDD\xA7u\xE5\x8D\xD5A\xE0\x8A\x11llS\x81\\\x0B\xD0(\x19/{bh\0\xCD^\xD1\\n\x18~w\xE9\xAE\xE8\x81\x84\xC2\x1FO!\x82\xABX'\xCB;~\x07\xFB\xED\xCDc\xF03\0\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\xA1dsolcC\0\x08\x1C\0\n", ); /// The runtime bytecode of the contract, as deployed on the network. /// /// ```text - ///0x608060405260043610610280575f3560e01c8063715018a611610155578063b3e6ebd5116100be578063d547741f11610078578063d547741f1461084c578063d9cc7d261461086b578063e63ab1e914610880578063f2fde38b146108a0578063fa52c7d8146108bf578063fc0c546a14610902575f5ffd5b8063b3e6ebd514610760578063b5700e681461078e578063b5ecb344146107ad578063be203094146107d8578063c64814dd146107f7578063c75f543e1461082d575f5ffd5b80639ffb6b431161010f5780639ffb6b431461062d578063a217fddf14610680578063a2d78dd514610693578063a3066aab146106e5578063ac5c2ad014610704578063ad3cb1cc14610723575f5ffd5b8063715018a6146105625780638456cb59146105765780638da5cb5b1461058a57806391d14854146105da5780639b30a5e6146105f95780639e9a8f3114610618575f5ffd5b8063394b348f116101f75780634f1ef286116101b15780634f1ef286146104bc57806352d1902d146104cf5780635544c2f1146104e35780635c975abb146104fd5780635f8754a6146105205780636a911ccf1461054e575f5ffd5b8063394b348f1461040a5780633b2b7ffa146104295780633e9df9b5146104485780633f3bb3661461045c5780633f4ba83a146104895780634d99dd161461049d575f5ffd5b80632140fecd116102485780632140fecd14610342578063248a9ca3146103615780632dc9bac61461038e5780632f2ff15d146103ad578063304240bf146103cc57806336568abe146103eb575f5ffd5b806301ffc9a714610284578063026e402b146102b85780630d8e6e2c146102d957806313b9057a146103045780631a20cd6314610323575b5f5ffd5b34801561028f575f5ffd5b506102a361029e3660046131ba565b610921565b60405190151581526020015b60405180910390f35b3480156102c3575f5ffd5b506102d76102d23660046131fc565b610957565b005b3480156102e4575f5ffd5b5060408051600281525f60208201819052918101919091526060016102af565b34801561030f575f5ffd5b506102d761031e366004613300565b61096d565b34801561032e575f5ffd5b506102d761033d36600461336a565b610986565b34801561034d575f5ffd5b506102d761035c366004613385565b610a9a565b34801561036c575f5ffd5b5061038061037b36600461339e565b610bee565b6040519081526020016102af565b348015610399575f5ffd5b506102d76103a83660046133b5565b610c0e565b3480156103b8575f5ffd5b506102d76103c73660046133ce565b610c97565b3480156103d7575f5ffd5b506102d76103e6366004613481565b610cb9565b3480156103f6575f5ffd5b506102d76104053660046133ce565b610ec1565b348015610415575f5ffd5b506102d761042436600461339e565b610ef9565b348015610434575f5ffd5b506102d76104433660046133b5565b610f66565b348015610453575f5ffd5b506103805f5481565b348015610467575f5ffd5b50600a546104769061ffff1681565b60405161ffff90911681526020016102af565b348015610494575f5ffd5b506102d76110c9565b3480156104a8575f5ffd5b506102d76104b73660046131fc565b6110eb565b6102d76104ca366004613501565b6110fd565b3480156104da575f5ffd5b50610380611118565b3480156104ee575f5ffd5b506102d761031e36600461354b565b348015610508575f5ffd5b505f516020613c0e5f395f51905f525460ff166102a3565b34801561052b575f5ffd5b506102a361053a36600461339e565b600c6020525f908152604090205460ff1681565b348015610559575f5ffd5b506102d7611133565b34801561056d575f5ffd5b506102d76111bd565b348015610581575f5ffd5b506102d76111d0565b348015610595575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016102af565b3480156105e5575f5ffd5b506102a36105f43660046133ce565b6111ef565b348015610604575f5ffd5b5061038061061336600461358f565b611225565b348015610623575f5ffd5b5061038060085481565b348015610638575f5ffd5b50610666610647366004613385565b600b6020525f90815260409020805460019091015461ffff9091169082565b6040805161ffff90931683526020830191909152016102af565b34801561068b575f5ffd5b506103805f81565b34801561069e575f5ffd5b506106d06106ad3660046135a9565b600760209081525f92835260408084209091529082529020805460019091015482565b604080519283526020830191909152016102af565b3480156106f0575f5ffd5b506102d76106ff366004613385565b61127f565b34801561070f575f5ffd5b506102d761071e3660046135d1565b611290565b34801561072e575f5ffd5b50610753604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102af919061366e565b34801561076b575f5ffd5b506102a361077a36600461339e565b60046020525f908152604090205460ff1681565b348015610799575f5ffd5b506001546105c2906001600160a01b031681565b3480156107b8575f5ffd5b506103806107c7366004613385565b60056020525f908152604090205481565b3480156107e3575f5ffd5b506102d76107f2366004613680565b611367565b348015610802575f5ffd5b506103806108113660046135a9565b600660209081525f928352604080842090915290825290205481565b348015610838575f5ffd5b506102d76108473660046136bf565b61147e565b348015610857575f5ffd5b506102d76108663660046133ce565b61158d565b348015610876575f5ffd5b5061038060095481565b34801561088b575f5ffd5b506103805f516020613bce5f395f51905f5281565b3480156108ab575f5ffd5b506102d76108ba366004613385565b6115a9565b3480156108ca575f5ffd5b506108f46108d9366004613385565b60036020525f90815260409020805460019091015460ff1682565b6040516102af92919061375e565b34801561090d575f5ffd5b506002546105c2906001600160a01b031681565b5f6001600160e01b03198216637965db0b60e01b148061095157506301ffc9a760e01b6001600160e01b03198316145b92915050565b61095f6115e8565b6109698282611618565b5050565b60405163c2d7f81360e01b815260040160405180910390fd5b61098e6117b6565b60015460408051633c1a081560e21b815290515f926001600160a01b03169163f06820549160048083019260209291908290030181865afa1580156109d5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f9919061378e565b610a0490600f6137bd565b9050621275006001600160401b038083169084161080610a355750806001600160401b0316836001600160401b0316115b15610a535760405163b57e21df60e01b815260040160405180910390fd5b6001600160401b03831660088190556040519081527f793e3b1e1bcd677bb11900c83124d3c44c9946ea8ddf978a0ca250b034ec9dde9060200160405180910390a1505050565b610aa26115e8565b6001600160a01b0381165f908152600560205260408120543391819003610adc576040516379298a5360e11b815260040160405180910390fd5b80421015610afd57604051635a77435760e01b815260040160405180910390fd5b6001600160a01b038084165f90815260066020908152604080832093861683529290529081205490819003610b4557604051630686827b60e51b815260040160405180910390fd5b6001600160a01b038085165f818152600660209081526040808320948816835293815283822082905591815260039091529081208054839290610b899084906137df565b9091555050600254610ba5906001600160a01b03168483611811565b826001600160a01b03167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6582604051610be091815260200190565b60405180910390a250505050565b5f9081525f516020613bee5f395f51905f52602052604090206001015490565b610c166117b6565b5f8161ffff16118015610c2f57506127108161ffff1611155b610c4c5760405163674e8ef360e01b815260040160405180910390fd5b600a805461ffff191661ffff83169081179091556040519081527fbe5b47be76500fea510ce219178b6e63695b6641dad0d3a0486455cea10aedfd906020015b60405180910390a150565b610ca082610bee565b610ca98161189a565b610cb383836118a4565b50505050565b610cc16115e8565b33610ccb8161194c565b610cd485611999565b610cde86866119d4565b604080516001600160a01b03831660208201525f91016040516020818303038152906040529050610d10818689611a4d565b8351604014610d3257604051634247068760e01b815260040160405180910390fd5b6127108361ffff161115610d595760405163dc81db8560e01b815260040160405180910390fd5b600160045f610d678a611225565b81526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600c5f610d9889611ae2565b81526020019081526020015f205f6101000a81548160ff02191690831515021790555060405180604001604052805f815260200160016002811115610ddf57610ddf61374a565b90526001600160a01b0383165f908152600360209081526040909120825181559082015160018083018054909160ff1990911690836002811115610e2557610e2561374a565b02179055505060408051808201825261ffff86811682525f60208084018281526001600160a01b038916808452600b909252918590209351845461ffff191693169290921783555160019092019190915590519091507ff057d4ea81e98628653a8f90788541972078137334a92b42347eaccda80fc40a90610eb0908a908a9088908b908b906137f2565b60405180910390a250505050505050565b6001600160a01b0381163314610eea5760405163334bd91960e11b815260040160405180910390fd5b610ef48282611b06565b505050565b610f016117b6565b5f81118015610f1457506301e133808111155b610f315760405163674e8ef360e01b815260040160405180910390fd5b60098190556040518181527f51d9fefdd48191bc75ab12116d5e5181964799a639e1ee31b0998ffaaf9ef25990602001610c8c565b610f6e6115e8565b33610f7881611b7f565b6127108261ffff161115610f9f5760405163dc81db8560e01b815260040160405180910390fd5b6001600160a01b0381165f908152600b60205260409020805461ffff908116908416819003610fe157604051633082eb2560e21b815260040160405180910390fd5b8061ffff168461ffff16111561106d57600182015480158061100f575060095461100b9082613864565b4210155b61102c576040516316eb94cb60e01b815260040160405180910390fd5b600a5461103d9061ffff1683613877565b61ffff168561ffff161115611065576040516312d6a46560e11b815260040160405180910390fd5b504260018301555b815461ffff191661ffff85811691821784556040805142815291841660208301528101919091526001600160a01b038416907fbd8d76fccab39db7064bc007d9a2c83a98247dcb1087cc12f343b8be90aefd6490606001610be0565b5f516020613bce5f395f51905f526110e08161189a565b6110e8611c00565b50565b6110f36115e8565b6109698282611c59565b611105611e0b565b61110e82611eaf565b6109698282611eb7565b5f611121611f73565b505f516020613bae5f395f51905f5290565b61113b6115e8565b3361114581611b7f565b6001600160a01b0381165f908152600360205260409020600101805460ff191660021790556008546111779042613864565b6001600160a01b0382165f8181526005602052604080822093909355915190917ffb24305354c87762d557487ae4a564e8d03ecbb9a97dd8afff8e1f6fcaf0dd1691a250565b6111c56117b6565b6111ce5f611fbc565b565b5f516020613bce5f395f51905f526111e78161189a565b6110e861202c565b5f9182525f516020613bee5f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f815f0151826020015183604001518460600151604051602001611262949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6112876115e8565b6110e881612074565b6112986115e8565b336112a281611b7f565b6112ab84611999565b6112b585856119d4565b604080516001600160a01b03831660208201525f910160405160208183030381529060405290506112e7818588611a4d565b600160045f6112f589611225565b81526020019081526020015f205f6101000a81548160ff021916908315150217905550816001600160a01b03167fc8c5b37aec7f2ddbd3a13c51361e54a0a8df3bca256ab758a77f5ad741d281e5878787876040516113579493929190613891565b60405180910390a2505050505050565b5f516020613c2e5f395f51905f528054600160401b810460ff1615906001600160401b03165f811580156113985750825b90505f826001600160401b031660011480156113b35750303b155b9050811580156113c1575080155b156113df5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561140957845460ff60401b1916600160401b1785555b61141286612184565b61141a612195565b61142261219d565b61142d89898961228f565b831561147357845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b5f516020613c2e5f395f51905f52805460029190600160401b900460ff16806114b4575080546001600160401b03808416911610155b156114d25760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556114fb612195565b6115055f866118a4565b5061151d5f516020613bce5f395f51905f52876118a4565b5062093a80600955600a805461ffff19166101f417905561153e8484612338565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050565b61159682610bee565b61159f8161189a565b610cb38383611b06565b6115b16117b6565b6001600160a01b0381166115df57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6110e881611fbc565b5f516020613c0e5f395f51905f525460ff16156111ce5760405163d93c066560e01b815260040160405180910390fd5b61162182611b7f565b335f82900361164357604051631f2a200560e01b815260040160405180910390fd5b600254604051636eb1769f60e11b81526001600160a01b0383811660048301523060248301525f92169063dd62ed3e90604401602060405180830381865afa158015611691573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b591906138f7565b9050828110156116e25760405163054365bb60e31b815260048101829052602481018490526044016115d6565b6002546116fa906001600160a01b03168330866124cd565b6001600160a01b0384165f9081526003602052604081208054859290611721908490613864565b90915550506001600160a01b038085165f9081526006602090815260408083209386168352929052908120805485929061175c908490613864565b92505081905550836001600160a01b0316826001600160a01b03167fe5541a6b6103d4fa7e021ed54fad39c66f27a76bd13d374cf6240ae6bd0bb72b856040516117a891815260200190565b60405180910390a350505050565b336117e87f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146111ce5760405163118cdaa760e01b81523360048201526024016115d6565b5f60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af191505080601f3d1160015f51141615161561185b5750823b153d17155b80610cb35760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b60448201526064016115d6565b6110e8813361256a565b5f5f516020613bee5f395f51905f526118bd84846111ef565b61193c575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556118f23390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610951565b5f915050610951565b5092915050565b6001600160a01b0381165f9081526003602052604081206001015460ff16600281111561197b5761197b61374a565b146110e85760405163132e7efb60e31b815260040160405180910390fd5b604080518082019091525f80825260208201526119b682826125a3565b15610969576040516306cf438f60e01b815260040160405180910390fd5b60045f6119e084611225565b815260208101919091526040015f205460ff1615611a105760405162da8a5760e11b815260040160405180910390fd5b600c5f611a1c83611ae2565b815260208101919091526040015f205460ff16156109695760405163ae493b0360e01b815260040160405180910390fd5b611a56826125c4565b5f604051806060016040528060248152602001613b6a6024913990505f8482604051602001611a86929190613925565b60405160208183030381529060405290505f611aa18261262b565b9050611abe8185611ab188612718565b611ab961278f565b61285c565b611ada5760405162ced3e560e41b815260040160405180910390fd5b505050505050565b5f815f01518260200151604051602001611262929190918252602082015260400190565b5f5f516020613bee5f395f51905f52611b1f84846111ef565b1561193c575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610951565b6001600160a01b0381165f9081526003602052604081206001015460ff1690816002811115611bb057611bb061374a565b03611bce5760405163508a793f60e01b815260040160405180910390fd5b6002816002811115611be257611be261374a565b036109695760405163eab4a96360e01b815260040160405180910390fd5b611c0861290b565b5f516020613c0e5f395f51905f52805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b039091168152602001610c8c565b611c6282611b7f565b335f829003611c8457604051631f2a200560e01b815260040160405180910390fd5b6001600160a01b038084165f9081526007602090815260408083209385168352929052205415611cc75760405163d423a4f160e01b815260040160405180910390fd5b6001600160a01b038084165f9081526006602090815260408083209385168352929052205482811015611d1057604051639266535160e01b8152600481018290526024016115d6565b6001600160a01b038085165f90815260066020908152604080832093861683529290529081208054859290611d469084906137df565b92505081905550604051806040016040528084815260200160085442611d6c9190613864565b90526001600160a01b038086165f81815260076020908152604080832094881683529381528382208551815594810151600190950194909455908152600390925281208054859290611dbf9084906137df565b92505081905550836001600160a01b0316826001600160a01b03167f4d10bd049775c77bd7f255195afba5088028ecb3c7c277d393ccff7934f2f92c856040516117a891815260200190565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611e9157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611e855f516020613bae5f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156111ce5760405163703e46dd60e11b815260040160405180910390fd5b6110e86117b6565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f11575060408051601f3d908101601f19168201909252611f0e918101906138f7565b60015b611f3957604051634c9c8ce360e01b81526001600160a01b03831660048201526024016115d6565b5f516020613bae5f395f51905f528114611f6957604051632a87526960e21b8152600481018290526024016115d6565b610ef4838361293a565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111ce5760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6120346115e8565b5f516020613c0e5f395f51905f52805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611c41565b6001600160a01b0381165f90815260076020908152604080832033808552925282205490918190036120b957604051630686827b60e51b815260040160405180910390fd5b6001600160a01b038084165f9081526007602090815260408083209386168352929052206001015442101561210157604051635a77435760e01b815260040160405180910390fd5b6001600160a01b038084165f908152600760209081526040808320868516845290915281208181556001015560025461213c91168383611811565b816001600160a01b03167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b658260405161217791815260200190565b60405180910390a2505050565b61218c61298f565b6110e8816129c5565b6111ce61298f565b5f516020613c2e5f395f51905f528054600160401b810460ff1615906001600160401b03165f811580156121ce5750825b90505f826001600160401b031660011480156121e95750303b155b9050811580156121f7575080155b156122155760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561223f57845460ff60401b1916600160401b1785555b435f55831561228857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b6001600160a01b0383166122b65760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0382166122dd5760405163d92e233d60e01b815260040160405180910390fd5b600280546001600160a01b038086166001600160a01b0319928316179092556001805492851692909116919091179055605a808210156123305760405163b57e21df60e01b815260040160405180910390fd5b506008555050565b5f5b81811015610ef4575f83838381811061235557612355613941565b61236b9260206040909202019081019150613385565b90505f84848481811061238057612380613941565b905060400201602001602081019061239891906133b5565b90506127108161ffff1611156123c15760405163dc81db8560e01b815260040160405180910390fd5b6001600160a01b0382165f9081526003602052604081206001015460ff16908160028111156123f2576123f261374a565b036124105760405163508a793f60e01b815260040160405180910390fd5b6001600160a01b0383165f908152600b602052604090206001015415801561245157506001600160a01b0383165f908152600b602052604090205461ffff16155b839061247c5760405163050814e160e41b81526001600160a01b0390911660048201526024016115d6565b505060408051808201825261ffff92831681525f60208083018281526001600160a01b03969096168252600b9052919091209051815461ffff1916921691909117815590516001918201550161233a565b5f6040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b038416602482015282604482015260205f6064835f8a5af191505080601f3d1160015f5114161516156125265750833b153d17155b806122885760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b60448201526064016115d6565b61257482826111ef565b6109695760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016115d6565b805182515f911480156125bd575081602001518360200151145b9392505050565b805160208201515f915f516020613b8e5f395f51905f529115901516156125ea57505050565b825160208401518260038485858609850908838283091483821084841016169350505081610ef45760405163279e345360e21b815260040160405180910390fd5b604080518082019091525f80825260208201525f612648836129cd565b90505f516020613b8e5f395f51905f5260035f828485099050828061266f5761266f613955565b8482099050828061268257612682613955565b82820890505f5f61269283612bd5565b925090505b806126fb5784806126aa576126aa613955565b60018708955084806126be576126be613955565b868709925084806126d1576126d1613955565b868409925084806126e4576126e4613955565b84840892506126f283612bd5565b92509050612697565b506040805180820190915294855260208501525091949350505050565b604080518082019091525f808252602082015281516020830151159015161561273f575090565b6040518060400160405280835f015181526020015f516020613b8e5f395f51905f5284602001516127709190613969565b612787905f516020613b8e5f395f51905f526137df565b905292915050565b6127b660405180608001604052805f81526020015f81526020015f81526020015f81525090565b60405180608001604052807f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b815250905090565b5f5f5f6040518751815260208801516020820152602087015160408201528651606082015260608701516080820152604087015160a0820152855160c0820152602086015160e0820152602085015161010082015284516101208201526060850151610140820152604085015161016082015260205f6101808360085afa9150505f519150806128ff5760405163c206334f60e01b815260040160405180910390fd5b50151595945050505050565b5f516020613c0e5f395f51905f525460ff166111ce57604051638dfc202b60e01b815260040160405180910390fd5b61294382612c9d565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561298757610ef48282612d00565b610969612d72565b5f516020613c2e5f395f51905f5254600160401b900460ff166111ce57604051631afcd79f60e31b815260040160405180910390fd5b6115b161298f565b5f5f6129d883612d91565b8051909150603081146129ed576129ed613988565b5f816001600160401b03811115612a0657612a06613224565b6040519080825280601f01601f191660200182016040528015612a30576020820181803683370190505b5090505f5b82811015612a9f57836001612a4a83866137df565b612a5491906137df565b81518110612a6457612a64613941565b602001015160f81c60f81b828281518110612a8157612a81613941565b60200101906001600160f81b03191690815f1a905350600101612a35565b5060408051601f80825261040082019092525f9082602082016103e0803683370190505090505f5b82811015612b2f578381612adb85886137df565b612ae59190613864565b81518110612af557612af5613941565b602001015160f81c60f81b60f81c828281518110612b1557612b15613941565b60ff90921660209283029190910190910152600101612ac7565b505f612b3a826130dc565b90506101005f516020613b8e5f395f51905f525f612b5886896137df565b90505f5b81811015612bc5575f886001612b7284866137df565b612b7c91906137df565b81518110612b8c57612b8c613941565b016020015160f81c90508380612ba457612ba4613955565b85870995508380612bb757612bb7613955565b818708955050600101612b5c565b50929a9950505050505050505050565b5f5f5f5f5f7f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f5290505f5f516020613b8e5f395f51905f52905060405160208152602080820152602060408201528760608201528260808201528160a082015260205f60c08360055afa9450505f51925083612c6357604051630c9d3e9960e21b815260040160405180910390fd5b80600184901b1115612c7c57612c7983826137df565b92505b8080612c8a57612c8a613955565b8384099690961496919550909350505050565b806001600160a01b03163b5f03612cd257604051634c9c8ce360e01b81526001600160a01b03821660048201526024016115d6565b5f516020613bae5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b031684604051612d1c919061399c565b5f60405180830381855af49150503d805f8114612d54576040519150601f19603f3d011682016040523d82523d5f602084013e612d59565b606091505b5091509150612d6985838361313c565b95945050505050565b34156111ce5760405163b398979f60e01b815260040160405180910390fd5b604080516030808252606082810190935290602090600160f91b905f90846020820181803683370190505090508086604051602001612dd1929190613925565b6040516020818303038152906040529050808460f81b604051602001612df89291906139a7565b604051602081830303815290604052905080604051602001612e1a91906139d1565b60408051601f1981840301815290829052915061010160f01b90612e4490839083906020016139e9565b60408051808303601f190181528282528051602091820120818401819052600160f81b848401526001600160f01b031985166041850152825160238186030181526043909401909252825190830120919350905f60ff88166001600160401b03811115612eb357612eb3613224565b6040519080825280601f01601f191660200182016040528015612edd576020820181803683370190505b5090505f82604051602001612ef491815260200190565b60408051601f1981840301815291905290505f5b8151811015612f5e57818181518110612f2357612f23613941565b602001015160f81c60f81b838281518110612f4057612f40613941565b60200101906001600160f81b03191690815f1a905350600101612f08565b505f84604051602001612f7391815260200190565b60408051601f19818403018152602083019091525f80835291985091505b89811015613005575f838281518110612fac57612fac613941565b602001015160f81c60f81b838381518110612fc957612fc9613941565b602001015160f81c60f81b1890508881604051602001612fea929190613a0d565b60408051601f19818403018152919052985050600101612f91565b5086888760405160200161301b93929190613a31565b6040516020818303038152906040529650868051906020012093508360405160200161304991815260200190565b60408051601f1981840301815291905291505f5b61306a8a60ff8d166137df565b8110156130cb5782818151811061308357613083613941565b01602001516001600160f81b0319168461309d838d613864565b815181106130ad576130ad613941565b60200101906001600160f81b03191690815f1a90535060010161305d565b50919b9a5050505050505050505050565b5f80805b8351811015611945578381815181106130fb576130fb613941565b602002602001015160ff168160086131139190613a64565b61311e906002613b5e565b6131289190613a64565b6131329083613864565b91506001016130e0565b6060826131515761314c82613191565b6125bd565b815115801561316857506001600160a01b0384163b155b1561194557604051639996b31560e01b81526001600160a01b03851660048201526024016115d6565b8051156131a15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f602082840312156131ca575f5ffd5b81356001600160e01b0319811681146125bd575f5ffd5b80356001600160a01b03811681146131f7575f5ffd5b919050565b5f5f6040838503121561320d575f5ffd5b613216836131e1565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b038111828210171561325a5761325a613224565b60405290565b5f60808284031215613270575f5ffd5b604051608081016001600160401b038111828210171561329257613292613224565b6040908152833582526020808501359083015283810135908201526060928301359281019290925250919050565b5f604082840312156132d0575f5ffd5b6132d8613238565b823581526020928301359281019290925250919050565b803561ffff811681146131f7575f5ffd5b5f5f5f5f6101208587031215613314575f5ffd5b61331e8686613260565b935061332d86608087016132c0565b925061333c8660c087016132c0565b915061334b61010086016132ef565b905092959194509250565b6001600160401b03811681146110e8575f5ffd5b5f6020828403121561337a575f5ffd5b81356125bd81613356565b5f60208284031215613395575f5ffd5b6125bd826131e1565b5f602082840312156133ae575f5ffd5b5035919050565b5f602082840312156133c5575f5ffd5b6125bd826132ef565b5f5f604083850312156133df575f5ffd5b823591506133ef602084016131e1565b90509250929050565b5f82601f830112613407575f5ffd5b81356001600160401b0381111561342057613420613224565b604051601f8201601f19908116603f011681016001600160401b038111828210171561344e5761344e613224565b604052818152838201602001851015613465575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f5f6101408688031215613496575f5ffd5b6134a08787613260565b94506134af87608088016132c0565b93506134be8760c088016132c0565b92506101008601356001600160401b038111156134d9575f5ffd5b6134e5888289016133f8565b9250506134f561012087016132ef565b90509295509295909350565b5f5f60408385031215613512575f5ffd5b61351b836131e1565b915060208301356001600160401b03811115613535575f5ffd5b613541858286016133f8565b9150509250929050565b5f5f5f610100848603121561355e575f5ffd5b6135688585613260565b925061357785608086016132c0565b91506135868560c086016132c0565b90509250925092565b5f6080828403121561359f575f5ffd5b6125bd8383613260565b5f5f604083850312156135ba575f5ffd5b6135c3836131e1565b91506133ef602084016131e1565b5f5f5f5f61012085870312156135e5575f5ffd5b6135ef8686613260565b93506135fe86608087016132c0565b925061360d8660c087016132c0565b91506101008501356001600160401b03811115613628575f5ffd5b613634878288016133f8565b91505092959194509250565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6125bd6020830184613640565b5f5f5f5f60808587031215613693575f5ffd5b61369c856131e1565b93506136aa602086016131e1565b92506040850135915061334b606086016131e1565b5f5f5f5f606085870312156136d2575f5ffd5b6136db856131e1565b93506136e9602086016131e1565b925060408501356001600160401b03811115613703575f5ffd5b8501601f81018713613713575f5ffd5b80356001600160401b03811115613728575f5ffd5b8760208260061b840101111561373c575f5ffd5b949793965060200194505050565b634e487b7160e01b5f52602160045260245ffd5b828152604081016003831061378157634e487b7160e01b5f52602160045260245ffd5b8260208301529392505050565b5f6020828403121561379e575f5ffd5b81516125bd81613356565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160290811690818114611945576119456137a9565b81810381811115610951576109516137a9565b8551815260208087015190820152604080870151908201526060808701519082015284516080820152602085015160a082015261ffff841660c0820152825160e082015260208301516101008201526101406101208201525f613859610140830184613640565b979650505050505050565b80820180821115610951576109516137a9565b61ffff8181168382160190811115610951576109516137a9565b8451815260208086015190820152604080860151908201526060808601519082015283516080820152602084015160a0820152825160c0820152602083015160e08201526101206101008201525f6138ed610120830184613640565b9695505050505050565b5f60208284031215613907575f5ffd5b5051919050565b5f81518060208401855e5f93019283525090919050565b5f613939613933838661390e565b8461390e565b949350505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261398357634e487b7160e01b5f52601260045260245ffd5b500690565b634e487b7160e01b5f52600160045260245ffd5b5f6125bd828461390e565b5f6139b2828561390e565b5f81526001600160f81b03199390931660018401525050600201919050565b5f6139dc828461390e565b5f81526001019392505050565b5f6139f4828561390e565b6001600160f01b03199390931683525050600201919050565b5f613a18828561390e565b6001600160f81b03199390931683525050600101919050565b5f613a3c828661390e565b6001600160f81b031994909416845250506001600160f01b0319166001820152600301919050565b8082028115828204841417610951576109516137a9565b6001815b6001841115613ab657808504811115613a9a57613a9a6137a9565b6001841615613aa857908102905b60019390931c928002613a7f565b935093915050565b5f82613acc57506001610951565b81613ad857505f610951565b8160018114613aee5760028114613af857613b14565b6001915050610951565b60ff841115613b0957613b096137a9565b50506001821b610951565b5060208310610133831016604e8410600b8410161715613b37575081810a610951565b613b435f198484613a7b565b805f1904821115613b5657613b566137a9565b029392505050565b5f6125bd8383613abe56fe424c535f5349475f424e32353447315f584d443a4b454343414b5f4e4354485f4e554c5f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c634300081c000a + ///0x60806040526004361061028b575f3560e01c8063715018a611610155578063b3e6ebd5116100be578063d547741f11610078578063d547741f1461086c578063d9cc7d261461088b578063e63ab1e9146108a0578063f2fde38b146108c0578063fa52c7d8146108df578063fc0c546a14610922575f5ffd5b8063b3e6ebd51461078a578063b5700e68146107b8578063b5ecb344146107d7578063bd49c35f14610802578063be20309414610817578063c64814dd14610836575f5ffd5b80639ffb6b431161010f5780639ffb6b4314610657578063a217fddf146106aa578063a2d78dd5146106bd578063a3066aab1461070f578063ac5c2ad01461072e578063ad3cb1cc1461074d575f5ffd5b8063715018a61461058c5780638456cb59146105a05780638da5cb5b146105b457806391d14854146106045780639b30a5e6146106235780639e9a8f3114610642575f5ffd5b80633b2b7ffa116101f757806352780b6e116101b157806352780b6e146104da57806352d1902d146104f95780635544c2f11461050d5780635c975abb146105275780635f8754a61461054a5780636a911ccf14610578575f5ffd5b80633b2b7ffa146104345780633e9df9b5146104535780633f3bb366146104675780633f4ba83a146104945780634d99dd16146104a85780634f1ef286146104c7575f5ffd5b8063248a9ca311610248578063248a9ca31461036c5780632dc9bac6146103995780632f2ff15d146103b8578063304240bf146103d757806336568abe146103f6578063394b348f14610415575f5ffd5b806301ffc9a71461028f578063026e402b146102c35780630d8e6e2c146102e457806313b9057a1461030f5780631a20cd631461032e5780632140fecd1461034d575b5f5ffd5b34801561029a575f5ffd5b506102ae6102a93660046132c3565b610941565b60405190151581526020015b60405180910390f35b3480156102ce575f5ffd5b506102e26102dd366004613305565b610977565b005b3480156102ef575f5ffd5b5060408051600281525f60208201819052918101919091526060016102ba565b34801561031a575f5ffd5b506102e2610329366004613409565b6109a3565b348015610339575f5ffd5b506102e2610348366004613473565b6109bc565b348015610358575f5ffd5b506102e261036736600461348e565b610ad0565b348015610377575f5ffd5b5061038b6103863660046134a7565b610c24565b6040519081526020016102ba565b3480156103a4575f5ffd5b506102e26103b33660046134be565b610c44565b3480156103c3575f5ffd5b506102e26103d23660046134d7565b610ccd565b3480156103e2575f5ffd5b506102e26103f136600461358a565b610cef565b348015610401575f5ffd5b506102e26104103660046134d7565b610ef7565b348015610420575f5ffd5b506102e261042f3660046134a7565b610f2f565b34801561043f575f5ffd5b506102e261044e3660046134be565b610f9c565b34801561045e575f5ffd5b5061038b5f5481565b348015610472575f5ffd5b50600a546104819061ffff1681565b60405161ffff90911681526020016102ba565b34801561049f575f5ffd5b506102e26110ff565b3480156104b3575f5ffd5b506102e26104c2366004613305565b611121565b6102e26104d536600461360a565b611144565b3480156104e5575f5ffd5b506102e26104f4366004613654565b611163565b348015610504575f5ffd5b5061038b61127c565b348015610518575f5ffd5b506102e26103293660046136ea565b348015610532575f5ffd5b505f516020613d225f395f51905f525460ff166102ae565b348015610555575f5ffd5b506102ae6105643660046134a7565b600d6020525f908152604090205460ff1681565b348015610583575f5ffd5b506102e2611297565b348015610597575f5ffd5b506102e261134f565b3480156105ab575f5ffd5b506102e2611362565b3480156105bf575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016102ba565b34801561060f575f5ffd5b506102ae61061e3660046134d7565b611381565b34801561062e575f5ffd5b5061038b61063d36600461372e565b6113b7565b34801561064d575f5ffd5b5061038b60085481565b348015610662575f5ffd5b5061069061067136600461348e565b600c6020525f90815260409020805460019091015461ffff9091169082565b6040805161ffff90931683526020830191909152016102ba565b3480156106b5575f5ffd5b5061038b5f81565b3480156106c8575f5ffd5b506106fa6106d7366004613748565b600760209081525f92835260408084209091529082529020805460019091015482565b604080519283526020830191909152016102ba565b34801561071a575f5ffd5b506102e261072936600461348e565b611411565b348015610739575f5ffd5b506102e2610748366004613770565b611529565b348015610758575f5ffd5b5061077d604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102ba919061380d565b348015610795575f5ffd5b506102ae6107a43660046134a7565b60046020525f908152604090205460ff1681565b3480156107c3575f5ffd5b506001546105ec906001600160a01b031681565b3480156107e2575f5ffd5b5061038b6107f136600461348e565b60056020525f908152604090205481565b34801561080d575f5ffd5b5061038b600b5481565b348015610822575f5ffd5b506102e261083136600461381f565b611600565b348015610841575f5ffd5b5061038b610850366004613748565b600660209081525f928352604080842090915290825290205481565b348015610877575f5ffd5b506102e26108863660046134d7565b611717565b348015610896575f5ffd5b5061038b60095481565b3480156108ab575f5ffd5b5061038b5f516020613ce25f395f51905f5281565b3480156108cb575f5ffd5b506102e26108da36600461348e565b611733565b3480156108ea575f5ffd5b506109146108f936600461348e565b60036020525f90815260409020805460019091015460ff1682565b6040516102ba929190613872565b34801561092d575f5ffd5b506002546105ec906001600160a01b031681565b5f6001600160e01b03198216637965db0b60e01b148061097157506301ffc9a760e01b6001600160e01b03198316145b92915050565b61097f611772565b61098982826117a2565b80600b5f82825461099a91906138b6565b90915550505050565b60405163c2d7f81360e01b815260040160405180910390fd5b6109c4611940565b60015460408051633c1a081560e21b815290515f926001600160a01b03169163f06820549160048083019260209291908290030181865afa158015610a0b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a2f91906138c9565b610a3a90600f6138e4565b9050621275006001600160401b038083169084161080610a6b5750806001600160401b0316836001600160401b0316115b15610a895760405163b57e21df60e01b815260040160405180910390fd5b6001600160401b03831660088190556040519081527f793e3b1e1bcd677bb11900c83124d3c44c9946ea8ddf978a0ca250b034ec9dde9060200160405180910390a1505050565b610ad8611772565b6001600160a01b0381165f908152600560205260408120543391819003610b12576040516379298a5360e11b815260040160405180910390fd5b80421015610b3357604051635a77435760e01b815260040160405180910390fd5b6001600160a01b038084165f90815260066020908152604080832093861683529290529081205490819003610b7b57604051630686827b60e51b815260040160405180910390fd5b6001600160a01b038085165f818152600660209081526040808320948816835293815283822082905591815260039091529081208054839290610bbf908490613906565b9091555050600254610bdb906001600160a01b0316848361199b565b826001600160a01b03167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6582604051610c1691815260200190565b60405180910390a250505050565b5f9081525f516020613d025f395f51905f52602052604090206001015490565b610c4c611940565b5f8161ffff16118015610c6557506127108161ffff1611155b610c825760405163674e8ef360e01b815260040160405180910390fd5b600a805461ffff191661ffff83169081179091556040519081527fbe5b47be76500fea510ce219178b6e63695b6641dad0d3a0486455cea10aedfd906020015b60405180910390a150565b610cd682610c24565b610cdf81611a24565b610ce98383611a2e565b50505050565b610cf7611772565b33610d0181611ad6565b610d0a85611b23565b610d148686611b5e565b604080516001600160a01b03831660208201525f91016040516020818303038152906040529050610d46818689611bd7565b8351604014610d6857604051634247068760e01b815260040160405180910390fd5b6127108361ffff161115610d8f5760405163dc81db8560e01b815260040160405180910390fd5b600160045f610d9d8a6113b7565b81526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600d5f610dce89611c6c565b81526020019081526020015f205f6101000a81548160ff02191690831515021790555060405180604001604052805f815260200160016002811115610e1557610e1561385e565b90526001600160a01b0383165f908152600360209081526040909120825181559082015160018083018054909160ff1990911690836002811115610e5b57610e5b61385e565b02179055505060408051808201825261ffff86811682525f60208084018281526001600160a01b038916808452600c909252918590209351845461ffff191693169290921783555160019092019190915590519091507ff057d4ea81e98628653a8f90788541972078137334a92b42347eaccda80fc40a90610ee6908a908a9088908b908b90613919565b60405180910390a250505050505050565b6001600160a01b0381163314610f205760405163334bd91960e11b815260040160405180910390fd5b610f2a8282611c90565b505050565b610f37611940565b5f81118015610f4a57506301e133808111155b610f675760405163674e8ef360e01b815260040160405180910390fd5b60098190556040518181527f51d9fefdd48191bc75ab12116d5e5181964799a639e1ee31b0998ffaaf9ef25990602001610cc2565b610fa4611772565b33610fae81611d09565b6127108261ffff161115610fd55760405163dc81db8560e01b815260040160405180910390fd5b6001600160a01b0381165f908152600c60205260409020805461ffff90811690841681900361101757604051633082eb2560e21b815260040160405180910390fd5b8061ffff168461ffff1611156110a3576001820154801580611045575060095461104190826138b6565b4210155b611062576040516316eb94cb60e01b815260040160405180910390fd5b600a546110739061ffff168361398b565b61ffff168561ffff16111561109b576040516312d6a46560e11b815260040160405180910390fd5b504260018301555b815461ffff191661ffff85811691821784556040805142815291841660208301528101919091526001600160a01b038416907fbd8d76fccab39db7064bc007d9a2c83a98247dcb1087cc12f343b8be90aefd6490606001610c16565b5f516020613ce25f395f51905f5261111681611a24565b61111e611d8a565b50565b611129611772565b6111338282611de3565b80600b5f82825461099a9190613906565b61114c611f95565b61115582612039565b61115f8282612041565b5050565b5f516020613d425f395f51905f52805460029190600160401b900460ff1680611199575080546001600160401b03808416911610155b156111b75760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556111e06120fd565b6111ea5f87611a2e565b506112025f516020613ce25f395f51905f5288611a2e565b5062093a80600955600a805461ffff19166101f41790556112238484612105565b61122c8561229a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050505050565b5f611285612329565b505f516020613cc25f395f51905f5290565b61129f611772565b336112a981611d09565b6001600160a01b0381165f908152600360205260409020600101805460ff191660021790556008546112db90426138b6565b6001600160a01b0382165f908152600560209081526040808320939093556003905290812054600b805491929091611314908490613906565b90915550506040516001600160a01b038216907ffb24305354c87762d557487ae4a564e8d03ecbb9a97dd8afff8e1f6fcaf0dd16905f90a250565b611357611940565b6113605f612372565b565b5f516020613ce25f395f51905f5261137981611a24565b61111e6123e2565b5f9182525f516020613d025f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f815f01518260200151836040015184606001516040516020016113f4949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b611419611772565b6001600160a01b0381165f908152600760209081526040808320338085529252822054909181900361145e57604051630686827b60e51b815260040160405180910390fd5b6001600160a01b038084165f908152600760209081526040808320938616835292905220600101544210156114a657604051635a77435760e01b815260040160405180910390fd5b6001600160a01b038084165f90815260076020908152604080832086851684529091528120818155600101556002546114e19116838361199b565b816001600160a01b03167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b658260405161151c91815260200190565b60405180910390a2505050565b611531611772565b3361153b81611d09565b61154484611b23565b61154e8585611b5e565b604080516001600160a01b03831660208201525f91016040516020818303038152906040529050611580818588611bd7565b600160045f61158e896113b7565b81526020019081526020015f205f6101000a81548160ff021916908315150217905550816001600160a01b03167fc8c5b37aec7f2ddbd3a13c51361e54a0a8df3bca256ab758a77f5ad741d281e5878787876040516115f094939291906139a5565b60405180910390a2505050505050565b5f516020613d425f395f51905f528054600160401b810460ff1615906001600160401b03165f811580156116315750825b90505f826001600160401b0316600114801561164c5750303b155b90508115801561165a575080155b156116785760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156116a257845460ff60401b1916600160401b1785555b6116ab8661242a565b6116b36120fd565b6116bb61243b565b6116c689898961252d565b831561170c57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b61172082610c24565b61172981611a24565b610ce98383611c90565b61173b611940565b6001600160a01b03811661176957604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61111e81612372565b5f516020613d225f395f51905f525460ff16156113605760405163d93c066560e01b815260040160405180910390fd5b6117ab82611d09565b335f8290036117cd57604051631f2a200560e01b815260040160405180910390fd5b600254604051636eb1769f60e11b81526001600160a01b0383811660048301523060248301525f92169063dd62ed3e90604401602060405180830381865afa15801561181b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183f9190613a0b565b90508281101561186c5760405163054365bb60e31b81526004810182905260248101849052604401611760565b600254611884906001600160a01b03168330866125d6565b6001600160a01b0384165f90815260036020526040812080548592906118ab9084906138b6565b90915550506001600160a01b038085165f908152600660209081526040808320938616835292905290812080548592906118e69084906138b6565b92505081905550836001600160a01b0316826001600160a01b03167fe5541a6b6103d4fa7e021ed54fad39c66f27a76bd13d374cf6240ae6bd0bb72b8560405161193291815260200190565b60405180910390a350505050565b336119727f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146113605760405163118cdaa760e01b8152336004820152602401611760565b5f60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af191505080601f3d1160015f5114161516156119e55750823b153d17155b80610ce95760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401611760565b61111e8133612673565b5f5f516020613d025f395f51905f52611a478484611381565b611ac6575f848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055611a7c3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610971565b5f915050610971565b5092915050565b6001600160a01b0381165f9081526003602052604081206001015460ff166002811115611b0557611b0561385e565b1461111e5760405163132e7efb60e31b815260040160405180910390fd5b604080518082019091525f8082526020820152611b4082826126ac565b1561115f576040516306cf438f60e01b815260040160405180910390fd5b60045f611b6a846113b7565b815260208101919091526040015f205460ff1615611b9a5760405162da8a5760e11b815260040160405180910390fd5b600d5f611ba683611c6c565b815260208101919091526040015f205460ff161561115f5760405163ae493b0360e01b815260040160405180910390fd5b611be0826126cd565b5f604051806060016040528060248152602001613c7e6024913990505f8482604051602001611c10929190613a39565b60405160208183030381529060405290505f611c2b82612734565b9050611c488185611c3b88612821565b611c43612898565b612965565b611c645760405162ced3e560e41b815260040160405180910390fd5b505050505050565b5f815f015182602001516040516020016113f4929190918252602082015260400190565b5f5f516020613d025f395f51905f52611ca98484611381565b15611ac6575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610971565b6001600160a01b0381165f9081526003602052604081206001015460ff1690816002811115611d3a57611d3a61385e565b03611d585760405163508a793f60e01b815260040160405180910390fd5b6002816002811115611d6c57611d6c61385e565b0361115f5760405163eab4a96360e01b815260040160405180910390fd5b611d92612a14565b5f516020613d225f395f51905f52805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b039091168152602001610cc2565b611dec82611d09565b335f829003611e0e57604051631f2a200560e01b815260040160405180910390fd5b6001600160a01b038084165f9081526007602090815260408083209385168352929052205415611e515760405163d423a4f160e01b815260040160405180910390fd5b6001600160a01b038084165f9081526006602090815260408083209385168352929052205482811015611e9a57604051639266535160e01b815260048101829052602401611760565b6001600160a01b038085165f90815260066020908152604080832093861683529290529081208054859290611ed0908490613906565b92505081905550604051806040016040528084815260200160085442611ef691906138b6565b90526001600160a01b038086165f81815260076020908152604080832094881683529381528382208551815594810151600190950194909455908152600390925281208054859290611f49908490613906565b92505081905550836001600160a01b0316826001600160a01b03167f4d10bd049775c77bd7f255195afba5088028ecb3c7c277d393ccff7934f2f92c8560405161193291815260200190565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061201b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661200f5f516020613cc25f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156113605760405163703e46dd60e11b815260040160405180910390fd5b61111e611940565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561209b575060408051601f3d908101601f1916820190925261209891810190613a0b565b60015b6120c357604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611760565b5f516020613cc25f395f51905f5281146120f357604051632a87526960e21b815260048101829052602401611760565b610f2a8383612a43565b611360612a98565b5f5b81811015610f2a575f83838381811061212257612122613a55565b612138926020604090920201908101915061348e565b90505f84848481811061214d5761214d613a55565b905060400201602001602081019061216591906134be565b90506127108161ffff16111561218e5760405163dc81db8560e01b815260040160405180910390fd5b6001600160a01b0382165f9081526003602052604081206001015460ff16908160028111156121bf576121bf61385e565b036121dd5760405163508a793f60e01b815260040160405180910390fd5b6001600160a01b0383165f908152600c602052604090206001015415801561221e57506001600160a01b0383165f908152600c602052604090205461ffff16155b83906122495760405163050814e160e41b81526001600160a01b039091166004820152602401611760565b505060408051808201825261ffff92831681525f60208083018281526001600160a01b03969096168252600c9052919091209051815461ffff19169216919091178155905160019182015501612107565b6002546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156122e0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123049190613a0b565b81111561232457604051633d934f4960e11b815260040160405180910390fd5b600b55565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113605760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6123ea611772565b5f516020613d225f395f51905f52805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611dcb565b612432612a98565b61111e81612ace565b5f516020613d425f395f51905f528054600160401b810460ff1615906001600160401b03165f8115801561246c5750825b90505f826001600160401b031660011480156124875750303b155b905081158015612495575080155b156124b35760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156124dd57845460ff60401b1916600160401b1785555b435f55831561252657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b6001600160a01b0383166125545760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03821661257b5760405163d92e233d60e01b815260040160405180910390fd5b600280546001600160a01b038086166001600160a01b0319928316179092556001805492851692909116919091179055605a808210156125ce5760405163b57e21df60e01b815260040160405180910390fd5b506008555050565b5f6040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b038416602482015282604482015260205f6064835f8a5af191505080601f3d1160015f51141615161561262f5750833b153d17155b806125265760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606401611760565b61267d8282611381565b61115f5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401611760565b805182515f911480156126c6575081602001518360200151145b9392505050565b805160208201515f915f516020613ca25f395f51905f529115901516156126f357505050565b825160208401518260038485858609850908838283091483821084841016169350505081610f2a5760405163279e345360e21b815260040160405180910390fd5b604080518082019091525f80825260208201525f61275183612ad6565b90505f516020613ca25f395f51905f5260035f828485099050828061277857612778613a69565b8482099050828061278b5761278b613a69565b82820890505f5f61279b83612cde565b925090505b806128045784806127b3576127b3613a69565b60018708955084806127c7576127c7613a69565b868709925084806127da576127da613a69565b868409925084806127ed576127ed613a69565b84840892506127fb83612cde565b925090506127a0565b506040805180820190915294855260208501525091949350505050565b604080518082019091525f8082526020820152815160208301511590151615612848575090565b6040518060400160405280835f015181526020015f516020613ca25f395f51905f5284602001516128799190613a7d565b612890905f516020613ca25f395f51905f52613906565b905292915050565b6128bf60405180608001604052805f81526020015f81526020015f81526020015f81525090565b60405180608001604052807f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b815250905090565b5f5f5f6040518751815260208801516020820152602087015160408201528651606082015260608701516080820152604087015160a0820152855160c0820152602086015160e0820152602085015161010082015284516101208201526060850151610140820152604085015161016082015260205f6101808360085afa9150505f51915080612a085760405163c206334f60e01b815260040160405180910390fd5b50151595945050505050565b5f516020613d225f395f51905f525460ff1661136057604051638dfc202b60e01b815260040160405180910390fd5b612a4c82612da6565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115612a9057610f2a8282612e09565b61115f612e7b565b5f516020613d425f395f51905f5254600160401b900460ff1661136057604051631afcd79f60e31b815260040160405180910390fd5b61173b612a98565b5f5f612ae183612e9a565b805190915060308114612af657612af6613a9c565b5f816001600160401b03811115612b0f57612b0f61332d565b6040519080825280601f01601f191660200182016040528015612b39576020820181803683370190505b5090505f5b82811015612ba857836001612b538386613906565b612b5d9190613906565b81518110612b6d57612b6d613a55565b602001015160f81c60f81b828281518110612b8a57612b8a613a55565b60200101906001600160f81b03191690815f1a905350600101612b3e565b5060408051601f80825261040082019092525f9082602082016103e0803683370190505090505f5b82811015612c38578381612be48588613906565b612bee91906138b6565b81518110612bfe57612bfe613a55565b602001015160f81c60f81b60f81c828281518110612c1e57612c1e613a55565b60ff90921660209283029190910190910152600101612bd0565b505f612c43826131e5565b90506101005f516020613ca25f395f51905f525f612c618689613906565b90505f5b81811015612cce575f886001612c7b8486613906565b612c859190613906565b81518110612c9557612c95613a55565b016020015160f81c90508380612cad57612cad613a69565b85870995508380612cc057612cc0613a69565b818708955050600101612c65565b50929a9950505050505050505050565b5f5f5f5f5f7f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f5290505f5f516020613ca25f395f51905f52905060405160208152602080820152602060408201528760608201528260808201528160a082015260205f60c08360055afa9450505f51925083612d6c57604051630c9d3e9960e21b815260040160405180910390fd5b80600184901b1115612d8557612d828382613906565b92505b8080612d9357612d93613a69565b8384099690961496919550909350505050565b806001600160a01b03163b5f03612ddb57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611760565b5f516020613cc25f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b031684604051612e259190613ab0565b5f60405180830381855af49150503d805f8114612e5d576040519150601f19603f3d011682016040523d82523d5f602084013e612e62565b606091505b5091509150612e72858383613245565b95945050505050565b34156113605760405163b398979f60e01b815260040160405180910390fd5b604080516030808252606082810190935290602090600160f91b905f90846020820181803683370190505090508086604051602001612eda929190613a39565b6040516020818303038152906040529050808460f81b604051602001612f01929190613abb565b604051602081830303815290604052905080604051602001612f239190613ae5565b60408051601f1981840301815290829052915061010160f01b90612f4d9083908390602001613afd565b60408051808303601f190181528282528051602091820120818401819052600160f81b848401526001600160f01b031985166041850152825160238186030181526043909401909252825190830120919350905f60ff88166001600160401b03811115612fbc57612fbc61332d565b6040519080825280601f01601f191660200182016040528015612fe6576020820181803683370190505b5090505f82604051602001612ffd91815260200190565b60408051601f1981840301815291905290505f5b81518110156130675781818151811061302c5761302c613a55565b602001015160f81c60f81b83828151811061304957613049613a55565b60200101906001600160f81b03191690815f1a905350600101613011565b505f8460405160200161307c91815260200190565b60408051601f19818403018152602083019091525f80835291985091505b8981101561310e575f8382815181106130b5576130b5613a55565b602001015160f81c60f81b8383815181106130d2576130d2613a55565b602001015160f81c60f81b18905088816040516020016130f3929190613b21565b60408051601f1981840301815291905298505060010161309a565b5086888760405160200161312493929190613b45565b6040516020818303038152906040529650868051906020012093508360405160200161315291815260200190565b60408051601f1981840301815291905291505f5b6131738a60ff8d16613906565b8110156131d45782818151811061318c5761318c613a55565b01602001516001600160f81b031916846131a6838d6138b6565b815181106131b6576131b6613a55565b60200101906001600160f81b03191690815f1a905350600101613166565b50919b9a5050505050505050505050565b5f80805b8351811015611acf5783818151811061320457613204613a55565b602002602001015160ff1681600861321c9190613b78565b613227906002613c72565b6132319190613b78565b61323b90836138b6565b91506001016131e9565b60608261325a576132558261329a565b6126c6565b815115801561327157506001600160a01b0384163b155b15611acf57604051639996b31560e01b81526001600160a01b0385166004820152602401611760565b8051156132aa5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f602082840312156132d3575f5ffd5b81356001600160e01b0319811681146126c6575f5ffd5b80356001600160a01b0381168114613300575f5ffd5b919050565b5f5f60408385031215613316575f5ffd5b61331f836132ea565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156133635761336361332d565b60405290565b5f60808284031215613379575f5ffd5b604051608081016001600160401b038111828210171561339b5761339b61332d565b6040908152833582526020808501359083015283810135908201526060928301359281019290925250919050565b5f604082840312156133d9575f5ffd5b6133e1613341565b823581526020928301359281019290925250919050565b803561ffff81168114613300575f5ffd5b5f5f5f5f610120858703121561341d575f5ffd5b6134278686613369565b935061343686608087016133c9565b92506134458660c087016133c9565b915061345461010086016133f8565b905092959194509250565b6001600160401b038116811461111e575f5ffd5b5f60208284031215613483575f5ffd5b81356126c68161345f565b5f6020828403121561349e575f5ffd5b6126c6826132ea565b5f602082840312156134b7575f5ffd5b5035919050565b5f602082840312156134ce575f5ffd5b6126c6826133f8565b5f5f604083850312156134e8575f5ffd5b823591506134f8602084016132ea565b90509250929050565b5f82601f830112613510575f5ffd5b81356001600160401b038111156135295761352961332d565b604051601f8201601f19908116603f011681016001600160401b03811182821017156135575761355761332d565b60405281815283820160200185101561356e575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f5f610140868803121561359f575f5ffd5b6135a98787613369565b94506135b887608088016133c9565b93506135c78760c088016133c9565b92506101008601356001600160401b038111156135e2575f5ffd5b6135ee88828901613501565b9250506135fe61012087016133f8565b90509295509295909350565b5f5f6040838503121561361b575f5ffd5b613624836132ea565b915060208301356001600160401b0381111561363e575f5ffd5b61364a85828601613501565b9150509250929050565b5f5f5f5f5f60808688031215613668575f5ffd5b613671866132ea565b945061367f602087016132ea565b93506040860135925060608601356001600160401b038111156136a0575f5ffd5b8601601f810188136136b0575f5ffd5b80356001600160401b038111156136c5575f5ffd5b8860208260061b84010111156136d9575f5ffd5b959894975092955050506020019190565b5f5f5f61010084860312156136fd575f5ffd5b6137078585613369565b925061371685608086016133c9565b91506137258560c086016133c9565b90509250925092565b5f6080828403121561373e575f5ffd5b6126c68383613369565b5f5f60408385031215613759575f5ffd5b613762836132ea565b91506134f8602084016132ea565b5f5f5f5f6101208587031215613784575f5ffd5b61378e8686613369565b935061379d86608087016133c9565b92506137ac8660c087016133c9565b91506101008501356001600160401b038111156137c7575f5ffd5b6137d387828801613501565b91505092959194509250565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6126c660208301846137df565b5f5f5f5f60808587031215613832575f5ffd5b61383b856132ea565b9350613849602086016132ea565b925060408501359150613454606086016132ea565b634e487b7160e01b5f52602160045260245ffd5b828152604081016003831061389557634e487b7160e01b5f52602160045260245ffd5b8260208301529392505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610971576109716138a2565b5f602082840312156138d9575f5ffd5b81516126c68161345f565b6001600160401b038181168382160290811690818114611acf57611acf6138a2565b81810381811115610971576109716138a2565b8551815260208087015190820152604080870151908201526060808701519082015284516080820152602085015160a082015261ffff841660c0820152825160e082015260208301516101008201526101406101208201525f6139806101408301846137df565b979650505050505050565b61ffff8181168382160190811115610971576109716138a2565b8451815260208086015190820152604080860151908201526060808601519082015283516080820152602084015160a0820152825160c0820152602083015160e08201526101206101008201525f613a016101208301846137df565b9695505050505050565b5f60208284031215613a1b575f5ffd5b5051919050565b5f81518060208401855e5f93019283525090919050565b5f613a4d613a478386613a22565b84613a22565b949350505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f82613a9757634e487b7160e01b5f52601260045260245ffd5b500690565b634e487b7160e01b5f52600160045260245ffd5b5f6126c68284613a22565b5f613ac68285613a22565b5f81526001600160f81b03199390931660018401525050600201919050565b5f613af08284613a22565b5f81526001019392505050565b5f613b088285613a22565b6001600160f01b03199390931683525050600201919050565b5f613b2c8285613a22565b6001600160f81b03199390931683525050600101919050565b5f613b508286613a22565b6001600160f81b031994909416845250506001600160f01b0319166001820152600301919050565b8082028115828204841417610971576109716138a2565b6001815b6001841115613bca57808504811115613bae57613bae6138a2565b6001841615613bbc57908102905b60019390931c928002613b93565b935093915050565b5f82613be057506001610971565b81613bec57505f610971565b8160018114613c025760028114613c0c57613c28565b6001915050610971565b60ff841115613c1d57613c1d6138a2565b50506001821b610971565b5060208310610133831016604e8410600b8410161715613c4b575081810a610971565b613c575f198484613b8f565b805f1904821115613c6a57613c6a6138a2565b029392505050565b5f6126c68383613bd256fe424c535f5349475f424e32353447315f584d443a4b454343414b5f4e4354485f4e554c5f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c634300081c000a /// ``` #[rustfmt::skip] #[allow(clippy::all)] pub static DEPLOYED_BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\x80`@R`\x046\x10a\x02\x80W_5`\xE0\x1C\x80cqP\x18\xA6\x11a\x01UW\x80c\xB3\xE6\xEB\xD5\x11a\0\xBEW\x80c\xD5Gt\x1F\x11a\0xW\x80c\xD5Gt\x1F\x14a\x08LW\x80c\xD9\xCC}&\x14a\x08kW\x80c\xE6:\xB1\xE9\x14a\x08\x80W\x80c\xF2\xFD\xE3\x8B\x14a\x08\xA0W\x80c\xFAR\xC7\xD8\x14a\x08\xBFW\x80c\xFC\x0CTj\x14a\t\x02W__\xFD[\x80c\xB3\xE6\xEB\xD5\x14a\x07`W\x80c\xB5p\x0Eh\x14a\x07\x8EW\x80c\xB5\xEC\xB3D\x14a\x07\xADW\x80c\xBE 0\x94\x14a\x07\xD8W\x80c\xC6H\x14\xDD\x14a\x07\xF7W\x80c\xC7_T>\x14a\x08-W__\xFD[\x80c\x9F\xFBkC\x11a\x01\x0FW\x80c\x9F\xFBkC\x14a\x06-W\x80c\xA2\x17\xFD\xDF\x14a\x06\x80W\x80c\xA2\xD7\x8D\xD5\x14a\x06\x93W\x80c\xA3\x06j\xAB\x14a\x06\xE5W\x80c\xAC\\*\xD0\x14a\x07\x04W\x80c\xAD<\xB1\xCC\x14a\x07#W__\xFD[\x80cqP\x18\xA6\x14a\x05bW\x80c\x84V\xCBY\x14a\x05vW\x80c\x8D\xA5\xCB[\x14a\x05\x8AW\x80c\x91\xD1HT\x14a\x05\xDAW\x80c\x9B0\xA5\xE6\x14a\x05\xF9W\x80c\x9E\x9A\x8F1\x14a\x06\x18W__\xFD[\x80c9K4\x8F\x11a\x01\xF7W\x80cO\x1E\xF2\x86\x11a\x01\xB1W\x80cO\x1E\xF2\x86\x14a\x04\xBCW\x80cR\xD1\x90-\x14a\x04\xCFW\x80cUD\xC2\xF1\x14a\x04\xE3W\x80c\\\x97Z\xBB\x14a\x04\xFDW\x80c_\x87T\xA6\x14a\x05 W\x80cj\x91\x1C\xCF\x14a\x05NW__\xFD[\x80c9K4\x8F\x14a\x04\nW\x80c;+\x7F\xFA\x14a\x04)W\x80c>\x9D\xF9\xB5\x14a\x04HW\x80c?;\xB3f\x14a\x04\\W\x80c?K\xA8:\x14a\x04\x89W\x80cM\x99\xDD\x16\x14a\x04\x9DW__\xFD[\x80c!@\xFE\xCD\x11a\x02HW\x80c!@\xFE\xCD\x14a\x03BW\x80c$\x8A\x9C\xA3\x14a\x03aW\x80c-\xC9\xBA\xC6\x14a\x03\x8EW\x80c//\xF1]\x14a\x03\xADW\x80c0B@\xBF\x14a\x03\xCCW\x80c6V\x8A\xBE\x14a\x03\xEBW__\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x02\x84W\x80c\x02n@+\x14a\x02\xB8W\x80c\r\x8En,\x14a\x02\xD9W\x80c\x13\xB9\x05z\x14a\x03\x04W\x80c\x1A \xCDc\x14a\x03#W[__\xFD[4\x80\x15a\x02\x8FW__\xFD[Pa\x02\xA3a\x02\x9E6`\x04a1\xBAV[a\t!V[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xC3W__\xFD[Pa\x02\xD7a\x02\xD26`\x04a1\xFCV[a\tWV[\0[4\x80\x15a\x02\xE4W__\xFD[P`@\x80Q`\x02\x81R_` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01a\x02\xAFV[4\x80\x15a\x03\x0FW__\xFD[Pa\x02\xD7a\x03\x1E6`\x04a3\0V[a\tmV[4\x80\x15a\x03.W__\xFD[Pa\x02\xD7a\x03=6`\x04a3jV[a\t\x86V[4\x80\x15a\x03MW__\xFD[Pa\x02\xD7a\x03\\6`\x04a3\x85V[a\n\x9AV[4\x80\x15a\x03lW__\xFD[Pa\x03\x80a\x03{6`\x04a3\x9EV[a\x0B\xEEV[`@Q\x90\x81R` \x01a\x02\xAFV[4\x80\x15a\x03\x99W__\xFD[Pa\x02\xD7a\x03\xA86`\x04a3\xB5V[a\x0C\x0EV[4\x80\x15a\x03\xB8W__\xFD[Pa\x02\xD7a\x03\xC76`\x04a3\xCEV[a\x0C\x97V[4\x80\x15a\x03\xD7W__\xFD[Pa\x02\xD7a\x03\xE66`\x04a4\x81V[a\x0C\xB9V[4\x80\x15a\x03\xF6W__\xFD[Pa\x02\xD7a\x04\x056`\x04a3\xCEV[a\x0E\xC1V[4\x80\x15a\x04\x15W__\xFD[Pa\x02\xD7a\x04$6`\x04a3\x9EV[a\x0E\xF9V[4\x80\x15a\x044W__\xFD[Pa\x02\xD7a\x04C6`\x04a3\xB5V[a\x0FfV[4\x80\x15a\x04SW__\xFD[Pa\x03\x80_T\x81V[4\x80\x15a\x04gW__\xFD[P`\nTa\x04v\x90a\xFF\xFF\x16\x81V[`@Qa\xFF\xFF\x90\x91\x16\x81R` \x01a\x02\xAFV[4\x80\x15a\x04\x94W__\xFD[Pa\x02\xD7a\x10\xC9V[4\x80\x15a\x04\xA8W__\xFD[Pa\x02\xD7a\x04\xB76`\x04a1\xFCV[a\x10\xEBV[a\x02\xD7a\x04\xCA6`\x04a5\x01V[a\x10\xFDV[4\x80\x15a\x04\xDAW__\xFD[Pa\x03\x80a\x11\x18V[4\x80\x15a\x04\xEEW__\xFD[Pa\x02\xD7a\x03\x1E6`\x04a5KV[4\x80\x15a\x05\x08W__\xFD[P_Q` a<\x0E_9_Q\x90_RT`\xFF\x16a\x02\xA3V[4\x80\x15a\x05+W__\xFD[Pa\x02\xA3a\x05:6`\x04a3\x9EV[`\x0C` R_\x90\x81R`@\x90 T`\xFF\x16\x81V[4\x80\x15a\x05YW__\xFD[Pa\x02\xD7a\x113V[4\x80\x15a\x05mW__\xFD[Pa\x02\xD7a\x11\xBDV[4\x80\x15a\x05\x81W__\xFD[Pa\x02\xD7a\x11\xD0V[4\x80\x15a\x05\x95W__\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x02\xAFV[4\x80\x15a\x05\xE5W__\xFD[Pa\x02\xA3a\x05\xF46`\x04a3\xCEV[a\x11\xEFV[4\x80\x15a\x06\x04W__\xFD[Pa\x03\x80a\x06\x136`\x04a5\x8FV[a\x12%V[4\x80\x15a\x06#W__\xFD[Pa\x03\x80`\x08T\x81V[4\x80\x15a\x068W__\xFD[Pa\x06fa\x06G6`\x04a3\x85V[`\x0B` R_\x90\x81R`@\x90 \x80T`\x01\x90\x91\x01Ta\xFF\xFF\x90\x91\x16\x90\x82V[`@\x80Qa\xFF\xFF\x90\x93\x16\x83R` \x83\x01\x91\x90\x91R\x01a\x02\xAFV[4\x80\x15a\x06\x8BW__\xFD[Pa\x03\x80_\x81V[4\x80\x15a\x06\x9EW__\xFD[Pa\x06\xD0a\x06\xAD6`\x04a5\xA9V[`\x07` \x90\x81R_\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 \x80T`\x01\x90\x91\x01T\x82V[`@\x80Q\x92\x83R` \x83\x01\x91\x90\x91R\x01a\x02\xAFV[4\x80\x15a\x06\xF0W__\xFD[Pa\x02\xD7a\x06\xFF6`\x04a3\x85V[a\x12\x7FV[4\x80\x15a\x07\x0FW__\xFD[Pa\x02\xD7a\x07\x1E6`\x04a5\xD1V[a\x12\x90V[4\x80\x15a\x07.W__\xFD[Pa\x07S`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x02\xAF\x91\x90a6nV[4\x80\x15a\x07kW__\xFD[Pa\x02\xA3a\x07z6`\x04a3\x9EV[`\x04` R_\x90\x81R`@\x90 T`\xFF\x16\x81V[4\x80\x15a\x07\x99W__\xFD[P`\x01Ta\x05\xC2\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[4\x80\x15a\x07\xB8W__\xFD[Pa\x03\x80a\x07\xC76`\x04a3\x85V[`\x05` R_\x90\x81R`@\x90 T\x81V[4\x80\x15a\x07\xE3W__\xFD[Pa\x02\xD7a\x07\xF26`\x04a6\x80V[a\x13gV[4\x80\x15a\x08\x02W__\xFD[Pa\x03\x80a\x08\x116`\x04a5\xA9V[`\x06` \x90\x81R_\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 T\x81V[4\x80\x15a\x088W__\xFD[Pa\x02\xD7a\x08G6`\x04a6\xBFV[a\x14~V[4\x80\x15a\x08WW__\xFD[Pa\x02\xD7a\x08f6`\x04a3\xCEV[a\x15\x8DV[4\x80\x15a\x08vW__\xFD[Pa\x03\x80`\tT\x81V[4\x80\x15a\x08\x8BW__\xFD[Pa\x03\x80_Q` a;\xCE_9_Q\x90_R\x81V[4\x80\x15a\x08\xABW__\xFD[Pa\x02\xD7a\x08\xBA6`\x04a3\x85V[a\x15\xA9V[4\x80\x15a\x08\xCAW__\xFD[Pa\x08\xF4a\x08\xD96`\x04a3\x85V[`\x03` R_\x90\x81R`@\x90 \x80T`\x01\x90\x91\x01T`\xFF\x16\x82V[`@Qa\x02\xAF\x92\x91\x90a7^V[4\x80\x15a\t\rW__\xFD[P`\x02Ta\x05\xC2\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[_`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\tQWPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[a\t_a\x15\xE8V[a\ti\x82\x82a\x16\x18V[PPV[`@Qc\xC2\xD7\xF8\x13`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\t\x8Ea\x17\xB6V[`\x01T`@\x80Qc<\x1A\x08\x15`\xE2\x1B\x81R\x90Q_\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\xF0h T\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\t\xD5W=__>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\t\xF9\x91\x90a7\x8EV[a\n\x04\x90`\x0Fa7\xBDV[\x90Pb\x12u\0`\x01`\x01`@\x1B\x03\x80\x83\x16\x90\x84\x16\x10\x80a\n5WP\x80`\x01`\x01`@\x1B\x03\x16\x83`\x01`\x01`@\x1B\x03\x16\x11[\x15a\nSW`@Qc\xB5~!\xDF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`@\x1B\x03\x83\x16`\x08\x81\x90U`@Q\x90\x81R\x7Fy>;\x1E\x1B\xCDg{\xB1\x19\0\xC81$\xD3\xC4L\x99F\xEA\x8D\xDF\x97\x8A\x0C\xA2P\xB04\xEC\x9D\xDE\x90` \x01`@Q\x80\x91\x03\x90\xA1PPPV[a\n\xA2a\x15\xE8V[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x05` R`@\x81 T3\x91\x81\x90\x03a\n\xDCW`@Qcy)\x8AS`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80B\x10\x15a\n\xFDW`@QcZwCW`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x84\x16_\x90\x81R`\x06` \x90\x81R`@\x80\x83 \x93\x86\x16\x83R\x92\x90R\x90\x81 T\x90\x81\x90\x03a\x0BEW`@Qc\x06\x86\x82{`\xE5\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x85\x16_\x81\x81R`\x06` \x90\x81R`@\x80\x83 \x94\x88\x16\x83R\x93\x81R\x83\x82 \x82\x90U\x91\x81R`\x03\x90\x91R\x90\x81 \x80T\x83\x92\x90a\x0B\x89\x90\x84\x90a7\xDFV[\x90\x91UPP`\x02Ta\x0B\xA5\x90`\x01`\x01`\xA0\x1B\x03\x16\x84\x83a\x18\x11V[\x82`\x01`\x01`\xA0\x1B\x03\x16\x7F\x7F\xCFS,\x15\xF0\xA6\xDB\x0B\xD6\xD0\xE08\xBE\xA7\x1D0\xD8\x08\xC7\xD9\x8C\xB3\xBFrh\xA9[\xF5\x08\x1Be\x82`@Qa\x0B\xE0\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2PPPPV[_\x90\x81R_Q` a;\xEE_9_Q\x90_R` R`@\x90 `\x01\x01T\x90V[a\x0C\x16a\x17\xB6V[_\x81a\xFF\xFF\x16\x11\x80\x15a\x0C/WPa'\x10\x81a\xFF\xFF\x16\x11\x15[a\x0CLW`@QcgN\x8E\xF3`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\n\x80Ta\xFF\xFF\x19\x16a\xFF\xFF\x83\x16\x90\x81\x17\x90\x91U`@Q\x90\x81R\x7F\xBE[G\xBEvP\x0F\xEAQ\x0C\xE2\x19\x17\x8Bnci[fA\xDA\xD0\xD3\xA0HdU\xCE\xA1\n\xED\xFD\x90` \x01[`@Q\x80\x91\x03\x90\xA1PV[a\x0C\xA0\x82a\x0B\xEEV[a\x0C\xA9\x81a\x18\x9AV[a\x0C\xB3\x83\x83a\x18\xA4V[PPPPV[a\x0C\xC1a\x15\xE8V[3a\x0C\xCB\x81a\x19LV[a\x0C\xD4\x85a\x19\x99V[a\x0C\xDE\x86\x86a\x19\xD4V[`@\x80Q`\x01`\x01`\xA0\x1B\x03\x83\x16` \x82\x01R_\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90Pa\r\x10\x81\x86\x89a\x1AMV[\x83Q`@\x14a\r2W`@QcBG\x06\x87`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a'\x10\x83a\xFF\xFF\x16\x11\x15a\rYW`@Qc\xDC\x81\xDB\x85`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x04_a\rg\x8Aa\x12%V[\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP`\x01`\x0C_a\r\x98\x89a\x1A\xE2V[\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP`@Q\x80`@\x01`@R\x80_\x81R` \x01`\x01`\x02\x81\x11\x15a\r\xDFWa\r\xDFa7JV[\x90R`\x01`\x01`\xA0\x1B\x03\x83\x16_\x90\x81R`\x03` \x90\x81R`@\x90\x91 \x82Q\x81U\x90\x82\x01Q`\x01\x80\x83\x01\x80T\x90\x91`\xFF\x19\x90\x91\x16\x90\x83`\x02\x81\x11\x15a\x0E%Wa\x0E%a7JV[\x02\x17\x90UPP`@\x80Q\x80\x82\x01\x82Ra\xFF\xFF\x86\x81\x16\x82R_` \x80\x84\x01\x82\x81R`\x01`\x01`\xA0\x1B\x03\x89\x16\x80\x84R`\x0B\x90\x92R\x91\x85\x90 \x93Q\x84Ta\xFF\xFF\x19\x16\x93\x16\x92\x90\x92\x17\x83UQ`\x01\x90\x92\x01\x91\x90\x91U\x90Q\x90\x91P\x7F\xF0W\xD4\xEA\x81\xE9\x86(e:\x8F\x90x\x85A\x97 x\x13s4\xA9+B4~\xAC\xCD\xA8\x0F\xC4\n\x90a\x0E\xB0\x90\x8A\x90\x8A\x90\x88\x90\x8B\x90\x8B\x90a7\xF2V[`@Q\x80\x91\x03\x90\xA2PPPPPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x0E\xEAW`@Qc3K\xD9\x19`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0E\xF4\x82\x82a\x1B\x06V[PPPV[a\x0F\x01a\x17\xB6V[_\x81\x11\x80\x15a\x0F\x14WPc\x01\xE13\x80\x81\x11\x15[a\x0F1W`@QcgN\x8E\xF3`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\t\x81\x90U`@Q\x81\x81R\x7FQ\xD9\xFE\xFD\xD4\x81\x91\xBCu\xAB\x12\x11m^Q\x81\x96G\x99\xA69\xE1\xEE1\xB0\x99\x8F\xFA\xAF\x9E\xF2Y\x90` \x01a\x0C\x8CV[a\x0Fna\x15\xE8V[3a\x0Fx\x81a\x1B\x7FV[a'\x10\x82a\xFF\xFF\x16\x11\x15a\x0F\x9FW`@Qc\xDC\x81\xDB\x85`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x0B` R`@\x90 \x80Ta\xFF\xFF\x90\x81\x16\x90\x84\x16\x81\x90\x03a\x0F\xE1W`@Qc0\x82\xEB%`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80a\xFF\xFF\x16\x84a\xFF\xFF\x16\x11\x15a\x10mW`\x01\x82\x01T\x80\x15\x80a\x10\x0FWP`\tTa\x10\x0B\x90\x82a8dV[B\x10\x15[a\x10,W`@Qc\x16\xEB\x94\xCB`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\nTa\x10=\x90a\xFF\xFF\x16\x83a8wV[a\xFF\xFF\x16\x85a\xFF\xFF\x16\x11\x15a\x10eW`@Qc\x12\xD6\xA4e`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PB`\x01\x83\x01U[\x81Ta\xFF\xFF\x19\x16a\xFF\xFF\x85\x81\x16\x91\x82\x17\x84U`@\x80QB\x81R\x91\x84\x16` \x83\x01R\x81\x01\x91\x90\x91R`\x01`\x01`\xA0\x1B\x03\x84\x16\x90\x7F\xBD\x8Dv\xFC\xCA\xB3\x9D\xB7\x06K\xC0\x07\xD9\xA2\xC8:\x98$}\xCB\x10\x87\xCC\x12\xF3C\xB8\xBE\x90\xAE\xFDd\x90``\x01a\x0B\xE0V[_Q` a;\xCE_9_Q\x90_Ra\x10\xE0\x81a\x18\x9AV[a\x10\xE8a\x1C\0V[PV[a\x10\xF3a\x15\xE8V[a\ti\x82\x82a\x1CYV[a\x11\x05a\x1E\x0BV[a\x11\x0E\x82a\x1E\xAFV[a\ti\x82\x82a\x1E\xB7V[_a\x11!a\x1FsV[P_Q` a;\xAE_9_Q\x90_R\x90V[a\x11;a\x15\xE8V[3a\x11E\x81a\x1B\x7FV[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x03` R`@\x90 `\x01\x01\x80T`\xFF\x19\x16`\x02\x17\x90U`\x08Ta\x11w\x90Ba8dV[`\x01`\x01`\xA0\x1B\x03\x82\x16_\x81\x81R`\x05` R`@\x80\x82 \x93\x90\x93U\x91Q\x90\x91\x7F\xFB$0ST\xC8wb\xD5WHz\xE4\xA5d\xE8\xD0>\xCB\xB9\xA9}\xD8\xAF\xFF\x8E\x1Fo\xCA\xF0\xDD\x16\x91\xA2PV[a\x11\xC5a\x17\xB6V[a\x11\xCE_a\x1F\xBCV[V[_Q` a;\xCE_9_Q\x90_Ra\x11\xE7\x81a\x18\x9AV[a\x10\xE8a ,V[_\x91\x82R_Q` a;\xEE_9_Q\x90_R` \x90\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[_\x81_\x01Q\x82` \x01Q\x83`@\x01Q\x84``\x01Q`@Q` \x01a\x12b\x94\x93\x92\x91\x90\x93\x84R` \x84\x01\x92\x90\x92R`@\x83\x01R``\x82\x01R`\x80\x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[a\x12\x87a\x15\xE8V[a\x10\xE8\x81a tV[a\x12\x98a\x15\xE8V[3a\x12\xA2\x81a\x1B\x7FV[a\x12\xAB\x84a\x19\x99V[a\x12\xB5\x85\x85a\x19\xD4V[`@\x80Q`\x01`\x01`\xA0\x1B\x03\x83\x16` \x82\x01R_\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90Pa\x12\xE7\x81\x85\x88a\x1AMV[`\x01`\x04_a\x12\xF5\x89a\x12%V[\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x01`\x01`\xA0\x1B\x03\x16\x7F\xC8\xC5\xB3z\xEC\x7F-\xDB\xD3\xA1\x84\x84a#8V[\x80T`\xFF`@\x1B\x19\x16\x81U`@Q`\x01`\x01`@\x1B\x03\x83\x16\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1PPPPPPV[a\x15\x96\x82a\x0B\xEEV[a\x15\x9F\x81a\x18\x9AV[a\x0C\xB3\x83\x83a\x1B\x06V[a\x15\xB1a\x17\xB6V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x15\xDFW`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R_`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\x10\xE8\x81a\x1F\xBCV[_Q` a<\x0E_9_Q\x90_RT`\xFF\x16\x15a\x11\xCEW`@Qc\xD9<\x06e`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x16!\x82a\x1B\x7FV[3_\x82\x90\x03a\x16CW`@Qc\x1F* \x05`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02T`@Qcn\xB1v\x9F`\xE1\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x81\x16`\x04\x83\x01R0`$\x83\x01R_\x92\x16\x90c\xDDb\xED>\x90`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x16\x91W=__>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x16\xB5\x91\x90a8\xF7V[\x90P\x82\x81\x10\x15a\x16\xE2W`@Qc\x05Ce\xBB`\xE3\x1B\x81R`\x04\x81\x01\x82\x90R`$\x81\x01\x84\x90R`D\x01a\x15\xD6V[`\x02Ta\x16\xFA\x90`\x01`\x01`\xA0\x1B\x03\x16\x830\x86a$\xCDV[`\x01`\x01`\xA0\x1B\x03\x84\x16_\x90\x81R`\x03` R`@\x81 \x80T\x85\x92\x90a\x17!\x90\x84\x90a8dV[\x90\x91UPP`\x01`\x01`\xA0\x1B\x03\x80\x85\x16_\x90\x81R`\x06` \x90\x81R`@\x80\x83 \x93\x86\x16\x83R\x92\x90R\x90\x81 \x80T\x85\x92\x90a\x17\\\x90\x84\x90a8dV[\x92PP\x81\x90UP\x83`\x01`\x01`\xA0\x1B\x03\x16\x82`\x01`\x01`\xA0\x1B\x03\x16\x7F\xE5T\x1Aka\x03\xD4\xFA~\x02\x1E\xD5O\xAD9\xC6o'\xA7k\xD1=7L\xF6$\n\xE6\xBD\x0B\xB7+\x85`@Qa\x17\xA8\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPPV[3a\x17\xE8\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x11\xCEW`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\x15\xD6V[_`@Qc\xA9\x05\x9C\xBB`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x84\x16`\x04\x82\x01R\x82`$\x82\x01R` _`D\x83_\x89Z\xF1\x91PP\x80`\x1F=\x11`\x01_Q\x14\x16\x15\x16\x15a\x18[WP\x82;\x15=\x17\x15[\x80a\x0C\xB3W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0F`$\x82\x01Rn\x15\x14\x90S\x94\xD1\x91T\x97\xD1\x90RS\x11Q`\x8A\x1B`D\x82\x01R`d\x01a\x15\xD6V[a\x10\xE8\x813a%jV[__Q` a;\xEE_9_Q\x90_Ra\x18\xBD\x84\x84a\x11\xEFV[a\x19F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x10\xE8a\x17\xB6V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x1F\x11WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x1F\x0E\x91\x81\x01\x90a8\xF7V[`\x01[a\x1F9W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x15\xD6V[_Q` a;\xAE_9_Q\x90_R\x81\x14a\x1FiW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x15\xD6V[a\x0E\xF4\x83\x83a):V[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x11\xCEW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90_\x90\xA3PPPV[a 4a\x15\xE8V[_Q` a<\x0E_9_Q\x90_R\x80T`\xFF\x19\x16`\x01\x17\x81U\x7Fb\xE7\x8C\xEA\x01\xBE\xE3 \xCDNB\x02p\xB5\xEAt\0\r\x11\xB0\xC9\xF7GT\xEB\xDB\xFCTK\x05\xA2X3a\x1CAV[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x07` \x90\x81R`@\x80\x83 3\x80\x85R\x92R\x82 T\x90\x91\x81\x90\x03a \xB9W`@Qc\x06\x86\x82{`\xE5\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x84\x16_\x90\x81R`\x07` \x90\x81R`@\x80\x83 \x93\x86\x16\x83R\x92\x90R `\x01\x01TB\x10\x15a!\x01W`@QcZwCW`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x84\x16_\x90\x81R`\x07` \x90\x81R`@\x80\x83 \x86\x85\x16\x84R\x90\x91R\x81 \x81\x81U`\x01\x01U`\x02Ta!<\x91\x16\x83\x83a\x18\x11V[\x81`\x01`\x01`\xA0\x1B\x03\x16\x7F\x7F\xCFS,\x15\xF0\xA6\xDB\x0B\xD6\xD0\xE08\xBE\xA7\x1D0\xD8\x08\xC7\xD9\x8C\xB3\xBFrh\xA9[\xF5\x08\x1Be\x82`@Qa!w\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2PPPV[a!\x8Ca)\x8FV[a\x10\xE8\x81a)\xC5V[a\x11\xCEa)\x8FV[_Q` a<._9_Q\x90_R\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16_\x81\x15\x80\x15a!\xCEWP\x82[\x90P_\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a!\xE9WP0;\x15[\x90P\x81\x15\x80\x15a!\xF7WP\x80\x15[\x15a\"\x15W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\"?W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[C_U\x83\x15a\"\x88W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPV[`\x01`\x01`\xA0\x1B\x03\x83\x16a\"\xB6W`@Qc\xD9.#=`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x82\x16a\"\xDDW`@Qc\xD9.#=`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x80T`\x01`\x01`\xA0\x1B\x03\x80\x86\x16`\x01`\x01`\xA0\x1B\x03\x19\x92\x83\x16\x17\x90\x92U`\x01\x80T\x92\x85\x16\x92\x90\x91\x16\x91\x90\x91\x17\x90U`Z\x80\x82\x10\x15a#0W`@Qc\xB5~!\xDF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P`\x08UPPV[_[\x81\x81\x10\x15a\x0E\xF4W_\x83\x83\x83\x81\x81\x10a#UWa#Ua9AV[a#k\x92` `@\x90\x92\x02\x01\x90\x81\x01\x91Pa3\x85V[\x90P_\x84\x84\x84\x81\x81\x10a#\x80Wa#\x80a9AV[\x90P`@\x02\x01` \x01` \x81\x01\x90a#\x98\x91\x90a3\xB5V[\x90Pa'\x10\x81a\xFF\xFF\x16\x11\x15a#\xC1W`@Qc\xDC\x81\xDB\x85`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x82\x16_\x90\x81R`\x03` R`@\x81 `\x01\x01T`\xFF\x16\x90\x81`\x02\x81\x11\x15a#\xF2Wa#\xF2a7JV[\x03a$\x10W`@QcP\x8Ay?`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x83\x16_\x90\x81R`\x0B` R`@\x90 `\x01\x01T\x15\x80\x15a$QWP`\x01`\x01`\xA0\x1B\x03\x83\x16_\x90\x81R`\x0B` R`@\x90 Ta\xFF\xFF\x16\x15[\x83\x90a$|W`@Qc\x05\x08\x14\xE1`\xE4\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x90\x91\x16`\x04\x82\x01R`$\x01a\x15\xD6V[PP`@\x80Q\x80\x82\x01\x82Ra\xFF\xFF\x92\x83\x16\x81R_` \x80\x83\x01\x82\x81R`\x01`\x01`\xA0\x1B\x03\x96\x90\x96\x16\x82R`\x0B\x90R\x91\x90\x91 \x90Q\x81Ta\xFF\xFF\x19\x16\x92\x16\x91\x90\x91\x17\x81U\x90Q`\x01\x91\x82\x01U\x01a#:V[_`@Qc#\xB8r\xDD`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`\x01`\x01`\xA0\x1B\x03\x84\x16`$\x82\x01R\x82`D\x82\x01R` _`d\x83_\x8AZ\xF1\x91PP\x80`\x1F=\x11`\x01_Q\x14\x16\x15\x16\x15a%&WP\x83;\x15=\x17\x15[\x80a\"\x88W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x14`$\x82\x01Rs\x15\x14\x90S\x94\xD1\x91T\x97\xD1\x94\x93\xD3W\xD1\x90RS\x11Q`b\x1B`D\x82\x01R`d\x01a\x15\xD6V[a%t\x82\x82a\x11\xEFV[a\tiW`@Qc\xE2Q}?`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x81\x01\x83\x90R`D\x01a\x15\xD6V[\x80Q\x82Q_\x91\x14\x80\x15a%\xBDWP\x81` \x01Q\x83` \x01Q\x14[\x93\x92PPPV[\x80Q` \x82\x01Q_\x91_Q` a;\x8E_9_Q\x90_R\x91\x15\x90\x15\x16\x15a%\xEAWPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x0E\xF4W`@Qc'\x9E4S`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_a&H\x83a)\xCDV[\x90P_Q` a;\x8E_9_Q\x90_R`\x03_\x82\x84\x85\t\x90P\x82\x80a&oWa&oa9UV[\x84\x82\t\x90P\x82\x80a&\x82Wa&\x82a9UV[\x82\x82\x08\x90P__a&\x92\x83a+\xD5V[\x92P\x90P[\x80a&\xFBW\x84\x80a&\xAAWa&\xAAa9UV[`\x01\x87\x08\x95P\x84\x80a&\xBEWa&\xBEa9UV[\x86\x87\t\x92P\x84\x80a&\xD1Wa&\xD1a9UV[\x86\x84\t\x92P\x84\x80a&\xE4Wa&\xE4a9UV[\x84\x84\x08\x92Pa&\xF2\x83a+\xD5V[\x92P\x90Pa&\x97V[P`@\x80Q\x80\x82\x01\x90\x91R\x94\x85R` \x85\x01RP\x91\x94\x93PPPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a'?WP\x90V[`@Q\x80`@\x01`@R\x80\x83_\x01Q\x81R` \x01_Q` a;\x8E_9_Q\x90_R\x84` \x01Qa'p\x91\x90a9iV[a'\x87\x90_Q` a;\x8E_9_Q\x90_Ra7\xDFV[\x90R\x92\x91PPV[a'\xB6`@Q\x80`\x80\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[___`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` _a\x01\x80\x83`\x08Z\xFA\x91PP_Q\x91P\x80a(\xFFW`@Qc\xC2\x063O`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x15\x15\x95\x94PPPPPV[_Q` a<\x0E_9_Q\x90_RT`\xFF\x16a\x11\xCEW`@Qc\x8D\xFC +`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a)C\x82a,\x9DV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90_\x90\xA2\x80Q\x15a)\x87Wa\x0E\xF4\x82\x82a-\0V[a\tia-rV[_Q` a<._9_Q\x90_RT`\x01`@\x1B\x90\x04`\xFF\x16a\x11\xCEW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x15\xB1a)\x8FV[__a)\xD8\x83a-\x91V[\x80Q\x90\x91P`0\x81\x14a)\xEDWa)\xEDa9\x88V[_\x81`\x01`\x01`@\x1B\x03\x81\x11\x15a*\x06Wa*\x06a2$V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a*0W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P_[\x82\x81\x10\x15a*\x9FW\x83`\x01a*J\x83\x86a7\xDFV[a*T\x91\x90a7\xDFV[\x81Q\x81\x10a*dWa*da9AV[` \x01\x01Q`\xF8\x1C`\xF8\x1B\x82\x82\x81Q\x81\x10a*\x81Wa*\x81a9AV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81_\x1A\x90SP`\x01\x01a*5V[P`@\x80Q`\x1F\x80\x82Ra\x04\0\x82\x01\x90\x92R_\x90\x82` \x82\x01a\x03\xE0\x806\x837\x01\x90PP\x90P_[\x82\x81\x10\x15a+/W\x83\x81a*\xDB\x85\x88a7\xDFV[a*\xE5\x91\x90a8dV[\x81Q\x81\x10a*\xF5Wa*\xF5a9AV[` \x01\x01Q`\xF8\x1C`\xF8\x1B`\xF8\x1C\x82\x82\x81Q\x81\x10a+\x15Wa+\x15a9AV[`\xFF\x90\x92\x16` \x92\x83\x02\x91\x90\x91\x01\x90\x91\x01R`\x01\x01a*\xC7V[P_a+:\x82a0\xDCV[\x90Pa\x01\0_Q` a;\x8E_9_Q\x90_R_a+X\x86\x89a7\xDFV[\x90P_[\x81\x81\x10\x15a+\xC5W_\x88`\x01a+r\x84\x86a7\xDFV[a+|\x91\x90a7\xDFV[\x81Q\x81\x10a+\x8CWa+\x8Ca9AV[\x01` \x01Q`\xF8\x1C\x90P\x83\x80a+\xA4Wa+\xA4a9UV[\x85\x87\t\x95P\x83\x80a+\xB7Wa+\xB7a9UV[\x81\x87\x08\x95PP`\x01\x01a+\\V[P\x92\x9A\x99PPPPPPPPPPV[_____\x7F\x0C\x19\x13\x9C\xB8Lh\nn\x14\x11m\xA0`V\x17e\xE0Z\xA4Z\x1Cr\xA3O\x08#\x05\xB6\x1F?R\x90P__Q` a;\x8E_9_Q\x90_R\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x87``\x82\x01R\x82`\x80\x82\x01R\x81`\xA0\x82\x01R` _`\xC0\x83`\x05Z\xFA\x94PP_Q\x92P\x83a,cW`@Qc\x0C\x9D>\x99`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80`\x01\x84\x90\x1B\x11\x15a,|Wa,y\x83\x82a7\xDFV[\x92P[\x80\x80a,\x8AWa,\x8Aa9UV[\x83\x84\t\x96\x90\x96\x14\x96\x91\x95P\x90\x93PPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;_\x03a,\xD2W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x15\xD6V[_Q` a;\xAE_9_Q\x90_R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[``__\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa-\x1C\x91\x90a9\x9CV[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a-TW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a-YV[``\x91P[P\x91P\x91Pa-i\x85\x83\x83a1 v\xCC75\xA9 \xA3\xCAP]8+\xBCe\xD7\xA2\x8E2e\xB3zdt\x92\x9F3e!\xB32\xC1h\x1B\x93?l\xB9\xF37fsD\r\x86*\x02\xDD{\xC7\xDE\xC4\xDC\xEE\xDD\xA7u\xE5\x8D\xD5A\xE0\x8A\x11llS\x81\\\x0B\xD0(\x19/{bh\0\xCD^\xD1\\n\x18~w\xE9\xAE\xE8\x81\x84\xC2\x1FO!\x82\xABX'\xCB;~\x07\xFB\xED\xCDc\xF03\0\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\xA1dsolcC\0\x08\x1C\0\n", + b"`\x80`@R`\x046\x10a\x02\x8BW_5`\xE0\x1C\x80cqP\x18\xA6\x11a\x01UW\x80c\xB3\xE6\xEB\xD5\x11a\0\xBEW\x80c\xD5Gt\x1F\x11a\0xW\x80c\xD5Gt\x1F\x14a\x08lW\x80c\xD9\xCC}&\x14a\x08\x8BW\x80c\xE6:\xB1\xE9\x14a\x08\xA0W\x80c\xF2\xFD\xE3\x8B\x14a\x08\xC0W\x80c\xFAR\xC7\xD8\x14a\x08\xDFW\x80c\xFC\x0CTj\x14a\t\"W__\xFD[\x80c\xB3\xE6\xEB\xD5\x14a\x07\x8AW\x80c\xB5p\x0Eh\x14a\x07\xB8W\x80c\xB5\xEC\xB3D\x14a\x07\xD7W\x80c\xBDI\xC3_\x14a\x08\x02W\x80c\xBE 0\x94\x14a\x08\x17W\x80c\xC6H\x14\xDD\x14a\x086W__\xFD[\x80c\x9F\xFBkC\x11a\x01\x0FW\x80c\x9F\xFBkC\x14a\x06WW\x80c\xA2\x17\xFD\xDF\x14a\x06\xAAW\x80c\xA2\xD7\x8D\xD5\x14a\x06\xBDW\x80c\xA3\x06j\xAB\x14a\x07\x0FW\x80c\xAC\\*\xD0\x14a\x07.W\x80c\xAD<\xB1\xCC\x14a\x07MW__\xFD[\x80cqP\x18\xA6\x14a\x05\x8CW\x80c\x84V\xCBY\x14a\x05\xA0W\x80c\x8D\xA5\xCB[\x14a\x05\xB4W\x80c\x91\xD1HT\x14a\x06\x04W\x80c\x9B0\xA5\xE6\x14a\x06#W\x80c\x9E\x9A\x8F1\x14a\x06BW__\xFD[\x80c;+\x7F\xFA\x11a\x01\xF7W\x80cRx\x0Bn\x11a\x01\xB1W\x80cRx\x0Bn\x14a\x04\xDAW\x80cR\xD1\x90-\x14a\x04\xF9W\x80cUD\xC2\xF1\x14a\x05\rW\x80c\\\x97Z\xBB\x14a\x05'W\x80c_\x87T\xA6\x14a\x05JW\x80cj\x91\x1C\xCF\x14a\x05xW__\xFD[\x80c;+\x7F\xFA\x14a\x044W\x80c>\x9D\xF9\xB5\x14a\x04SW\x80c?;\xB3f\x14a\x04gW\x80c?K\xA8:\x14a\x04\x94W\x80cM\x99\xDD\x16\x14a\x04\xA8W\x80cO\x1E\xF2\x86\x14a\x04\xC7W__\xFD[\x80c$\x8A\x9C\xA3\x11a\x02HW\x80c$\x8A\x9C\xA3\x14a\x03lW\x80c-\xC9\xBA\xC6\x14a\x03\x99W\x80c//\xF1]\x14a\x03\xB8W\x80c0B@\xBF\x14a\x03\xD7W\x80c6V\x8A\xBE\x14a\x03\xF6W\x80c9K4\x8F\x14a\x04\x15W__\xFD[\x80c\x01\xFF\xC9\xA7\x14a\x02\x8FW\x80c\x02n@+\x14a\x02\xC3W\x80c\r\x8En,\x14a\x02\xE4W\x80c\x13\xB9\x05z\x14a\x03\x0FW\x80c\x1A \xCDc\x14a\x03.W\x80c!@\xFE\xCD\x14a\x03MW[__\xFD[4\x80\x15a\x02\x9AW__\xFD[Pa\x02\xAEa\x02\xA96`\x04a2\xC3V[a\tAV[`@Q\x90\x15\x15\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02\xCEW__\xFD[Pa\x02\xE2a\x02\xDD6`\x04a3\x05V[a\twV[\0[4\x80\x15a\x02\xEFW__\xFD[P`@\x80Q`\x02\x81R_` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01a\x02\xBAV[4\x80\x15a\x03\x1AW__\xFD[Pa\x02\xE2a\x03)6`\x04a4\tV[a\t\xA3V[4\x80\x15a\x039W__\xFD[Pa\x02\xE2a\x03H6`\x04a4sV[a\t\xBCV[4\x80\x15a\x03XW__\xFD[Pa\x02\xE2a\x03g6`\x04a4\x8EV[a\n\xD0V[4\x80\x15a\x03wW__\xFD[Pa\x03\x8Ba\x03\x866`\x04a4\xA7V[a\x0C$V[`@Q\x90\x81R` \x01a\x02\xBAV[4\x80\x15a\x03\xA4W__\xFD[Pa\x02\xE2a\x03\xB36`\x04a4\xBEV[a\x0CDV[4\x80\x15a\x03\xC3W__\xFD[Pa\x02\xE2a\x03\xD26`\x04a4\xD7V[a\x0C\xCDV[4\x80\x15a\x03\xE2W__\xFD[Pa\x02\xE2a\x03\xF16`\x04a5\x8AV[a\x0C\xEFV[4\x80\x15a\x04\x01W__\xFD[Pa\x02\xE2a\x04\x106`\x04a4\xD7V[a\x0E\xF7V[4\x80\x15a\x04 W__\xFD[Pa\x02\xE2a\x04/6`\x04a4\xA7V[a\x0F/V[4\x80\x15a\x04?W__\xFD[Pa\x02\xE2a\x04N6`\x04a4\xBEV[a\x0F\x9CV[4\x80\x15a\x04^W__\xFD[Pa\x03\x8B_T\x81V[4\x80\x15a\x04rW__\xFD[P`\nTa\x04\x81\x90a\xFF\xFF\x16\x81V[`@Qa\xFF\xFF\x90\x91\x16\x81R` \x01a\x02\xBAV[4\x80\x15a\x04\x9FW__\xFD[Pa\x02\xE2a\x10\xFFV[4\x80\x15a\x04\xB3W__\xFD[Pa\x02\xE2a\x04\xC26`\x04a3\x05V[a\x11!V[a\x02\xE2a\x04\xD56`\x04a6\nV[a\x11DV[4\x80\x15a\x04\xE5W__\xFD[Pa\x02\xE2a\x04\xF46`\x04a6TV[a\x11cV[4\x80\x15a\x05\x04W__\xFD[Pa\x03\x8Ba\x12|V[4\x80\x15a\x05\x18W__\xFD[Pa\x02\xE2a\x03)6`\x04a6\xEAV[4\x80\x15a\x052W__\xFD[P_Q` a=\"_9_Q\x90_RT`\xFF\x16a\x02\xAEV[4\x80\x15a\x05UW__\xFD[Pa\x02\xAEa\x05d6`\x04a4\xA7V[`\r` R_\x90\x81R`@\x90 T`\xFF\x16\x81V[4\x80\x15a\x05\x83W__\xFD[Pa\x02\xE2a\x12\x97V[4\x80\x15a\x05\x97W__\xFD[Pa\x02\xE2a\x13OV[4\x80\x15a\x05\xABW__\xFD[Pa\x02\xE2a\x13bV[4\x80\x15a\x05\xBFW__\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x02\xBAV[4\x80\x15a\x06\x0FW__\xFD[Pa\x02\xAEa\x06\x1E6`\x04a4\xD7V[a\x13\x81V[4\x80\x15a\x06.W__\xFD[Pa\x03\x8Ba\x06=6`\x04a7.V[a\x13\xB7V[4\x80\x15a\x06MW__\xFD[Pa\x03\x8B`\x08T\x81V[4\x80\x15a\x06bW__\xFD[Pa\x06\x90a\x06q6`\x04a4\x8EV[`\x0C` R_\x90\x81R`@\x90 \x80T`\x01\x90\x91\x01Ta\xFF\xFF\x90\x91\x16\x90\x82V[`@\x80Qa\xFF\xFF\x90\x93\x16\x83R` \x83\x01\x91\x90\x91R\x01a\x02\xBAV[4\x80\x15a\x06\xB5W__\xFD[Pa\x03\x8B_\x81V[4\x80\x15a\x06\xC8W__\xFD[Pa\x06\xFAa\x06\xD76`\x04a7HV[`\x07` \x90\x81R_\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 \x80T`\x01\x90\x91\x01T\x82V[`@\x80Q\x92\x83R` \x83\x01\x91\x90\x91R\x01a\x02\xBAV[4\x80\x15a\x07\x1AW__\xFD[Pa\x02\xE2a\x07)6`\x04a4\x8EV[a\x14\x11V[4\x80\x15a\x079W__\xFD[Pa\x02\xE2a\x07H6`\x04a7pV[a\x15)V[4\x80\x15a\x07XW__\xFD[Pa\x07}`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x02\xBA\x91\x90a8\rV[4\x80\x15a\x07\x95W__\xFD[Pa\x02\xAEa\x07\xA46`\x04a4\xA7V[`\x04` R_\x90\x81R`@\x90 T`\xFF\x16\x81V[4\x80\x15a\x07\xC3W__\xFD[P`\x01Ta\x05\xEC\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[4\x80\x15a\x07\xE2W__\xFD[Pa\x03\x8Ba\x07\xF16`\x04a4\x8EV[`\x05` R_\x90\x81R`@\x90 T\x81V[4\x80\x15a\x08\rW__\xFD[Pa\x03\x8B`\x0BT\x81V[4\x80\x15a\x08\"W__\xFD[Pa\x02\xE2a\x0816`\x04a8\x1FV[a\x16\0V[4\x80\x15a\x08AW__\xFD[Pa\x03\x8Ba\x08P6`\x04a7HV[`\x06` \x90\x81R_\x92\x83R`@\x80\x84 \x90\x91R\x90\x82R\x90 T\x81V[4\x80\x15a\x08wW__\xFD[Pa\x02\xE2a\x08\x866`\x04a4\xD7V[a\x17\x17V[4\x80\x15a\x08\x96W__\xFD[Pa\x03\x8B`\tT\x81V[4\x80\x15a\x08\xABW__\xFD[Pa\x03\x8B_Q` a<\xE2_9_Q\x90_R\x81V[4\x80\x15a\x08\xCBW__\xFD[Pa\x02\xE2a\x08\xDA6`\x04a4\x8EV[a\x173V[4\x80\x15a\x08\xEAW__\xFD[Pa\t\x14a\x08\xF96`\x04a4\x8EV[`\x03` R_\x90\x81R`@\x90 \x80T`\x01\x90\x91\x01T`\xFF\x16\x82V[`@Qa\x02\xBA\x92\x91\x90a8rV[4\x80\x15a\t-W__\xFD[P`\x02Ta\x05\xEC\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[_`\x01`\x01`\xE0\x1B\x03\x19\x82\x16cye\xDB\x0B`\xE0\x1B\x14\x80a\tqWPc\x01\xFF\xC9\xA7`\xE0\x1B`\x01`\x01`\xE0\x1B\x03\x19\x83\x16\x14[\x92\x91PPV[a\t\x7Fa\x17rV[a\t\x89\x82\x82a\x17\xA2V[\x80`\x0B_\x82\x82Ta\t\x9A\x91\x90a8\xB6V[\x90\x91UPPPPV[`@Qc\xC2\xD7\xF8\x13`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\t\xC4a\x19@V[`\x01T`@\x80Qc<\x1A\x08\x15`\xE2\x1B\x81R\x90Q_\x92`\x01`\x01`\xA0\x1B\x03\x16\x91c\xF0h T\x91`\x04\x80\x83\x01\x92` \x92\x91\x90\x82\x90\x03\x01\x81\x86Z\xFA\x15\x80\x15a\n\x0BW=__>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\n/\x91\x90a8\xC9V[a\n:\x90`\x0Fa8\xE4V[\x90Pb\x12u\0`\x01`\x01`@\x1B\x03\x80\x83\x16\x90\x84\x16\x10\x80a\nkWP\x80`\x01`\x01`@\x1B\x03\x16\x83`\x01`\x01`@\x1B\x03\x16\x11[\x15a\n\x89W`@Qc\xB5~!\xDF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`@\x1B\x03\x83\x16`\x08\x81\x90U`@Q\x90\x81R\x7Fy>;\x1E\x1B\xCDg{\xB1\x19\0\xC81$\xD3\xC4L\x99F\xEA\x8D\xDF\x97\x8A\x0C\xA2P\xB04\xEC\x9D\xDE\x90` \x01`@Q\x80\x91\x03\x90\xA1PPPV[a\n\xD8a\x17rV[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x05` R`@\x81 T3\x91\x81\x90\x03a\x0B\x12W`@Qcy)\x8AS`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80B\x10\x15a\x0B3W`@QcZwCW`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x84\x16_\x90\x81R`\x06` \x90\x81R`@\x80\x83 \x93\x86\x16\x83R\x92\x90R\x90\x81 T\x90\x81\x90\x03a\x0B{W`@Qc\x06\x86\x82{`\xE5\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x85\x16_\x81\x81R`\x06` \x90\x81R`@\x80\x83 \x94\x88\x16\x83R\x93\x81R\x83\x82 \x82\x90U\x91\x81R`\x03\x90\x91R\x90\x81 \x80T\x83\x92\x90a\x0B\xBF\x90\x84\x90a9\x06V[\x90\x91UPP`\x02Ta\x0B\xDB\x90`\x01`\x01`\xA0\x1B\x03\x16\x84\x83a\x19\x9BV[\x82`\x01`\x01`\xA0\x1B\x03\x16\x7F\x7F\xCFS,\x15\xF0\xA6\xDB\x0B\xD6\xD0\xE08\xBE\xA7\x1D0\xD8\x08\xC7\xD9\x8C\xB3\xBFrh\xA9[\xF5\x08\x1Be\x82`@Qa\x0C\x16\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2PPPPV[_\x90\x81R_Q` a=\x02_9_Q\x90_R` R`@\x90 `\x01\x01T\x90V[a\x0CLa\x19@V[_\x81a\xFF\xFF\x16\x11\x80\x15a\x0CeWPa'\x10\x81a\xFF\xFF\x16\x11\x15[a\x0C\x82W`@QcgN\x8E\xF3`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\n\x80Ta\xFF\xFF\x19\x16a\xFF\xFF\x83\x16\x90\x81\x17\x90\x91U`@Q\x90\x81R\x7F\xBE[G\xBEvP\x0F\xEAQ\x0C\xE2\x19\x17\x8Bnci[fA\xDA\xD0\xD3\xA0HdU\xCE\xA1\n\xED\xFD\x90` \x01[`@Q\x80\x91\x03\x90\xA1PV[a\x0C\xD6\x82a\x0C$V[a\x0C\xDF\x81a\x1A$V[a\x0C\xE9\x83\x83a\x1A.V[PPPPV[a\x0C\xF7a\x17rV[3a\r\x01\x81a\x1A\xD6V[a\r\n\x85a\x1B#V[a\r\x14\x86\x86a\x1B^V[`@\x80Q`\x01`\x01`\xA0\x1B\x03\x83\x16` \x82\x01R_\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90Pa\rF\x81\x86\x89a\x1B\xD7V[\x83Q`@\x14a\rhW`@QcBG\x06\x87`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a'\x10\x83a\xFF\xFF\x16\x11\x15a\r\x8FW`@Qc\xDC\x81\xDB\x85`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x04_a\r\x9D\x8Aa\x13\xB7V[\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP`\x01`\r_a\r\xCE\x89a\x1ClV[\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP`@Q\x80`@\x01`@R\x80_\x81R` \x01`\x01`\x02\x81\x11\x15a\x0E\x15Wa\x0E\x15a8^V[\x90R`\x01`\x01`\xA0\x1B\x03\x83\x16_\x90\x81R`\x03` \x90\x81R`@\x90\x91 \x82Q\x81U\x90\x82\x01Q`\x01\x80\x83\x01\x80T\x90\x91`\xFF\x19\x90\x91\x16\x90\x83`\x02\x81\x11\x15a\x0E[Wa\x0E[a8^V[\x02\x17\x90UPP`@\x80Q\x80\x82\x01\x82Ra\xFF\xFF\x86\x81\x16\x82R_` \x80\x84\x01\x82\x81R`\x01`\x01`\xA0\x1B\x03\x89\x16\x80\x84R`\x0C\x90\x92R\x91\x85\x90 \x93Q\x84Ta\xFF\xFF\x19\x16\x93\x16\x92\x90\x92\x17\x83UQ`\x01\x90\x92\x01\x91\x90\x91U\x90Q\x90\x91P\x7F\xF0W\xD4\xEA\x81\xE9\x86(e:\x8F\x90x\x85A\x97 x\x13s4\xA9+B4~\xAC\xCD\xA8\x0F\xC4\n\x90a\x0E\xE6\x90\x8A\x90\x8A\x90\x88\x90\x8B\x90\x8B\x90a9\x19V[`@Q\x80\x91\x03\x90\xA2PPPPPPPV[`\x01`\x01`\xA0\x1B\x03\x81\x163\x14a\x0F W`@Qc3K\xD9\x19`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0F*\x82\x82a\x1C\x90V[PPPV[a\x0F7a\x19@V[_\x81\x11\x80\x15a\x0FJWPc\x01\xE13\x80\x81\x11\x15[a\x0FgW`@QcgN\x8E\xF3`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\t\x81\x90U`@Q\x81\x81R\x7FQ\xD9\xFE\xFD\xD4\x81\x91\xBCu\xAB\x12\x11m^Q\x81\x96G\x99\xA69\xE1\xEE1\xB0\x99\x8F\xFA\xAF\x9E\xF2Y\x90` \x01a\x0C\xC2V[a\x0F\xA4a\x17rV[3a\x0F\xAE\x81a\x1D\tV[a'\x10\x82a\xFF\xFF\x16\x11\x15a\x0F\xD5W`@Qc\xDC\x81\xDB\x85`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x0C` R`@\x90 \x80Ta\xFF\xFF\x90\x81\x16\x90\x84\x16\x81\x90\x03a\x10\x17W`@Qc0\x82\xEB%`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80a\xFF\xFF\x16\x84a\xFF\xFF\x16\x11\x15a\x10\xA3W`\x01\x82\x01T\x80\x15\x80a\x10EWP`\tTa\x10A\x90\x82a8\xB6V[B\x10\x15[a\x10bW`@Qc\x16\xEB\x94\xCB`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\nTa\x10s\x90a\xFF\xFF\x16\x83a9\x8BV[a\xFF\xFF\x16\x85a\xFF\xFF\x16\x11\x15a\x10\x9BW`@Qc\x12\xD6\xA4e`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PB`\x01\x83\x01U[\x81Ta\xFF\xFF\x19\x16a\xFF\xFF\x85\x81\x16\x91\x82\x17\x84U`@\x80QB\x81R\x91\x84\x16` \x83\x01R\x81\x01\x91\x90\x91R`\x01`\x01`\xA0\x1B\x03\x84\x16\x90\x7F\xBD\x8Dv\xFC\xCA\xB3\x9D\xB7\x06K\xC0\x07\xD9\xA2\xC8:\x98$}\xCB\x10\x87\xCC\x12\xF3C\xB8\xBE\x90\xAE\xFDd\x90``\x01a\x0C\x16V[_Q` a<\xE2_9_Q\x90_Ra\x11\x16\x81a\x1A$V[a\x11\x1Ea\x1D\x8AV[PV[a\x11)a\x17rV[a\x113\x82\x82a\x1D\xE3V[\x80`\x0B_\x82\x82Ta\t\x9A\x91\x90a9\x06V[a\x11La\x1F\x95V[a\x11U\x82a 9V[a\x11_\x82\x82a AV[PPV[_Q` a=B_9_Q\x90_R\x80T`\x02\x91\x90`\x01`@\x1B\x90\x04`\xFF\x16\x80a\x11\x99WP\x80T`\x01`\x01`@\x1B\x03\x80\x84\x16\x91\x16\x10\x15[\x15a\x11\xB7W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80Th\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01`\x01`@\x1B\x03\x83\x16\x17`\x01`@\x1B\x17\x81Ua\x11\xE0a \xFDV[a\x11\xEA_\x87a\x1A.V[Pa\x12\x02_Q` a<\xE2_9_Q\x90_R\x88a\x1A.V[Pb\t:\x80`\tU`\n\x80Ta\xFF\xFF\x19\x16a\x01\xF4\x17\x90Ua\x12#\x84\x84a!\x05V[a\x12,\x85a\"\x9AV[\x80T`\xFF`@\x1B\x19\x16\x81U`@Q`\x01`\x01`@\x1B\x03\x83\x16\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1PPPPPPPV[_a\x12\x85a#)V[P_Q` a<\xC2_9_Q\x90_R\x90V[a\x12\x9Fa\x17rV[3a\x12\xA9\x81a\x1D\tV[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x03` R`@\x90 `\x01\x01\x80T`\xFF\x19\x16`\x02\x17\x90U`\x08Ta\x12\xDB\x90Ba8\xB6V[`\x01`\x01`\xA0\x1B\x03\x82\x16_\x90\x81R`\x05` \x90\x81R`@\x80\x83 \x93\x90\x93U`\x03\x90R\x90\x81 T`\x0B\x80T\x91\x92\x90\x91a\x13\x14\x90\x84\x90a9\x06V[\x90\x91UPP`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x90\x7F\xFB$0ST\xC8wb\xD5WHz\xE4\xA5d\xE8\xD0>\xCB\xB9\xA9}\xD8\xAF\xFF\x8E\x1Fo\xCA\xF0\xDD\x16\x90_\x90\xA2PV[a\x13Wa\x19@V[a\x13`_a#rV[V[_Q` a<\xE2_9_Q\x90_Ra\x13y\x81a\x1A$V[a\x11\x1Ea#\xE2V[_\x91\x82R_Q` a=\x02_9_Q\x90_R` \x90\x81R`@\x80\x84 `\x01`\x01`\xA0\x1B\x03\x93\x90\x93\x16\x84R\x91\x90R\x90 T`\xFF\x16\x90V[_\x81_\x01Q\x82` \x01Q\x83`@\x01Q\x84``\x01Q`@Q` \x01a\x13\xF4\x94\x93\x92\x91\x90\x93\x84R` \x84\x01\x92\x90\x92R`@\x83\x01R``\x82\x01R`\x80\x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[a\x14\x19a\x17rV[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x07` \x90\x81R`@\x80\x83 3\x80\x85R\x92R\x82 T\x90\x91\x81\x90\x03a\x14^W`@Qc\x06\x86\x82{`\xE5\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x84\x16_\x90\x81R`\x07` \x90\x81R`@\x80\x83 \x93\x86\x16\x83R\x92\x90R `\x01\x01TB\x10\x15a\x14\xA6W`@QcZwCW`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x84\x16_\x90\x81R`\x07` \x90\x81R`@\x80\x83 \x86\x85\x16\x84R\x90\x91R\x81 \x81\x81U`\x01\x01U`\x02Ta\x14\xE1\x91\x16\x83\x83a\x19\x9BV[\x81`\x01`\x01`\xA0\x1B\x03\x16\x7F\x7F\xCFS,\x15\xF0\xA6\xDB\x0B\xD6\xD0\xE08\xBE\xA7\x1D0\xD8\x08\xC7\xD9\x8C\xB3\xBFrh\xA9[\xF5\x08\x1Be\x82`@Qa\x15\x1C\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA2PPPV[a\x151a\x17rV[3a\x15;\x81a\x1D\tV[a\x15D\x84a\x1B#V[a\x15N\x85\x85a\x1B^V[`@\x80Q`\x01`\x01`\xA0\x1B\x03\x83\x16` \x82\x01R_\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90Pa\x15\x80\x81\x85\x88a\x1B\xD7V[`\x01`\x04_a\x15\x8E\x89a\x13\xB7V[\x81R` \x01\x90\x81R` \x01_ _a\x01\0\n\x81T\x81`\xFF\x02\x19\x16\x90\x83\x15\x15\x02\x17\x90UP\x81`\x01`\x01`\xA0\x1B\x03\x16\x7F\xC8\xC5\xB3z\xEC\x7F-\xDB\xD3\xA1\x90`D\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x18\x1BW=__>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x18?\x91\x90a:\x0BV[\x90P\x82\x81\x10\x15a\x18lW`@Qc\x05Ce\xBB`\xE3\x1B\x81R`\x04\x81\x01\x82\x90R`$\x81\x01\x84\x90R`D\x01a\x17`V[`\x02Ta\x18\x84\x90`\x01`\x01`\xA0\x1B\x03\x16\x830\x86a%\xD6V[`\x01`\x01`\xA0\x1B\x03\x84\x16_\x90\x81R`\x03` R`@\x81 \x80T\x85\x92\x90a\x18\xAB\x90\x84\x90a8\xB6V[\x90\x91UPP`\x01`\x01`\xA0\x1B\x03\x80\x85\x16_\x90\x81R`\x06` \x90\x81R`@\x80\x83 \x93\x86\x16\x83R\x92\x90R\x90\x81 \x80T\x85\x92\x90a\x18\xE6\x90\x84\x90a8\xB6V[\x92PP\x81\x90UP\x83`\x01`\x01`\xA0\x1B\x03\x16\x82`\x01`\x01`\xA0\x1B\x03\x16\x7F\xE5T\x1Aka\x03\xD4\xFA~\x02\x1E\xD5O\xAD9\xC6o'\xA7k\xD1=7L\xF6$\n\xE6\xBD\x0B\xB7+\x85`@Qa\x192\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPPV[3a\x19r\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x13`W`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\x17`V[_`@Qc\xA9\x05\x9C\xBB`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x84\x16`\x04\x82\x01R\x82`$\x82\x01R` _`D\x83_\x89Z\xF1\x91PP\x80`\x1F=\x11`\x01_Q\x14\x16\x15\x16\x15a\x19\xE5WP\x82;\x15=\x17\x15[\x80a\x0C\xE9W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0F`$\x82\x01Rn\x15\x14\x90S\x94\xD1\x91T\x97\xD1\x90RS\x11Q`\x8A\x1B`D\x82\x01R`d\x01a\x17`V[a\x11\x1E\x813a&sV[__Q` a=\x02_9_Q\x90_Ra\x1AG\x84\x84a\x13\x81V[a\x1A\xC6W_\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x84R\x90\x91R\x90 \x80T`\xFF\x19\x16`\x01\x17\x90Ua\x1A|3\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x83`\x01`\x01`\xA0\x1B\x03\x16\x85\x7F/\x87\x88\x11~~\xFF\x1D\x82\xE9&\xECyI\x01\xD1|x\x02JP'\t@0E@\xA73eo\r`@Q`@Q\x80\x91\x03\x90\xA4`\x01\x91PPa\tqV[_\x91PPa\tqV[P\x92\x91PPV[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x03` R`@\x81 `\x01\x01T`\xFF\x16`\x02\x81\x11\x15a\x1B\x05Wa\x1B\x05a8^V[\x14a\x11\x1EW`@Qc\x13.~\xFB`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x1B@\x82\x82a&\xACV[\x15a\x11_W`@Qc\x06\xCFC\x8F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x04_a\x1Bj\x84a\x13\xB7V[\x81R` \x81\x01\x91\x90\x91R`@\x01_ T`\xFF\x16\x15a\x1B\x9AW`@Qb\xDA\x8AW`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\r_a\x1B\xA6\x83a\x1ClV[\x81R` \x81\x01\x91\x90\x91R`@\x01_ T`\xFF\x16\x15a\x11_W`@Qc\xAEI;\x03`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x1B\xE0\x82a&\xCDV[_`@Q\x80``\x01`@R\x80`$\x81R` \x01a<~`$\x919\x90P_\x84\x82`@Q` \x01a\x1C\x10\x92\x91\x90a:9V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P_a\x1C+\x82a'4V[\x90Pa\x1CH\x81\x85a\x1C;\x88a(!V[a\x1CCa(\x98V[a)eV[a\x1CdW`@Qb\xCE\xD3\xE5`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPPPV[_\x81_\x01Q\x82` \x01Q`@Q` \x01a\x13\xF4\x92\x91\x90\x91\x82R` \x82\x01R`@\x01\x90V[__Q` a=\x02_9_Q\x90_Ra\x1C\xA9\x84\x84a\x13\x81V[\x15a\x1A\xC6W_\x84\x81R` \x82\x81R`@\x80\x83 `\x01`\x01`\xA0\x1B\x03\x87\x16\x80\x85R\x92R\x80\x83 \x80T`\xFF\x19\x16\x90UQ3\x92\x87\x91\x7F\xF69\x1F\\2\xD9\xC6\x9D*G\xEAg\x0BD)t\xB595\xD1\xED\xC7\xFDd\xEB!\xE0G\xA89\x17\x1B\x91\x90\xA4`\x01\x91PPa\tqV[`\x01`\x01`\xA0\x1B\x03\x81\x16_\x90\x81R`\x03` R`@\x81 `\x01\x01T`\xFF\x16\x90\x81`\x02\x81\x11\x15a\x1D:Wa\x1D:a8^V[\x03a\x1DXW`@QcP\x8Ay?`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x81`\x02\x81\x11\x15a\x1DlWa\x1Dla8^V[\x03a\x11_W`@Qc\xEA\xB4\xA9c`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x1D\x92a*\x14V[_Q` a=\"_9_Q\x90_R\x80T`\xFF\x19\x16\x81U\x7F]\xB9\xEE\nI[\xF2\xE6\xFF\x9C\x91\xA7\x83L\x1B\xA4\xFD\xD2D\xA5\xE8\xAANS{\xD3\x8A\xEA\xE4\xB0s\xAA3[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x0C\xC2V[a\x1D\xEC\x82a\x1D\tV[3_\x82\x90\x03a\x1E\x0EW`@Qc\x1F* \x05`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x84\x16_\x90\x81R`\x07` \x90\x81R`@\x80\x83 \x93\x85\x16\x83R\x92\x90R T\x15a\x1EQW`@Qc\xD4#\xA4\xF1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x80\x84\x16_\x90\x81R`\x06` \x90\x81R`@\x80\x83 \x93\x85\x16\x83R\x92\x90R T\x82\x81\x10\x15a\x1E\x9AW`@Qc\x92fSQ`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x17`V[`\x01`\x01`\xA0\x1B\x03\x80\x85\x16_\x90\x81R`\x06` \x90\x81R`@\x80\x83 \x93\x86\x16\x83R\x92\x90R\x90\x81 \x80T\x85\x92\x90a\x1E\xD0\x90\x84\x90a9\x06V[\x92PP\x81\x90UP`@Q\x80`@\x01`@R\x80\x84\x81R` \x01`\x08TBa\x1E\xF6\x91\x90a8\xB6V[\x90R`\x01`\x01`\xA0\x1B\x03\x80\x86\x16_\x81\x81R`\x07` \x90\x81R`@\x80\x83 \x94\x88\x16\x83R\x93\x81R\x83\x82 \x85Q\x81U\x94\x81\x01Q`\x01\x90\x95\x01\x94\x90\x94U\x90\x81R`\x03\x90\x92R\x81 \x80T\x85\x92\x90a\x1FI\x90\x84\x90a9\x06V[\x92PP\x81\x90UP\x83`\x01`\x01`\xA0\x1B\x03\x16\x82`\x01`\x01`\xA0\x1B\x03\x16\x7FM\x10\xBD\x04\x97u\xC7{\xD7\xF2U\x19Z\xFB\xA5\x08\x80(\xEC\xB3\xC7\xC2w\xD3\x93\xCC\xFFy4\xF2\xF9,\x85`@Qa\x192\x91\x81R` \x01\x90V[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14\x80a \x1BWP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x01`\x01`\xA0\x1B\x03\x16a \x0F_Q` a<\xC2_9_Q\x90_RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x13`W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x11\x1Ea\x19@V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a \x9BWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra \x98\x91\x81\x01\x90a:\x0BV[`\x01[a \xC3W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x17`V[_Q` a<\xC2_9_Q\x90_R\x81\x14a \xF3W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x17`V[a\x0F*\x83\x83a*CV[a\x13`a*\x98V[_[\x81\x81\x10\x15a\x0F*W_\x83\x83\x83\x81\x81\x10a!\"Wa!\"a:UV[a!8\x92` `@\x90\x92\x02\x01\x90\x81\x01\x91Pa4\x8EV[\x90P_\x84\x84\x84\x81\x81\x10a!MWa!Ma:UV[\x90P`@\x02\x01` \x01` \x81\x01\x90a!e\x91\x90a4\xBEV[\x90Pa'\x10\x81a\xFF\xFF\x16\x11\x15a!\x8EW`@Qc\xDC\x81\xDB\x85`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x82\x16_\x90\x81R`\x03` R`@\x81 `\x01\x01T`\xFF\x16\x90\x81`\x02\x81\x11\x15a!\xBFWa!\xBFa8^V[\x03a!\xDDW`@QcP\x8Ay?`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x83\x16_\x90\x81R`\x0C` R`@\x90 `\x01\x01T\x15\x80\x15a\"\x1EWP`\x01`\x01`\xA0\x1B\x03\x83\x16_\x90\x81R`\x0C` R`@\x90 Ta\xFF\xFF\x16\x15[\x83\x90a\"IW`@Qc\x05\x08\x14\xE1`\xE4\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x90\x91\x16`\x04\x82\x01R`$\x01a\x17`V[PP`@\x80Q\x80\x82\x01\x82Ra\xFF\xFF\x92\x83\x16\x81R_` \x80\x83\x01\x82\x81R`\x01`\x01`\xA0\x1B\x03\x96\x90\x96\x16\x82R`\x0C\x90R\x91\x90\x91 \x90Q\x81Ta\xFF\xFF\x19\x16\x92\x16\x91\x90\x91\x17\x81U\x90Q`\x01\x91\x82\x01U\x01a!\x07V[`\x02T`@Qcp\xA0\x821`\xE0\x1B\x81R0`\x04\x82\x01R`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x90cp\xA0\x821\x90`$\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\"\xE0W=__>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a#\x04\x91\x90a:\x0BV[\x81\x11\x15a#$W`@Qc=\x93OI`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x0BUV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x13`W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90_\x90\xA3PPPV[a#\xEAa\x17rV[_Q` a=\"_9_Q\x90_R\x80T`\xFF\x19\x16`\x01\x17\x81U\x7Fb\xE7\x8C\xEA\x01\xBE\xE3 \xCDNB\x02p\xB5\xEAt\0\r\x11\xB0\xC9\xF7GT\xEB\xDB\xFCTK\x05\xA2X3a\x1D\xCBV[a$2a*\x98V[a\x11\x1E\x81a*\xCEV[_Q` a=B_9_Q\x90_R\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16_\x81\x15\x80\x15a$lWP\x82[\x90P_\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a$\x87WP0;\x15[\x90P\x81\x15\x80\x15a$\x95WP\x80\x15[\x15a$\xB3W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a$\xDDW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[C_U\x83\x15a%&W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPV[`\x01`\x01`\xA0\x1B\x03\x83\x16a%TW`@Qc\xD9.#=`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x82\x16a%{W`@Qc\xD9.#=`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x02\x80T`\x01`\x01`\xA0\x1B\x03\x80\x86\x16`\x01`\x01`\xA0\x1B\x03\x19\x92\x83\x16\x17\x90\x92U`\x01\x80T\x92\x85\x16\x92\x90\x91\x16\x91\x90\x91\x17\x90U`Z\x80\x82\x10\x15a%\xCEW`@Qc\xB5~!\xDF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P`\x08UPPV[_`@Qc#\xB8r\xDD`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`\x01`\x01`\xA0\x1B\x03\x84\x16`$\x82\x01R\x82`D\x82\x01R` _`d\x83_\x8AZ\xF1\x91PP\x80`\x1F=\x11`\x01_Q\x14\x16\x15\x16\x15a&/WP\x83;\x15=\x17\x15[\x80a%&W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x14`$\x82\x01Rs\x15\x14\x90S\x94\xD1\x91T\x97\xD1\x94\x93\xD3W\xD1\x90RS\x11Q`b\x1B`D\x82\x01R`d\x01a\x17`V[a&}\x82\x82a\x13\x81V[a\x11_W`@Qc\xE2Q}?`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x81\x01\x83\x90R`D\x01a\x17`V[\x80Q\x82Q_\x91\x14\x80\x15a&\xC6WP\x81` \x01Q\x83` \x01Q\x14[\x93\x92PPPV[\x80Q` \x82\x01Q_\x91_Q` a<\xA2_9_Q\x90_R\x91\x15\x90\x15\x16\x15a&\xF3WPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x0F*W`@Qc'\x9E4S`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_a'Q\x83a*\xD6V[\x90P_Q` a<\xA2_9_Q\x90_R`\x03_\x82\x84\x85\t\x90P\x82\x80a'xWa'xa:iV[\x84\x82\t\x90P\x82\x80a'\x8BWa'\x8Ba:iV[\x82\x82\x08\x90P__a'\x9B\x83a,\xDEV[\x92P\x90P[\x80a(\x04W\x84\x80a'\xB3Wa'\xB3a:iV[`\x01\x87\x08\x95P\x84\x80a'\xC7Wa'\xC7a:iV[\x86\x87\t\x92P\x84\x80a'\xDAWa'\xDAa:iV[\x86\x84\t\x92P\x84\x80a'\xEDWa'\xEDa:iV[\x84\x84\x08\x92Pa'\xFB\x83a,\xDEV[\x92P\x90Pa'\xA0V[P`@\x80Q\x80\x82\x01\x90\x91R\x94\x85R` \x85\x01RP\x91\x94\x93PPPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a(HWP\x90V[`@Q\x80`@\x01`@R\x80\x83_\x01Q\x81R` \x01_Q` a<\xA2_9_Q\x90_R\x84` \x01Qa(y\x91\x90a:}V[a(\x90\x90_Q` a<\xA2_9_Q\x90_Ra9\x06V[\x90R\x92\x91PPV[a(\xBF`@Q\x80`\x80\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[___`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` _a\x01\x80\x83`\x08Z\xFA\x91PP_Q\x91P\x80a*\x08W`@Qc\xC2\x063O`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x15\x15\x95\x94PPPPPV[_Q` a=\"_9_Q\x90_RT`\xFF\x16a\x13`W`@Qc\x8D\xFC +`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a*L\x82a-\xA6V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90_\x90\xA2\x80Q\x15a*\x90Wa\x0F*\x82\x82a.\tV[a\x11_a.{V[_Q` a=B_9_Q\x90_RT`\x01`@\x1B\x90\x04`\xFF\x16a\x13`W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x17;a*\x98V[__a*\xE1\x83a.\x9AV[\x80Q\x90\x91P`0\x81\x14a*\xF6Wa*\xF6a:\x9CV[_\x81`\x01`\x01`@\x1B\x03\x81\x11\x15a+\x0FWa+\x0Fa3-V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a+9W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P_[\x82\x81\x10\x15a+\xA8W\x83`\x01a+S\x83\x86a9\x06V[a+]\x91\x90a9\x06V[\x81Q\x81\x10a+mWa+ma:UV[` \x01\x01Q`\xF8\x1C`\xF8\x1B\x82\x82\x81Q\x81\x10a+\x8AWa+\x8Aa:UV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81_\x1A\x90SP`\x01\x01a+>V[P`@\x80Q`\x1F\x80\x82Ra\x04\0\x82\x01\x90\x92R_\x90\x82` \x82\x01a\x03\xE0\x806\x837\x01\x90PP\x90P_[\x82\x81\x10\x15a,8W\x83\x81a+\xE4\x85\x88a9\x06V[a+\xEE\x91\x90a8\xB6V[\x81Q\x81\x10a+\xFEWa+\xFEa:UV[` \x01\x01Q`\xF8\x1C`\xF8\x1B`\xF8\x1C\x82\x82\x81Q\x81\x10a,\x1EWa,\x1Ea:UV[`\xFF\x90\x92\x16` \x92\x83\x02\x91\x90\x91\x01\x90\x91\x01R`\x01\x01a+\xD0V[P_a,C\x82a1\xE5V[\x90Pa\x01\0_Q` a<\xA2_9_Q\x90_R_a,a\x86\x89a9\x06V[\x90P_[\x81\x81\x10\x15a,\xCEW_\x88`\x01a,{\x84\x86a9\x06V[a,\x85\x91\x90a9\x06V[\x81Q\x81\x10a,\x95Wa,\x95a:UV[\x01` \x01Q`\xF8\x1C\x90P\x83\x80a,\xADWa,\xADa:iV[\x85\x87\t\x95P\x83\x80a,\xC0Wa,\xC0a:iV[\x81\x87\x08\x95PP`\x01\x01a,eV[P\x92\x9A\x99PPPPPPPPPPV[_____\x7F\x0C\x19\x13\x9C\xB8Lh\nn\x14\x11m\xA0`V\x17e\xE0Z\xA4Z\x1Cr\xA3O\x08#\x05\xB6\x1F?R\x90P__Q` a<\xA2_9_Q\x90_R\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x87``\x82\x01R\x82`\x80\x82\x01R\x81`\xA0\x82\x01R` _`\xC0\x83`\x05Z\xFA\x94PP_Q\x92P\x83a-lW`@Qc\x0C\x9D>\x99`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80`\x01\x84\x90\x1B\x11\x15a-\x85Wa-\x82\x83\x82a9\x06V[\x92P[\x80\x80a-\x93Wa-\x93a:iV[\x83\x84\t\x96\x90\x96\x14\x96\x91\x95P\x90\x93PPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;_\x03a-\xDBW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x17`V[_Q` a<\xC2_9_Q\x90_R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[``__\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa.%\x91\x90a:\xB0V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a.]W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a.bV[``\x91P[P\x91P\x91Pa.r\x85\x83\x83a2EV[\x95\x94PPPPPV[4\x15a\x13`W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@\x80Q`0\x80\x82R``\x82\x81\x01\x90\x93R\x90` \x90`\x01`\xF9\x1B\x90_\x90\x84` \x82\x01\x81\x806\x837\x01\x90PP\x90P\x80\x86`@Q` \x01a.\xDA\x92\x91\x90a:9V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x80\x84`\xF8\x1B`@Q` \x01a/\x01\x92\x91\x90a:\xBBV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x90P\x80`@Q` \x01a/#\x91\x90a:\xE5V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x90\x82\x90R\x91Pa\x01\x01`\xF0\x1B\x90a/M\x90\x83\x90\x83\x90` \x01a:\xFDV[`@\x80Q\x80\x83\x03`\x1F\x19\x01\x81R\x82\x82R\x80Q` \x91\x82\x01 \x81\x84\x01\x81\x90R`\x01`\xF8\x1B\x84\x84\x01R`\x01`\x01`\xF0\x1B\x03\x19\x85\x16`A\x85\x01R\x82Q`#\x81\x86\x03\x01\x81R`C\x90\x94\x01\x90\x92R\x82Q\x90\x83\x01 \x91\x93P\x90_`\xFF\x88\x16`\x01`\x01`@\x1B\x03\x81\x11\x15a/\xBCWa/\xBCa3-V[`@Q\x90\x80\x82R\x80`\x1F\x01`\x1F\x19\x16` \x01\x82\x01`@R\x80\x15a/\xE6W` \x82\x01\x81\x806\x837\x01\x90P[P\x90P_\x82`@Q` \x01a/\xFD\x91\x81R` \x01\x90V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x90P_[\x81Q\x81\x10\x15a0gW\x81\x81\x81Q\x81\x10a0,Wa0,a:UV[` \x01\x01Q`\xF8\x1C`\xF8\x1B\x83\x82\x81Q\x81\x10a0IWa0Ia:UV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81_\x1A\x90SP`\x01\x01a0\x11V[P_\x84`@Q` \x01a0|\x91\x81R` \x01\x90V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R` \x83\x01\x90\x91R_\x80\x83R\x91\x98P\x91P[\x89\x81\x10\x15a1\x0EW_\x83\x82\x81Q\x81\x10a0\xB5Wa0\xB5a:UV[` \x01\x01Q`\xF8\x1C`\xF8\x1B\x83\x83\x81Q\x81\x10a0\xD2Wa0\xD2a:UV[` \x01\x01Q`\xF8\x1C`\xF8\x1B\x18\x90P\x88\x81`@Q` \x01a0\xF3\x92\x91\x90a;!V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x98PP`\x01\x01a0\x9AV[P\x86\x88\x87`@Q` \x01a1$\x93\x92\x91\x90a;EV[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x96P\x86\x80Q\x90` \x01 \x93P\x83`@Q` \x01a1R\x91\x81R` \x01\x90V[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x91P_[a1s\x8A`\xFF\x8D\x16a9\x06V[\x81\x10\x15a1\xD4W\x82\x81\x81Q\x81\x10a1\x8CWa1\x8Ca:UV[\x01` \x01Q`\x01`\x01`\xF8\x1B\x03\x19\x16\x84a1\xA6\x83\x8Da8\xB6V[\x81Q\x81\x10a1\xB6Wa1\xB6a:UV[` \x01\x01\x90`\x01`\x01`\xF8\x1B\x03\x19\x16\x90\x81_\x1A\x90SP`\x01\x01a1fV[P\x91\x9B\x9APPPPPPPPPPPV[_\x80\x80[\x83Q\x81\x10\x15a\x1A\xCFW\x83\x81\x81Q\x81\x10a2\x04Wa2\x04a:UV[` \x02` \x01\x01Q`\xFF\x16\x81`\x08a2\x1C\x91\x90a;xV[a2'\x90`\x02aW__\xFD[a6J\x85\x82\x86\x01a5\x01V[\x91PP\x92P\x92\x90PV[_____`\x80\x86\x88\x03\x12\x15a6hW__\xFD[a6q\x86a2\xEAV[\x94Pa6\x7F` \x87\x01a2\xEAV[\x93P`@\x86\x015\x92P``\x86\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a6\xA0W__\xFD[\x86\x01`\x1F\x81\x01\x88\x13a6\xB0W__\xFD[\x805`\x01`\x01`@\x1B\x03\x81\x11\x15a6\xC5W__\xFD[\x88` \x82`\x06\x1B\x84\x01\x01\x11\x15a6\xD9W__\xFD[\x95\x98\x94\x97P\x92\x95PPP` \x01\x91\x90V[___a\x01\0\x84\x86\x03\x12\x15a6\xFDW__\xFD[a7\x07\x85\x85a3iV[\x92Pa7\x16\x85`\x80\x86\x01a3\xC9V[\x91Pa7%\x85`\xC0\x86\x01a3\xC9V[\x90P\x92P\x92P\x92V[_`\x80\x82\x84\x03\x12\x15a7>W__\xFD[a&\xC6\x83\x83a3iV[__`@\x83\x85\x03\x12\x15a7YW__\xFD[a7b\x83a2\xEAV[\x91Pa4\xF8` \x84\x01a2\xEAV[____a\x01 \x85\x87\x03\x12\x15a7\x84W__\xFD[a7\x8E\x86\x86a3iV[\x93Pa7\x9D\x86`\x80\x87\x01a3\xC9V[\x92Pa7\xAC\x86`\xC0\x87\x01a3\xC9V[\x91Pa\x01\0\x85\x015`\x01`\x01`@\x1B\x03\x81\x11\x15a7\xC7W__\xFD[a7\xD3\x87\x82\x88\x01a5\x01V[\x91PP\x92\x95\x91\x94P\x92PV[_\x81Q\x80\x84R\x80` \x84\x01` \x86\x01^_` \x82\x86\x01\x01R` `\x1F\x19`\x1F\x83\x01\x16\x85\x01\x01\x91PP\x92\x91PPV[` \x81R_a&\xC6` \x83\x01\x84a7\xDFV[____`\x80\x85\x87\x03\x12\x15a82W__\xFD[a8;\x85a2\xEAV[\x93Pa8I` \x86\x01a2\xEAV[\x92P`@\x85\x015\x91Pa4T``\x86\x01a2\xEAV[cNH{q`\xE0\x1B_R`!`\x04R`$_\xFD[\x82\x81R`@\x81\x01`\x03\x83\x10a8\x95WcNH{q`\xE0\x1B_R`!`\x04R`$_\xFD[\x82` \x83\x01R\x93\x92PPPV[cNH{q`\xE0\x1B_R`\x11`\x04R`$_\xFD[\x80\x82\x01\x80\x82\x11\x15a\tqWa\tqa8\xA2V[_` \x82\x84\x03\x12\x15a8\xD9W__\xFD[\x81Qa&\xC6\x81a4_V[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x02\x90\x81\x16\x90\x81\x81\x14a\x1A\xCFWa\x1A\xCFa8\xA2V[\x81\x81\x03\x81\x81\x11\x15a\tqWa\tqa8\xA2V[\x85Q\x81R` \x80\x87\x01Q\x90\x82\x01R`@\x80\x87\x01Q\x90\x82\x01R``\x80\x87\x01Q\x90\x82\x01R\x84Q`\x80\x82\x01R` \x85\x01Q`\xA0\x82\x01Ra\xFF\xFF\x84\x16`\xC0\x82\x01R\x82Q`\xE0\x82\x01R` \x83\x01Qa\x01\0\x82\x01Ra\x01@a\x01 \x82\x01R_a9\x80a\x01@\x83\x01\x84a7\xDFV[\x97\x96PPPPPPPV[a\xFF\xFF\x81\x81\x16\x83\x82\x16\x01\x90\x81\x11\x15a\tqWa\tqa8\xA2V[\x84Q\x81R` \x80\x86\x01Q\x90\x82\x01R`@\x80\x86\x01Q\x90\x82\x01R``\x80\x86\x01Q\x90\x82\x01R\x83Q`\x80\x82\x01R` \x84\x01Q`\xA0\x82\x01R\x82Q`\xC0\x82\x01R` \x83\x01Q`\xE0\x82\x01Ra\x01 a\x01\0\x82\x01R_a:\x01a\x01 \x83\x01\x84a7\xDFV[\x96\x95PPPPPPV[_` \x82\x84\x03\x12\x15a:\x1BW__\xFD[PQ\x91\x90PV[_\x81Q\x80` \x84\x01\x85^_\x93\x01\x92\x83RP\x90\x91\x90PV[_a:Ma:G\x83\x86a:\"V[\x84a:\"V[\x94\x93PPPPV[cNH{q`\xE0\x1B_R`2`\x04R`$_\xFD[cNH{q`\xE0\x1B_R`\x12`\x04R`$_\xFD[_\x82a:\x97WcNH{q`\xE0\x1B_R`\x12`\x04R`$_\xFD[P\x06\x90V[cNH{q`\xE0\x1B_R`\x01`\x04R`$_\xFD[_a&\xC6\x82\x84a:\"V[_a:\xC6\x82\x85a:\"V[_\x81R`\x01`\x01`\xF8\x1B\x03\x19\x93\x90\x93\x16`\x01\x84\x01RPP`\x02\x01\x91\x90PV[_a:\xF0\x82\x84a:\"V[_\x81R`\x01\x01\x93\x92PPPV[_a;\x08\x82\x85a:\"V[`\x01`\x01`\xF0\x1B\x03\x19\x93\x90\x93\x16\x83RPP`\x02\x01\x91\x90PV[_a;,\x82\x85a:\"V[`\x01`\x01`\xF8\x1B\x03\x19\x93\x90\x93\x16\x83RPP`\x01\x01\x91\x90PV[_a;P\x82\x86a:\"V[`\x01`\x01`\xF8\x1B\x03\x19\x94\x90\x94\x16\x84RPP`\x01`\x01`\xF0\x1B\x03\x19\x16`\x01\x82\x01R`\x03\x01\x91\x90PV[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a\tqWa\tqa8\xA2V[`\x01\x81[`\x01\x84\x11\x15a;\xCAW\x80\x85\x04\x81\x11\x15a;\xAEWa;\xAEa8\xA2V[`\x01\x84\x16\x15a;\xBCW\x90\x81\x02\x90[`\x01\x93\x90\x93\x1C\x92\x80\x02a;\x93V[\x93P\x93\x91PPV[_\x82a;\xE0WP`\x01a\tqV[\x81a;\xECWP_a\tqV[\x81`\x01\x81\x14a<\x02W`\x02\x81\x14a<\x0CWa<(V[`\x01\x91PPa\tqV[`\xFF\x84\x11\x15a<\x1DWa<\x1Da8\xA2V[PP`\x01\x82\x1Ba\tqV[P` \x83\x10a\x013\x83\x10\x16`N\x84\x10`\x0B\x84\x10\x16\x17\x15a v\xCC75\xA9 \xA3\xCAP]8+\xBCe\xD7\xA2\x8E2e\xB3zdt\x92\x9F3e!\xB32\xC1h\x1B\x93?l\xB9\xF37fsD\r\x86*\x02\xDD{\xC7\xDE\xC4\xDC\xEE\xDD\xA7u\xE5\x8D\xD5A\xE0\x8A\x11llS\x81\\\x0B\xD0(\x19/{bh\0\xCD^\xD1\\n\x18~w\xE9\xAE\xE8\x81\x84\xC2\x1FO!\x82\xABX'\xCB;~\x07\xFB\xED\xCDc\xF03\0\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\xA1dsolcC\0\x08\x1C\0\n", ); #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] @@ -4977,6 +5002,82 @@ error FailedInnerCall(); }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Custom error with signature `InitialActiveStakeExceedsBalance()` and selector `0x7b269e92`. +```solidity +error InitialActiveStakeExceedsBalance(); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct InitialActiveStakeExceedsBalance; + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + #[allow(dead_code)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From + for UnderlyingRustTuple<'_> { + fn from(value: InitialActiveStakeExceedsBalance) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> + for InitialActiveStakeExceedsBalance { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for InitialActiveStakeExceedsBalance { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "InitialActiveStakeExceedsBalance()"; + const SELECTOR: [u8; 4] = [123u8, 38u8, 158u8, 146u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_raw_validate(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(Self::new) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Custom error with signature `InsufficientAllowance(uint256,uint256)` and selector `0x2a1b2dd8`. ```solidity error InsufficientAllowance(uint256, uint256); @@ -9851,6 +9952,153 @@ function _hashBlsKey(BN254.G2Point memory blsVK) external pure returns (bytes32) }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] + /**Function with signature `activeStake()` and selector `0xbd49c35f`. +```solidity +function activeStake() external view returns (uint256); +```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct activeStakeCall; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] + ///Container type for the return parameters of the [`activeStake()`](activeStakeCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct activeStakeReturn { + #[allow(missing_docs)] + pub _0: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + #[allow(dead_code)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: activeStakeCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for activeStakeCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self + } + } + } + { + #[doc(hidden)] + #[allow(dead_code)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion( + _t: alloy_sol_types::private::AssertTypeEq, + ) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: activeStakeReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for activeStakeReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for activeStakeCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = alloy::sol_types::private::primitives::aliases::U256; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "activeStake()"; + const SELECTOR: [u8; 4] = [189u8, 73u8, 195u8, 95u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn tokenize_returns(ret: &Self::Return) -> Self::ReturnToken<'_> { + ( + as alloy_sol_types::SolType>::tokenize(ret), + ) + } + #[inline] + fn abi_decode_returns(data: &[u8]) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence(data) + .map(|r| { + let r: activeStakeReturn = r.into(); + r._0 + }) + } + #[inline] + fn abi_decode_returns_validate( + data: &[u8], + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence_validate(data) + .map(|r| { + let r: activeStakeReturn = r.into(); + r._0 + }) + } + } + }; + #[derive(serde::Serialize, serde::Deserialize)] + #[derive(Default, Debug, PartialEq, Eq, Hash)] /**Function with signature `blsKeys(bytes32)` and selector `0xb3e6ebd5`. ```solidity function blsKeys(bytes32 blsKeyHash) external view returns (bool used); @@ -11929,9 +12177,9 @@ function initialize(address _tokenAddress, address _lightClientAddress, uint256 }; #[derive(serde::Serialize, serde::Deserialize)] #[derive(Default, Debug, PartialEq, Eq, Hash)] - /**Function with signature `initializeV2(address,address,(address,uint16)[])` and selector `0xc75f543e`. + /**Function with signature `initializeV2(address,address,uint256,(address,uint16)[])` and selector `0x52780b6e`. ```solidity -function initializeV2(address pauser, address admin, InitialCommission[] memory initialCommissions) external; +function initializeV2(address pauser, address admin, uint256 initialActiveStake, InitialCommission[] memory initialCommissions) external; ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] @@ -11941,11 +12189,13 @@ function initializeV2(address pauser, address admin, InitialCommission[] memory #[allow(missing_docs)] pub admin: alloy::sol_types::private::Address, #[allow(missing_docs)] + pub initialActiveStake: alloy::sol_types::private::primitives::aliases::U256, + #[allow(missing_docs)] pub initialCommissions: alloy::sol_types::private::Vec< ::RustType, >, } - ///Container type for the return parameters of the [`initializeV2(address,address,(address,uint16)[])`](initializeV2Call) function. + ///Container type for the return parameters of the [`initializeV2(address,address,uint256,(address,uint16)[])`](initializeV2Call) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] pub struct initializeV2Return {} @@ -11963,12 +12213,14 @@ function initializeV2(address pauser, address admin, InitialCommission[] memory type UnderlyingSolTuple<'a> = ( alloy::sol_types::sol_data::Address, alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Uint<256>, alloy::sol_types::sol_data::Array, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( alloy::sol_types::private::Address, alloy::sol_types::private::Address, + alloy::sol_types::private::primitives::aliases::U256, alloy::sol_types::private::Vec< ::RustType, >, @@ -11988,7 +12240,12 @@ function initializeV2(address pauser, address admin, InitialCommission[] memory #[doc(hidden)] impl ::core::convert::From for UnderlyingRustTuple<'_> { fn from(value: initializeV2Call) -> Self { - (value.pauser, value.admin, value.initialCommissions) + ( + value.pauser, + value.admin, + value.initialActiveStake, + value.initialCommissions, + ) } } #[automatically_derived] @@ -11998,7 +12255,8 @@ function initializeV2(address pauser, address admin, InitialCommission[] memory Self { pauser: tuple.0, admin: tuple.1, - initialCommissions: tuple.2, + initialActiveStake: tuple.2, + initialCommissions: tuple.3, } } } @@ -12047,6 +12305,7 @@ function initializeV2(address pauser, address admin, InitialCommission[] memory type Parameters<'a> = ( alloy::sol_types::sol_data::Address, alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Uint<256>, alloy::sol_types::sol_data::Array, ); type Token<'a> = = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "initializeV2(address,address,(address,uint16)[])"; - const SELECTOR: [u8; 4] = [199u8, 95u8, 84u8, 62u8]; + const SIGNATURE: &'static str = "initializeV2(address,address,uint256,(address,uint16)[])"; + const SELECTOR: [u8; 4] = [82u8, 120u8, 11u8, 110u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -12074,6 +12333,9 @@ function initializeV2(address pauser, address admin, InitialCommission[] memory ::tokenize( &self.admin, ), + as alloy_sol_types::SolType>::tokenize(&self.initialActiveStake), as alloy_sol_types::SolType>::tokenize(&self.initialCommissions), @@ -16648,6 +16910,8 @@ function validators(address account) external view returns (uint256 delegatedAmo #[allow(missing_docs)] _hashBlsKey(_hashBlsKeyCall), #[allow(missing_docs)] + activeStake(activeStakeCall), + #[allow(missing_docs)] blsKeys(blsKeysCall), #[allow(missing_docs)] claimValidatorExit(claimValidatorExitCall), @@ -16761,6 +17025,7 @@ function validators(address account) external view returns (uint256 delegatedAmo [63u8, 75u8, 168u8, 58u8], [77u8, 153u8, 221u8, 22u8], [79u8, 30u8, 242u8, 134u8], + [82u8, 120u8, 11u8, 110u8], [82u8, 209u8, 144u8, 45u8], [85u8, 68u8, 194u8, 241u8], [92u8, 151u8, 90u8, 187u8], @@ -16781,9 +17046,9 @@ function validators(address account) external view returns (uint256 delegatedAmo [179u8, 230u8, 235u8, 213u8], [181u8, 112u8, 14u8, 104u8], [181u8, 236u8, 179u8, 68u8], + [189u8, 73u8, 195u8, 95u8], [190u8, 32u8, 48u8, 148u8], [198u8, 72u8, 20u8, 221u8], - [199u8, 95u8, 84u8, 62u8], [213u8, 71u8, 116u8, 31u8], [217u8, 204u8, 125u8, 38u8], [230u8, 58u8, 177u8, 233u8], @@ -16796,7 +17061,7 @@ function validators(address account) external view returns (uint256 delegatedAmo impl alloy_sol_types::SolInterface for StakeTableV2Calls { const NAME: &'static str = "StakeTableV2Calls"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 47usize; + const COUNT: usize = 48usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -16812,6 +17077,9 @@ function validators(address account) external view returns (uint256 delegatedAmo Self::_hashBlsKey(_) => { <_hashBlsKeyCall as alloy_sol_types::SolCall>::SELECTOR } + Self::activeStake(_) => { + ::SELECTOR + } Self::blsKeys(_) => ::SELECTOR, Self::claimValidatorExit(_) => { ::SELECTOR @@ -17136,6 +17404,17 @@ function validators(address account) external view returns (uint256 delegatedAmo } upgradeToAndCall }, + { + fn initializeV2( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(StakeTableV2Calls::initializeV2) + } + initializeV2 + }, { fn proxiableUUID( data: &[u8], @@ -17342,6 +17621,17 @@ function validators(address account) external view returns (uint256 delegatedAmo } validatorExits }, + { + fn activeStake( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(StakeTableV2Calls::activeStake) + } + activeStake + }, { fn initialize( data: &[u8], @@ -17364,17 +17654,6 @@ function validators(address account) external view returns (uint256 delegatedAmo } delegations }, - { - fn initializeV2( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, - ) - .map(StakeTableV2Calls::initializeV2) - } - initializeV2 - }, { fn revokeRole( data: &[u8], @@ -17655,6 +17934,17 @@ function validators(address account) external view returns (uint256 delegatedAmo } upgradeToAndCall }, + { + fn initializeV2( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(StakeTableV2Calls::initializeV2) + } + initializeV2 + }, { fn proxiableUUID( data: &[u8], @@ -17871,6 +18161,17 @@ function validators(address account) external view returns (uint256 delegatedAmo } validatorExits }, + { + fn activeStake( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(StakeTableV2Calls::activeStake) + } + activeStake + }, { fn initialize( data: &[u8], @@ -17893,17 +18194,6 @@ function validators(address account) external view returns (uint256 delegatedAmo } delegations }, - { - fn initializeV2( - data: &[u8], - ) -> alloy_sol_types::Result { - ::abi_decode_raw_validate( - data, - ) - .map(StakeTableV2Calls::initializeV2) - } - initializeV2 - }, { fn revokeRole( data: &[u8], @@ -18002,6 +18292,11 @@ function validators(address account) external view returns (uint256 delegatedAmo inner, ) } + Self::activeStake(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::blsKeys(inner) => { ::abi_encoded_size(inner) } @@ -18218,6 +18513,12 @@ function validators(address account) external view returns (uint256 delegatedAmo out, ) } + Self::activeStake(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } Self::blsKeys(inner) => { ::abi_encode_raw(inner, out) } @@ -18497,6 +18798,8 @@ function validators(address account) external view returns (uint256 delegatedAmo #[allow(missing_docs)] FailedInnerCall(FailedInnerCall), #[allow(missing_docs)] + InitialActiveStakeExceedsBalance(InitialActiveStakeExceedsBalance), + #[allow(missing_docs)] InsufficientAllowance(InsufficientAllowance), #[allow(missing_docs)] InsufficientBalance(InsufficientBalance), @@ -18572,6 +18875,7 @@ function validators(address account) external view returns (uint256 delegatedAmo [90u8, 119u8, 67u8, 87u8], [102u8, 151u8, 178u8, 50u8], [103u8, 78u8, 142u8, 243u8], + [123u8, 38u8, 158u8, 146u8], [141u8, 252u8, 32u8, 43u8], [146u8, 102u8, 83u8, 81u8], [153u8, 115u8, 247u8, 216u8], @@ -18601,7 +18905,7 @@ function validators(address account) external view returns (uint256 delegatedAmo impl alloy_sol_types::SolInterface for StakeTableV2Errors { const NAME: &'static str = "StakeTableV2Errors"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 41usize; + const COUNT: usize = 42usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -18656,6 +18960,9 @@ function validators(address account) external view returns (uint256 delegatedAmo Self::FailedInnerCall(_) => { ::SELECTOR } + Self::InitialActiveStakeExceedsBalance(_) => { + ::SELECTOR + } Self::InsufficientAllowance(_) => { ::SELECTOR } @@ -18941,6 +19248,17 @@ function validators(address account) external view returns (uint256 delegatedAmo } InvalidRateLimitParameters }, + { + fn InitialActiveStakeExceedsBalance( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + ) + .map(StakeTableV2Errors::InitialActiveStakeExceedsBalance) + } + InitialActiveStakeExceedsBalance + }, { fn ExpectedPause( data: &[u8], @@ -19408,6 +19726,17 @@ function validators(address account) external view returns (uint256 delegatedAmo } InvalidRateLimitParameters }, + { + fn InitialActiveStakeExceedsBalance( + data: &[u8], + ) -> alloy_sol_types::Result { + ::abi_decode_raw_validate( + data, + ) + .map(StakeTableV2Errors::InitialActiveStakeExceedsBalance) + } + InitialActiveStakeExceedsBalance + }, { fn ExpectedPause( data: &[u8], @@ -19756,6 +20085,11 @@ function validators(address account) external view returns (uint256 delegatedAmo inner, ) } + Self::InitialActiveStakeExceedsBalance(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::InsufficientAllowance(inner) => { ::abi_encoded_size( inner, @@ -19977,6 +20311,12 @@ function validators(address account) external view returns (uint256 delegatedAmo out, ) } + Self::InitialActiveStakeExceedsBalance(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } Self::InsufficientAllowance(inner) => { ::abi_encode_raw( inner, @@ -20761,6 +21101,12 @@ the bytecode concatenated with the constructor's ABI-encoded arguments.*/ ) -> alloy_contract::SolCallBuilder<&P, _hashBlsKeyCall, N> { self.call_builder(&_hashBlsKeyCall { blsVK }) } + ///Creates a new call builder for the [`activeStake`] function. + pub fn activeStake( + &self, + ) -> alloy_contract::SolCallBuilder<&P, activeStakeCall, N> { + self.call_builder(&activeStakeCall) + } ///Creates a new call builder for the [`blsKeys`] function. pub fn blsKeys( &self, @@ -20881,6 +21227,7 @@ the bytecode concatenated with the constructor's ABI-encoded arguments.*/ &self, pauser: alloy::sol_types::private::Address, admin: alloy::sol_types::private::Address, + initialActiveStake: alloy::sol_types::private::primitives::aliases::U256, initialCommissions: alloy::sol_types::private::Vec< ::RustType, >, @@ -20889,6 +21236,7 @@ the bytecode concatenated with the constructor's ABI-encoded arguments.*/ &initializeV2Call { pauser, admin, + initialActiveStake, initialCommissions, }, ) diff --git a/contracts/rust/deployer/src/lib.rs b/contracts/rust/deployer/src/lib.rs index 94bc349590..2b93b0b8a0 100644 --- a/contracts/rust/deployer/src/lib.rs +++ b/contracts/rust/deployer/src/lib.rs @@ -959,6 +959,60 @@ pub async fn fetch_commissions_for_stake_table_storage_migration( Ok(initial_commissions) } +/// Read active stake from L1 StakeTable V1 Delegated events for V2 migration +/// +/// Assumes an infura RPC is used, otherwise it may hit other rate limits. +pub async fn fetch_active_stake_for_stake_table_storage_migration_to_v2( + l1_provider: impl Provider, + stake_table_address: Address, +) -> Result { + let stake_table = StakeTable::new(stake_table_address, &l1_provider); + + // Verify this is a V1 contract + let version = stake_table.getVersion().call().await?; + if version.majorVersion != 1 { + anyhow::bail!( + "Expected StakeTable V1 for active stake migration, found V{}", + version.majorVersion + ); + } + + let start_block = stake_table.initializedAtBlock().call().await?.to::(); + + tracing::info!( + "Reading Delegated events from L1 StakeTable V1 starting at block {}", + start_block + ); + + // Query Delegated events (V1) to get initial active stake values + let delegated_events = stake_table + .Delegated_filter() + .from_block(start_block) + .query() + .await + .context("Failed to query Delegated events from V1 contract")?; + + // Create a vec to store active stake values + let mut initial_active_stake = U256::ZERO; + + for (event, _log) in delegated_events { + tracing::debug!( + "Delegated: delegator={:?}, validator={:?}, amount={}", + event.delegator, + event.validator, + event.amount + ); + initial_active_stake += event.amount; + } + + tracing::info!( + "Found {} active stake to migrate from V1", + initial_active_stake + ); + + Ok(initial_active_stake) +} + /// Prepare the upgrade data for StakeTable V2, checking version and fetching commissions if needed. /// /// Returns: @@ -969,7 +1023,11 @@ pub async fn prepare_stake_table_v2_upgrade( proxy_addr: Address, pauser: Address, admin: Address, -) -> Result<(Option>, Option)> { +) -> Result<( + Option>, + Option, + Option, +)> { let proxy = StakeTable::new(proxy_addr, &provider); let current_version = proxy.getVersion().call().await?; @@ -1001,26 +1059,33 @@ pub async fn prepare_stake_table_v2_upgrade( fetch_commissions_for_stake_table_storage_migration(&provider, proxy_addr).await?; tracing::info!("Fetched {} commissions from V1 contract", commissions.len()); + tracing::info!("Fetching active stake from V1 contract for migration"); + let active_stake = + fetch_active_stake_for_stake_table_storage_migration_to_v2(&provider, proxy_addr) + .await?; + tracing::info!("Fetched {} active stake from V1 contract", active_stake); + tracing::info!( %pauser, %admin, + active_stake = %format!("{:?} wei", active_stake), commission_count = commissions.len(), "Init Data to be signed. Function: initializeV2", ); // We can use any address here since we're just building calldata let data = StakeTableV2::new(Address::ZERO, &provider) - .initializeV2(pauser, admin, commissions.clone()) + .initializeV2(pauser, admin, active_stake, commissions.clone()) .calldata() .to_owned(); - Ok((Some(commissions), Some(data))) + Ok((Some(commissions), Some(active_stake), Some(data))) } else { tracing::info!( "Proxy was already initialized for version {}", target_version ); - Ok((None, None)) + Ok((None, None, None)) } } @@ -1037,7 +1102,7 @@ pub async fn upgrade_stake_table_v2( }; // First prepare upgrade data (including fetching commissions if needed) - let (init_commissions, init_data) = + let (init_commissions, init_active_stake, init_data) = prepare_stake_table_v2_upgrade(&provider, proxy_addr, pauser, admin).await?; // Then deploy the new implementation @@ -1079,6 +1144,13 @@ pub async fn upgrade_stake_table_v2( } } + tracing::info!("Verifying migrated active stake"); + assert_eq!( + proxy_as_v2.activeStake().call().await?, + init_active_stake.unwrap_or_default(), + "migrated active stake does not match" + ); + tracing::info!(%v2_addr, "StakeTable successfully upgraded to"); } else { anyhow::bail!("StakeTable upgrade failed: {:?}", receipt); @@ -1741,6 +1813,128 @@ mod tests { Ok(()) } + #[test_log::test(tokio::test)] + async fn test_fetch_active_stake_for_stake_table_storage_migration_to_v2() -> Result<()> { + let provider = ProviderBuilder::new().connect_anvil_with_wallet(); + let mut contracts = Contracts::new(); + let owner = provider.get_accounts().await?[0]; + + let token_addr = deploy_token_proxy( + &provider, + &mut contracts, + owner, + owner, + U256::from(10_000_000u64), + "Test Token", + "TEST", + ) + .await?; + let lc_addr = deploy_light_client_contract(&provider, &mut contracts, false).await?; + let exit_escrow_period = U256::from(1000); + + let stake_table_proxy_addr = deploy_stake_table_proxy( + &provider, + &mut contracts, + token_addr, + lc_addr, + exit_escrow_period, + owner, + ) + .await?; + + // Use V2 interface even for V1 contract (V2 ABI is a superset of V1) + let stake_table = StakeTableV2::new(stake_table_proxy_addr, &provider); + + let accounts = provider.get_accounts().await?; + let test_delegators = [ + (accounts[0], U256::from(1000)), + (accounts[1], U256::from(1000)), + (accounts[2], U256::from(10_000)), + ]; + + let mut rng = StdRng::from_seed([42u8; 32]); + let validator_addr = accounts[4]; + let commission = 0; + let bls_key_pair = BLSKeyPair::generate(&mut rng); + let state_key_pair = StateKeyPair::generate_from_seed(rng.gen()); + let bls_vk_sol: G2PointSol = bls_key_pair.ver_key().to_affine().into(); + let bls_sig_sol: G1PointSol = + sign_address_bls(&bls_key_pair, Address::from(*validator_addr)).into(); + let schnorr_vk_sol: EdOnBN254PointSol = state_key_pair.ver_key().to_affine().into(); + + let receipt = stake_table + .registerValidator(bls_vk_sol, schnorr_vk_sol, bls_sig_sol.into(), commission) + .from(Address::from(*validator_addr)) + .send() + .await? + .get_receipt() + .await?; + assert!(receipt.status()); + + let token = EspToken::new(token_addr, &provider); + + for (delegator_addr, amount) in test_delegators.iter() { + let _receipt = token + .transfer(*delegator_addr, *amount) + .from(Address::from(*owner)) + .send() + .await? + .get_receipt() + .await?; + + let receipt = token + .approve(stake_table_proxy_addr, *amount) + .from(*delegator_addr) + .send() + .await? + .get_receipt() + .await?; + assert!(receipt.status()); + + let receipt = stake_table + .delegate(validator_addr, *amount) + .from(*delegator_addr) + .send() + .await? + .get_receipt() + .await?; + assert!(receipt.status()); + } + + let fetched_active_stake = fetch_active_stake_for_stake_table_storage_migration_to_v2( + &provider, + stake_table_proxy_addr, + ) + .await?; + + assert_eq!( + fetched_active_stake, + test_delegators + .iter() + .map(|(_, amount)| *amount) + .sum::(), + ); + + assert!( + fetched_active_stake <= token.balanceOf(stake_table_proxy_addr).call().await?, + "fetched active stake should not exceed contract balance" + ); + + // Migration only applies to V1 contract + let stake_table_v2 = StakeTableV2::deploy(&provider).await?; + let err = fetch_active_stake_for_stake_table_storage_migration_to_v2( + &provider, + *stake_table_v2.address(), + ) + .await + .unwrap_err(); + assert!(err + .to_string() + .contains("Expected StakeTable V1 for active stake migration, found V2")); + + Ok(()) + } + /// Check that we can fetch the commissions on sepolia where we will do the /// commission migration. /// @@ -1773,10 +1967,18 @@ mod tests { ); } + let fetched_active_stake = fetch_active_stake_for_stake_table_storage_migration_to_v2( + &provider, + stake_table_address, + ) + .await?; + assert!(!fetched_active_stake.is_zero()); + println!("Fetched active stake: {}", fetched_active_stake); + let pauser = Address::random(); let admin = Address::random(); let init_v2_calldata = StakeTableV2::new(stake_table_address, &provider) - .initializeV2(pauser, admin, fetched_commissions) + .initializeV2(pauser, admin, fetched_active_stake, fetched_commissions) .calldata() .clone(); println!("Calldata size: {} bytes", init_v2_calldata.len()); diff --git a/contracts/rust/deployer/src/proposals/multisig.rs b/contracts/rust/deployer/src/proposals/multisig.rs index ae2f8244a6..ec4e89d4fe 100644 --- a/contracts/rust/deployer/src/proposals/multisig.rs +++ b/contracts/rust/deployer/src/proposals/multisig.rs @@ -625,7 +625,7 @@ pub async fn upgrade_stake_table_v2_multisig_owner( } // TODO: check if owner is a SAFE multisig - let (_init_commissions, init_data) = + let (_init_commissions, _init_active_stake, init_data) = crate::prepare_stake_table_v2_upgrade(&provider, proxy_addr, pauser, owner_addr).await?; let stake_table_v2_addr = contracts diff --git a/contracts/src/StakeTableV2.sol b/contracts/src/StakeTableV2.sol index d77214488e..47c2efe19b 100644 --- a/contracts/src/StakeTableV2.sol +++ b/contracts/src/StakeTableV2.sol @@ -57,6 +57,10 @@ import { SafeTransferLib } from "solmate/utils/SafeTransferLib.sol"; /// /// 8. The commission rate for validators can be updated with the `updateCommission` function. /// +/// 9. The `activeStake` variable is added to allow governance to +/// track the total stake in the contract. The activeStake is the +/// total stake that is not awaiting exit or in exited state. +/// /// @notice The StakeTableV2 contract ABI is a superset of the original ABI. Consumers of the /// contract can use the V2 ABI, even if they would like to maintain backwards compatibility. contract StakeTableV2 is StakeTable, PausableUpgradeable, AccessControlUpgradeable { @@ -84,6 +88,9 @@ contract StakeTableV2 is StakeTable, PausableUpgradeable, AccessControlUpgradeab /// @notice Maximum commission increase allowed per increase (in basis points) uint16 public maxCommissionIncrease; + /// @notice Total stake in active (not marked for exit) validators in the contract + uint256 public activeStake; + /// @notice Commission tracking for each validator mapping(address validator => CommissionTracking tracking) public commissionTracking; @@ -163,6 +170,9 @@ contract StakeTableV2 is StakeTable, PausableUpgradeable, AccessControlUpgradeab /// The validator commission has already been initialized error CommissionAlreadyInitialized(address validator); + /// The initial active stake exceeds the balance of the contract + error InitialActiveStakeExceedsBalance(); + /// The Schnorr key has been previously registered in the contract. error SchnorrKeyAlreadyUsed(); @@ -176,6 +186,7 @@ contract StakeTableV2 is StakeTable, PausableUpgradeable, AccessControlUpgradeab /// /// @param admin The address to be granted the default admin role /// @param pauser The address to be granted the pauser role + /// @param initialActiveStake The initial active stake in the contract /// @param initialCommissions commissions of validators /// /// @notice initialCommissions must be an empty array if the contract we're @@ -187,6 +198,7 @@ contract StakeTableV2 is StakeTable, PausableUpgradeable, AccessControlUpgradeab function initializeV2( address pauser, address admin, + uint256 initialActiveStake, InitialCommission[] calldata initialCommissions ) public reinitializer(2) { __AccessControl_init(); @@ -201,6 +213,7 @@ contract StakeTableV2 is StakeTable, PausableUpgradeable, AccessControlUpgradeab // initialize commissions (if the contract under upgrade has existing state) _initializeCommissions(initialCommissions); + _initializeActiveStake(initialActiveStake); } /// @notice Get the version of the contract @@ -263,7 +276,23 @@ contract StakeTableV2 is StakeTable, PausableUpgradeable, AccessControlUpgradeab /// @param validator The validator to withdraw from /// @dev This function is overridden to add pausable functionality function claimWithdrawal(address validator) public virtual override whenNotPaused { - super.claimWithdrawal(validator); + address delegator = msg.sender; + // If entries are missing at any of the levels of the mapping this will return zero + uint256 amount = undelegations[validator][delegator].amount; + if (amount == 0) { + revert NothingToWithdraw(); + } + + if (block.timestamp < undelegations[validator][delegator].unlocksAt) { + revert PrematureWithdrawal(); + } + + // Mark funds as spent + delete undelegations[validator][delegator]; + + SafeTransferLib.safeTransfer(token, delegator, amount); + + emit Withdrawal(delegator, amount); } /// @notice Delegate funds to a validator @@ -272,6 +301,7 @@ contract StakeTableV2 is StakeTable, PausableUpgradeable, AccessControlUpgradeab /// @dev This function is overridden to add pausable functionality function delegate(address validator, uint256 amount) public virtual override whenNotPaused { super.delegate(validator, amount); + activeStake += amount; } /// @notice Undelegate funds from a validator @@ -280,6 +310,7 @@ contract StakeTableV2 is StakeTable, PausableUpgradeable, AccessControlUpgradeab /// @dev This function is overridden to add pausable functionality function undelegate(address validator, uint256 amount) public virtual override whenNotPaused { super.undelegate(validator, amount); + activeStake -= amount; } /// @notice Deregister a validator @@ -295,6 +326,7 @@ contract StakeTableV2 is StakeTable, PausableUpgradeable, AccessControlUpgradeab validatorExits[validator] = block.timestamp + exitEscrowPeriod; // in v2, the delegatedAmount is not updated until withdrawal + activeStake -= validators[validator].delegatedAmount; emit ValidatorExit(validator); } @@ -464,6 +496,16 @@ contract StakeTableV2 is StakeTable, PausableUpgradeable, AccessControlUpgradeab } } + /// @notice Initialize the active stake in the contract + /// @param initialActiveStake The initial active stake in the contract + function _initializeActiveStake(uint256 initialActiveStake) private { + require( + initialActiveStake <= token.balanceOf(address(this)), InitialActiveStakeExceedsBalance() + ); + + activeStake = initialActiveStake; + } + /// @notice Update the exit escrow period /// @param newExitEscrowPeriod The new exit escrow period /// @dev This function ensures that the exit escrow period is within the valid range diff --git a/contracts/test/StakeTable.t.sol b/contracts/test/StakeTable.t.sol index b586d00f05..fa008d7e80 100644 --- a/contracts/test/StakeTable.t.sol +++ b/contracts/test/StakeTable.t.sol @@ -1376,6 +1376,7 @@ contract StakeTableUpgradeV2Test is Test { vm.expectEmit(false, false, false, true, address(stakeTable)); emit S.Delegated(delegator, validator, originalDelegateAmount); stakeTable.delegate(validator, originalDelegateAmount); + assertEq(stakeTable.activeStake(), originalDelegateAmount); // undelegate uint256 amountUndelegated = originalDelegateAmount / 3; @@ -1384,6 +1385,7 @@ contract StakeTableUpgradeV2Test is Test { emit S.Undelegated(delegator, validator, amountUndelegated); stakeTable.undelegate(validator, amountUndelegated); vm.stopPrank(); + assertEq(stakeTable.activeStake(), originalDelegateAmount - amountUndelegated); // Validator Exits vm.startPrank(validator); @@ -1391,6 +1393,7 @@ contract StakeTableUpgradeV2Test is Test { emit S.ValidatorExit(validator); stakeTable.deregisterValidator(); vm.stopPrank(); + assertEq(stakeTable.activeStake(), 0); // amount delegated to validator is still the same until the delegator(s) claim(s) the // withdrawal @@ -1424,6 +1427,7 @@ contract StakeTableUpgradeV2Test is Test { emit S.Withdrawal(delegator, remainderDelegation); stakeTable.claimValidatorExit(validator); vm.stopPrank(); + assertEq(stakeTable.activeStake(), 0); assertEq( stakeTable.token().balanceOf(delegator), @@ -1456,6 +1460,7 @@ contract StakeTableUpgradeV2Test is Test { emit S.Withdrawal(delegator, amountUndelegated); stakeTable.claimWithdrawal(validator); vm.stopPrank(); + assertEq(stakeTable.activeStake(), 0); assertEq( stakeTable.token().balanceOf(delegator), @@ -1494,6 +1499,7 @@ contract StakeTableUpgradeV2Test is Test { emit S.Delegated(delegator, validator, amountDelegated); stakeTable.delegate(validator, amountDelegated); vm.stopPrank(); + assertEq(stakeTable.activeStake(), amountDelegated); // validator exits vm.startPrank(validator); @@ -1501,6 +1507,7 @@ contract StakeTableUpgradeV2Test is Test { emit S.ValidatorExit(validator); stakeTable.deregisterValidator(); vm.stopPrank(); + assertEq(stakeTable.activeStake(), 0); // check the validator's delegatedAmount and undelegations (uint256 validatorAmountDelegated,) = stakeTable.validators(validator); @@ -1527,6 +1534,7 @@ contract StakeTableUpgradeV2Test is Test { emit S.Withdrawal(delegator, amountDelegated); stakeTable.claimValidatorExit(validator); vm.stopPrank(); + assertEq(stakeTable.activeStake(), 0); assertEq( stakeTable.token().balanceOf(delegator), @@ -1573,11 +1581,13 @@ contract StakeTableUpgradeV2Test is Test { vm.expectEmit(false, false, false, true, address(stakeTable)); emit S.Delegated(delegator, validator1, amountDelegated / 3); stakeTable.delegate(validator1, amountDelegated / 3); + assertEq(stakeTable.activeStake(), amountDelegated / 3); // delegate 1/3 of balance to validator2 vm.expectEmit(false, false, false, true, address(stakeTable)); emit S.Delegated(delegator, validator2, amountDelegated / 3); stakeTable.delegate(validator2, amountDelegated / 3); + assertEq(stakeTable.activeStake(), amountDelegated / 3 + amountDelegated / 3); // undelegate 1/3 of balance from validator1 vm.expectEmit(false, false, false, true, address(stakeTable)); @@ -1598,6 +1608,7 @@ contract StakeTableUpgradeV2Test is Test { 0, "the validator's delegatedAmount should be zero as the delegator has undelegated" ); + assertEq(stakeTable.activeStake(), amountDelegated / 3); // undelegate from validator 2 vm.expectEmit(false, false, false, true, address(stakeTable)); @@ -1616,6 +1627,7 @@ contract StakeTableUpgradeV2Test is Test { 0, "the validator's delegatedAmount should be zero as the delegator has undelegated" ); + assertEq(stakeTable.activeStake(), 0); vm.warp(block.timestamp + stakeTable.exitEscrowPeriod()); uint256 delegatorBalanceBefore = stakeTable.token().balanceOf(delegator); @@ -1626,6 +1638,7 @@ contract StakeTableUpgradeV2Test is Test { stakeTable.token().balanceOf(delegator), delegatorBalanceBefore + amountDelegated / 3 ); assertEq(stakeTable.token().balanceOf(address(stakeTable)), amountDelegated / 3); + assertEq(stakeTable.activeStake(), 0); delegatorBalanceBefore = stakeTable.token().balanceOf(delegator); vm.expectEmit(false, false, false, true, address(stakeTable)); @@ -1635,6 +1648,7 @@ contract StakeTableUpgradeV2Test is Test { stakeTable.token().balanceOf(delegator), delegatorBalanceBefore + amountDelegated / 3 ); assertEq(stakeTable.token().balanceOf(address(stakeTable)), 0); + assertEq(stakeTable.activeStake(), 0); vm.stopPrank(); } @@ -1662,13 +1676,14 @@ contract StakeTableUpgradeV2Test is Test { vm.expectEmit(false, false, false, true, address(stakeTable)); emit S.Delegated(delegator, validator, amountFirstDelegated); stakeTable.delegate(validator, amountFirstDelegated); + assertEq(stakeTable.activeStake(), amountFirstDelegated); // undelegate a 1/3 of the balance uint256 amountToUndelegate = amountFirstDelegated / 3; vm.expectEmit(false, false, false, true, address(stakeTable)); emit S.Undelegated(delegator, validator, amountToUndelegate); stakeTable.undelegate(validator, amountToUndelegate); - + assertEq(stakeTable.activeStake(), amountFirstDelegated - amountToUndelegate); assertEq( stakeTable.delegations(validator, delegator), amountFirstDelegated - amountToUndelegate ); @@ -1712,6 +1727,7 @@ contract StakeTableUpgradeV2Test is Test { amountFirstDelegated - amountToUndelegate, "the validator's delegatedAmount should be the full amount minus the amount undelegated" ); + assertEq(stakeTable.activeStake(), amountFirstDelegated - amountToUndelegate); vm.stopPrank(); } @@ -1739,7 +1755,7 @@ contract StakeTableUpgradeV2Test is Test { vm.expectEmit(false, false, false, true, address(stakeTable)); emit S.Delegated(delegator, validator, 3 ether); stakeTable.delegate(validator, 3 ether); - + assertEq(stakeTable.activeStake(), 3 ether); assertEq(stakeTable.token().balanceOf(delegator), initialBalance - 3 ether); assertEq(stakeTable.token().balanceOf(address(stakeTable)), 3 ether); @@ -1751,6 +1767,7 @@ contract StakeTableUpgradeV2Test is Test { delegatedAmountBefore - 2 ether, "the validator's delegated amount after the undelegation method is reduced by the undelegation amount" ); + assertEq(stakeTable.activeStake(), 1 ether); vm.expectRevert(S.UndelegationAlreadyExists.selector); stakeTable.undelegate(validator, 1 ether); @@ -1766,11 +1783,13 @@ contract StakeTableUpgradeV2Test is Test { assertEq(stakeTable.token().balanceOf(delegator), initialBalance - 3 ether + 2 ether); assertEq(stakeTable.delegations(validator, delegator), 1 ether); + assertEq(stakeTable.activeStake(), 1 ether); // now the delegator can undelegate again vm.expectEmit(false, false, false, true, address(stakeTable)); emit S.Undelegated(delegator, validator, 1 ether); stakeTable.undelegate(validator, 1 ether); + assertEq(stakeTable.activeStake(), 0); assertEq(stakeTable.delegations(validator, delegator), 0); (uint256 amountUndelegated, uint256 unlocksAt) = @@ -1789,6 +1808,7 @@ contract StakeTableUpgradeV2Test is Test { vm.expectEmit(false, false, false, true, address(stakeTable)); emit S.Withdrawal(delegator, 1 ether); stakeTable.claimWithdrawal(validator); + assertEq(stakeTable.activeStake(), 0); assertEq(stakeTable.token().balanceOf(delegator), initialBalance); assertEq(stakeTable.token().balanceOf(address(stakeTable)), 0); @@ -1797,6 +1817,144 @@ contract StakeTableUpgradeV2Test is Test { vm.stopPrank(); } + + function test_StakeTracking() public { + stakeTableRegisterTest.setUp(); + vm.startPrank(stakeTableRegisterTest.admin()); + stakeTableRegisterTest.stakeTable().upgradeToAndCall(address(new StakeTableV2()), ""); + vm.stopPrank(); + StakeTableV2 stakeTable = StakeTableV2(address(stakeTableRegisterTest.stakeTable())); + + address validator = makeAddr("validator"); + address delegator = makeAddr("delegator"); + uint256 initialBalance = 5 ether; + + vm.startPrank(stakeTableRegisterTest.tokenGrantRecipient()); + stakeTableRegisterTest.stakeTable().token().transfer(delegator, initialBalance); + vm.stopPrank(); + + registerValidatorOnStakeTableV2(validator, "1", 0, stakeTable); + + vm.startPrank(delegator); + stakeTable.token().approve(address(stakeTable), initialBalance); + assertEq(stakeTable.token().balanceOf(delegator), initialBalance); + + // Delegate some funds + vm.expectEmit(false, false, false, true, address(stakeTable)); + emit S.Delegated(delegator, validator, 3 ether); + stakeTable.delegate(validator, 3 ether); + + assertEq(stakeTable.token().balanceOf(delegator), initialBalance - 3 ether); + assertEq(stakeTable.token().balanceOf(address(stakeTable)), 3 ether); + + assertEq(stakeTable.activeStake(), 3 ether); + + stakeTable.undelegate(validator, 2 ether); + + assertEq(stakeTable.activeStake(), 1 ether); + + vm.warp(block.timestamp + stakeTable.exitEscrowPeriod()); + vm.expectEmit(false, false, false, true, address(stakeTable)); + emit S.Withdrawal(delegator, 2 ether); + stakeTable.claimWithdrawal(validator); + + assertEq(stakeTable.activeStake(), 1 ether); + + vm.stopPrank(); + } + + function test_initializeActiveStake() public { + stakeTableRegisterTest.setUp(); + address delegator = makeAddr("delegator"); + address validator = makeAddr("validator"); + uint256 initialBalance = 5 ether; + + vm.startPrank(stakeTableRegisterTest.tokenGrantRecipient()); + stakeTableRegisterTest.stakeTable().token().transfer(delegator, initialBalance); + vm.stopPrank(); + + vm.startPrank(validator); + uint16 commission = 0; + registerValidatorOnStakeTableV1( + validator, "1", commission, stakeTableRegisterTest.stakeTable() + ); + vm.stopPrank(); + + vm.startPrank(delegator); + stakeTableRegisterTest.stakeTable().token().approve( + address(stakeTableRegisterTest.stakeTable()), initialBalance / 2 + ); + stakeTableRegisterTest.stakeTable().delegate(validator, initialBalance / 2); + vm.stopPrank(); + + StakeTableV2.InitialCommission[] memory initialCommissions = + new StakeTableV2.InitialCommission[](1); + initialCommissions[0] = + StakeTableV2.InitialCommission({ validator: validator, commission: commission }); + + //upgrade to staketablev2 + vm.startPrank(stakeTableRegisterTest.admin()); + StakeTableV2 stakeTableV2 = StakeTableV2(address(stakeTableRegisterTest.stakeTable())); + + stakeTableV2.upgradeToAndCall( + address(new StakeTableV2()), + abi.encodeWithSelector( + StakeTableV2.initializeV2.selector, + stakeTableRegisterTest.admin(), + stakeTableRegisterTest.admin(), + initialBalance / 2, + initialCommissions + ) + ); + vm.stopPrank(); + + assertEq(stakeTableV2.activeStake(), initialBalance / 2); + } + + function test_revertWhenInvalidInitialActiveStake() public { + stakeTableRegisterTest.setUp(); + address delegator = makeAddr("delegator"); + address validator = makeAddr("validator"); + uint256 initialBalance = 5 ether; + + vm.startPrank(stakeTableRegisterTest.tokenGrantRecipient()); + stakeTableRegisterTest.stakeTable().token().transfer(delegator, initialBalance); + vm.stopPrank(); + + vm.startPrank(validator); + uint16 commission = 0; + registerValidatorOnStakeTableV1( + validator, "1", commission, stakeTableRegisterTest.stakeTable() + ); + vm.stopPrank(); + + vm.startPrank(delegator); + stakeTableRegisterTest.stakeTable().token().approve( + address(stakeTableRegisterTest.stakeTable()), initialBalance / 2 + ); + stakeTableRegisterTest.stakeTable().delegate(validator, initialBalance / 2); + vm.stopPrank(); + + StakeTableV2.InitialCommission[] memory initialCommissions = + new StakeTableV2.InitialCommission[](1); + initialCommissions[0] = + StakeTableV2.InitialCommission({ validator: validator, commission: commission }); + + //upgrade to staketablev2 + vm.startPrank(stakeTableRegisterTest.admin()); + StakeTableV2 stakeTableV2 = StakeTableV2(address(stakeTableRegisterTest.stakeTable())); + + address newImpl = address(new StakeTableV2()); + address admin = stakeTableRegisterTest.admin(); + vm.expectRevert(StakeTableV2.InitialActiveStakeExceedsBalance.selector); + stakeTableV2.upgradeToAndCall( + newImpl, + abi.encodeWithSelector( + StakeTableV2.initializeV2.selector, admin, admin, initialBalance, initialCommissions + ) + ); + vm.stopPrank(); + } } contract StakeTableTimelockTest is Test { @@ -2188,7 +2346,7 @@ contract StakeTableV2PausableTest is StakeTableUpgradeV2Test { address admin = proxy.owner(); StakeTableV2.InitialCommission[] memory emptyCommissions; bytes memory initData = abi.encodeWithSelector( - StakeTableV2.initializeV2.selector, pauser, admin, emptyCommissions + StakeTableV2.initializeV2.selector, pauser, admin, 0, emptyCommissions ); proxy.upgradeToAndCall(address(new StakeTableV2()), initData); @@ -2209,7 +2367,7 @@ contract StakeTableV2PausableTest is StakeTableUpgradeV2Test { address admin = stakeTableV2.owner(); vm.expectRevert(Initializable.InvalidInitialization.selector); StakeTableV2.InitialCommission[] memory emptyCommissions; - stakeTableV2.initializeV2(pauser, admin, emptyCommissions); + stakeTableV2.initializeV2(pauser, admin, 0, emptyCommissions); } function test_StorageLayout_IsCompatible_V1V2() public { diff --git a/contracts/test/StakeTableV2.echidna.sol b/contracts/test/StakeTableV2.echidna.sol index 4db876e688..ec78e9c99d 100644 --- a/contracts/test/StakeTableV2.echidna.sol +++ b/contracts/test/StakeTableV2.echidna.sol @@ -32,4 +32,14 @@ contract StakeTableV2EchidnaTest is StakeTableV2PropTestBase { // Note: Unlike Foundry invariant tests, Echidna doesn't support post-test cleanup. // The withdrawAllFunds() verification is only available in the Foundry test suite. + + /// @dev Total validator stake should equal sum of all active delegated amounts + function echidna_activeStakeMatchesTracked() public view returns (bool) { + return stakeTable.activeStake() == testState.activeStake; + } + + /// @dev Total validator stake should not exceed contract token balance + function echidna_activeStakeNotExceedsContractTokenBalance() public view returns (bool) { + return stakeTable.activeStake() <= stakeTable.token().balanceOf(address(stakeTable)); + } } diff --git a/contracts/test/StakeTableV2.invariant.t.sol b/contracts/test/StakeTableV2.invariant.t.sol index 32349fc33a..fdbba8c0ca 100644 --- a/contracts/test/StakeTableV2.invariant.t.sol +++ b/contracts/test/StakeTableV2.invariant.t.sol @@ -50,6 +50,10 @@ contract StakeTableV2InvariantTest is StdInvariant, Test { invariant_ContractBalanceMatchesTrackedDelegations(); invariant_TotalSupply(); + // verify the total stake invariants + invariant_activeStakeMatchesTracked(); + invariant_ValidatorStakeNotExceedsContractBalance(); + // additionally check the actor balances assertActorsRecoveredFunds(); } @@ -93,4 +97,22 @@ contract StakeTableV2InvariantTest is StdInvariant, Test { "Total supply invariant violated" ); } + + /// @dev Contract's activeStake should match tracked activeStake + function invariant_activeStakeMatchesTracked() public view { + assertEq( + handler.stakeTable().activeStake(), + handler.getactiveStake(), + "Contract activeStake does not match tracked activeStake" + ); + } + + /// @dev Total validator stake should not exceed contract balance + function invariant_ValidatorStakeNotExceedsContractBalance() public view { + assertLe( + handler.stakeTable().activeStake(), + handler.stakeTable().token().balanceOf(address(handler.stakeTable())), + "Total validator stake should not exceed contract balance" + ); + } } diff --git a/contracts/test/StakeTableV2Commission.t.sol b/contracts/test/StakeTableV2Commission.t.sol index a28607a24b..dcbf428b8f 100644 --- a/contracts/test/StakeTableV2Commission.t.sol +++ b/contracts/test/StakeTableV2Commission.t.sol @@ -31,7 +31,7 @@ contract StakeTableV2CommissionTest is Test { address admin = baseProxy.owner(); StakeTableV2.InitialCommission[] memory emptyCommissions; bytes memory initData = abi.encodeWithSelector( - StakeTableV2.initializeV2.selector, pauser, admin, emptyCommissions + StakeTableV2.initializeV2.selector, pauser, admin, 0, emptyCommissions ); baseProxy.upgradeToAndCall(address(new StakeTableV2()), initData); proxy = StakeTableV2(address(baseProxy)); @@ -227,7 +227,7 @@ contract StakeTableV2CommissionTest is Test { StakeTableV2.InitialCommission({ validator: validator, commission: 500 }); bytes memory initData = abi.encodeWithSelector( - StakeTableV2.initializeV2.selector, pauser, upgradeTest.admin(), wrongCommissions + StakeTableV2.initializeV2.selector, pauser, upgradeTest.admin(), 0, wrongCommissions ); vm.startPrank(upgradeTest.admin()); @@ -254,7 +254,7 @@ contract StakeTableV2CommissionTest is Test { StakeTableV2.InitialCommission({ validator: validator, commission: 500 }); bytes memory initData = abi.encodeWithSelector( - StakeTableV2.initializeV2.selector, pauser, upgradeTest.admin(), duplicateCommissions + StakeTableV2.initializeV2.selector, pauser, upgradeTest.admin(), 0, duplicateCommissions ); vm.startPrank(upgradeTest.admin()); diff --git a/contracts/test/StakeTableV2PropTestBase.sol b/contracts/test/StakeTableV2PropTestBase.sol index c1fd007cb6..8d99f4326f 100644 --- a/contracts/test/StakeTableV2PropTestBase.sol +++ b/contracts/test/StakeTableV2PropTestBase.sol @@ -83,6 +83,7 @@ contract StakeTableV2PropTestBase is FunctionCallTracking { uint256 totalPendingWithdrawal; uint256 numPendingWithdrawals; uint256 numActiveDelegations; + uint256 activeStake; } // Actors can be validators and/or delegators @@ -203,7 +204,11 @@ contract StakeTableV2PropTestBase is FunctionCallTracking { StakeTable(payable(address(proxy))).upgradeToAndCall( address(stakeTableV2Impl), abi.encodeWithSignature( - "initializeV2(address,address,(address,uint16)[])", admin, admin, emptyCommissions + "initializeV2(address,address,uint256,(address,uint16)[])", + admin, + admin, + 0, + emptyCommissions ) ); @@ -417,6 +422,7 @@ contract StakeTableV2PropTestBase is FunctionCallTracking { function trackDelegate(address actorAddr, address val, uint256 amount) internal { testState.totalDelegated += amount; + testState.activeStake += amount; // Add this actors.trackedFunds[actorAddr].delegated += amount; validators.staked.add(val); @@ -431,6 +437,7 @@ contract StakeTableV2PropTestBase is FunctionCallTracking { function trackUndelegate(address actorAddr, address val, uint256 amount) internal { testState.totalDelegated -= amount; testState.totalPendingWithdrawal += amount; + testState.activeStake -= amount; actors.trackedFunds[actorAddr].delegated -= amount; actors.trackedFunds[actorAddr].pendingWithdrawal += amount; addPendingWithdrawal(actorAddr, val); @@ -461,6 +468,9 @@ contract StakeTableV2PropTestBase is FunctionCallTracking { validators.active.remove(val); validators.exited.add(val); validators.staked.remove(val); + + (uint256 validatorDelegatedAmount,) = stakeTable.validators(val); + testState.activeStake -= validatorDelegatedAmount; } function trackClaimWithdrawal(address actorAddr, address val, uint256 undelegationAmount) @@ -557,6 +567,10 @@ contract StakeTableV2PropTestBase is FunctionCallTracking { return testState; } + function getactiveStake() external view returns (uint256) { + return testState.activeStake; + } + function getTotalSuccesses() external view returns (uint256) { uint256 total = 0; // Ok functions @@ -732,6 +746,10 @@ contract StakeTableV2PropTestBase is FunctionCallTracking { // Verify no pending withdrawals remain require(testState.totalPendingWithdrawal == 0, "No pending withdrawals should remain"); require(testState.totalDelegated == 0, "No delegations should remain"); + + require( + testState.activeStake == 0, "Total validator stake should be zero after full withdrawal" + ); } /// @dev Assert sum of delegated amounts to a validator equals validator.delegatedAmount @@ -757,4 +775,12 @@ contract StakeTableV2PropTestBase is FunctionCallTracking { ); } } + + /// @dev Assert that contract's token balance and activeStake match our tracking + function assertStakeInvariants() public view { + require( + stakeTable.activeStake() == testState.activeStake, + "Contract activeStake does not match tracked activeStake" + ); + } } diff --git a/justfile b/justfile index e8e0adda4e..d0f0cf875b 100644 --- a/justfile +++ b/justfile @@ -173,7 +173,7 @@ gen-bindings: export-contract-abis: rm -rv contracts/artifacts/abi mkdir -p contracts/artifacts/abi - for contract in LightClient{,Mock,V2{,Mock}} StakeTable EspToken IRewardClaim; do \ + for contract in LightClient{,Mock,V2{,Mock}} StakeTable{,V2} EspToken IRewardClaim; do \ cat "contracts/out/${contract}.sol/${contract}.json" | jq .abi > "contracts/artifacts/abi/${contract}.json"; \ done