{
  "_format": "hh-sol-artifact-1",
  "contractName": "EVM2EVMOnRamp",
  "sourceName": "src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol",
  "abi": [
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "linkToken",
              "type": "address"
            },
            {
              "internalType": "uint64",
              "name": "chainSelector",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "destChainSelector",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "defaultTxGasLimit",
              "type": "uint64"
            },
            {
              "internalType": "uint96",
              "name": "maxNopFeesJuels",
              "type": "uint96"
            },
            {
              "internalType": "address",
              "name": "prevOnRamp",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "armProxy",
              "type": "address"
            }
          ],
          "internalType": "struct EVM2EVMOnRamp.StaticConfig",
          "name": "staticConfig",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "router",
              "type": "address"
            },
            {
              "internalType": "uint16",
              "name": "maxTokensLength",
              "type": "uint16"
            },
            {
              "internalType": "address",
              "name": "priceRegistry",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "maxDataSize",
              "type": "uint32"
            },
            {
              "internalType": "uint64",
              "name": "maxGasLimit",
              "type": "uint64"
            }
          ],
          "internalType": "struct EVM2EVMOnRamp.DynamicConfig",
          "name": "dynamicConfig",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "pool",
              "type": "address"
            }
          ],
          "internalType": "struct Internal.PoolUpdate[]",
          "name": "tokensAndPools",
          "type": "tuple[]"
        },
        {
          "internalType": "address[]",
          "name": "allowlist",
          "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": "rateLimiterConfig",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "uint64",
              "name": "gasMultiplier",
              "type": "uint64"
            },
            {
              "internalType": "uint96",
              "name": "networkFeeAmountUSD",
              "type": "uint96"
            },
            {
              "internalType": "uint32",
              "name": "destGasOverhead",
              "type": "uint32"
            },
            {
              "internalType": "uint16",
              "name": "destGasPerPayloadByte",
              "type": "uint16"
            },
            {
              "internalType": "bool",
              "name": "enabled",
              "type": "bool"
            }
          ],
          "internalType": "struct EVM2EVMOnRamp.FeeTokenConfigArgs[]",
          "name": "feeTokenConfigs",
          "type": "tuple[]"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "minFee",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "maxFee",
              "type": "uint32"
            },
            {
              "internalType": "uint16",
              "name": "ratio",
              "type": "uint16"
            }
          ],
          "internalType": "struct EVM2EVMOnRamp.TokenTransferFeeConfigArgs[]",
          "name": "tokenTransferFeeConfigArgs",
          "type": "tuple[]"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "nop",
              "type": "address"
            },
            {
              "internalType": "uint16",
              "name": "weight",
              "type": "uint16"
            }
          ],
          "internalType": "struct EVM2EVMOnRamp.NopAndWeight[]",
          "name": "nopsAndWeights",
          "type": "tuple[]"
        }
      ],
      "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": "BadARMSignal",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "BucketOverfilled",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InsufficientBalance",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "encodedAddress",
          "type": "bytes"
        }
      ],
      "name": "InvalidAddress",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidConfig",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidExtraArgsTag",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "nop",
          "type": "address"
        }
      ],
      "name": "InvalidNopAddress",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidTokenPoolConfig",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidWithdrawParams",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "LinkBalanceNotSettled",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MaxFeeBalanceReached",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MessageGasLimitTooHigh",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "maxSize",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "actualSize",
          "type": "uint256"
        }
      ],
      "name": "MessageTooLarge",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MustBeCalledByRouter",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoFeesToPay",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoNopsToPay",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "NotAFeeToken",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyCallableByAdminOrOwner",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyCallableByOwnerOrAdmin",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyCallableByOwnerOrAdminOrNop",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "PoolAlreadyAdded",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "PoolDoesNotExist",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "PriceNotFoundForToken",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "RouterMustSetOriginalSender",
      "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": [],
      "name": "TokenPoolMismatch",
      "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": "TooManyNops",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UnsupportedNumberOfTokens",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC20",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "UnsupportedToken",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "newAdmin",
          "type": "address"
        }
      ],
      "name": "AdminSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "AllowListAdd",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bool",
          "name": "enabled",
          "type": "bool"
        }
      ],
      "name": "AllowListEnabledSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "AllowListRemove",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint64",
              "name": "sourceChainSelector",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "sequenceNumber",
              "type": "uint64"
            },
            {
              "internalType": "uint256",
              "name": "feeTokenAmount",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "sender",
              "type": "address"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            },
            {
              "internalType": "uint256",
              "name": "gasLimit",
              "type": "uint256"
            },
            {
              "internalType": "bool",
              "name": "strict",
              "type": "bool"
            },
            {
              "internalType": "address",
              "name": "receiver",
              "type": "address"
            },
            {
              "internalType": "bytes",
              "name": "data",
              "type": "bytes"
            },
            {
              "components": [
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "internalType": "struct Client.EVMTokenAmount[]",
              "name": "tokenAmounts",
              "type": "tuple[]"
            },
            {
              "internalType": "address",
              "name": "feeToken",
              "type": "address"
            },
            {
              "internalType": "bytes32",
              "name": "messageId",
              "type": "bytes32"
            }
          ],
          "indexed": false,
          "internalType": "struct Internal.EVM2EVMMessage",
          "name": "message",
          "type": "tuple"
        }
      ],
      "name": "CCIPSendRequested",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "linkToken",
              "type": "address"
            },
            {
              "internalType": "uint64",
              "name": "chainSelector",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "destChainSelector",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "defaultTxGasLimit",
              "type": "uint64"
            },
            {
              "internalType": "uint96",
              "name": "maxNopFeesJuels",
              "type": "uint96"
            },
            {
              "internalType": "address",
              "name": "prevOnRamp",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "armProxy",
              "type": "address"
            }
          ],
          "indexed": false,
          "internalType": "struct EVM2EVMOnRamp.StaticConfig",
          "name": "staticConfig",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "router",
              "type": "address"
            },
            {
              "internalType": "uint16",
              "name": "maxTokensLength",
              "type": "uint16"
            },
            {
              "internalType": "address",
              "name": "priceRegistry",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "maxDataSize",
              "type": "uint32"
            },
            {
              "internalType": "uint64",
              "name": "maxGasLimit",
              "type": "uint64"
            }
          ],
          "indexed": false,
          "internalType": "struct EVM2EVMOnRamp.DynamicConfig",
          "name": "dynamicConfig",
          "type": "tuple"
        }
      ],
      "name": "ConfigSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "uint64",
              "name": "gasMultiplier",
              "type": "uint64"
            },
            {
              "internalType": "uint96",
              "name": "networkFeeAmountUSD",
              "type": "uint96"
            },
            {
              "internalType": "uint32",
              "name": "destGasOverhead",
              "type": "uint32"
            },
            {
              "internalType": "uint16",
              "name": "destGasPerPayloadByte",
              "type": "uint16"
            },
            {
              "internalType": "bool",
              "name": "enabled",
              "type": "bool"
            }
          ],
          "indexed": false,
          "internalType": "struct EVM2EVMOnRamp.FeeTokenConfigArgs[]",
          "name": "feeConfig",
          "type": "tuple[]"
        }
      ],
      "name": "FeeConfigSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "nop",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "NopPaid",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "nopWeightsTotal",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "nop",
              "type": "address"
            },
            {
              "internalType": "uint16",
              "name": "weight",
              "type": "uint16"
            }
          ],
          "indexed": false,
          "internalType": "struct EVM2EVMOnRamp.NopAndWeight[]",
          "name": "nopsAndWeights",
          "type": "tuple[]"
        }
      ],
      "name": "NopsSet",
      "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": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "pool",
          "type": "address"
        }
      ],
      "name": "PoolAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "pool",
          "type": "address"
        }
      ],
      "name": "PoolRemoved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "minFee",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "maxFee",
              "type": "uint32"
            },
            {
              "internalType": "uint16",
              "name": "ratio",
              "type": "uint16"
            }
          ],
          "indexed": false,
          "internalType": "struct EVM2EVMOnRamp.TokenTransferFeeConfigArgs[]",
          "name": "transferFeeConfig",
          "type": "tuple[]"
        }
      ],
      "name": "TokenTransferFeeConfigSet",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "acceptOwnership",
      "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": "token",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "pool",
              "type": "address"
            }
          ],
          "internalType": "struct Internal.PoolUpdate[]",
          "name": "removes",
          "type": "tuple[]"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "pool",
              "type": "address"
            }
          ],
          "internalType": "struct Internal.PoolUpdate[]",
          "name": "adds",
          "type": "tuple[]"
        }
      ],
      "name": "applyPoolUpdates",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "currentRateLimiterState",
      "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": [
        {
          "components": [
            {
              "internalType": "bytes",
              "name": "receiver",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "data",
              "type": "bytes"
            },
            {
              "components": [
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "internalType": "struct Client.EVMTokenAmount[]",
              "name": "tokenAmounts",
              "type": "tuple[]"
            },
            {
              "internalType": "address",
              "name": "feeToken",
              "type": "address"
            },
            {
              "internalType": "bytes",
              "name": "extraArgs",
              "type": "bytes"
            }
          ],
          "internalType": "struct Client.EVM2AnyMessage",
          "name": "message",
          "type": "tuple"
        },
        {
          "internalType": "uint256",
          "name": "feeTokenAmount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "originalSender",
          "type": "address"
        }
      ],
      "name": "forwardFromRouter",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "nonpayable",
      "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": "getDynamicConfig",
      "outputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "router",
              "type": "address"
            },
            {
              "internalType": "uint16",
              "name": "maxTokensLength",
              "type": "uint16"
            },
            {
              "internalType": "address",
              "name": "priceRegistry",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "maxDataSize",
              "type": "uint32"
            },
            {
              "internalType": "uint64",
              "name": "maxGasLimit",
              "type": "uint64"
            }
          ],
          "internalType": "struct EVM2EVMOnRamp.DynamicConfig",
          "name": "dynamicConfig",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getExpectedNextSequenceNumber",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "bytes",
              "name": "receiver",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "data",
              "type": "bytes"
            },
            {
              "components": [
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "internalType": "struct Client.EVMTokenAmount[]",
              "name": "tokenAmounts",
              "type": "tuple[]"
            },
            {
              "internalType": "address",
              "name": "feeToken",
              "type": "address"
            },
            {
              "internalType": "bytes",
              "name": "extraArgs",
              "type": "bytes"
            }
          ],
          "internalType": "struct Client.EVM2AnyMessage",
          "name": "message",
          "type": "tuple"
        }
      ],
      "name": "getFee",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "getFeeTokenConfig",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint96",
              "name": "networkFeeAmountUSD",
              "type": "uint96"
            },
            {
              "internalType": "uint64",
              "name": "gasMultiplier",
              "type": "uint64"
            },
            {
              "internalType": "uint32",
              "name": "destGasOverhead",
              "type": "uint32"
            },
            {
              "internalType": "uint16",
              "name": "destGasPerPayloadByte",
              "type": "uint16"
            },
            {
              "internalType": "bool",
              "name": "enabled",
              "type": "bool"
            }
          ],
          "internalType": "struct EVM2EVMOnRamp.FeeTokenConfig",
          "name": "feeTokenConfig",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getNopFeesJuels",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "",
          "type": "uint96"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getNops",
      "outputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "nop",
              "type": "address"
            },
            {
              "internalType": "uint16",
              "name": "weight",
              "type": "uint16"
            }
          ],
          "internalType": "struct EVM2EVMOnRamp.NopAndWeight[]",
          "name": "nopsAndWeights",
          "type": "tuple[]"
        },
        {
          "internalType": "uint256",
          "name": "weightsTotal",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC20",
          "name": "sourceToken",
          "type": "address"
        }
      ],
      "name": "getPoolBySourceToken",
      "outputs": [
        {
          "internalType": "contract IPool",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "getSenderNonce",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getStaticConfig",
      "outputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "linkToken",
              "type": "address"
            },
            {
              "internalType": "uint64",
              "name": "chainSelector",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "destChainSelector",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "defaultTxGasLimit",
              "type": "uint64"
            },
            {
              "internalType": "uint96",
              "name": "maxNopFeesJuels",
              "type": "uint96"
            },
            {
              "internalType": "address",
              "name": "prevOnRamp",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "armProxy",
              "type": "address"
            }
          ],
          "internalType": "struct EVM2EVMOnRamp.StaticConfig",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getSupportedTokens",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTokenLimitAdmin",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "getTokenTransferFeeConfig",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "minFee",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "maxFee",
              "type": "uint32"
            },
            {
              "internalType": "uint16",
              "name": "ratio",
              "type": "uint16"
            }
          ],
          "internalType": "struct EVM2EVMOnRamp.TokenTransferFeeConfig",
          "name": "tokenTransferFeeConfig",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "linkAvailableForPayment",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "payNops",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newAdmin",
          "type": "address"
        }
      ],
      "name": "setAdmin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bool",
          "name": "enabled",
          "type": "bool"
        }
      ],
      "name": "setAllowListEnabled",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "router",
              "type": "address"
            },
            {
              "internalType": "uint16",
              "name": "maxTokensLength",
              "type": "uint16"
            },
            {
              "internalType": "address",
              "name": "priceRegistry",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "maxDataSize",
              "type": "uint32"
            },
            {
              "internalType": "uint64",
              "name": "maxGasLimit",
              "type": "uint64"
            }
          ],
          "internalType": "struct EVM2EVMOnRamp.DynamicConfig",
          "name": "dynamicConfig",
          "type": "tuple"
        }
      ],
      "name": "setDynamicConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "uint64",
              "name": "gasMultiplier",
              "type": "uint64"
            },
            {
              "internalType": "uint96",
              "name": "networkFeeAmountUSD",
              "type": "uint96"
            },
            {
              "internalType": "uint32",
              "name": "destGasOverhead",
              "type": "uint32"
            },
            {
              "internalType": "uint16",
              "name": "destGasPerPayloadByte",
              "type": "uint16"
            },
            {
              "internalType": "bool",
              "name": "enabled",
              "type": "bool"
            }
          ],
          "internalType": "struct EVM2EVMOnRamp.FeeTokenConfigArgs[]",
          "name": "feeTokenConfigArgs",
          "type": "tuple[]"
        }
      ],
      "name": "setFeeTokenConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "nop",
              "type": "address"
            },
            {
              "internalType": "uint16",
              "name": "weight",
              "type": "uint16"
            }
          ],
          "internalType": "struct EVM2EVMOnRamp.NopAndWeight[]",
          "name": "nopsAndWeights",
          "type": "tuple[]"
        }
      ],
      "name": "setNops",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "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": "setRateLimiterConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "minFee",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "maxFee",
              "type": "uint32"
            },
            {
              "internalType": "uint16",
              "name": "ratio",
              "type": "uint16"
            }
          ],
          "internalType": "struct EVM2EVMOnRamp.TokenTransferFeeConfigArgs[]",
          "name": "tokenTransferFeeConfigArgs",
          "type": "tuple[]"
        }
      ],
      "name": "setTokenTransferFeeConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "typeAndVersion",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "feeToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        }
      ],
      "name": "withdrawNonLinkFees",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x6101806040526012805460ff60c01b191690553480156200001f57600080fd5b5060405162007f9338038062007f93833981016040819052620000429162001eb3565b8333806000816200009a5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000cd57620000cd8162000369565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080909301839052600380546001600160a01b031916909417600160801b9283021760ff60a01b1916600160a01b90910217909255029091176004555087516001600160a01b0316158062000176575060208801516001600160401b0316155b806200018d575060408801516001600160401b0316155b80620001a4575060608801516001600160401b0316155b80620001bb575060c08801516001600160a01b0316155b15620001da576040516306b7c75960e31b815260040160405180910390fd5b6020808901516040808b015181517fbdd59ac4dd1d82276c9a9c5d2656546346b9dcdb1f9b4204aed4ec15c23d7d3a948101949094526001600160401b039283169184019190915216606082015230608082015260a00160408051601f19818403018152918152815160209283012060809081528a516001600160a01b0390811660e052928b01516001600160401b0390811661010052918b015182166101205260608b015190911660a0908152908a01516001600160601b031660c0908152908a01518216610140528901511661016052620002b78762000414565b620002c28362000566565b620002cd82620006d8565b620002d881620007e5565b6040805160008082526020820190925262000323916200031b565b6040805180820190915260008082526020820152815260200190600190039081620002f35790505b508762000a0f565b8451156200035b576012805460ff60c81b1916600160c81b179055604080516000808252602082019092526200035b91508662000d12565b505050505050505062002405565b336001600160a01b03821603620003c35760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000091565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60408101516001600160a01b031662000440576040516306b7c75960e31b815260040160405180910390fd5b8051600580546020808501516001600160a01b039485166001600160b01b031990931692909217600160a01b61ffff909316830217909255604080850151600680546060808901516080808b0151958a166001600160c01b03199094169390931763ffffffff909116909602959095176001600160c01b0316600160c01b6001600160401b039485160217909155825160e080820185525187168152610100518316958101959095526101205182168584015260a080519092169385019390935260c080516001600160601b03169385019390935261014051851690840152610160519093169082015290517fdd226617d8d287f40a64c54741bbcdc492b3e096ef16bc5273a18cb6ab85f124916200055b91849062001fd6565b60405180910390a150565b60005b8151811015620006a65760008282815181106200058a576200058a62002086565b6020908102919091018101516040805160a08082018352828401516001600160601b039081168352848601516001600160401b0390811684880190815260608088015163ffffffff9081168789019081526080808b015161ffff908116948a01948552978b0151151590890190815299516001600160a01b03166000908152600f909b52979099209551865492519751915198511515600160d01b0260ff60d01b1999909616600160c01b0261ffff60c01b1992909a16600160a01b029190911665ffffffffffff60a01b19979093166c01000000000000000000000000026001600160a01b03199092169316929092179190911793909316929092179390931791909116179055506200069e81620020b2565b905062000569565b507ffba339fca97870ffdfaedbae3745db5e6de1a6909dfd0e0dbb56917469ffe236816040516200055b9190620020ce565b60005b8151811015620007b3576000828281518110620006fc57620006fc62002086565b60209081029190910181015160408051606080820183528385015163ffffffff90811683528385015181168387019081529185015161ffff90811684860190815295516001600160a01b031660009081526010909752939095209151825491519451909316680100000000000000000261ffff60401b19948616640100000000026001600160401b03199092169390951692909217919091179190911691909117905550620007ab81620020b2565b9050620006db565b507fcb0c5f472d325cf0c56953fc81870ddd80d0d3c9a3fbfe777002d75f380dfb81816040516200055b91906200216f565b805160408111156200080a57604051635ad0867d60e11b815260040160405180910390fd5b6012546c01000000000000000000000000900463ffffffff161580159062000854575060125463ffffffff6c010000000000000000000000008204166001600160601b0390911610155b1562000864576200086462000e5d565b60006200087260076200105d565b90505b8015620008be576000620008986200088f600184620021de565b60079062001070565b509050620008a86007826200108e565b505080620008b690620021f4565b905062000875565b506000805b82811015620009a6576000848281518110620008e357620008e362002086565b6020026020010151600001519050600085838151811062000908576200090862002086565b602002602001015160200151905060e0516001600160a01b0316826001600160a01b031614806200094057506001600160a01b038216155b156200096b57604051634de938d160e01b81526001600160a01b038316600482015260240162000091565b6200097d60078361ffff8416620010ac565b506200098e61ffff8216856200220e565b93505050806200099e90620020b2565b9050620008c3565b506012805463ffffffff60601b19166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd249062000a0290839086906200222e565b60405180910390a1505050565b60005b825181101562000b4b57600083828151811062000a335762000a3362002086565b6020026020010151600001519050600084838151811062000a585762000a5862002086565b6020908102919091018101510151905062000a75600a83620010cc565b62000a9f576040516373913ebd60e01b81526001600160a01b038316600482015260240162000091565b6001600160a01b03811662000ab6600a84620010e3565b6001600160a01b03161462000ade57604051630d98f73360e31b815260040160405180910390fd5b62000aeb600a83620010fa565b1562000b3557604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b50508062000b4390620020b2565b905062000a12565b5060005b815181101562000d0d57600082828151811062000b705762000b7062002086565b6020026020010151600001519050600083838151811062000b955762000b9562002086565b602002602001015160200151905060006001600160a01b0316826001600160a01b0316148062000bcc57506001600160a01b038116155b1562000bea5760405162d8548360e71b815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000c29573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c4f91906200229b565b6001600160a01b0316826001600160a01b03161462000c8157604051630d98f73360e31b815260040160405180910390fd5b62000c8f600a838362001111565b1562000cde57604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a162000cf7565b604051633caf458560e01b815260040160405180910390fd5b50508062000d0590620020b2565b905062000b4f565b505050565b60005b825181101562000da757600083828151811062000d365762000d3662002086565b6020908102919091010151905062000d50600d8262001129565b1562000d93576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b5062000d9f81620020b2565b905062000d15565b5060005b815181101562000d0d57600082828151811062000dcc5762000dcc62002086565b6020026020010151905060006001600160a01b0316816001600160a01b03160362000df8575062000e4a565b62000e05600d8262001140565b1562000e48576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b62000e5581620020b2565b905062000dab565b6000546001600160a01b0316331480159062000e8457506002546001600160a01b03163314155b801562000e9b575062000e9960073362001157565b155b1562000eba5760405163032bb72b60e31b815260040160405180910390fd5b6012546c01000000000000000000000000900463ffffffff16600081900362000ef65760405163990e30bf60e01b815260040160405180910390fd5b6012546001600160601b03168181101562000f24576040516311a1ee3b60e31b815260040160405180910390fd5b600062000f306200116e565b121562000f5057604051631e9acf1760e31b815260040160405180910390fd5b80600062000f5f60076200105d565b905060005b81811015620010375760008062000f7d60078462001070565b909250905060008762000f9a836001600160601b038a16620022bb565b62000fa69190620022d5565b905062000fb48187620022f8565b60e05190965062000fd9906001600160a01b0316846001600160601b038416620011fc565b6040516001600160601b03821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a2505050806200102f90620020b2565b905062000f64565b5050601280546001600160601b0319166001600160601b03929092169190911790555050565b60006200106a8262001254565b92915050565b600080808062001081868662001261565b9097909650945050505050565b6000620010a5836001600160a01b0384166200128e565b9392505050565b6000620010c4846001600160a01b03851684620012ad565b949350505050565b6000620010a5836001600160a01b038416620012cc565b6000620010a5836001600160a01b038416620012da565b6000620010a5836001600160a01b038416620012e8565b6000620010c4846001600160a01b03851684620012f6565b6000620010a5836001600160a01b0384166200130e565b6000620010a5836001600160a01b03841662001419565b6000620010a5836001600160a01b0384166200146b565b60125460e0516040516370a0823160e01b81523060048201526000926001600160601b0316916001600160a01b0316906370a0823190602401602060405180830381865afa158015620011c5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620011eb91906200231b565b620011f7919062002335565b905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663a9059cbb60e01b1790915262000d0d9185916200147916565b60006200106a826200154a565b6000808062001271858562001555565b600081815260029690960160205260409095205494959350505050565b60008181526002830160205260408120819055620010a5838362001563565b60008281526002840160205260408120829055620010c4848462001571565b6000620010a583836200146b565b6000620010a583836200157f565b6000620010a583836200128e565b6000620010c484846001600160a01b038516620012ad565b600081815260018301602052604081205480156200140757600062001335600183620021de565b85549091506000906200134b90600190620021de565b9050818114620013b75760008660000182815481106200136f576200136f62002086565b906000526020600020015490508087600001848154811062001395576200139562002086565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080620013cb57620013cb62002358565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506200106a565b60009150506200106a565b5092915050565b600081815260018301602052604081205462001462575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200106a565b5060006200106a565b6000620010a58383620015f4565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620014c8906001600160a01b0385169084906200160d565b80519091501562000d0d5780806020019051810190620014e991906200236e565b62000d0d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000091565b60006200106a825490565b6000620010a583836200161e565b6000620010a583836200130e565b6000620010a5838362001419565b600081815260028301602052604081205480151580620015a65750620015a684846200146b565b620010a55760405162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640162000091565b60008181526001830160205260408120541515620010a5565b6060620010c484846000856200164b565b600082600001828154811062001638576200163862002086565b9060005260206000200154905092915050565b606082471015620016ae5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000091565b600080866001600160a01b03168587604051620016cc9190620023b2565b60006040518083038185875af1925050503d80600081146200170b576040519150601f19603f3d011682016040523d82523d6000602084013e62001710565b606091505b50909250905062001724878383876200172f565b979650505050505050565b60608315620017a35782516000036200179b576001600160a01b0385163b6200179b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000091565b5081620010c4565b620010c48383815115620017ba5781518083602001fd5b8060405162461bcd60e51b8152600401620000919190620023d0565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715620018115762001811620017d6565b60405290565b60405160c081016001600160401b0381118282101715620018115762001811620017d6565b604051608081016001600160401b0381118282101715620018115762001811620017d6565b604051601f8201601f191681016001600160401b03811182821017156200188c576200188c620017d6565b604052919050565b6001600160a01b0381168114620018aa57600080fd5b50565b80516001600160401b0381168114620018c557600080fd5b919050565b80516001600160601b0381168114620018c557600080fd5b600060e08284031215620018f557600080fd5b60405160e081016001600160401b03811182821017156200191a576200191a620017d6565b806040525080915082516200192f8162001894565b81526200193f60208401620018ad565b60208201526200195260408401620018ad565b60408201526200196560608401620018ad565b60608201526200197860808401620018ca565b608082015260a08301516200198d8162001894565b60a082015260c0830151620019a28162001894565b60c0919091015292915050565b805161ffff81168114620018c557600080fd5b805163ffffffff81168114620018c557600080fd5b600060a08284031215620019ea57600080fd5b60405160a081016001600160401b038111828210171562001a0f5762001a0f620017d6565b8060405250809150825162001a248162001894565b815262001a3460208401620019af565b6020820152604083015162001a498162001894565b604082015262001a5c60608401620019c2565b606082015262001a6f60808401620018ad565b60808201525092915050565b60006001600160401b0382111562001a975762001a97620017d6565b5060051b60200190565b600082601f83011262001ab357600080fd5b8151602062001acc62001ac68362001a7b565b62001861565b82815260069290921b8401810191818101908684111562001aec57600080fd5b8286015b8481101562001b46576040818903121562001b0b5760008081fd5b62001b15620017ec565b815162001b228162001894565b81528185015162001b338162001894565b8186015283529183019160400162001af0565b509695505050505050565b600082601f83011262001b6357600080fd5b8151602062001b7662001ac68362001a7b565b82815260059290921b8401810191818101908684111562001b9657600080fd5b8286015b8481101562001b4657805162001bb08162001894565b835291830191830162001b9a565b80518015158114620018c557600080fd5b80516001600160801b0381168114620018c557600080fd5b60006060828403121562001bfa57600080fd5b604051606081016001600160401b038111828210171562001c1f5762001c1f620017d6565b60405290508062001c308362001bbe565b815262001c406020840162001bcf565b602082015262001c536040840162001bcf565b60408201525092915050565b600082601f83011262001c7157600080fd5b8151602062001c8462001ac68362001a7b565b82815260c0928302850182019282820191908785111562001ca457600080fd5b8387015b8581101562001d465781818a03121562001cc25760008081fd5b62001ccc62001817565b815162001cd98162001894565b815262001ce8828701620018ad565b86820152604062001cfb818401620018ca565b90820152606062001d0e838201620019c2565b90820152608062001d21838201620019af565b9082015260a062001d3483820162001bbe565b90820152845292840192810162001ca8565b5090979650505050505050565b600082601f83011262001d6557600080fd5b8151602062001d7862001ac68362001a7b565b82815260079290921b8401810191818101908684111562001d9857600080fd5b8286015b8481101562001b46576080818903121562001db75760008081fd5b62001dc16200183c565b815162001dce8162001894565b815262001ddd828601620019c2565b85820152604062001df0818401620019c2565b90820152606062001e03838201620019af565b9082015283529183019160800162001d9c565b600082601f83011262001e2857600080fd5b8151602062001e3b62001ac68362001a7b565b82815260069290921b8401810191818101908684111562001e5b57600080fd5b8286015b8481101562001b46576040818903121562001e7a5760008081fd5b62001e84620017ec565b815162001e918162001894565b815262001ea0828601620019af565b8186015283529183019160400162001e5f565b600080600080600080600080610280898b03121562001ed157600080fd5b62001edd8a8a620018e2565b975062001eee8a60e08b01620019d7565b6101808a01519097506001600160401b038082111562001f0d57600080fd5b62001f1b8c838d0162001aa1565b97506101a08b015191508082111562001f3357600080fd5b62001f418c838d0162001b51565b965062001f538c6101c08d0162001be7565b95506102208b015191508082111562001f6b57600080fd5b62001f798c838d0162001c5f565b94506102408b015191508082111562001f9157600080fd5b62001f9f8c838d0162001d53565b93506102608b015191508082111562001fb757600080fd5b5062001fc68b828c0162001e16565b9150509295985092959890939650565b82516001600160a01b0390811682526020808501516001600160401b03908116828501526040808701518216818601526060808801518316818701526080808901516001600160601b03168188015260a0808a015187169088015260c0808a01518716908801528751861660e08801529387015161ffff16610100870152908601519093166101208501529184015163ffffffff16610140840152830151166101608201526101808101620010a5565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620020c757620020c76200209c565b5060010190565b602080825282518282018190526000919060409081850190868401855b828110156200216257815180516001600160a01b03168552868101516001600160401b031687860152858101516001600160601b03168686015260608082015163ffffffff169086015260808082015161ffff169086015260a09081015115159085015260c09093019290850190600101620020eb565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156200216257815180516001600160a01b031685528681015163ffffffff9081168887015286820151168686015260609081015161ffff1690850152608090930192908501906001016200218c565b818103818111156200106a576200106a6200209c565b6000816200220657620022066200209c565b506000190190565b63ffffffff8181168382160190808211156200141257620014126200209c565b6000604080830163ffffffff8616845260208281860152818651808452606087019150828801935060005b818110156200228d57845180516001600160a01b0316845284015161ffff1684840152938301939185019160010162002259565b509098975050505050505050565b600060208284031215620022ae57600080fd5b8151620010a58162001894565b80820281158282048414176200106a576200106a6200209c565b600082620022f357634e487b7160e01b600052601260045260246000fd5b500490565b6001600160601b038281168282160390808211156200141257620014126200209c565b6000602082840312156200232e57600080fd5b5051919050565b81810360008312801583831316838312821617156200141257620014126200209c565b634e487b7160e01b600052603160045260246000fd5b6000602082840312156200238157600080fd5b620010a58262001bbe565b60005b83811015620023a95781810151838201526020016200238f565b50506000910152565b60008251620023c68184602087016200238c565b9190910192915050565b6020815260008251806020840152620023f18160408501602087016200238c565b601f01601f19169190910160400192915050565b60805160a05160c05160e05161010051610120516101405161016051615a876200250c60003960008181610360015281816113ac0152612b87015260008181610331015281816112c20152818161132a015281816117fc015281816118640152612b5f01526000818161029d01528181610ac601528181611bf70152612ad701526000818161026d0152818161192f0152612aad01526000818161023e01528181610db6015281816115af015281816116a80152818161212c01528181612a8801528181612cd201526131a30152600081816102fd015281816117740152612b290152600081816102cd015281816122480152612afe01526000611b110152615a876000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806376f6ae761161010f578063b06d41bc116100a2578063e0351e1311610071578063e0351e13146108cc578063efeadb6d146108ff578063eff7cc4814610912578063f2fde38b1461091a57600080fd5b8063b06d41bc14610893578063c92b2832146108a9578063d09dc339146108bc578063d3c7c2c7146108c457600080fd5b80638da5cb5b116100de5780638da5cb5b146106ff5780639a113c3614610710578063a7cd63b71461086b578063a7d3e02f1461088057600080fd5b806376f6ae76146106be578063799c3a67146106d157806379ba5097146106e4578063856c8247146106ec57600080fd5b8063549e946f116101875780635d86f141116101565780635d86f141146105d45780635ebbd9f8146105e7578063704b6c02146105fa5780637437ff9f1461060d57600080fd5b8063549e946f1461056957806354b714681461057c57806354c8a4f31461059c578063599f6431146105af57600080fd5b80633a87ac53116101c35780633a87ac53146104bc5780633a9bf949146104d15780634120fccd146104e4578063546719cd1461050557600080fd5b806306285c69146101f55780631772047e146103a6578063181f5a771461045257806338724a951461049b575b600080fd5b6103906040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b60405161039d9190614698565b60405180910390f35b6104216103b4366004614729565b6040805160608082018352600080835260208084018290529284018190526001600160a01b039490941684526010825292829020825193840183525463ffffffff80821685526401000000008204169184019190915268010000000000000000900461ffff169082015290565b60408051825163ffffffff9081168252602080850151909116908201529181015161ffff169082015260600161039d565b61048e6040518060400160405280601381526020017f45564d3245564d4f6e52616d7020312e302e300000000000000000000000000081525081565b60405161039d9190614796565b6104ae6104a93660046147bb565b61092d565b60405190815260200161039d565b6104cf6104ca366004614984565b610c5a565b005b6104cf6104df366004614a29565b610c70565b6104ec610c84565b60405167ffffffffffffffff909116815260200161039d565b61050d610cb8565b60405161039d919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6104cf610577366004614abd565b610d57565b6012546040516bffffffffffffffffffffffff909116815260200161039d565b6104cf6105aa366004614b5a565b610f0c565b6002546001600160a01b03165b6040516001600160a01b03909116815260200161039d565b6105bc6105e2366004614729565b610f1e565b6104cf6105f5366004614bb4565b610f7d565b6104cf610608366004614729565b610fe3565b6106b16040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a0810182526005546001600160a01b038082168352600160a01b9182900461ffff16602084015260065490811693830193909352820463ffffffff166060820152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16608082015290565b60405161039d9190614c92565b6104cf6106cc366004614cec565b6110ad565b6104cf6106df366004614d7a565b611165565b6104cf6111cb565b6104ec6106fa366004614729565b611294565b6000546001600160a01b03166105bc565b61080561071e366004614729565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506001600160a01b03166000908152600f6020908152604091829020825160a08101845290546bffffffffffffffffffffffff811682526c01000000000000000000000000810467ffffffffffffffff1692820192909252600160a01b820463ffffffff16928101929092527801000000000000000000000000000000000000000000000000810461ffff1660608301527a010000000000000000000000000000000000000000000000000000900460ff161515608082015290565b60405161039d9190600060a0820190506bffffffffffffffffffffffff835116825267ffffffffffffffff602084015116602083015263ffffffff604084015116604083015261ffff606084015116606083015260808301511515608083015292915050565b61087361139c565b60405161039d9190614e98565b6104ae61088e366004614ee5565b6113a8565b61089b611cc0565b60405161039d929190614f93565b6104cf6108b7366004614fd5565b611dc4565b6104ae611e2c565b610873611e36565b601254790100000000000000000000000000000000000000000000000000900460ff16604051901515815260200161039d565b6104cf61090d366004615043565b611ee7565b6104cf611f6d565b6104cf610928366004614729565b612204565b600080600f816109436080860160608701614729565b6001600160a01b031681526020808201929092526040908101600020815160a08101835290546bffffffffffffffffffffffff811682526c01000000000000000000000000810467ffffffffffffffff1693820193909352600160a01b830463ffffffff16918101919091527801000000000000000000000000000000000000000000000000820461ffff1660608201527a01000000000000000000000000000000000000000000000000000090910460ff16151560808201819052909150610a5957610a166080840160608501614729565b6040517fa7499d200000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024015b60405180910390fd5b60065460009081906001600160a01b031663ffdb4b37610a7f6080880160608901614729565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044016040805180830381865afa158015610b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2e9190615088565b91509150600083600001516bffffffffffffffffffffffff16670de0b6b3a7640000856020015167ffffffffffffffff16866060015161ffff16898060200190610b7891906150bb565b610b8392915061514f565b604088015163ffffffff16610ba3610b9e60808d018d6150bb565b612215565b51610bae9190615166565b610bb89190615166565b610bc2919061514f565b610be69077ffffffffffffffffffffffffffffffffffffffffffffffff861661514f565b610bf09190615179565b610bfa9190615166565b9050610c22610c0f6080880160608901614729565b84610c1d60408a018a6151b4565b612314565b610c4677ffffffffffffffffffffffffffffffffffffffffffffffff851683612560565b610c509190615166565b9695505050505050565b610c62612599565b610c6c82826125f5565b5050565b610c78612599565b610c8181612955565b50565b601254600090610cb390700100000000000000000000000000000000900467ffffffffffffffff16600161521c565b905090565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff166020850152600160a01b90920460ff161515938301939093526004548084166060840152049091166080820152610cb390612bdd565b6000546001600160a01b03163314801590610d7d57506002546001600160a01b03163314155b15610db4576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610dfb57506001600160a01b038116155b15610e32576040517f232cb97f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610e3c612c8f565b1215610e74576040517f02075e0000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610c6c9082906001600160a01b038516906370a0823190602401602060405180830381865afa158015610ed7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efb919061523d565b6001600160a01b0385169190612d4f565b610f14612599565b610c6c8282612dcf565b6000610f2b600a83612f0a565b610f6c576040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610a50565b610f77600a83612f1f565b92915050565b6000546001600160a01b03163314801590610fa357506002546001600160a01b03163314155b15610fda576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8181612f34565b6000546001600160a01b0316331480159061100957506002546001600160a01b03163314155b15611040576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c906020015b60405180910390a150565b6000546001600160a01b031633148015906110d357506002546001600160a01b03163314155b1561110a576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c6c8282808060200260200160405190810160405280939291908181526020016000905b8282101561115b5761114c60408302860136819003810190615256565b8152602001906001019061112f565b505050505061306a565b6000546001600160a01b0316331480159061118b57506002546001600160a01b03163314155b156111c2576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c81816132dd565b6001546001600160a01b031633146112255760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610a50565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b03811660009081526011602052604081205467ffffffffffffffff16801580156112ed57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15610f77576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015611371573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113959190615295565b9392505050565b6060610cb3600d6134db565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142c91906152b2565b15611463576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61146d84806150bb565b90506020146114b45761148084806150bb565b6040517f370d875f000000000000000000000000000000000000000000000000000000008152600401610a509291906152fa565b60006114c085806150bb565b8101906114cd919061530e565b90506001600160a01b038111806114e45750600a81105b156114f35761148085806150bb565b6000611505610b9e60808801886150bb565b905061153161151760208801886150bb565b835190915061152960408a018a6151b4565b9050876134e8565b6115a561154160408801886151b4565b808060200260200160405190810160405280939291908181526020016000905b8282101561158d5761157e60408302860136819003810190615327565b81526020019060010190611561565b50506006546001600160a01b031692506136e9915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166115df6080880160608901614729565b6001600160a01b03160361164357601280548691906000906116109084906bffffffffffffffffffffffff16615361565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550611762565b6006546001600160a01b03166241e5be6116636080890160608a01614729565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039182166004820152602481018990527f00000000000000000000000000000000000000000000000000000000000000009091166044820152606401602060405180830381865afa1580156116ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611713919061523d565b601280546000906117339084906bffffffffffffffffffffffff16615361565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505b6012546bffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116911611156117cf576040517fe5c7a49100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03841660009081526011602052604090205467ffffffffffffffff1615801561182757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b1561191f576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156118ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cf9190615295565b6001600160a01b038516600090815260116020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff929092169190911790555b60006040518061018001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020016012601081819054906101000a900467ffffffffffffffff1661197f90615386565b825467ffffffffffffffff9182166101009390930a8381029083021990911617909255825260208083018a90526001600160a01b038916604080850182905260009182526011909252908120805460609094019390926119df9116615386565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff16815260200183600001518152602001836020015115158152602001846001600160a01b03168152602001888060200190611a4891906150bb565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001611a8f60408a018a6151b4565b808060200260200160405190810160405280939291908181526020016000905b82821015611adb57611acc60408302860136819003810190615327565b81526020019060010190611aaf565b5050509183525050602001611af660808a0160608b01614729565b6001600160a01b0316815260006020909101529050611b35817f00000000000000000000000000000000000000000000000000000000000000006138a2565b61016082015260005b611b4b60408901896151b4565b9050811015611c79576000611b6360408a018a6151b4565b83818110611b7357611b736153ad565b905060400201803603810190611b899190615327565b9050611b988160000151610f1e565b6001600160a01b0316639687544588611bb18c806150bb565b60208087015160408051928301815260008352517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b168152611c1f959493927f0000000000000000000000000000000000000000000000000000000000000000916004016153dc565b6000604051808303816000875af1158015611c3e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c669190810190615434565b505080611c72906154c8565b9050611b3e565b507faffc45517195d6499808c643bd4a7b0ffeedf95bea5852840d7bfcf63f59e82181604051611ca99190615544565b60405180910390a161016001519695505050505050565b6060600080611ccf60076139ac565b90508067ffffffffffffffff811115611cea57611cea6147f0565b604051908082528060200260200182016040528015611d2f57816020015b6040805180820190915260008082526020820152815260200190600190039081611d085790505b50925060005b81811015611da157600080611d4b6007846139b7565b915091506040518060400160405280836001600160a01b031681526020018261ffff16815250868481518110611d8357611d836153ad565b6020026020010181905250505080611d9a906154c8565b9050611d35565b505060125491926c0100000000000000000000000090920463ffffffff16919050565b6000546001600160a01b03163314801590611dea57506002546001600160a01b03163314155b15611e21576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c816003826139d5565b6000610cb3612c8f565b60606000611e44600a613b9c565b67ffffffffffffffff811115611e5c57611e5c6147f0565b604051908082528060200260200182016040528015611e85578160200160208202803683370190505b50905060005b8151811015611ee157611e9f600a82613ba7565b50828281518110611eb257611eb26153ad565b60200260200101816001600160a01b03166001600160a01b03168152505080611eda906154c8565b9050611e8b565b50919050565b611eef612599565b60128054821515790100000000000000000000000000000000000000000000000000027fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff9091161790556040517fccf4daf6ab6430389f26b970595dab82a5881ad454770907e415ede27c8df032906110a290831515815260200190565b6000546001600160a01b03163314801590611f9357506002546001600160a01b03163314155b8015611fa75750611fa5600733613bb6565b155b15611fde576040517f195db95800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6012546c01000000000000000000000000900463ffffffff166000819003612032576040517f990e30bf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6012546bffffffffffffffffffffffff168181101561207d576040517f8d0f71d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612087612c8f565b12156120bf576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060006120cc60076139ac565b905060005b818110156121c1576000806120e76007846139b7565b9092509050600087612107836bffffffffffffffffffffffff8a1661514f565b6121119190615179565b905061211d8187615663565b95506121616001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846bffffffffffffffffffffffff8416612d4f565b6040516bffffffffffffffffffffffff821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a2505050806121ba906154c8565b90506120d1565b5050601280547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff929092169190911790555050565b61220c612599565b610c8181613bcb565b6040805180820190915260008082526020820152600082900361227657506040805180820190915267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260006020820152610f77565b7f97a657c9000000000000000000000000000000000000000000000000000000006122a18385615688565b7fffffffff0000000000000000000000000000000000000000000000000000000016146122fa576040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61230782600481866156d0565b81019061139591906156fa565b600081808203612328576000915050612558565b60005b81811015612555576000858583818110612347576123476153ad565b90506040020180360381019061235d9190615327565b80516001600160a01b031660009081526010602090815260408083208151606081018352905463ffffffff8082168352640100000000820416938201939093526801000000000000000090920461ffff1690820181905292935091156124b457825189906001600160a01b038c811691161461245e5760065484516040517f4ab35b0b0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690634ab35b0b90602401602060405180830381865afa158015612437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245b9190615726565b90505b620186a0836040015161ffff1661249c86602001518477ffffffffffffffffffffffffffffffffffffffffffffffff16613c8c90919063ffffffff16565b6124a6919061514f565b6124b09190615179565b9150505b81516000906124d09063ffffffff16662386f26fc1000061514f565b90506000836020015163ffffffff16662386f26fc100006124f1919061514f565b9050818310156125035781925061250f565b8083111561250f578092505b61253377ffffffffffffffffffffffffffffffffffffffffffffffff8c1684612560565b61253d9089615166565b975050505050508061254e906154c8565b905061232b565b50505b949350505050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff831661258f83670de0b6b3a764000061514f565b6113959190615179565b6000546001600160a01b031633146125f35760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610a50565b565b60005b8251811015612756576000838281518110612615576126156153ad565b60200260200101516000015190506000848381518110612637576126376153ad565b602002602001015160200151905061265982600a612f0a90919063ffffffff16565b61269a576040517f73913ebd0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610a50565b6001600160a01b0381166126af600a84612f1f565b6001600160a01b0316146126ef576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126fa600a83613cbb565b1561274357604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b50508061274f906154c8565b90506125f8565b5060005b8151811015612950576000828281518110612777576127776153ad565b60200260200101516000015190506000838381518110612799576127996153ad565b602002602001015160200151905060006001600160a01b0316826001600160a01b031614806127cf57506001600160a01b038116155b15612806576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612844573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128689190615741565b6001600160a01b0316826001600160a01b0316146128b2576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128be600a8383613cd0565b1561290b57604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a161293d565b6040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505080612949906154c8565b905061275a565b505050565b60408101516001600160a01b0316612999576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600580546020808501516001600160a01b039485167fffffffffffffffffffff0000000000000000000000000000000000000000000090931692909217600160a01b61ffff909316830217909255604080850151600680546060808901516080808b0151958a167fffffffffffffffff0000000000000000000000000000000000000000000000009094169390931763ffffffff9091169096029590951777ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff9485160217909155825160e0810184527f0000000000000000000000000000000000000000000000000000000000000000871681527f00000000000000000000000000000000000000000000000000000000000000008316958101959095527f00000000000000000000000000000000000000000000000000000000000000008216858401527f0000000000000000000000000000000000000000000000000000000000000000909116928401929092527f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff16918301919091527f0000000000000000000000000000000000000000000000000000000000000000831660a08301527f000000000000000000000000000000000000000000000000000000000000000090921660c082015290517fdd226617d8d287f40a64c54741bbcdc492b3e096ef16bc5273a18cb6ab85f124916110a291849061575e565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152612c6b82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642612c4f9190615833565b85608001516fffffffffffffffffffffffffffffffff16613ce6565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6012546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916bffffffffffffffffffffffff16907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d45919061523d565b610cb39190615846565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612950908490613d0e565b60005b8251811015612e60576000838281518110612def57612def6153ad565b60200260200101519050612e0d81600d613df390919063ffffffff16565b15612e4f576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50612e59816154c8565b9050612dd2565b5060005b8151811015612950576000828281518110612e8157612e816153ad565b6020026020010151905060006001600160a01b0316816001600160a01b031603612eab5750612efa565b612eb6600d82613e08565b15612ef8576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b612f03816154c8565b9050612e64565b6000611395836001600160a01b038416613e1d565b6000611395836001600160a01b038416613e29565b60005b815181101561303a576000828281518110612f5457612f546153ad565b60209081029190910181015160408051606080820183528385015163ffffffff90811683528385015181168387019081529185015161ffff90811684860190815295516001600160a01b03166000908152601090975293909520915182549151945190931668010000000000000000027fffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffff948616640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092169390951692909217919091179190911691909117905550613033816154c8565b9050612f37565b507fcb0c5f472d325cf0c56953fc81870ddd80d0d3c9a3fbfe777002d75f380dfb81816040516110a29190615866565b805160408111156130a7576040517fb5a10cfa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6012546c01000000000000000000000000900463ffffffff16158015906130f5575060125463ffffffff6c010000000000000000000000008204166bffffffffffffffffffffffff90911610155b1561310257613102611f6d565b600061310e60076139ac565b90505b801561315057600061312f613127600184615833565b6007906139b7565b50905061313d600782613e35565b505080613149906158e0565b9050613111565b506000805b8281101561325e576000848281518110613171576131716153ad565b60200260200101516000015190506000858381518110613193576131936153ad565b60200260200101516020015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614806131e857506001600160a01b038216155b1561322a576040517f4de938d10000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610a50565b61323a60078361ffff8416613e4a565b5061324961ffff821685615915565b9350505080613257906154c8565b9050613155565b50601280547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd24906132d09083908690615932565b60405180910390a1505050565b60005b81518110156134ab5760008282815181106132fd576132fd6153ad565b6020908102919091018101516040805160a08082018352828401516bffffffffffffffffffffffff90811683528486015167ffffffffffffffff90811684880190815260608088015163ffffffff9081168789019081526080808b015161ffff908116948a01948552978b0151151590890190815299516001600160a01b03166000908152600f909b529790992095518654925197519151985115157a010000000000000000000000000000000000000000000000000000027fffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff999096167801000000000000000000000000000000000000000000000000027fffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffff92909a16600160a01b02919091167fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff979093166c01000000000000000000000000027fffffffffffffffffffffffff00000000000000000000000000000000000000009092169316929092179190911793909316929092179390931791909116179055506134a4816154c8565b90506132e0565b507ffba339fca97870ffdfaedbae3745db5e6de1a6909dfd0e0dbb56917469ffe236816040516110a29190615951565b6060600061139583613e60565b6001600160a01b038116613528576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546001600160a01b0316331461356c576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600654600160a01b900463ffffffff16808511156135c0576040517f869337890000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610a50565b6006547801000000000000000000000000000000000000000000000000900467ffffffffffffffff16841115613622576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600554600160a01b900461ffff16831115613669576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601254790100000000000000000000000000000000000000000000000000900460ff1680156136a0575061369e600d83613ebc565b155b156136e2576040517fd0d259760000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610a50565b5050505050565b81516000805b8281101561388e576000846001600160a01b031663d02641a087848151811061371a5761371a6153ad565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024016040805180830381865afa158015613781573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137a591906159e9565b51905077ffffffffffffffffffffffffffffffffffffffffffffffff8116600003613826578582815181106137dc576137dc6153ad565b6020908102919091010151516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610a50565b61387086838151811061383b5761383b6153ad565b6020026020010151602001518277ffffffffffffffffffffffffffffffffffffffffffffffff16613c8c90919063ffffffff16565b61387a9084615166565b92505080613887906154c8565b90506136ef565b5061389c6003826000613ede565b50505050565b60008060001b828460200151856080015186606001518760e00151886101000151805190602001208961012001516040516020016138e09190615a1c565b604051602081830303815290604052805190602001208a60a001518b60c001518c61014001518d6040015160405160200161398e9c9b9a999897969594939291909b8c5260208c019a909a5267ffffffffffffffff98891660408c01529690971660608a01526001600160a01b0394851660808a015292841660a089015260c088019190915260e0870152610100860152911515610120850152166101408301526101608201526101800190565b60405160208183030381529060405280519060200120905092915050565b6000610f778261421c565b60008080806139c68686614227565b909450925050505b9250929050565b81546000906139fe90700100000000000000000000000000000000900463ffffffff1642615833565b90508015613aa05760018301548354613a46916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613ce6565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354613ac6916fffffffffffffffffffffffffffffffff9081169116614252565b835483511515600160a01b027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906132d09084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b6000610f77826139ac565b60008080806139c686866139b7565b6000611395836001600160a01b038416614268565b336001600160a01b03821603613c235760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610a50565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000670de0b6b3a764000061258f8377ffffffffffffffffffffffffffffffffffffffffffffffff861661514f565b6000611395836001600160a01b038416614274565b6000612558846001600160a01b03851684614280565b6000613d0585613cf6848661514f565b613d009087615166565b614252565b95945050505050565b6000613d63826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166142969092919063ffffffff16565b8051909150156129505780806020019051810190613d8191906152b2565b6129505760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a50565b6000611395836001600160a01b0384166142a5565b6000611395836001600160a01b03841661439f565b60006113958383614268565b600061139583836143ee565b6000611395836001600160a01b03841661445e565b6000612558846001600160a01b0385168461447b565b606081600001805480602002602001604051908101604052809291908181526020018280548015613eb057602002820191906000526020600020905b815481526020019060010190808311613e9c575b50505050509050919050565b6001600160a01b03811660009081526001830160205260408120541515611395565b8254600160a01b900460ff161580613ef4575081155b15613efe57505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090613f4490700100000000000000000000000000000000900463ffffffff1642615833565b905080156140045781831115613f86576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154613fc09083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613ce6565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156140a1576001600160a01b038416614056576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610a50565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610a50565b8483101561419a5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906140e59082615833565b6140ef878a615833565b6140f99190615166565b6141039190615179565b90506001600160a01b03861661414f576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610a50565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610a50565b6141a48584615833565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b6000610f7782614498565b6000808061423585856144a2565b600081815260029690960160205260409095205494959350505050565b60008183106142615781611395565b5090919050565b600061139583836144ae565b6000611395838361445e565b600061255884846001600160a01b03851661447b565b606061255884846000856144c6565b6000818152600183016020526040812054801561438e5760006142c9600183615833565b85549091506000906142dd90600190615833565b90508181146143425760008660000182815481106142fd576142fd6153ad565b9060005260206000200154905080876000018481548110614320576143206153ad565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061435357614353615a2f565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610f77565b6000915050610f77565b5092915050565b60008181526001830160205260408120546143e657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f77565b506000610f77565b60008181526002830160205260408120548015158061441257506144128484614268565b6113955760405162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610a50565b6000818152600283016020526040812081905561139583836145b8565b6000828152600284016020526040812082905561255884846145c4565b6000610f77825490565b600061139583836145d0565b60008181526001830160205260408120541515611395565b60608247101561453e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a50565b600080866001600160a01b0316858760405161455a9190615a5e565b60006040518083038185875af1925050503d8060008114614597576040519150601f19603f3d011682016040523d82523d6000602084013e61459c565b606091505b50915091506145ad878383876145fa565b979650505050505050565b600061139583836142a5565b6000611395838361439f565b60008260000182815481106145e7576145e76153ad565b9060005260206000200154905092915050565b60608315614669578251600003614662576001600160a01b0385163b6146625760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a50565b5081612558565b612558838381511561467e5781518083602001fd5b8060405162461bcd60e51b8152600401610a509190614796565b60e08101610f7782846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b6001600160a01b0381168114610c8157600080fd5b60006020828403121561473b57600080fd5b813561139581614714565b60005b83811015614761578181015183820152602001614749565b50506000910152565b60008151808452614782816020860160208601614746565b601f01601f19169290920160200192915050565b602081526000611395602083018461476a565b600060a08284031215611ee157600080fd5b6000602082840312156147cd57600080fd5b813567ffffffffffffffff8111156147e457600080fd5b612558848285016147a9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715614842576148426147f0565b60405290565b6040516080810167ffffffffffffffff81118282101715614842576148426147f0565b60405160c0810167ffffffffffffffff81118282101715614842576148426147f0565b604051601f8201601f1916810167ffffffffffffffff811182821017156148b7576148b76147f0565b604052919050565b600067ffffffffffffffff8211156148d9576148d96147f0565b5060051b60200190565b600082601f8301126148f457600080fd5b81356020614909614904836148bf565b61488e565b82815260069290921b8401810191818101908684111561492857600080fd5b8286015b8481101561497957604081890312156149455760008081fd5b61494d61481f565b813561495881614714565b81528185013561496781614714565b8186015283529183019160400161492c565b509695505050505050565b6000806040838503121561499757600080fd5b823567ffffffffffffffff808211156149af57600080fd5b6149bb868387016148e3565b935060208501359150808211156149d157600080fd5b506149de858286016148e3565b9150509250929050565b803561ffff811681146149fa57600080fd5b919050565b803563ffffffff811681146149fa57600080fd5b67ffffffffffffffff81168114610c8157600080fd5b600060a08284031215614a3b57600080fd5b60405160a0810181811067ffffffffffffffff82111715614a5e57614a5e6147f0565b6040528235614a6c81614714565b8152614a7a602084016149e8565b60208201526040830135614a8d81614714565b6040820152614a9e606084016149ff565b60608201526080830135614ab181614a13565b60808201529392505050565b60008060408385031215614ad057600080fd5b8235614adb81614714565b91506020830135614aeb81614714565b809150509250929050565b600082601f830112614b0757600080fd5b81356020614b17614904836148bf565b82815260059290921b84018101918181019086841115614b3657600080fd5b8286015b84811015614979578035614b4d81614714565b8352918301918301614b3a565b60008060408385031215614b6d57600080fd5b823567ffffffffffffffff80821115614b8557600080fd5b614b9186838701614af6565b93506020850135915080821115614ba757600080fd5b506149de85828601614af6565b60006020808385031215614bc757600080fd5b823567ffffffffffffffff811115614bde57600080fd5b8301601f81018513614bef57600080fd5b8035614bfd614904826148bf565b81815260079190911b82018301908381019087831115614c1c57600080fd5b928401925b828410156145ad5760808489031215614c3a5760008081fd5b614c42614848565b8435614c4d81614714565b8152614c5a8587016149ff565b868201526040614c6b8187016149ff565b908201526060614c7c8682016149e8565b9082015282526080939093019290840190614c21565b60a08101610f7782846001600160a01b0380825116835261ffff60208301511660208401528060408301511660408401525063ffffffff606082015116606083015267ffffffffffffffff60808201511660808301525050565b60008060208385031215614cff57600080fd5b823567ffffffffffffffff80821115614d1757600080fd5b818501915085601f830112614d2b57600080fd5b813581811115614d3a57600080fd5b8660208260061b8501011115614d4f57600080fd5b60209290920196919550909350505050565b8015158114610c8157600080fd5b80356149fa81614d61565b60006020808385031215614d8d57600080fd5b823567ffffffffffffffff811115614da457600080fd5b8301601f81018513614db557600080fd5b8035614dc3614904826148bf565b81815260c09182028301840191848201919088841115614de257600080fd5b938501935b83851015614e8c5780858a031215614dff5760008081fd5b614e0761486b565b8535614e1281614714565b815285870135614e2181614a13565b818801526040868101356bffffffffffffffffffffffff81168114614e465760008081fd5b908201526060614e578782016149ff565b908201526080614e688782016149e8565b9082015260a0614e79878201614d6f565b9082015283529384019391850191614de7565b50979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614ed95783516001600160a01b031683529284019291840191600101614eb4565b50909695505050505050565b600080600060608486031215614efa57600080fd5b833567ffffffffffffffff811115614f1157600080fd5b614f1d868287016147a9565b935050602084013591506040840135614f3581614714565b809150509250925092565b600081518084526020808501945080840160005b83811015614f8857815180516001600160a01b0316885283015161ffff168388015260409096019590820190600101614f54565b509495945050505050565b604081526000614fa66040830185614f40565b90508260208301529392505050565b80356fffffffffffffffffffffffffffffffff811681146149fa57600080fd5b600060608284031215614fe757600080fd5b6040516060810181811067ffffffffffffffff8211171561500a5761500a6147f0565b604052823561501881614d61565b815261502660208401614fb5565b602082015261503760408401614fb5565b60408201529392505050565b60006020828403121561505557600080fd5b813561139581614d61565b805177ffffffffffffffffffffffffffffffffffffffffffffffff811681146149fa57600080fd5b6000806040838503121561509b57600080fd5b6150a483615060565b91506150b260208401615060565b90509250929050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126150f057600080fd5b83018035915067ffffffffffffffff82111561510b57600080fd5b6020019150368190038213156139ce57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610f7757610f77615120565b80820180821115610f7757610f77615120565b6000826151af577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126151e957600080fd5b83018035915067ffffffffffffffff82111561520457600080fd5b6020019150600681901b36038213156139ce57600080fd5b67ffffffffffffffff81811683821601908082111561439857614398615120565b60006020828403121561524f57600080fd5b5051919050565b60006040828403121561526857600080fd5b61527061481f565b823561527b81614714565b8152615289602084016149e8565b60208201529392505050565b6000602082840312156152a757600080fd5b815161139581614a13565b6000602082840312156152c457600080fd5b815161139581614d61565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6020815260006125586020830184866152cf565b60006020828403121561532057600080fd5b5035919050565b60006040828403121561533957600080fd5b61534161481f565b823561534c81614714565b81526020928301359281019290925250919050565b6bffffffffffffffffffffffff81811683821601908082111561439857614398615120565b600067ffffffffffffffff8083168181036153a3576153a3615120565b6001019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6001600160a01b038716815260a0602082015260006153ff60a0830187896152cf565b85604084015267ffffffffffffffff851660608401528281036080840152615427818561476a565b9998505050505050505050565b60006020828403121561544657600080fd5b815167ffffffffffffffff8082111561545e57600080fd5b818401915084601f83011261547257600080fd5b815181811115615484576154846147f0565b6154976020601f19601f8401160161488e565b91508082528560208285010111156154ae57600080fd5b6154bf816020840160208601614746565b50949350505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036154f9576154f9615120565b5060010190565b600081518084526020808501945080840160005b83811015614f8857815180516001600160a01b031688528301518388015260409096019590820190600101615514565b6020815261555f60208201835167ffffffffffffffff169052565b6000602083015161557c604084018267ffffffffffffffff169052565b506040830151606083015260608301516155a160808401826001600160a01b03169052565b50608083015167ffffffffffffffff811660a08401525060a083015160c083015260c08301516155d560e084018215159052565b5060e08301516101006155f2818501836001600160a01b03169052565b8085015191505061018061012081818601526156126101a086018461476a565b9250808601519050610140601f1986850301818701526156328483615500565b935080870151915050610160615652818701836001600160a01b03169052565b959095015193019290925250919050565b6bffffffffffffffffffffffff82811682821603908082111561439857614398615120565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156156c85780818660040360031b1b83161692505b505092915050565b600080858511156156e057600080fd5b838611156156ed57600080fd5b5050820193919092039150565b60006040828403121561570c57600080fd5b61571461481f565b82358152602083013561528981614d61565b60006020828403121561573857600080fd5b61139582615060565b60006020828403121561575357600080fd5b815161139581614714565b61018081016157db82856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b82516001600160a01b0390811660e0840152602084015161ffff16610100840152604084015116610120830152606083015163ffffffff16610140830152608083015167ffffffffffffffff16610160830152611395565b81810381811115610f7757610f77615120565b818103600083128015838313168383128216171561439857614398615120565b602080825282518282018190526000919060409081850190868401855b828110156158d357815180516001600160a01b031685528681015163ffffffff9081168887015286820151168686015260609081015161ffff169085015260809093019290850190600101615883565b5091979650505050505050565b6000816158ef576158ef615120565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b63ffffffff81811683821601908082111561439857614398615120565b63ffffffff831681526040602082015260006125586040830184614f40565b602080825282518282018190526000919060409081850190868401855b828110156158d357815180516001600160a01b031685528681015167ffffffffffffffff1687860152858101516bffffffffffffffffffffffff168686015260608082015163ffffffff169086015260808082015161ffff169086015260a09081015115159085015260c0909301929085019060010161596e565b6000604082840312156159fb57600080fd5b615a0361481f565b615a0c83615060565b8152602083015161528981614a13565b6020815260006113956020830184615500565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251615a70818460208701614746565b919091019291505056fea164736f6c6343000813000a",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806376f6ae761161010f578063b06d41bc116100a2578063e0351e1311610071578063e0351e13146108cc578063efeadb6d146108ff578063eff7cc4814610912578063f2fde38b1461091a57600080fd5b8063b06d41bc14610893578063c92b2832146108a9578063d09dc339146108bc578063d3c7c2c7146108c457600080fd5b80638da5cb5b116100de5780638da5cb5b146106ff5780639a113c3614610710578063a7cd63b71461086b578063a7d3e02f1461088057600080fd5b806376f6ae76146106be578063799c3a67146106d157806379ba5097146106e4578063856c8247146106ec57600080fd5b8063549e946f116101875780635d86f141116101565780635d86f141146105d45780635ebbd9f8146105e7578063704b6c02146105fa5780637437ff9f1461060d57600080fd5b8063549e946f1461056957806354b714681461057c57806354c8a4f31461059c578063599f6431146105af57600080fd5b80633a87ac53116101c35780633a87ac53146104bc5780633a9bf949146104d15780634120fccd146104e4578063546719cd1461050557600080fd5b806306285c69146101f55780631772047e146103a6578063181f5a771461045257806338724a951461049b575b600080fd5b6103906040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b60405161039d9190614698565b60405180910390f35b6104216103b4366004614729565b6040805160608082018352600080835260208084018290529284018190526001600160a01b039490941684526010825292829020825193840183525463ffffffff80821685526401000000008204169184019190915268010000000000000000900461ffff169082015290565b60408051825163ffffffff9081168252602080850151909116908201529181015161ffff169082015260600161039d565b61048e6040518060400160405280601381526020017f45564d3245564d4f6e52616d7020312e302e300000000000000000000000000081525081565b60405161039d9190614796565b6104ae6104a93660046147bb565b61092d565b60405190815260200161039d565b6104cf6104ca366004614984565b610c5a565b005b6104cf6104df366004614a29565b610c70565b6104ec610c84565b60405167ffffffffffffffff909116815260200161039d565b61050d610cb8565b60405161039d919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6104cf610577366004614abd565b610d57565b6012546040516bffffffffffffffffffffffff909116815260200161039d565b6104cf6105aa366004614b5a565b610f0c565b6002546001600160a01b03165b6040516001600160a01b03909116815260200161039d565b6105bc6105e2366004614729565b610f1e565b6104cf6105f5366004614bb4565b610f7d565b6104cf610608366004614729565b610fe3565b6106b16040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a0810182526005546001600160a01b038082168352600160a01b9182900461ffff16602084015260065490811693830193909352820463ffffffff166060820152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16608082015290565b60405161039d9190614c92565b6104cf6106cc366004614cec565b6110ad565b6104cf6106df366004614d7a565b611165565b6104cf6111cb565b6104ec6106fa366004614729565b611294565b6000546001600160a01b03166105bc565b61080561071e366004614729565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506001600160a01b03166000908152600f6020908152604091829020825160a08101845290546bffffffffffffffffffffffff811682526c01000000000000000000000000810467ffffffffffffffff1692820192909252600160a01b820463ffffffff16928101929092527801000000000000000000000000000000000000000000000000810461ffff1660608301527a010000000000000000000000000000000000000000000000000000900460ff161515608082015290565b60405161039d9190600060a0820190506bffffffffffffffffffffffff835116825267ffffffffffffffff602084015116602083015263ffffffff604084015116604083015261ffff606084015116606083015260808301511515608083015292915050565b61087361139c565b60405161039d9190614e98565b6104ae61088e366004614ee5565b6113a8565b61089b611cc0565b60405161039d929190614f93565b6104cf6108b7366004614fd5565b611dc4565b6104ae611e2c565b610873611e36565b601254790100000000000000000000000000000000000000000000000000900460ff16604051901515815260200161039d565b6104cf61090d366004615043565b611ee7565b6104cf611f6d565b6104cf610928366004614729565b612204565b600080600f816109436080860160608701614729565b6001600160a01b031681526020808201929092526040908101600020815160a08101835290546bffffffffffffffffffffffff811682526c01000000000000000000000000810467ffffffffffffffff1693820193909352600160a01b830463ffffffff16918101919091527801000000000000000000000000000000000000000000000000820461ffff1660608201527a01000000000000000000000000000000000000000000000000000090910460ff16151560808201819052909150610a5957610a166080840160608501614729565b6040517fa7499d200000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024015b60405180910390fd5b60065460009081906001600160a01b031663ffdb4b37610a7f6080880160608901614729565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044016040805180830381865afa158015610b0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2e9190615088565b91509150600083600001516bffffffffffffffffffffffff16670de0b6b3a7640000856020015167ffffffffffffffff16866060015161ffff16898060200190610b7891906150bb565b610b8392915061514f565b604088015163ffffffff16610ba3610b9e60808d018d6150bb565b612215565b51610bae9190615166565b610bb89190615166565b610bc2919061514f565b610be69077ffffffffffffffffffffffffffffffffffffffffffffffff861661514f565b610bf09190615179565b610bfa9190615166565b9050610c22610c0f6080880160608901614729565b84610c1d60408a018a6151b4565b612314565b610c4677ffffffffffffffffffffffffffffffffffffffffffffffff851683612560565b610c509190615166565b9695505050505050565b610c62612599565b610c6c82826125f5565b5050565b610c78612599565b610c8181612955565b50565b601254600090610cb390700100000000000000000000000000000000900467ffffffffffffffff16600161521c565b905090565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff166020850152600160a01b90920460ff161515938301939093526004548084166060840152049091166080820152610cb390612bdd565b6000546001600160a01b03163314801590610d7d57506002546001600160a01b03163314155b15610db4576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610dfb57506001600160a01b038116155b15610e32576040517f232cb97f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610e3c612c8f565b1215610e74576040517f02075e0000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610c6c9082906001600160a01b038516906370a0823190602401602060405180830381865afa158015610ed7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efb919061523d565b6001600160a01b0385169190612d4f565b610f14612599565b610c6c8282612dcf565b6000610f2b600a83612f0a565b610f6c576040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610a50565b610f77600a83612f1f565b92915050565b6000546001600160a01b03163314801590610fa357506002546001600160a01b03163314155b15610fda576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8181612f34565b6000546001600160a01b0316331480159061100957506002546001600160a01b03163314155b15611040576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c906020015b60405180910390a150565b6000546001600160a01b031633148015906110d357506002546001600160a01b03163314155b1561110a576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c6c8282808060200260200160405190810160405280939291908181526020016000905b8282101561115b5761114c60408302860136819003810190615256565b8152602001906001019061112f565b505050505061306a565b6000546001600160a01b0316331480159061118b57506002546001600160a01b03163314155b156111c2576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c81816132dd565b6001546001600160a01b031633146112255760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610a50565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b03811660009081526011602052604081205467ffffffffffffffff16801580156112ed57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15610f77576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015611371573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113959190615295565b9392505050565b6060610cb3600d6134db565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611408573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142c91906152b2565b15611463576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61146d84806150bb565b90506020146114b45761148084806150bb565b6040517f370d875f000000000000000000000000000000000000000000000000000000008152600401610a509291906152fa565b60006114c085806150bb565b8101906114cd919061530e565b90506001600160a01b038111806114e45750600a81105b156114f35761148085806150bb565b6000611505610b9e60808801886150bb565b905061153161151760208801886150bb565b835190915061152960408a018a6151b4565b9050876134e8565b6115a561154160408801886151b4565b808060200260200160405190810160405280939291908181526020016000905b8282101561158d5761157e60408302860136819003810190615327565b81526020019060010190611561565b50506006546001600160a01b031692506136e9915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166115df6080880160608901614729565b6001600160a01b03160361164357601280548691906000906116109084906bffffffffffffffffffffffff16615361565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550611762565b6006546001600160a01b03166241e5be6116636080890160608a01614729565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039182166004820152602481018990527f00000000000000000000000000000000000000000000000000000000000000009091166044820152606401602060405180830381865afa1580156116ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611713919061523d565b601280546000906117339084906bffffffffffffffffffffffff16615361565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505b6012546bffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116911611156117cf576040517fe5c7a49100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03841660009081526011602052604090205467ffffffffffffffff1615801561182757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b1561191f576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156118ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cf9190615295565b6001600160a01b038516600090815260116020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff929092169190911790555b60006040518061018001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020016012601081819054906101000a900467ffffffffffffffff1661197f90615386565b825467ffffffffffffffff9182166101009390930a8381029083021990911617909255825260208083018a90526001600160a01b038916604080850182905260009182526011909252908120805460609094019390926119df9116615386565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff16815260200183600001518152602001836020015115158152602001846001600160a01b03168152602001888060200190611a4891906150bb565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001611a8f60408a018a6151b4565b808060200260200160405190810160405280939291908181526020016000905b82821015611adb57611acc60408302860136819003810190615327565b81526020019060010190611aaf565b5050509183525050602001611af660808a0160608b01614729565b6001600160a01b0316815260006020909101529050611b35817f00000000000000000000000000000000000000000000000000000000000000006138a2565b61016082015260005b611b4b60408901896151b4565b9050811015611c79576000611b6360408a018a6151b4565b83818110611b7357611b736153ad565b905060400201803603810190611b899190615327565b9050611b988160000151610f1e565b6001600160a01b0316639687544588611bb18c806150bb565b60208087015160408051928301815260008352517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b168152611c1f959493927f0000000000000000000000000000000000000000000000000000000000000000916004016153dc565b6000604051808303816000875af1158015611c3e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c669190810190615434565b505080611c72906154c8565b9050611b3e565b507faffc45517195d6499808c643bd4a7b0ffeedf95bea5852840d7bfcf63f59e82181604051611ca99190615544565b60405180910390a161016001519695505050505050565b6060600080611ccf60076139ac565b90508067ffffffffffffffff811115611cea57611cea6147f0565b604051908082528060200260200182016040528015611d2f57816020015b6040805180820190915260008082526020820152815260200190600190039081611d085790505b50925060005b81811015611da157600080611d4b6007846139b7565b915091506040518060400160405280836001600160a01b031681526020018261ffff16815250868481518110611d8357611d836153ad565b6020026020010181905250505080611d9a906154c8565b9050611d35565b505060125491926c0100000000000000000000000090920463ffffffff16919050565b6000546001600160a01b03163314801590611dea57506002546001600160a01b03163314155b15611e21576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c816003826139d5565b6000610cb3612c8f565b60606000611e44600a613b9c565b67ffffffffffffffff811115611e5c57611e5c6147f0565b604051908082528060200260200182016040528015611e85578160200160208202803683370190505b50905060005b8151811015611ee157611e9f600a82613ba7565b50828281518110611eb257611eb26153ad565b60200260200101816001600160a01b03166001600160a01b03168152505080611eda906154c8565b9050611e8b565b50919050565b611eef612599565b60128054821515790100000000000000000000000000000000000000000000000000027fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff9091161790556040517fccf4daf6ab6430389f26b970595dab82a5881ad454770907e415ede27c8df032906110a290831515815260200190565b6000546001600160a01b03163314801590611f9357506002546001600160a01b03163314155b8015611fa75750611fa5600733613bb6565b155b15611fde576040517f195db95800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6012546c01000000000000000000000000900463ffffffff166000819003612032576040517f990e30bf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6012546bffffffffffffffffffffffff168181101561207d576040517f8d0f71d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612087612c8f565b12156120bf576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060006120cc60076139ac565b905060005b818110156121c1576000806120e76007846139b7565b9092509050600087612107836bffffffffffffffffffffffff8a1661514f565b6121119190615179565b905061211d8187615663565b95506121616001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846bffffffffffffffffffffffff8416612d4f565b6040516bffffffffffffffffffffffff821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a2505050806121ba906154c8565b90506120d1565b5050601280547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff929092169190911790555050565b61220c612599565b610c8181613bcb565b6040805180820190915260008082526020820152600082900361227657506040805180820190915267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260006020820152610f77565b7f97a657c9000000000000000000000000000000000000000000000000000000006122a18385615688565b7fffffffff0000000000000000000000000000000000000000000000000000000016146122fa576040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61230782600481866156d0565b81019061139591906156fa565b600081808203612328576000915050612558565b60005b81811015612555576000858583818110612347576123476153ad565b90506040020180360381019061235d9190615327565b80516001600160a01b031660009081526010602090815260408083208151606081018352905463ffffffff8082168352640100000000820416938201939093526801000000000000000090920461ffff1690820181905292935091156124b457825189906001600160a01b038c811691161461245e5760065484516040517f4ab35b0b0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690634ab35b0b90602401602060405180830381865afa158015612437573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245b9190615726565b90505b620186a0836040015161ffff1661249c86602001518477ffffffffffffffffffffffffffffffffffffffffffffffff16613c8c90919063ffffffff16565b6124a6919061514f565b6124b09190615179565b9150505b81516000906124d09063ffffffff16662386f26fc1000061514f565b90506000836020015163ffffffff16662386f26fc100006124f1919061514f565b9050818310156125035781925061250f565b8083111561250f578092505b61253377ffffffffffffffffffffffffffffffffffffffffffffffff8c1684612560565b61253d9089615166565b975050505050508061254e906154c8565b905061232b565b50505b949350505050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff831661258f83670de0b6b3a764000061514f565b6113959190615179565b6000546001600160a01b031633146125f35760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610a50565b565b60005b8251811015612756576000838281518110612615576126156153ad565b60200260200101516000015190506000848381518110612637576126376153ad565b602002602001015160200151905061265982600a612f0a90919063ffffffff16565b61269a576040517f73913ebd0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610a50565b6001600160a01b0381166126af600a84612f1f565b6001600160a01b0316146126ef576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126fa600a83613cbb565b1561274357604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b50508061274f906154c8565b90506125f8565b5060005b8151811015612950576000828281518110612777576127776153ad565b60200260200101516000015190506000838381518110612799576127996153ad565b602002602001015160200151905060006001600160a01b0316826001600160a01b031614806127cf57506001600160a01b038116155b15612806576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612844573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128689190615741565b6001600160a01b0316826001600160a01b0316146128b2576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128be600a8383613cd0565b1561290b57604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a161293d565b6040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505080612949906154c8565b905061275a565b505050565b60408101516001600160a01b0316612999576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600580546020808501516001600160a01b039485167fffffffffffffffffffff0000000000000000000000000000000000000000000090931692909217600160a01b61ffff909316830217909255604080850151600680546060808901516080808b0151958a167fffffffffffffffff0000000000000000000000000000000000000000000000009094169390931763ffffffff9091169096029590951777ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff9485160217909155825160e0810184527f0000000000000000000000000000000000000000000000000000000000000000871681527f00000000000000000000000000000000000000000000000000000000000000008316958101959095527f00000000000000000000000000000000000000000000000000000000000000008216858401527f0000000000000000000000000000000000000000000000000000000000000000909116928401929092527f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff16918301919091527f0000000000000000000000000000000000000000000000000000000000000000831660a08301527f000000000000000000000000000000000000000000000000000000000000000090921660c082015290517fdd226617d8d287f40a64c54741bbcdc492b3e096ef16bc5273a18cb6ab85f124916110a291849061575e565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152612c6b82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642612c4f9190615833565b85608001516fffffffffffffffffffffffffffffffff16613ce6565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6012546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916bffffffffffffffffffffffff16907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d45919061523d565b610cb39190615846565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612950908490613d0e565b60005b8251811015612e60576000838281518110612def57612def6153ad565b60200260200101519050612e0d81600d613df390919063ffffffff16565b15612e4f576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50612e59816154c8565b9050612dd2565b5060005b8151811015612950576000828281518110612e8157612e816153ad565b6020026020010151905060006001600160a01b0316816001600160a01b031603612eab5750612efa565b612eb6600d82613e08565b15612ef8576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b612f03816154c8565b9050612e64565b6000611395836001600160a01b038416613e1d565b6000611395836001600160a01b038416613e29565b60005b815181101561303a576000828281518110612f5457612f546153ad565b60209081029190910181015160408051606080820183528385015163ffffffff90811683528385015181168387019081529185015161ffff90811684860190815295516001600160a01b03166000908152601090975293909520915182549151945190931668010000000000000000027fffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffff948616640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092169390951692909217919091179190911691909117905550613033816154c8565b9050612f37565b507fcb0c5f472d325cf0c56953fc81870ddd80d0d3c9a3fbfe777002d75f380dfb81816040516110a29190615866565b805160408111156130a7576040517fb5a10cfa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6012546c01000000000000000000000000900463ffffffff16158015906130f5575060125463ffffffff6c010000000000000000000000008204166bffffffffffffffffffffffff90911610155b1561310257613102611f6d565b600061310e60076139ac565b90505b801561315057600061312f613127600184615833565b6007906139b7565b50905061313d600782613e35565b505080613149906158e0565b9050613111565b506000805b8281101561325e576000848281518110613171576131716153ad565b60200260200101516000015190506000858381518110613193576131936153ad565b60200260200101516020015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614806131e857506001600160a01b038216155b1561322a576040517f4de938d10000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610a50565b61323a60078361ffff8416613e4a565b5061324961ffff821685615915565b9350505080613257906154c8565b9050613155565b50601280547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd24906132d09083908690615932565b60405180910390a1505050565b60005b81518110156134ab5760008282815181106132fd576132fd6153ad565b6020908102919091018101516040805160a08082018352828401516bffffffffffffffffffffffff90811683528486015167ffffffffffffffff90811684880190815260608088015163ffffffff9081168789019081526080808b015161ffff908116948a01948552978b0151151590890190815299516001600160a01b03166000908152600f909b529790992095518654925197519151985115157a010000000000000000000000000000000000000000000000000000027fffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff999096167801000000000000000000000000000000000000000000000000027fffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffff92909a16600160a01b02919091167fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff979093166c01000000000000000000000000027fffffffffffffffffffffffff00000000000000000000000000000000000000009092169316929092179190911793909316929092179390931791909116179055506134a4816154c8565b90506132e0565b507ffba339fca97870ffdfaedbae3745db5e6de1a6909dfd0e0dbb56917469ffe236816040516110a29190615951565b6060600061139583613e60565b6001600160a01b038116613528576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546001600160a01b0316331461356c576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600654600160a01b900463ffffffff16808511156135c0576040517f869337890000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610a50565b6006547801000000000000000000000000000000000000000000000000900467ffffffffffffffff16841115613622576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600554600160a01b900461ffff16831115613669576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601254790100000000000000000000000000000000000000000000000000900460ff1680156136a0575061369e600d83613ebc565b155b156136e2576040517fd0d259760000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610a50565b5050505050565b81516000805b8281101561388e576000846001600160a01b031663d02641a087848151811061371a5761371a6153ad565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024016040805180830381865afa158015613781573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137a591906159e9565b51905077ffffffffffffffffffffffffffffffffffffffffffffffff8116600003613826578582815181106137dc576137dc6153ad565b6020908102919091010151516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610a50565b61387086838151811061383b5761383b6153ad565b6020026020010151602001518277ffffffffffffffffffffffffffffffffffffffffffffffff16613c8c90919063ffffffff16565b61387a9084615166565b92505080613887906154c8565b90506136ef565b5061389c6003826000613ede565b50505050565b60008060001b828460200151856080015186606001518760e00151886101000151805190602001208961012001516040516020016138e09190615a1c565b604051602081830303815290604052805190602001208a60a001518b60c001518c61014001518d6040015160405160200161398e9c9b9a999897969594939291909b8c5260208c019a909a5267ffffffffffffffff98891660408c01529690971660608a01526001600160a01b0394851660808a015292841660a089015260c088019190915260e0870152610100860152911515610120850152166101408301526101608201526101800190565b60405160208183030381529060405280519060200120905092915050565b6000610f778261421c565b60008080806139c68686614227565b909450925050505b9250929050565b81546000906139fe90700100000000000000000000000000000000900463ffffffff1642615833565b90508015613aa05760018301548354613a46916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613ce6565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354613ac6916fffffffffffffffffffffffffffffffff9081169116614252565b835483511515600160a01b027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906132d09084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b6000610f77826139ac565b60008080806139c686866139b7565b6000611395836001600160a01b038416614268565b336001600160a01b03821603613c235760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610a50565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000670de0b6b3a764000061258f8377ffffffffffffffffffffffffffffffffffffffffffffffff861661514f565b6000611395836001600160a01b038416614274565b6000612558846001600160a01b03851684614280565b6000613d0585613cf6848661514f565b613d009087615166565b614252565b95945050505050565b6000613d63826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166142969092919063ffffffff16565b8051909150156129505780806020019051810190613d8191906152b2565b6129505760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a50565b6000611395836001600160a01b0384166142a5565b6000611395836001600160a01b03841661439f565b60006113958383614268565b600061139583836143ee565b6000611395836001600160a01b03841661445e565b6000612558846001600160a01b0385168461447b565b606081600001805480602002602001604051908101604052809291908181526020018280548015613eb057602002820191906000526020600020905b815481526020019060010190808311613e9c575b50505050509050919050565b6001600160a01b03811660009081526001830160205260408120541515611395565b8254600160a01b900460ff161580613ef4575081155b15613efe57505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090613f4490700100000000000000000000000000000000900463ffffffff1642615833565b905080156140045781831115613f86576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154613fc09083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613ce6565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156140a1576001600160a01b038416614056576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610a50565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610a50565b8483101561419a5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906140e59082615833565b6140ef878a615833565b6140f99190615166565b6141039190615179565b90506001600160a01b03861661414f576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610a50565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610a50565b6141a48584615833565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b6000610f7782614498565b6000808061423585856144a2565b600081815260029690960160205260409095205494959350505050565b60008183106142615781611395565b5090919050565b600061139583836144ae565b6000611395838361445e565b600061255884846001600160a01b03851661447b565b606061255884846000856144c6565b6000818152600183016020526040812054801561438e5760006142c9600183615833565b85549091506000906142dd90600190615833565b90508181146143425760008660000182815481106142fd576142fd6153ad565b9060005260206000200154905080876000018481548110614320576143206153ad565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061435357614353615a2f565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610f77565b6000915050610f77565b5092915050565b60008181526001830160205260408120546143e657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f77565b506000610f77565b60008181526002830160205260408120548015158061441257506144128484614268565b6113955760405162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610a50565b6000818152600283016020526040812081905561139583836145b8565b6000828152600284016020526040812082905561255884846145c4565b6000610f77825490565b600061139583836145d0565b60008181526001830160205260408120541515611395565b60608247101561453e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a50565b600080866001600160a01b0316858760405161455a9190615a5e565b60006040518083038185875af1925050503d8060008114614597576040519150601f19603f3d011682016040523d82523d6000602084013e61459c565b606091505b50915091506145ad878383876145fa565b979650505050505050565b600061139583836142a5565b6000611395838361439f565b60008260000182815481106145e7576145e76153ad565b9060005260206000200154905092915050565b60608315614669578251600003614662576001600160a01b0385163b6146625760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a50565b5081612558565b612558838381511561467e5781518083602001fd5b8060405162461bcd60e51b8152600401610a509190614796565b60e08101610f7782846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b6001600160a01b0381168114610c8157600080fd5b60006020828403121561473b57600080fd5b813561139581614714565b60005b83811015614761578181015183820152602001614749565b50506000910152565b60008151808452614782816020860160208601614746565b601f01601f19169290920160200192915050565b602081526000611395602083018461476a565b600060a08284031215611ee157600080fd5b6000602082840312156147cd57600080fd5b813567ffffffffffffffff8111156147e457600080fd5b612558848285016147a9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715614842576148426147f0565b60405290565b6040516080810167ffffffffffffffff81118282101715614842576148426147f0565b60405160c0810167ffffffffffffffff81118282101715614842576148426147f0565b604051601f8201601f1916810167ffffffffffffffff811182821017156148b7576148b76147f0565b604052919050565b600067ffffffffffffffff8211156148d9576148d96147f0565b5060051b60200190565b600082601f8301126148f457600080fd5b81356020614909614904836148bf565b61488e565b82815260069290921b8401810191818101908684111561492857600080fd5b8286015b8481101561497957604081890312156149455760008081fd5b61494d61481f565b813561495881614714565b81528185013561496781614714565b8186015283529183019160400161492c565b509695505050505050565b6000806040838503121561499757600080fd5b823567ffffffffffffffff808211156149af57600080fd5b6149bb868387016148e3565b935060208501359150808211156149d157600080fd5b506149de858286016148e3565b9150509250929050565b803561ffff811681146149fa57600080fd5b919050565b803563ffffffff811681146149fa57600080fd5b67ffffffffffffffff81168114610c8157600080fd5b600060a08284031215614a3b57600080fd5b60405160a0810181811067ffffffffffffffff82111715614a5e57614a5e6147f0565b6040528235614a6c81614714565b8152614a7a602084016149e8565b60208201526040830135614a8d81614714565b6040820152614a9e606084016149ff565b60608201526080830135614ab181614a13565b60808201529392505050565b60008060408385031215614ad057600080fd5b8235614adb81614714565b91506020830135614aeb81614714565b809150509250929050565b600082601f830112614b0757600080fd5b81356020614b17614904836148bf565b82815260059290921b84018101918181019086841115614b3657600080fd5b8286015b84811015614979578035614b4d81614714565b8352918301918301614b3a565b60008060408385031215614b6d57600080fd5b823567ffffffffffffffff80821115614b8557600080fd5b614b9186838701614af6565b93506020850135915080821115614ba757600080fd5b506149de85828601614af6565b60006020808385031215614bc757600080fd5b823567ffffffffffffffff811115614bde57600080fd5b8301601f81018513614bef57600080fd5b8035614bfd614904826148bf565b81815260079190911b82018301908381019087831115614c1c57600080fd5b928401925b828410156145ad5760808489031215614c3a5760008081fd5b614c42614848565b8435614c4d81614714565b8152614c5a8587016149ff565b868201526040614c6b8187016149ff565b908201526060614c7c8682016149e8565b9082015282526080939093019290840190614c21565b60a08101610f7782846001600160a01b0380825116835261ffff60208301511660208401528060408301511660408401525063ffffffff606082015116606083015267ffffffffffffffff60808201511660808301525050565b60008060208385031215614cff57600080fd5b823567ffffffffffffffff80821115614d1757600080fd5b818501915085601f830112614d2b57600080fd5b813581811115614d3a57600080fd5b8660208260061b8501011115614d4f57600080fd5b60209290920196919550909350505050565b8015158114610c8157600080fd5b80356149fa81614d61565b60006020808385031215614d8d57600080fd5b823567ffffffffffffffff811115614da457600080fd5b8301601f81018513614db557600080fd5b8035614dc3614904826148bf565b81815260c09182028301840191848201919088841115614de257600080fd5b938501935b83851015614e8c5780858a031215614dff5760008081fd5b614e0761486b565b8535614e1281614714565b815285870135614e2181614a13565b818801526040868101356bffffffffffffffffffffffff81168114614e465760008081fd5b908201526060614e578782016149ff565b908201526080614e688782016149e8565b9082015260a0614e79878201614d6f565b9082015283529384019391850191614de7565b50979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614ed95783516001600160a01b031683529284019291840191600101614eb4565b50909695505050505050565b600080600060608486031215614efa57600080fd5b833567ffffffffffffffff811115614f1157600080fd5b614f1d868287016147a9565b935050602084013591506040840135614f3581614714565b809150509250925092565b600081518084526020808501945080840160005b83811015614f8857815180516001600160a01b0316885283015161ffff168388015260409096019590820190600101614f54565b509495945050505050565b604081526000614fa66040830185614f40565b90508260208301529392505050565b80356fffffffffffffffffffffffffffffffff811681146149fa57600080fd5b600060608284031215614fe757600080fd5b6040516060810181811067ffffffffffffffff8211171561500a5761500a6147f0565b604052823561501881614d61565b815261502660208401614fb5565b602082015261503760408401614fb5565b60408201529392505050565b60006020828403121561505557600080fd5b813561139581614d61565b805177ffffffffffffffffffffffffffffffffffffffffffffffff811681146149fa57600080fd5b6000806040838503121561509b57600080fd5b6150a483615060565b91506150b260208401615060565b90509250929050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126150f057600080fd5b83018035915067ffffffffffffffff82111561510b57600080fd5b6020019150368190038213156139ce57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610f7757610f77615120565b80820180821115610f7757610f77615120565b6000826151af577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126151e957600080fd5b83018035915067ffffffffffffffff82111561520457600080fd5b6020019150600681901b36038213156139ce57600080fd5b67ffffffffffffffff81811683821601908082111561439857614398615120565b60006020828403121561524f57600080fd5b5051919050565b60006040828403121561526857600080fd5b61527061481f565b823561527b81614714565b8152615289602084016149e8565b60208201529392505050565b6000602082840312156152a757600080fd5b815161139581614a13565b6000602082840312156152c457600080fd5b815161139581614d61565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6020815260006125586020830184866152cf565b60006020828403121561532057600080fd5b5035919050565b60006040828403121561533957600080fd5b61534161481f565b823561534c81614714565b81526020928301359281019290925250919050565b6bffffffffffffffffffffffff81811683821601908082111561439857614398615120565b600067ffffffffffffffff8083168181036153a3576153a3615120565b6001019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6001600160a01b038716815260a0602082015260006153ff60a0830187896152cf565b85604084015267ffffffffffffffff851660608401528281036080840152615427818561476a565b9998505050505050505050565b60006020828403121561544657600080fd5b815167ffffffffffffffff8082111561545e57600080fd5b818401915084601f83011261547257600080fd5b815181811115615484576154846147f0565b6154976020601f19601f8401160161488e565b91508082528560208285010111156154ae57600080fd5b6154bf816020840160208601614746565b50949350505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036154f9576154f9615120565b5060010190565b600081518084526020808501945080840160005b83811015614f8857815180516001600160a01b031688528301518388015260409096019590820190600101615514565b6020815261555f60208201835167ffffffffffffffff169052565b6000602083015161557c604084018267ffffffffffffffff169052565b506040830151606083015260608301516155a160808401826001600160a01b03169052565b50608083015167ffffffffffffffff811660a08401525060a083015160c083015260c08301516155d560e084018215159052565b5060e08301516101006155f2818501836001600160a01b03169052565b8085015191505061018061012081818601526156126101a086018461476a565b9250808601519050610140601f1986850301818701526156328483615500565b935080870151915050610160615652818701836001600160a01b03169052565b959095015193019290925250919050565b6bffffffffffffffffffffffff82811682821603908082111561439857614398615120565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156156c85780818660040360031b1b83161692505b505092915050565b600080858511156156e057600080fd5b838611156156ed57600080fd5b5050820193919092039150565b60006040828403121561570c57600080fd5b61571461481f565b82358152602083013561528981614d61565b60006020828403121561573857600080fd5b61139582615060565b60006020828403121561575357600080fd5b815161139581614714565b61018081016157db82856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b82516001600160a01b0390811660e0840152602084015161ffff16610100840152604084015116610120830152606083015163ffffffff16610140830152608083015167ffffffffffffffff16610160830152611395565b81810381811115610f7757610f77615120565b818103600083128015838313168383128216171561439857614398615120565b602080825282518282018190526000919060409081850190868401855b828110156158d357815180516001600160a01b031685528681015163ffffffff9081168887015286820151168686015260609081015161ffff169085015260809093019290850190600101615883565b5091979650505050505050565b6000816158ef576158ef615120565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b63ffffffff81811683821601908082111561439857614398615120565b63ffffffff831681526040602082015260006125586040830184614f40565b602080825282518282018190526000919060409081850190868401855b828110156158d357815180516001600160a01b031685528681015167ffffffffffffffff1687860152858101516bffffffffffffffffffffffff168686015260608082015163ffffffff169086015260808082015161ffff169086015260a09081015115159085015260c0909301929085019060010161596e565b6000604082840312156159fb57600080fd5b615a0361481f565b615a0c83615060565b8152602083015161528981614a13565b6020815260006113956020830184615500565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251615a70818460208701614746565b919091019291505056fea164736f6c6343000813000a",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
