{
    "_format": "hh-sol-artifact-1",
    "contractName": "LockReleaseTokenPool",
    "sourceName": "src/v0.8/ccip/pools/LockReleaseTokenPool.sol",
    "abi": [
      {
        "inputs": [
          {
            "internalType": "contract IERC20",
            "name": "token",
            "type": "address"
          },
          {
            "internalType": "address[]",
            "name": "allowlist",
            "type": "address[]"
          },
          {
            "internalType": "address",
            "name": "armProxy",
            "type": "address"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "constructor"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "capacity",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "requested",
            "type": "uint256"
          }
        ],
        "name": "AggregateValueMaxCapacityExceeded",
        "type": "error"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "minWaitInSeconds",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "available",
            "type": "uint256"
          }
        ],
        "name": "AggregateValueRateLimitReached",
        "type": "error"
      },
      {
        "inputs": [],
        "name": "AllowListNotEnabled",
        "type": "error"
      },
      {
        "inputs": [],
        "name": "BadARMSignal",
        "type": "error"
      },
      {
        "inputs": [],
        "name": "BucketOverfilled",
        "type": "error"
      },
      {
        "inputs": [],
        "name": "InsufficientLiquidity",
        "type": "error"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "ramp",
            "type": "address"
          }
        ],
        "name": "NonExistentRamp",
        "type": "error"
      },
      {
        "inputs": [],
        "name": "PermissionsError",
        "type": "error"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "ramp",
            "type": "address"
          }
        ],
        "name": "RampAlreadyExists",
        "type": "error"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "sender",
            "type": "address"
          }
        ],
        "name": "SenderNotAllowed",
        "type": "error"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "capacity",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "requested",
            "type": "uint256"
          },
          {
            "internalType": "address",
            "name": "tokenAddress",
            "type": "address"
          }
        ],
        "name": "TokenMaxCapacityExceeded",
        "type": "error"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "minWaitInSeconds",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "available",
            "type": "uint256"
          },
          {
            "internalType": "address",
            "name": "tokenAddress",
            "type": "address"
          }
        ],
        "name": "TokenRateLimitReached",
        "type": "error"
      },
      {
        "inputs": [],
        "name": "WithdrawalTooHigh",
        "type": "error"
      },
      {
        "inputs": [],
        "name": "ZeroAddressNotAllowed",
        "type": "error"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": false,
            "internalType": "address",
            "name": "sender",
            "type": "address"
          }
        ],
        "name": "AllowListAdd",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": false,
            "internalType": "address",
            "name": "sender",
            "type": "address"
          }
        ],
        "name": "AllowListRemove",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "sender",
            "type": "address"
          },
          {
            "indexed": false,
            "internalType": "uint256",
            "name": "amount",
            "type": "uint256"
          }
        ],
        "name": "Burned",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "provider",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "uint256",
            "name": "amount",
            "type": "uint256"
          }
        ],
        "name": "LiquidityAdded",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "provider",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "uint256",
            "name": "amount",
            "type": "uint256"
          }
        ],
        "name": "LiquidityRemoved",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "sender",
            "type": "address"
          },
          {
            "indexed": false,
            "internalType": "uint256",
            "name": "amount",
            "type": "uint256"
          }
        ],
        "name": "Locked",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "sender",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "address",
            "name": "recipient",
            "type": "address"
          },
          {
            "indexed": false,
            "internalType": "uint256",
            "name": "amount",
            "type": "uint256"
          }
        ],
        "name": "Minted",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": false,
            "internalType": "address",
            "name": "offRamp",
            "type": "address"
          },
          {
            "components": [
              {
                "internalType": "bool",
                "name": "isEnabled",
                "type": "bool"
              },
              {
                "internalType": "uint128",
                "name": "capacity",
                "type": "uint128"
              },
              {
                "internalType": "uint128",
                "name": "rate",
                "type": "uint128"
              }
            ],
            "indexed": false,
            "internalType": "struct RateLimiter.Config",
            "name": "rateLimiterConfig",
            "type": "tuple"
          }
        ],
        "name": "OffRampAdded",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": false,
            "internalType": "address",
            "name": "offRamp",
            "type": "address"
          },
          {
            "components": [
              {
                "internalType": "bool",
                "name": "isEnabled",
                "type": "bool"
              },
              {
                "internalType": "uint128",
                "name": "capacity",
                "type": "uint128"
              },
              {
                "internalType": "uint128",
                "name": "rate",
                "type": "uint128"
              }
            ],
            "indexed": false,
            "internalType": "struct RateLimiter.Config",
            "name": "rateLimiterConfig",
            "type": "tuple"
          }
        ],
        "name": "OffRampConfigured",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": false,
            "internalType": "address",
            "name": "offRamp",
            "type": "address"
          }
        ],
        "name": "OffRampRemoved",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": false,
            "internalType": "address",
            "name": "onRamp",
            "type": "address"
          },
          {
            "components": [
              {
                "internalType": "bool",
                "name": "isEnabled",
                "type": "bool"
              },
              {
                "internalType": "uint128",
                "name": "capacity",
                "type": "uint128"
              },
              {
                "internalType": "uint128",
                "name": "rate",
                "type": "uint128"
              }
            ],
            "indexed": false,
            "internalType": "struct RateLimiter.Config",
            "name": "rateLimiterConfig",
            "type": "tuple"
          }
        ],
        "name": "OnRampAdded",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": false,
            "internalType": "address",
            "name": "onRamp",
            "type": "address"
          },
          {
            "components": [
              {
                "internalType": "bool",
                "name": "isEnabled",
                "type": "bool"
              },
              {
                "internalType": "uint128",
                "name": "capacity",
                "type": "uint128"
              },
              {
                "internalType": "uint128",
                "name": "rate",
                "type": "uint128"
              }
            ],
            "indexed": false,
            "internalType": "struct RateLimiter.Config",
            "name": "rateLimiterConfig",
            "type": "tuple"
          }
        ],
        "name": "OnRampConfigured",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": false,
            "internalType": "address",
            "name": "onRamp",
            "type": "address"
          }
        ],
        "name": "OnRampRemoved",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "from",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "address",
            "name": "to",
            "type": "address"
          }
        ],
        "name": "OwnershipTransferRequested",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "from",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "address",
            "name": "to",
            "type": "address"
          }
        ],
        "name": "OwnershipTransferred",
        "type": "event"
      },
      {
        "anonymous": false,
        "inputs": [
          {
            "indexed": true,
            "internalType": "address",
            "name": "sender",
            "type": "address"
          },
          {
            "indexed": true,
            "internalType": "address",
            "name": "recipient",
            "type": "address"
          },
          {
            "indexed": false,
            "internalType": "uint256",
            "name": "amount",
            "type": "uint256"
          }
        ],
        "name": "Released",
        "type": "event"
      },
      {
        "inputs": [],
        "name": "acceptOwnership",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "amount",
            "type": "uint256"
          }
        ],
        "name": "addLiquidity",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address[]",
            "name": "removes",
            "type": "address[]"
          },
          {
            "internalType": "address[]",
            "name": "adds",
            "type": "address[]"
          }
        ],
        "name": "applyAllowListUpdates",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "components": [
              {
                "internalType": "address",
                "name": "ramp",
                "type": "address"
              },
              {
                "internalType": "bool",
                "name": "allowed",
                "type": "bool"
              },
              {
                "components": [
                  {
                    "internalType": "bool",
                    "name": "isEnabled",
                    "type": "bool"
                  },
                  {
                    "internalType": "uint128",
                    "name": "capacity",
                    "type": "uint128"
                  },
                  {
                    "internalType": "uint128",
                    "name": "rate",
                    "type": "uint128"
                  }
                ],
                "internalType": "struct RateLimiter.Config",
                "name": "rateLimiterConfig",
                "type": "tuple"
              }
            ],
            "internalType": "struct TokenPool.RampUpdate[]",
            "name": "onRamps",
            "type": "tuple[]"
          },
          {
            "components": [
              {
                "internalType": "address",
                "name": "ramp",
                "type": "address"
              },
              {
                "internalType": "bool",
                "name": "allowed",
                "type": "bool"
              },
              {
                "components": [
                  {
                    "internalType": "bool",
                    "name": "isEnabled",
                    "type": "bool"
                  },
                  {
                    "internalType": "uint128",
                    "name": "capacity",
                    "type": "uint128"
                  },
                  {
                    "internalType": "uint128",
                    "name": "rate",
                    "type": "uint128"
                  }
                ],
                "internalType": "struct RateLimiter.Config",
                "name": "rateLimiterConfig",
                "type": "tuple"
              }
            ],
            "internalType": "struct TokenPool.RampUpdate[]",
            "name": "offRamps",
            "type": "tuple[]"
          }
        ],
        "name": "applyRampUpdates",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "offRamp",
            "type": "address"
          }
        ],
        "name": "currentOffRampRateLimiterState",
        "outputs": [
          {
            "components": [
              {
                "internalType": "uint128",
                "name": "tokens",
                "type": "uint128"
              },
              {
                "internalType": "uint32",
                "name": "lastUpdated",
                "type": "uint32"
              },
              {
                "internalType": "bool",
                "name": "isEnabled",
                "type": "bool"
              },
              {
                "internalType": "uint128",
                "name": "capacity",
                "type": "uint128"
              },
              {
                "internalType": "uint128",
                "name": "rate",
                "type": "uint128"
              }
            ],
            "internalType": "struct RateLimiter.TokenBucket",
            "name": "",
            "type": "tuple"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "onRamp",
            "type": "address"
          }
        ],
        "name": "currentOnRampRateLimiterState",
        "outputs": [
          {
            "components": [
              {
                "internalType": "uint128",
                "name": "tokens",
                "type": "uint128"
              },
              {
                "internalType": "uint32",
                "name": "lastUpdated",
                "type": "uint32"
              },
              {
                "internalType": "bool",
                "name": "isEnabled",
                "type": "bool"
              },
              {
                "internalType": "uint128",
                "name": "capacity",
                "type": "uint128"
              },
              {
                "internalType": "uint128",
                "name": "rate",
                "type": "uint128"
              }
            ],
            "internalType": "struct RateLimiter.TokenBucket",
            "name": "",
            "type": "tuple"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "getAllowList",
        "outputs": [
          {
            "internalType": "address[]",
            "name": "",
            "type": "address[]"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "getAllowListEnabled",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "getArmProxy",
        "outputs": [
          {
            "internalType": "address",
            "name": "armProxy",
            "type": "address"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "getLockReleaseInterfaceId",
        "outputs": [
          {
            "internalType": "bytes4",
            "name": "",
            "type": "bytes4"
          }
        ],
        "stateMutability": "pure",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "getOffRamps",
        "outputs": [
          {
            "internalType": "address[]",
            "name": "",
            "type": "address[]"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "getOnRamps",
        "outputs": [
          {
            "internalType": "address[]",
            "name": "",
            "type": "address[]"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "provider",
            "type": "address"
          }
        ],
        "name": "getProvidedLiquidity",
        "outputs": [
          {
            "internalType": "uint256",
            "name": "",
            "type": "uint256"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "getToken",
        "outputs": [
          {
            "internalType": "contract IERC20",
            "name": "token",
            "type": "address"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "offRamp",
            "type": "address"
          }
        ],
        "name": "isOffRamp",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "onRamp",
            "type": "address"
          }
        ],
        "name": "isOnRamp",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "originalSender",
            "type": "address"
          },
          {
            "internalType": "bytes",
            "name": "",
            "type": "bytes"
          },
          {
            "internalType": "uint256",
            "name": "amount",
            "type": "uint256"
          },
          {
            "internalType": "uint64",
            "name": "",
            "type": "uint64"
          },
          {
            "internalType": "bytes",
            "name": "",
            "type": "bytes"
          }
        ],
        "name": "lockOrBurn",
        "outputs": [
          {
            "internalType": "bytes",
            "name": "",
            "type": "bytes"
          }
        ],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [],
        "name": "owner",
        "outputs": [
          {
            "internalType": "address",
            "name": "",
            "type": "address"
          }
        ],
        "stateMutability": "view",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "bytes",
            "name": "",
            "type": "bytes"
          },
          {
            "internalType": "address",
            "name": "receiver",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "amount",
            "type": "uint256"
          },
          {
            "internalType": "uint64",
            "name": "",
            "type": "uint64"
          },
          {
            "internalType": "bytes",
            "name": "",
            "type": "bytes"
          }
        ],
        "name": "releaseOrMint",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "uint256",
            "name": "amount",
            "type": "uint256"
          }
        ],
        "name": "removeLiquidity",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "offRamp",
            "type": "address"
          },
          {
            "components": [
              {
                "internalType": "bool",
                "name": "isEnabled",
                "type": "bool"
              },
              {
                "internalType": "uint128",
                "name": "capacity",
                "type": "uint128"
              },
              {
                "internalType": "uint128",
                "name": "rate",
                "type": "uint128"
              }
            ],
            "internalType": "struct RateLimiter.Config",
            "name": "config",
            "type": "tuple"
          }
        ],
        "name": "setOffRampRateLimiterConfig",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "onRamp",
            "type": "address"
          },
          {
            "components": [
              {
                "internalType": "bool",
                "name": "isEnabled",
                "type": "bool"
              },
              {
                "internalType": "uint128",
                "name": "capacity",
                "type": "uint128"
              },
              {
                "internalType": "uint128",
                "name": "rate",
                "type": "uint128"
              }
            ],
            "internalType": "struct RateLimiter.Config",
            "name": "config",
            "type": "tuple"
          }
        ],
        "name": "setOnRampRateLimiterConfig",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "bytes4",
            "name": "interfaceId",
            "type": "bytes4"
          }
        ],
        "name": "supportsInterface",
        "outputs": [
          {
            "internalType": "bool",
            "name": "",
            "type": "bool"
          }
        ],
        "stateMutability": "pure",
        "type": "function"
      },
      {
        "inputs": [
          {
            "internalType": "address",
            "name": "to",
            "type": "address"
          }
        ],
        "name": "transferOwnership",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
      }
    ],
    "bytecode": "0x60e06040523480156200001157600080fd5b50604051620031e0380380620031e083398101604081905262000034916200051d565b82828233806000816200008e5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c157620000c18162000133565b5050506001600160a01b038316620000ec576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03808416608052811660a052815115801560c0526200012757604080516000815260208101909152620001279083620001de565b5050505050506200068e565b336001600160a01b038216036200018d5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000085565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c051620001ff576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620002945760008382815181106200022357620002236200061a565b602090810291909101015190506200023d6002826200034f565b1562000280576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506200028c8162000646565b905062000202565b5060005b81518110156200034a576000828281518110620002b957620002b96200061a565b6020026020010151905060006001600160a01b0316816001600160a01b031603620002e5575062000337565b620002f26002826200036f565b1562000335576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b620003428162000646565b905062000298565b505050565b600062000366836001600160a01b03841662000386565b90505b92915050565b600062000366836001600160a01b0384166200048a565b600081815260018301602052604081205480156200047f576000620003ad60018362000662565b8554909150600090620003c39060019062000662565b90508181146200042f576000866000018281548110620003e757620003e76200061a565b90600052602060002001549050808760000184815481106200040d576200040d6200061a565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000443576200044362000678565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000369565b600091505062000369565b6000818152600183016020526040812054620004d35750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000369565b50600062000369565b6001600160a01b0381168114620004f257600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b80516200051881620004dc565b919050565b6000806000606084860312156200053357600080fd5b83516200054081620004dc565b602085810151919450906001600160401b03808211156200056057600080fd5b818701915087601f8301126200057557600080fd5b8151818111156200058a576200058a620004f5565b8060051b604051601f19603f83011681018181108582111715620005b257620005b2620004f5565b60405291825284820192508381018501918a831115620005d157600080fd5b938501935b82851015620005fa57620005ea856200050b565b84529385019392850192620005d6565b80975050505050505062000611604085016200050b565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016200065b576200065b62000630565b5060010190565b8181038181111562000369576200036962000630565b634e487b7160e01b600052603160045260246000fd5b60805160a05160c051612adc6200070460003960008181610419015281816109de01526110880152600081816102290152818161084e0152610a550152600081816101da015281816104c60152818161091b01528181610bdf01528181610cbc0152818161146001526114f00152612adc6000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c806387381314116100e3578063a7cd63b71161008c578063d612b94511610066578063d612b94514610404578063e0351e1314610417578063f2fde38b1461043d57600080fd5b8063a7cd63b7146103d6578063b3a3fb41146103de578063c49907b5146103f157600080fd5b806396875445116100bd578063968754451461039b5780639c8f9f23146103bb578063a40e69c7146103ce57600080fd5b806387381314146103475780638bfca18c1461035c5780638da5cb5b1461038a57600080fd5b806356dd1e81116101455780637787e7ab1161011f5780637787e7ab146102bd57806379ba50971461032c5780638627fad61461033457600080fd5b806356dd1e81146102605780636f32b872146102975780637448b3c7146102aa57600080fd5b806351c6590a1161017657806351c6590a146102125780635246492f1461022757806354c8a4f31461024d57600080fd5b806301ffc9a71461019d5780631d7a74a0146101c557806321df0da7146101d8575b600080fd5b6101b06101ab3660046122aa565b610450565b60405190151581526020015b60405180910390f35b6101b06101d3366004612308565b6104ac565b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b0390911681526020016101bc565b610225610220366004612323565b6104b9565b005b7f00000000000000000000000000000000000000000000000000000000000000006101fa565b61022561025b366004612388565b610542565b61028961026e366004612308565b6001600160a01b03166000908152600a602052604090205490565b6040519081526020016101bc565b6101b06102a5366004612308565b6105bd565b6102256102b83660046124cb565b6105ca565b6102d06102cb366004612308565b610680565b6040516101bc919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b610225610744565b6102256103423660046125a4565b61080d565b61034f610989565b6040516101bc9190612633565b6040517f98a471770000000000000000000000000000000000000000000000000000000081526020016101bc565b6000546001600160a01b03166101fa565b6103ae6103a93660046126c2565b61099a565b6040516101bc91906127b0565b6102256103c9366004612323565b610b66565b61034f610d13565b61034f610d1f565b6102d06103ec366004612308565b610d2b565b6102256103ff366004612808565b610def565b6102256104123660046124cb565b610e03565b7f00000000000000000000000000000000000000000000000000000000000000006101b0565b61022561044b366004612308565b610ea8565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f98a471770000000000000000000000000000000000000000000000000000000014806104a657506104a682610ebc565b92915050565b60006104a6600783610f54565b6104ee6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084610f79565b336000908152600a60205260408120805483929061050d908490612897565b9091555050604051819033907fc17cea59c2955cb181b03393209566960365771dbba9dc3d510180e7cb31208890600090a350565b61054a61102a565b6105b78484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080880282810182019093528782529093508792508691829185019084908082843760009201919091525061108692505050565b50505050565b60006104a6600483610f54565b6105d261102a565b6105db826105bd565b610621576040517f498f12f60000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b6001600160a01b0382166000908152600660205260409020610643908261121d565b7f578db78e348076074dbff64a94073a83e9a65aa6766b8c75fdc89282b0e30ed682826040516106749291906128aa565b60405180910390a15050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526001600160a01b038216600090815260066020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff8082168352600160801b80830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260019091015480841660608301529190910490911660808201526104a690611398565b6001546001600160a01b0316331461079e5760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610618565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610816336104ac565b61084c576040517f5307f5ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ce91906128f5565b15610905576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61090e8361144a565b6109426001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585611484565b6040518381526001600160a01b0385169033907f2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f529060200160405180910390a35050505050565b606061099560046114cd565b905090565b60606109a5336105bd565b6109db576040517f5307f5ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b877f00000000000000000000000000000000000000000000000000000000000000008015610a115750610a0f600282610f54565b155b15610a53576040517fd0d259760000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610618565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad591906128f5565b15610b0c576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b15866114da565b60405186815233907f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd600089060200160405180910390a25050604080516020810190915260008152979650505050505050565b336000908152600a6020526040902054811115610baf576040517f6982012000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610c2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c529190612912565b1015610c8a576040517fbb55fd2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600a602052604081208054839290610ca990849061292b565b90915550610ce390506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383611484565b604051819033907fc2c3f06e49b9f15e7b4af9055e183b0d73362e033ad82a07dec9bf984017171990600090a350565b606061099560076114cd565b606061099560026114cd565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526001600160a01b038216600090815260096020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff8082168352600160801b80830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260019091015480841660608301529190910490911660808201526104a690611398565b610df761102a565b6105b784848484611514565b610e0b61102a565b610e14826104ac565b610e55576040517f498f12f60000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610618565b6001600160a01b0382166000908152600960205260409020610e77908261121d565b7fb3ba339cfbb8ef80d7a29ce5493051cb90e64fcfa85d7124efc1adfa4c68399f82826040516106749291906128aa565b610eb061102a565b610eb981611a42565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f317fa3340000000000000000000000000000000000000000000000000000000014806104a657507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b6040516001600160a01b03808516602483015283166044820152606481018290526105b79085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611b03565b6000546001600160a01b031633146110845760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610618565b565b7f00000000000000000000000000000000000000000000000000000000000000006110dd576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b825181101561116e5760008382815181106110fd576110fd61293e565b6020026020010151905061111b816002611be890919063ffffffff16565b1561115d576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506111678161296d565b90506110e0565b5060005b815181101561121857600082828151811061118f5761118f61293e565b6020026020010151905060006001600160a01b0316816001600160a01b0316036111b95750611208565b6111c4600282611bfd565b15611206576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b6112118161296d565b9050611172565b505050565b815460009061123990600160801b900463ffffffff164261292b565b905080156112c15760018301548354611274916fffffffffffffffffffffffffffffffff808216928116918591600160801b90910416611c12565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617600160801b4263ffffffff16021783555b602082015183546112e7916fffffffffffffffffffffffffffffffff9081169116611c3c565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff9283161717845560208301516040808501518316600160801b0291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c199061138b9084906129a5565b60405180910390a1505050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261142682606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261140a919061292b565b85608001516fffffffffffffffffffffffffffffffff16611c12565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b336000908152600960205260409020610eb990827f0000000000000000000000000000000000000000000000000000000000000000611c52565b6040516001600160a01b0383166024820152604481018290526112189084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401610fc6565b60606000610f7283611f6d565b336000908152600660205260409020610eb990827f0000000000000000000000000000000000000000000000000000000000000000611c52565b61151c61102a565b60005b838110156117eb57600085858381811061153b5761153b61293e565b905060a0020180360381019061155191906129e1565b905080602001511561170257805161156b90600490611bfd565b156116c2576040805160a08101825282820180516020908101516fffffffffffffffffffffffffffffffff908116845263ffffffff4281168386019081528451511515868801908152855185015184166060880190815286518901518516608089019081528a516001600160a01b031660009081526006909752958990209751885493519251151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff93909516600160801b9081027fffffffffffffffffffffffff0000000000000000000000000000000000000000909516918716919091179390931791909116929092178655905192518216029116176001909201919091558251905191517f0b594bb0555ff7b252e0c789ccc9d8903fec294172064308727d570505cee1ac926116b592916128aa565b60405180910390a16117da565b80516040517fd3eb6bc50000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610618565b805161171090600490611be8565b1561179a5780516001600160a01b031660009081526006602052604080822080547fffffffffffffffffffffff00000000000000000000000000000000000000000016815560010191909155815190517f7fd064821314ad863a0714a3f1229375ace6b6427ed5544b7b2ba1c47b1b5294916116b5916001600160a01b0391909116815260200190565b80516040517f498f12f60000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610618565b506117e48161296d565b905061151f565b5060005b81811015611a3b57600083838381811061180b5761180b61293e565b905060a0020180360381019061182191906129e1565b905080602001511561199257805161183b90600790611bfd565b156116c2576040805160a08101825282820180516020908101516fffffffffffffffffffffffffffffffff908116845263ffffffff4281168386019081528451511515868801908152855185015184166060880190815286518901518516608089019081528a516001600160a01b031660009081526009909752958990209751885493519251151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff93909516600160801b9081027fffffffffffffffffffffffff0000000000000000000000000000000000000000909516918716919091179390931791909116929092178655905192518216029116176001909201919091558251905191517f395b7374909d2b54e5796f53c898ebf41d767c86c78ea86519acf2b805852d889261198592916128aa565b60405180910390a1611a2a565b80516119a090600790611be8565b1561179a5780516001600160a01b031660009081526009602052604080822080547fffffffffffffffffffffff00000000000000000000000000000000000000000016815560010191909155815190517fcf91daec21e3510e2f2aea4b09d08c235d5c6844980be709f282ef591dbf420c91611985916001600160a01b0391909116815260200190565b50611a348161296d565b90506117ef565b5050505050565b336001600160a01b03821603611a9a5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610618565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000611b58826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611fc99092919063ffffffff16565b8051909150156112185780806020019051810190611b7691906128f5565b6112185760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610618565b6000610f72836001600160a01b038416611fd8565b6000610f72836001600160a01b0384166120cb565b6000611c3185611c228486612a32565b611c2c9087612897565b611c3c565b90505b949350505050565b6000818310611c4b5781610f72565b5090919050565b825474010000000000000000000000000000000000000000900460ff161580611c79575081155b15611c8357505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090611cbc90600160801b900463ffffffff164261292b565b90508015611d625781831115611cfe576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154611d2b90839085908490600160801b90046fffffffffffffffffffffffffffffffff16611c12565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16600160801b4263ffffffff160217875592505b84821015611dff576001600160a01b038416611db4576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610618565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610618565b84831015611eeb57600186810154600160801b90046fffffffffffffffffffffffffffffffff16906000908290611e36908261292b565b611e40878a61292b565b611e4a9190612897565b611e549190612a49565b90506001600160a01b038616611ea0576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610618565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610618565b611ef5858461292b565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b606081600001805480602002602001604051908101604052809291908181526020018280548015611fbd57602002820191906000526020600020905b815481526020019060010190808311611fa9575b50505050509050919050565b6060611c34848460008561211a565b600081815260018301602052604081205480156120c1576000611ffc60018361292b565b85549091506000906120109060019061292b565b90508181146120755760008660000182815481106120305761203061293e565b90600052602060002001549050808760000184815481106120535761205361293e565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061208657612086612a84565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104a6565b60009150506104a6565b6000818152600183016020526040812054612112575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104a6565b5060006104a6565b6060824710156121925760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610618565b600080866001600160a01b031685876040516121ae9190612ab3565b60006040518083038185875af1925050503d80600081146121eb576040519150601f19603f3d011682016040523d82523d6000602084013e6121f0565b606091505b50915091506122018783838761220c565b979650505050505050565b6060831561227b578251600003612274576001600160a01b0385163b6122745760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610618565b5081611c34565b611c3483838151156122905781518083602001fd5b8060405162461bcd60e51b815260040161061891906127b0565b6000602082840312156122bc57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610f7257600080fd5b80356001600160a01b038116811461230357600080fd5b919050565b60006020828403121561231a57600080fd5b610f72826122ec565b60006020828403121561233557600080fd5b5035919050565b60008083601f84011261234e57600080fd5b50813567ffffffffffffffff81111561236657600080fd5b6020830191508360208260051b850101111561238157600080fd5b9250929050565b6000806000806040858703121561239e57600080fd5b843567ffffffffffffffff808211156123b657600080fd5b6123c28883890161233c565b909650945060208701359150808211156123db57600080fd5b506123e88782880161233c565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715612446576124466123f4565b60405290565b8015158114610eb957600080fd5b80356fffffffffffffffffffffffffffffffff8116811461230357600080fd5b60006060828403121561248c57600080fd5b612494612423565b905081356124a18161244c565b81526124af6020830161245a565b60208201526124c06040830161245a565b604082015292915050565b600080608083850312156124de57600080fd5b6124e7836122ec565b91506124f6846020850161247a565b90509250929050565b600082601f83011261251057600080fd5b813567ffffffffffffffff8082111561252b5761252b6123f4565b604051601f8301601f19908116603f01168101908282118183101715612553576125536123f4565b8160405283815286602085880101111561256c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803567ffffffffffffffff8116811461230357600080fd5b600080600080600060a086880312156125bc57600080fd5b853567ffffffffffffffff808211156125d457600080fd5b6125e089838a016124ff565b96506125ee602089016122ec565b9550604088013594506126036060890161258c565b9350608088013591508082111561261957600080fd5b50612626888289016124ff565b9150509295509295909350565b6020808252825182820181905260009190848201906040850190845b818110156126745783516001600160a01b03168352928401929184019160010161264f565b50909695505050505050565b60008083601f84011261269257600080fd5b50813567ffffffffffffffff8111156126aa57600080fd5b60208301915083602082850101111561238157600080fd5b600080600080600080600060a0888a0312156126dd57600080fd5b6126e6886122ec565b9650602088013567ffffffffffffffff8082111561270357600080fd5b61270f8b838c01612680565b909850965060408a0135955086915061272a60608b0161258c565b945060808a013591508082111561274057600080fd5b5061274d8a828b01612680565b989b979a50959850939692959293505050565b60005b8381101561277b578181015183820152602001612763565b50506000910152565b6000815180845261279c816020860160208601612760565b601f01601f19169290920160200192915050565b602081526000610f726020830184612784565b60008083601f8401126127d557600080fd5b50813567ffffffffffffffff8111156127ed57600080fd5b60208301915083602060a08302850101111561238157600080fd5b6000806000806040858703121561281e57600080fd5b843567ffffffffffffffff8082111561283657600080fd5b612842888389016127c3565b9096509450602087013591508082111561285b57600080fd5b506123e8878288016127c3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104a6576104a6612868565b6001600160a01b038316815260808101610f7260208301848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b60006020828403121561290757600080fd5b8151610f728161244c565b60006020828403121561292457600080fd5b5051919050565b818103818111156104a6576104a6612868565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361299e5761299e612868565b5060010190565b606081016104a682848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b600060a082840312156129f357600080fd5b6129fb612423565b612a04836122ec565b81526020830135612a148161244c565b6020820152612a26846040850161247a565b60408201529392505050565b80820281158282048414176104a6576104a6612868565b600082612a7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251612ac5818460208701612760565b919091019291505056fea164736f6c6343000813000a",
    "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101985760003560e01c806387381314116100e3578063a7cd63b71161008c578063d612b94511610066578063d612b94514610404578063e0351e1314610417578063f2fde38b1461043d57600080fd5b8063a7cd63b7146103d6578063b3a3fb41146103de578063c49907b5146103f157600080fd5b806396875445116100bd578063968754451461039b5780639c8f9f23146103bb578063a40e69c7146103ce57600080fd5b806387381314146103475780638bfca18c1461035c5780638da5cb5b1461038a57600080fd5b806356dd1e81116101455780637787e7ab1161011f5780637787e7ab146102bd57806379ba50971461032c5780638627fad61461033457600080fd5b806356dd1e81146102605780636f32b872146102975780637448b3c7146102aa57600080fd5b806351c6590a1161017657806351c6590a146102125780635246492f1461022757806354c8a4f31461024d57600080fd5b806301ffc9a71461019d5780631d7a74a0146101c557806321df0da7146101d8575b600080fd5b6101b06101ab3660046122aa565b610450565b60405190151581526020015b60405180910390f35b6101b06101d3366004612308565b6104ac565b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b0390911681526020016101bc565b610225610220366004612323565b6104b9565b005b7f00000000000000000000000000000000000000000000000000000000000000006101fa565b61022561025b366004612388565b610542565b61028961026e366004612308565b6001600160a01b03166000908152600a602052604090205490565b6040519081526020016101bc565b6101b06102a5366004612308565b6105bd565b6102256102b83660046124cb565b6105ca565b6102d06102cb366004612308565b610680565b6040516101bc919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b610225610744565b6102256103423660046125a4565b61080d565b61034f610989565b6040516101bc9190612633565b6040517f98a471770000000000000000000000000000000000000000000000000000000081526020016101bc565b6000546001600160a01b03166101fa565b6103ae6103a93660046126c2565b61099a565b6040516101bc91906127b0565b6102256103c9366004612323565b610b66565b61034f610d13565b61034f610d1f565b6102d06103ec366004612308565b610d2b565b6102256103ff366004612808565b610def565b6102256104123660046124cb565b610e03565b7f00000000000000000000000000000000000000000000000000000000000000006101b0565b61022561044b366004612308565b610ea8565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f98a471770000000000000000000000000000000000000000000000000000000014806104a657506104a682610ebc565b92915050565b60006104a6600783610f54565b6104ee6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084610f79565b336000908152600a60205260408120805483929061050d908490612897565b9091555050604051819033907fc17cea59c2955cb181b03393209566960365771dbba9dc3d510180e7cb31208890600090a350565b61054a61102a565b6105b78484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080880282810182019093528782529093508792508691829185019084908082843760009201919091525061108692505050565b50505050565b60006104a6600483610f54565b6105d261102a565b6105db826105bd565b610621576040517f498f12f60000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b6001600160a01b0382166000908152600660205260409020610643908261121d565b7f578db78e348076074dbff64a94073a83e9a65aa6766b8c75fdc89282b0e30ed682826040516106749291906128aa565b60405180910390a15050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526001600160a01b038216600090815260066020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff8082168352600160801b80830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260019091015480841660608301529190910490911660808201526104a690611398565b6001546001600160a01b0316331461079e5760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610618565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610816336104ac565b61084c576040517f5307f5ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ce91906128f5565b15610905576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61090e8361144a565b6109426001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585611484565b6040518381526001600160a01b0385169033907f2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f529060200160405180910390a35050505050565b606061099560046114cd565b905090565b60606109a5336105bd565b6109db576040517f5307f5ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b877f00000000000000000000000000000000000000000000000000000000000000008015610a115750610a0f600282610f54565b155b15610a53576040517fd0d259760000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610618565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad591906128f5565b15610b0c576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b15866114da565b60405186815233907f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd600089060200160405180910390a25050604080516020810190915260008152979650505050505050565b336000908152600a6020526040902054811115610baf576040517f6982012000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610c2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c529190612912565b1015610c8a576040517fbb55fd2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600a602052604081208054839290610ca990849061292b565b90915550610ce390506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383611484565b604051819033907fc2c3f06e49b9f15e7b4af9055e183b0d73362e033ad82a07dec9bf984017171990600090a350565b606061099560076114cd565b606061099560026114cd565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526001600160a01b038216600090815260096020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff8082168352600160801b80830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260019091015480841660608301529190910490911660808201526104a690611398565b610df761102a565b6105b784848484611514565b610e0b61102a565b610e14826104ac565b610e55576040517f498f12f60000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610618565b6001600160a01b0382166000908152600960205260409020610e77908261121d565b7fb3ba339cfbb8ef80d7a29ce5493051cb90e64fcfa85d7124efc1adfa4c68399f82826040516106749291906128aa565b610eb061102a565b610eb981611a42565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f317fa3340000000000000000000000000000000000000000000000000000000014806104a657507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b6040516001600160a01b03808516602483015283166044820152606481018290526105b79085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611b03565b6000546001600160a01b031633146110845760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610618565b565b7f00000000000000000000000000000000000000000000000000000000000000006110dd576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b825181101561116e5760008382815181106110fd576110fd61293e565b6020026020010151905061111b816002611be890919063ffffffff16565b1561115d576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506111678161296d565b90506110e0565b5060005b815181101561121857600082828151811061118f5761118f61293e565b6020026020010151905060006001600160a01b0316816001600160a01b0316036111b95750611208565b6111c4600282611bfd565b15611206576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b6112118161296d565b9050611172565b505050565b815460009061123990600160801b900463ffffffff164261292b565b905080156112c15760018301548354611274916fffffffffffffffffffffffffffffffff808216928116918591600160801b90910416611c12565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617600160801b4263ffffffff16021783555b602082015183546112e7916fffffffffffffffffffffffffffffffff9081169116611c3c565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff9283161717845560208301516040808501518316600160801b0291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c199061138b9084906129a5565b60405180910390a1505050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261142682606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261140a919061292b565b85608001516fffffffffffffffffffffffffffffffff16611c12565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b336000908152600960205260409020610eb990827f0000000000000000000000000000000000000000000000000000000000000000611c52565b6040516001600160a01b0383166024820152604481018290526112189084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401610fc6565b60606000610f7283611f6d565b336000908152600660205260409020610eb990827f0000000000000000000000000000000000000000000000000000000000000000611c52565b61151c61102a565b60005b838110156117eb57600085858381811061153b5761153b61293e565b905060a0020180360381019061155191906129e1565b905080602001511561170257805161156b90600490611bfd565b156116c2576040805160a08101825282820180516020908101516fffffffffffffffffffffffffffffffff908116845263ffffffff4281168386019081528451511515868801908152855185015184166060880190815286518901518516608089019081528a516001600160a01b031660009081526006909752958990209751885493519251151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff93909516600160801b9081027fffffffffffffffffffffffff0000000000000000000000000000000000000000909516918716919091179390931791909116929092178655905192518216029116176001909201919091558251905191517f0b594bb0555ff7b252e0c789ccc9d8903fec294172064308727d570505cee1ac926116b592916128aa565b60405180910390a16117da565b80516040517fd3eb6bc50000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610618565b805161171090600490611be8565b1561179a5780516001600160a01b031660009081526006602052604080822080547fffffffffffffffffffffff00000000000000000000000000000000000000000016815560010191909155815190517f7fd064821314ad863a0714a3f1229375ace6b6427ed5544b7b2ba1c47b1b5294916116b5916001600160a01b0391909116815260200190565b80516040517f498f12f60000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610618565b506117e48161296d565b905061151f565b5060005b81811015611a3b57600083838381811061180b5761180b61293e565b905060a0020180360381019061182191906129e1565b905080602001511561199257805161183b90600790611bfd565b156116c2576040805160a08101825282820180516020908101516fffffffffffffffffffffffffffffffff908116845263ffffffff4281168386019081528451511515868801908152855185015184166060880190815286518901518516608089019081528a516001600160a01b031660009081526009909752958990209751885493519251151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff93909516600160801b9081027fffffffffffffffffffffffff0000000000000000000000000000000000000000909516918716919091179390931791909116929092178655905192518216029116176001909201919091558251905191517f395b7374909d2b54e5796f53c898ebf41d767c86c78ea86519acf2b805852d889261198592916128aa565b60405180910390a1611a2a565b80516119a090600790611be8565b1561179a5780516001600160a01b031660009081526009602052604080822080547fffffffffffffffffffffff00000000000000000000000000000000000000000016815560010191909155815190517fcf91daec21e3510e2f2aea4b09d08c235d5c6844980be709f282ef591dbf420c91611985916001600160a01b0391909116815260200190565b50611a348161296d565b90506117ef565b5050505050565b336001600160a01b03821603611a9a5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610618565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000611b58826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611fc99092919063ffffffff16565b8051909150156112185780806020019051810190611b7691906128f5565b6112185760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610618565b6000610f72836001600160a01b038416611fd8565b6000610f72836001600160a01b0384166120cb565b6000611c3185611c228486612a32565b611c2c9087612897565b611c3c565b90505b949350505050565b6000818310611c4b5781610f72565b5090919050565b825474010000000000000000000000000000000000000000900460ff161580611c79575081155b15611c8357505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090611cbc90600160801b900463ffffffff164261292b565b90508015611d625781831115611cfe576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154611d2b90839085908490600160801b90046fffffffffffffffffffffffffffffffff16611c12565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16600160801b4263ffffffff160217875592505b84821015611dff576001600160a01b038416611db4576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610618565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610618565b84831015611eeb57600186810154600160801b90046fffffffffffffffffffffffffffffffff16906000908290611e36908261292b565b611e40878a61292b565b611e4a9190612897565b611e549190612a49565b90506001600160a01b038616611ea0576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610618565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610618565b611ef5858461292b565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b606081600001805480602002602001604051908101604052809291908181526020018280548015611fbd57602002820191906000526020600020905b815481526020019060010190808311611fa9575b50505050509050919050565b6060611c34848460008561211a565b600081815260018301602052604081205480156120c1576000611ffc60018361292b565b85549091506000906120109060019061292b565b90508181146120755760008660000182815481106120305761203061293e565b90600052602060002001549050808760000184815481106120535761205361293e565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061208657612086612a84565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104a6565b60009150506104a6565b6000818152600183016020526040812054612112575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104a6565b5060006104a6565b6060824710156121925760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610618565b600080866001600160a01b031685876040516121ae9190612ab3565b60006040518083038185875af1925050503d80600081146121eb576040519150601f19603f3d011682016040523d82523d6000602084013e6121f0565b606091505b50915091506122018783838761220c565b979650505050505050565b6060831561227b578251600003612274576001600160a01b0385163b6122745760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610618565b5081611c34565b611c3483838151156122905781518083602001fd5b8060405162461bcd60e51b815260040161061891906127b0565b6000602082840312156122bc57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610f7257600080fd5b80356001600160a01b038116811461230357600080fd5b919050565b60006020828403121561231a57600080fd5b610f72826122ec565b60006020828403121561233557600080fd5b5035919050565b60008083601f84011261234e57600080fd5b50813567ffffffffffffffff81111561236657600080fd5b6020830191508360208260051b850101111561238157600080fd5b9250929050565b6000806000806040858703121561239e57600080fd5b843567ffffffffffffffff808211156123b657600080fd5b6123c28883890161233c565b909650945060208701359150808211156123db57600080fd5b506123e88782880161233c565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715612446576124466123f4565b60405290565b8015158114610eb957600080fd5b80356fffffffffffffffffffffffffffffffff8116811461230357600080fd5b60006060828403121561248c57600080fd5b612494612423565b905081356124a18161244c565b81526124af6020830161245a565b60208201526124c06040830161245a565b604082015292915050565b600080608083850312156124de57600080fd5b6124e7836122ec565b91506124f6846020850161247a565b90509250929050565b600082601f83011261251057600080fd5b813567ffffffffffffffff8082111561252b5761252b6123f4565b604051601f8301601f19908116603f01168101908282118183101715612553576125536123f4565b8160405283815286602085880101111561256c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803567ffffffffffffffff8116811461230357600080fd5b600080600080600060a086880312156125bc57600080fd5b853567ffffffffffffffff808211156125d457600080fd5b6125e089838a016124ff565b96506125ee602089016122ec565b9550604088013594506126036060890161258c565b9350608088013591508082111561261957600080fd5b50612626888289016124ff565b9150509295509295909350565b6020808252825182820181905260009190848201906040850190845b818110156126745783516001600160a01b03168352928401929184019160010161264f565b50909695505050505050565b60008083601f84011261269257600080fd5b50813567ffffffffffffffff8111156126aa57600080fd5b60208301915083602082850101111561238157600080fd5b600080600080600080600060a0888a0312156126dd57600080fd5b6126e6886122ec565b9650602088013567ffffffffffffffff8082111561270357600080fd5b61270f8b838c01612680565b909850965060408a0135955086915061272a60608b0161258c565b945060808a013591508082111561274057600080fd5b5061274d8a828b01612680565b989b979a50959850939692959293505050565b60005b8381101561277b578181015183820152602001612763565b50506000910152565b6000815180845261279c816020860160208601612760565b601f01601f19169290920160200192915050565b602081526000610f726020830184612784565b60008083601f8401126127d557600080fd5b50813567ffffffffffffffff8111156127ed57600080fd5b60208301915083602060a08302850101111561238157600080fd5b6000806000806040858703121561281e57600080fd5b843567ffffffffffffffff8082111561283657600080fd5b612842888389016127c3565b9096509450602087013591508082111561285b57600080fd5b506123e8878288016127c3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104a6576104a6612868565b6001600160a01b038316815260808101610f7260208301848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b60006020828403121561290757600080fd5b8151610f728161244c565b60006020828403121561292457600080fd5b5051919050565b818103818111156104a6576104a6612868565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361299e5761299e612868565b5060010190565b606081016104a682848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b600060a082840312156129f357600080fd5b6129fb612423565b612a04836122ec565b81526020830135612a148161244c565b6020820152612a26846040850161247a565b60408201529392505050565b80820281158282048414176104a6576104a6612868565b600082612a7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251612ac5818460208701612760565b919091019291505056fea164736f6c6343000813000a",
    "linkReferences": {},
    "deployedLinkReferences": {}
  }
  