{
  "_format": "hh-sol-artifact-1",
  "contractName": "FaultDisputeGame",
  "sourceName": "contracts/L1/dispute/FaultDisputeGame.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "GameType",
          "name": "_gameType",
          "type": "uint32"
        },
        {
          "internalType": "Claim",
          "name": "_absolutePrestate",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "_maxGameDepth",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_splitDepth",
          "type": "uint256"
        },
        {
          "internalType": "Duration",
          "name": "_clockExtension",
          "type": "uint64"
        },
        {
          "internalType": "Duration",
          "name": "_maxClockDuration",
          "type": "uint64"
        },
        {
          "internalType": "contract IBigStepper",
          "name": "_vm",
          "type": "address"
        },
        {
          "internalType": "contract IDelayedWETH",
          "name": "_weth",
          "type": "address"
        },
        {
          "internalType": "contract Lib_AddressManager",
          "name": "_addressManager",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_l2ChainId",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "AlreadyInitialized",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AnchorRootNotFound",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "BlockNumberMatches",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "BondTransferFailed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CannotDefendRootClaim",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ClaimAboveSplit",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ClaimAlreadyExists",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ClaimAlreadyResolved",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ClockNotExpired",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ClockTimeExceeded",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "DuplicateStep",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "GameDepthExceeded",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "GameNotInProgress",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "IncorrectBondAmount",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidChallengePeriod",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidClockExtension",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidDisputedClaimIndex",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidHeaderRLP",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidLocalIdent",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidOutputRootProof",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidParent",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidPrestate",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidSplitDepth",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "L2BlockNumberChallenged",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MaxDepthTooLarge",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoCreditToClaim",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OutOfOrderResolution",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "Claim",
          "name": "rootClaim",
          "type": "bytes32"
        }
      ],
      "name": "UnexpectedRootClaim",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ValidStep",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "parentIndex",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "Claim",
          "name": "claim",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "claimant",
          "type": "address"
        }
      ],
      "name": "Move",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "enum GameStatus",
          "name": "status",
          "type": "uint8"
        }
      ],
      "name": "Resolved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "intendedRecipient",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "reason",
          "type": "bytes"
        }
      ],
      "name": "SlashingFailed",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "absolutePrestate",
      "outputs": [
        {
          "internalType": "Claim",
          "name": "absolutePrestate_",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_ident",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_execLeafIdx",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_partOffset",
          "type": "uint256"
        }
      ],
      "name": "addLocalData",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "Claim",
          "name": "_disputed",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "_parentIndex",
          "type": "uint256"
        },
        {
          "internalType": "Claim",
          "name": "_claim",
          "type": "bytes32"
        }
      ],
      "name": "attack",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "batchIndex",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "batchRoot",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "batchSize",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "prevTotalElements",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraData",
              "type": "bytes"
            }
          ],
          "internalType": "struct Lib_OVMCodec.ChainBatchHeader",
          "name": "_outputRootProof",
          "type": "tuple"
        },
        {
          "internalType": "bytes",
          "name": "_headerRLP",
          "type": "bytes"
        }
      ],
      "name": "challengeRootL2Block",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_recipient",
          "type": "address"
        }
      ],
      "name": "claimCredit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "claimData",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "parentIndex",
          "type": "uint32"
        },
        {
          "internalType": "address",
          "name": "counteredBy",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "claimant",
          "type": "address"
        },
        {
          "internalType": "uint128",
          "name": "bond",
          "type": "uint128"
        },
        {
          "internalType": "Claim",
          "name": "claim",
          "type": "bytes32"
        },
        {
          "internalType": "Position",
          "name": "position",
          "type": "uint128"
        },
        {
          "internalType": "Clock",
          "name": "clock",
          "type": "uint128"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "claimDataLen",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "len_",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "Hash",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "claims",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "clockExtension",
      "outputs": [
        {
          "internalType": "Duration",
          "name": "clockExtension_",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "createdAt",
      "outputs": [
        {
          "internalType": "Timestamp",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "credit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "Claim",
          "name": "_disputed",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "_parentIndex",
          "type": "uint256"
        },
        {
          "internalType": "Claim",
          "name": "_claim",
          "type": "bytes32"
        }
      ],
      "name": "defend",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "extraData",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "extraData_",
          "type": "bytes"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "gameCreator",
      "outputs": [
        {
          "internalType": "address",
          "name": "creator_",
          "type": "address"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "gameData",
      "outputs": [
        {
          "internalType": "GameType",
          "name": "gameType_",
          "type": "uint32"
        },
        {
          "internalType": "Claim",
          "name": "rootClaim_",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "extraData_",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "gameType",
      "outputs": [
        {
          "internalType": "GameType",
          "name": "gameType_",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_claimIndex",
          "type": "uint256"
        }
      ],
      "name": "getChallengerDuration",
      "outputs": [
        {
          "internalType": "Duration",
          "name": "duration_",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_claimIndex",
          "type": "uint256"
        }
      ],
      "name": "getNumToResolve",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "numRemainingChildren_",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "Position",
          "name": "_position",
          "type": "uint128"
        }
      ],
      "name": "getRequiredBond",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "requiredBond_",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "l1Head",
      "outputs": [
        {
          "internalType": "Hash",
          "name": "l1Head_",
          "type": "bytes32"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "l2BlockNumber",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "l2BlockNumber_",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "l2BlockNumberChallenged",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "l2BlockNumberChallenger",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "l2ChainId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "l2ChainId_",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "maxClockDuration",
      "outputs": [
        {
          "internalType": "Duration",
          "name": "maxClockDuration_",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "maxGameDepth",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "maxGameDepth_",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "Claim",
          "name": "_disputed",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "_challengeIndex",
          "type": "uint256"
        },
        {
          "internalType": "Claim",
          "name": "_claim",
          "type": "bytes32"
        },
        {
          "internalType": "bool",
          "name": "_isAttack",
          "type": "bool"
        }
      ],
      "name": "move",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "resolutionCheckpoints",
      "outputs": [
        {
          "internalType": "bool",
          "name": "initialCheckpointComplete",
          "type": "bool"
        },
        {
          "internalType": "uint32",
          "name": "subgameIndex",
          "type": "uint32"
        },
        {
          "internalType": "Position",
          "name": "leftmostPosition",
          "type": "uint128"
        },
        {
          "internalType": "address",
          "name": "counteredBy",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "resolve",
      "outputs": [
        {
          "internalType": "enum GameStatus",
          "name": "status_",
          "type": "uint8"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_claimIndex",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_numToResolve",
          "type": "uint256"
        }
      ],
      "name": "resolveClaim",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "resolvedAt",
      "outputs": [
        {
          "internalType": "Timestamp",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "resolvedSubgames",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rootClaim",
      "outputs": [
        {
          "internalType": "Claim",
          "name": "rootClaim_",
          "type": "bytes32"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "scc",
      "outputs": [
        {
          "internalType": "contract IMVMStateCommitmentChain",
          "name": "scc_",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "splitDepth",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "splitDepth_",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "startingBlockNumber",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "startingBlockNumber_",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "startingOutputRoot",
      "outputs": [
        {
          "internalType": "Hash",
          "name": "root",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "l2BlockNumber",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "startingRootHash",
      "outputs": [
        {
          "internalType": "Hash",
          "name": "startingRootHash_",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "status",
      "outputs": [
        {
          "internalType": "enum GameStatus",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_claimIndex",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "_isAttack",
          "type": "bool"
        },
        {
          "internalType": "bytes",
          "name": "_stateData",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "_proof",
          "type": "bytes"
        }
      ],
      "name": "step",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "subgames",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "version",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "vm",
      "outputs": [
        {
          "internalType": "contract IBigStepper",
          "name": "vm_",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "weth",
      "outputs": [
        {
          "internalType": "contract IDelayedWETH",
          "name": "weth_",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x6101c06040523480156200001257600080fd5b506040516200616638038062006166833981016040819052620000359162000436565b620000436001607e6200050d565b60ff168811156200006757604051633beff19960e11b815260040160405180910390fd5b600019871480620000845750876200008188600162000533565b10155b15620000a35760405163e62ccf3960e01b815260040160405180910390fd5b6002871015620000c65760405163e62ccf3960e01b815260040160405180910390fd5b6001600160401b038016846001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200010f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200013591906200054e565b6001600160a01b031663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000173573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019991906200056e565b1115620001b95760405163b4e1243360e01b815260040160405180910390fd5b6000620001da876001600160401b0316620003e260201b6200110a1760201c565b620001f0906001600160401b0316600262000588565b90506000856001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025991906200054e565b6001600160a01b031663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000297573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bd91906200056e565b620002dc896001600160401b0316620003e260201b6200110a1760201c565b6001600160401b0316620002f1919062000533565b905060006200030c8383620003e560201b620039551760201c565b90506001600160401b03811115620003375760405163235dfb2b60e21b815260040160405180910390fd5b62000356886001600160401b0316620003e260201b6200110a1760201c565b6001600160401b0316816001600160401b03161115620003895760405163235dfb2b60e21b815260040160405180910390fd5b50505063ffffffff9099166101205260809790975260a09590955260c0939093526001600160401b039182166101a0521660e0526001600160a01b039081166101005290811661014052166101605261018052620005aa565b90565b600081831015620003f75781620003f9565b825b9392505050565b80516001600160401b03811681146200041857600080fd5b919050565b6001600160a01b03811681146200043357600080fd5b50565b6000806000806000806000806000806101408b8d0312156200045757600080fd5b8a5163ffffffff811681146200046c57600080fd5b809a505060208b0151985060408b0151975060608b015196506200049360808c0162000400565b9550620004a360a08c0162000400565b945060c08b0151620004b5816200041d565b60e08c0151909450620004c8816200041d565b6101008c0151909350620004dc816200041d565b809250506101208b015190509295989b9194979a5092959850565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff8416808210156200052a576200052a620004f7565b90039392505050565b60008219821115620005495762000549620004f7565b500190565b6000602082840312156200056157600080fd5b8151620003f9816200041d565b6000602082840312156200058157600080fd5b5051919050565b6000816000190483118215151615620005a557620005a5620004f7565b500290565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051615a2f620007376000396000818161063a015281816120c901528181612134015261216701526000818161091f015281816126d401526138930152600081816115f1015281816117f2015281816119a201526126380152600081816104e201528181611af5015281816124d901528181612b2901526139ed0152600081816107c2015261391501526000818161046f01528181611fe2015281816132c4015261359501526000818161097201528181610b1a01528181611f5201528181612197015281816121f601528181612cf20152612d340152600081816109a501528181611d9b01528181611ec1015281816121050152818161313b0152818161373901528181613db601528181614486015281816145a2015281816146810152614734015260008181610a4c01528181611e6401528181611fb601528181612e2001528181612ea601528181613053015261315c0152600081816106e701526131df0152615a2f6000f3fe6080604052600436106102f25760003560e01c806370872aa51161018f578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610a19578063fa315aa914610a3d578063fe2bbeb214610a7057600080fd5b8063ec5e630814610996578063eff0f592146109c9578063f8f43ff6146109f957600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610910578063d8cc1a3c14610943578063dabd396d1461096357600080fd5b8063c6f0308c1461084e578063cf09e0d0146108c2578063d5d44d80146108e357600080fd5b80638d450a9511610143578063bcef3b551161011d578063bcef3b55146107ec578063bd8da9561461080e578063c395e1ca1461082e57600080fd5b80638d450a95146106d8578063a445ece61461070b578063bbdc02db146107ab57600080fd5b80638129fc1c116101745780638129fc1c146106995780638980e0cc146106a15780638b85902b146106b657600080fd5b806370872aa5146106715780637b0f0adc1461068657600080fd5b80633fc8cef3116102485780635a5fa2d9116101fc5780636361506d116101d65780636361506d146106095780636b6716c01461062b5780636f0344091461065e57600080fd5b80635a5fa2d9146105b4578063609d3334146105d457806360e27464146105e957600080fd5b8063543acd501161022d578063543acd501461051957806354fd4d501461052e57806357da950e1461058457600080fd5b80633fc8cef3146104d3578063472777c61461050657600080fd5b80632810e1d6116102aa57806337b1b2291161028457806337b1b2291461043e5780633a768463146104605780633e3ac9121461049357600080fd5b80632810e1d6146103d15780632ad69aeb146103e657806330dbe5701461040657600080fd5b80631e31db5a116102db5780631e31db5a14610364578063200d2ed21461038457806325fc2ace146103b257600080fd5b806303c2924d146102f757806319effeb414610319575b600080fd5b34801561030357600080fd5b5061031761031236600461507b565b610aa0565b005b34801561032557600080fd5b506000546103469068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561037057600080fd5b5061031761037f3660046150e6565b611064565b34801561039057600080fd5b506000546103a590600160801b900460ff1681565b60405161035b9190615186565b3480156103be57600080fd5b506008545b60405190815260200161035b565b3480156103dd57600080fd5b506103a561139e565b3480156103f257600080fd5b506103c361040136600461507b565b6118f5565b34801561041257600080fd5b50600154610426906001600160a01b031681565b6040516001600160a01b03909116815260200161035b565b34801561044a57600080fd5b503660011981013560f01c90033560601c610426565b34801561046c57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610426565b34801561049f57600080fd5b506000546104c3907201000000000000000000000000000000000000900460ff1681565b604051901515815260200161035b565b3480156104df57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610426565b6103176105143660046151c7565b61192b565b34801561052557600080fd5b5061042661193d565b34801561053a57600080fd5b506105776040518060400160405280600a81526020017f312e332e302d72632e310000000000000000000000000000000000000000000081525081565b60405161035b9190615240565b34801561059057600080fd5b5060085460095461059f919082565b6040805192835260208301919091520161035b565b3480156105c057600080fd5b506103c36105cf366004615253565b611a16565b3480156105e057600080fd5b50610577611a50565b3480156105f557600080fd5b50610317610604366004615284565b611a5e565b34801561061557600080fd5b503660011981013560f01c9003603401356103c3565b34801561063757600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610346565b61031761066c3660046152af565b611bde565b34801561067d57600080fd5b506009546103c3565b6103176106943660046151c7565b612574565b610317612581565b3480156106ad57600080fd5b506002546103c3565b3480156106c257600080fd5b503660011981013560f01c9003605401356103c3565b3480156106e457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103c3565b34801561071757600080fd5b5061076d610726366004615253565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046001600160801b0316906001600160a01b031684565b60408051941515855263ffffffff90931660208501526001600160801b03909116918301919091526001600160a01b0316606082015260800161035b565b3480156107b757600080fd5b5060405163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161035b565b3480156107f857600080fd5b503660011981013560f01c9003601401356103c3565b34801561081a57600080fd5b50610346610829366004615253565b612bc2565b34801561083a57600080fd5b506103c36108493660046152f0565b612d5c565b34801561085a57600080fd5b5061086e610869366004615253565b612f5d565b6040805163ffffffff90981688526001600160a01b03968716602089015295909416948601949094526001600160801b039182166060860152608085015291821660a08401521660c082015260e00161035b565b3480156108ce57600080fd5b506000546103469067ffffffffffffffff1681565b3480156108ef57600080fd5b506103c36108fe366004615284565b60036020526000908152604090205481565b34801561091c57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103c3565b34801561094f57600080fd5b5061031761095e366004615319565b612fd1565b34801561096f57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610346565b3480156109a257600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103c3565b3480156109d557600080fd5b506104c36109e4366004615253565b60046020526000908152604090205460ff1681565b348015610a0557600080fd5b50610317610a143660046151c7565b61352d565b348015610a2557600080fd5b50610a2e613913565b60405161035b939291906153a5565b348015610a4957600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103c3565b348015610a7c57600080fd5b506104c3610a8b366004615253565b60066020526000908152604090205460ff1681565b60008054600160801b900460ff166002811115610abf57610abf615157565b14610add5760405163067fe19560e41b815260040160405180910390fd5b600060028381548110610af257610af26153ca565b906000526020600020906005020190506000610b0d84612bc2565b905067ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169082161015610b76576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615610bbf576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600560205260409020805480158015610bdc57508515155b15610c5d57835464010000000090046001600160a01b031660008115610c025781610c11565b60018601546001600160a01b03165b9050610c1d8187613970565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046001600160801b031693810193909352600101546001600160a01b03166060830152610ce1576001600160801b036040820152600181526000869003610ce1578195505b600086826020015163ffffffff16610cf99190615428565b90506000838211610d0a5781610d0c565b835b602084015190915063ffffffff165b81811015610e2c576000868281548110610d3757610d376153ca565b6000918252602080832090910154808352600690915260409091205490915060ff16610d8f576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028281548110610da457610da46153ca565b60009182526020909120600590910201805490915064010000000090046001600160a01b0316158015610deb5750600481015460408701516001600160801b039182169116115b15610e175760018101546001600160a01b0316606087015260048101546001600160801b031660408701525b50508080610e2490615440565b915050610d1b565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006001600160801b03909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039093169290921790915584900361105957606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905589158015610f9657506000547201000000000000000000000000000000000000900460ff165b15610ff1576001546001600160a01b0316610fb1818a613970565b88546001600160a01b03909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff909116178855611057565b61101e6001600160a01b038216156110095781611018565b60018901546001600160a01b03165b89613970565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff166401000000006001600160a01b038316021788555b505b505050505050505050565b60008054600160801b900460ff16600281111561108357611083615157565b146110a15760405163067fe19560e41b815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff16156110f4576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61110d3660011981013560f01c90036014013590565b90565b61111e611119856154e3565b613a4e565b14611155576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061116460808501856155a7565b810190611171919061560c565b5092505050808383604051611187929190615649565b6040518091039020146111c6576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061120f61120a85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613a9492505050565b613ac1565b9050600061123682600881518110611229576112296153ca565b6020026020010151613cc0565b9050602081511115611274576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c3660011981013560f01c90036054013581036112cb576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112da60608801356001615428565b8110806112f757506112f460408801356060890135615428565b81115b1561132e576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff167201000000000000000000000000000000000000179055505050565b600080600054600160801b900460ff1660028111156113bf576113bf615157565b146113dd5760405163067fe19560e41b815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff16611441576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b03166002600081548110611460576114606153ca565b600091825260209091206005909102015464010000000090046001600160a01b03161461148e576001611491565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff90911617600160801b83600281111561153557611535615157565b02179055600281111561154a5761154a615157565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a2600181600281111561158757611587615157565b0361110a57604080518082018252601581527f4661756c7450726f6f664c6f636b696e67506f6f6c0000000000000000000000602082015290517fbf40fac10000000000000000000000000000000000000000000000000000000081526000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163bf40fac19161162491600401615240565b602060405180830381865afa158015611641573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116659190615659565b90506001600160a01b03811615611790576000600260008154811061168c5761168c6153ca565b60009182526020909120600590910201546040517fc96be4cb0000000000000000000000000000000000000000000000000000000081526401000000009091046001600160a01b0390811660048301819052925083169063c96be4cb90602401600060405180830381600087803b15801561170657600080fd5b505af1925050508015611717575060015b61178e573d808015611745576040519150601f19603f3d011682016040523d82523d6000602084013e61174a565b606091505b50816001600160a01b03167f17ea47b379a2daf87a43d9fe6e50400125dff97424a6a7686eca528970fffc0f826040516117849190615240565b60405180910390a2505b505b604080518082018252601481527f5374617465436f6d6d69746d656e74436861696e000000000000000000000000602082015290517fbf40fac10000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163bf40fac1916118269190600401615240565b602060405180830381865afa158015611843573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118679190615659565b6001600160a01b0316637fe9b70f6118a1600260008154811061188c5761188c6153ca565b90600052602060002090600502016003015490565b6040518263ffffffff1660e01b81526004016118bf91815260200190565b600060405180830381600087803b1580156118d957600080fd5b505af11580156118ed573d6000803e3d6000fd5b505050505090565b6005602052816000526040600020818154811061191157600080fd5b90600052602060002001600091509150505481565b905090565b6119388383836001611bde565b505050565b604080518082018252601481527f5374617465436f6d6d69746d656e74436861696e000000000000000000000000602082015290517fbf40fac10000000000000000000000000000000000000000000000000000000081526000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163bf40fac1916119d591600401615240565b602060405180830381865afa1580156119f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119269190615659565b60008181526007602090815260408083206005909252822080548254611a4790610100900463ffffffff1682615676565b95945050505050565b606061192660546020613d47565b6001600160a01b038116600090815260036020526040812080549082905590819003611ab6576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a30000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063f3fef3a390604401600060405180830381600087803b158015611b3957600080fd5b505af1158015611b4d573d6000803e3d6000fd5b505050506000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611b9e576040519150601f19603f3d011682016040523d82523d6000602084013e611ba3565b606091505b5050905080611938576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054600160801b900460ff166002811115611bfd57611bfd615157565b14611c1b5760405163067fe19560e41b815260040160405180910390fd5b600060028481548110611c3057611c306153ca565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff811684526001600160a01b0364010000000090910481169484019490945260018101549093169082015260028201546001600160801b03908116606083015260038301546080830181905260049093015480821660a0840152600160801b90041660c082015291508514611cf4576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156001600160801b0383161760011b90506000611d89826001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580611dc45750611dc17f00000000000000000000000000000000000000000000000000000000000000006002615428565b81145b8015611dce575084155b15611e05576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015611e2b575086155b15611e62576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115611ebc576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ee77f00000000000000000000000000000000000000000000000000000000000000006001615428565b8103611ef957611ef986888588613d7b565b34611f0383612d5c565b14611f3a576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611f4588612bc2565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811690821603611fad576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611fda60017f0000000000000000000000000000000000000000000000000000000000000000615676565b83036120fe577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561203e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120629190615659565b6001600160a01b031663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa15801561209f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c3919061568d565b6120f7907f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166156a6565b9050612191565b61212960017f0000000000000000000000000000000000000000000000000000000000000000615676565b8303612164576120f77f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1660026156d2565b507f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff165b6121c5817f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16615702565b67ffffffffffffffff166121e08367ffffffffffffffff1690565b67ffffffffffffffff16111561222757612224817f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16615702565b91505b6000604083901b421760008a8152608087901b6001600160801b038d1617602052604081209192509060008181526004602052604090205490915060ff161561229c576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808d63ffffffff16815260200160006001600160a01b03168152602001336001600160a01b03168152602001346001600160801b031681526020018c8152602001886001600160801b03168152602001846001600160801b0316815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160020160006101000a8154816001600160801b0302191690836001600160801b031602179055506080820151816003015560a08201518160040160006101000a8154816001600160801b0302191690836001600160801b0316021790555060c08201518160040160106101000a8154816001600160801b0302191690836001600160801b031602179055505050600560008c815260200190815260200160002060016002805490506124939190615676565b81546001810183556000928352602083200155604080517fd0e30db000000000000000000000000000000000000000000000000000000000815290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263d0e30db09234926004808301939282900301818588803b15801561251e57600080fd5b505af1158015612532573d6000803e3d6000fd5b50506040513393508d92508e91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a4505050505050505050505050565b6119388383836000611bde565b60005471010000000000000000000000000000000000900460ff16156125d3576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082018252601481527f5374617465436f6d6d69746d656e74436861696e000000000000000000000000602082015290517fbf40fac10000000000000000000000000000000000000000000000000000000081526000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163bf40fac19161266b91600401615240565b602060405180830381865afa158015612688573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ac9190615659565b6040517fa0832c030000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015290915060009081906001600160a01b0384169063a0832c03906024016040805180830381865afa158015612730573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612754919061572b565b90925090508180612791576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5fc993dd000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03851690635fc993dd90602401602060405180830381865afa1580156127ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612813919061574f565b1561284a576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528181526020018290526008819055600982905536607a1461287d57639824bdab6000526004601cfd5b813660011981013560f01c900360540135116128db576040517ff40239db0000000000000000000000000000000000000000000000000000000081523660011981013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff808252600060208301818152600119369081013560f01c90038035606090811c868801908152346001600160801b0381811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace8101805499516001600160a01b03908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad18501555195518216600160801b0295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f00000000000000000000000000000000000000000000000000000000000000009092169363d0e30db093926004828101939282900301818588803b158015612b6f57600080fd5b505af1158015612b83573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff1617905550505050505050565b600080600054600160801b900460ff166002811115612be357612be3615157565b14612c015760405163067fe19560e41b815260040160405180910390fd5b600060028381548110612c1657612c166153ca565b600091825260208220600590910201805490925063ffffffff90811614612c7c57815460028054909163ffffffff16908110612c5457612c546153ca565b906000526020600020906005020160040160109054906101000a90046001600160801b031690505b6004820154600090612ca790600160801b900467ffffffffffffffff165b67ffffffffffffffff1690565b612cbb9067ffffffffffffffff1642615676565b612cd1612c9a846001600160801b031660401c90565b67ffffffffffffffff16612ce59190615428565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff168167ffffffffffffffff1611612d325780611a47565b7f000000000000000000000000000000000000000000000000000000000000000095945050505050565b60006002600081548110612d7257612d726153ca565b60009182526020909120600160059092020101546001600160a01b03163303612d9d57506000919050565b6000612e19836001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000000811115612e78576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000612e93838361579b565b9050670de0b6b3a76400006000612eca827f00000000000000000000000000000000000000000000000000000000000000006157af565b90506000612ee8612ee3670de0b6b3a7640000866157af565b613f01565b90506000612ef68484614153565b90506000612f0483836141a2565b90506000612f11826141d0565b90506000612f3082612f2b670de0b6b3a76400008f6157af565b6143b8565b90506000612f3e8b836141a2565b9050612f4a818d6157af565b9f9e505050505050505050505050505050565b60028181548110612f6d57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff841695506401000000009093046001600160a01b03908116949216926001600160801b03918216929180821691600160801b90041687565b60008054600160801b900460ff166002811115612ff057612ff0615157565b1461300e5760405163067fe19560e41b815260040160405180910390fd5b600060028781548110613023576130236153ca565b6000918252602082206005919091020160048101549092506001600160801b0316908715821760011b90506130797f00000000000000000000000000000000000000000000000000000000000000006001615428565b6130f3826001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161461312d576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808915613209576131807f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000615676565b6001901b613196846001600160801b03166143e9565b6001600160801b03166131a991906157ce565b156131dd576131d46131c560016001600160801b0387166157e2565b865463ffffffff16600061446f565b600301546131ff565b7f00000000000000000000000000000000000000000000000000000000000000005b915084905061322a565b600385015491506132276131c56001600160801b0386166001615802565b90505b600882901b60088a8a604051613241929190615649565b6040518091039020901b14613282576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061328d8c614538565b9050600061329c836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e14ced3290613309908f908f908f908f908a9060040161584f565b6020604051808303816000875af1158015613328573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061334c919061568d565b6004850154911491506000906002906133d5906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61344f896001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6134599190615889565b61346391906158ac565b60ff1615905081151581036134a4576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b875464010000000090046001600160a01b0316156134ee576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054600160801b900460ff16600281111561354c5761354c615157565b1461356a5760405163067fe19560e41b815260040160405180910390fd5b60008060008061357986614567565b9350935093509350600061358f858585856148c0565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136159190615659565b9050600189036136e2576001600160a01b0381166352f0f3ad8a846136463660011981013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af11580156136b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136dc919061568d565b50611059565b60028903613701576001600160a01b0381166352f0f3ad8a8489613646565b60038903613720576001600160a01b0381166352f0f3ad8a8487613646565b6004890361385557600061375d6001600160801b0385167f000000000000000000000000000000000000000000000000000000000000000061495f565b60095461376a9190615428565b613775906001615428565b90503660011981013560f01c90036054013581106137a2573660011981013560f01c9003605401356137a4565b805b90506001600160a01b0382166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561382a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061384e919061568d565b5050611059565b600589036138e1576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000000060c01b604482015260086064820152608481018890526001600160a01b038216906352f0f3ad9060a401613699565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000003660011981013560f01c900360140135606061394e611a50565b9050909192565b6000818310156139655781613967565b825b90505b92915050565b60028101546001600160a01b038316600090815260036020526040812080546001600160801b03909316928392906139a9908490615428565b90915550506040517f7eee288d0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690637eee288d90604401600060405180830381600087803b158015613a3157600080fd5b505af1158015613a45573d6000803e3d6000fd5b50505050505050565b60008160200151826040015183606001518460800151604051602001613a7794939291906158ce565b604051602081830303815290604052805190602001209050919050565b60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6060600080613acf846149f4565b91935090915060019050816001811115613aeb57613aeb615157565b14613b385760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064016128d2565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081613b515790505090506000835b8651811015613cb55760208210613bfd5760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e0000000000000000000000000000000000000000000060648201526084016128d2565b600080613c3a6040518060400160405280858c60000151613c1e9190615676565b8152602001858c60200151613c339190615428565b90526149f4565b509150915060405180604001604052808383613c569190615428565b8152602001848b60200151613c6b9190615428565b815250858581518110613c8057613c806153ca565b6020908102919091010152613c96600185615428565b9350613ca28183615428565b613cac9084615428565b92505050613b7e565b508152949350505050565b60606000806000613cd0856149f4565b919450925090506000816001811115613ceb57613ceb615157565b14613d385760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e000000000000000060448201526064016128d2565b611a4785602001518484614d45565b6040518181523660011981013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b6000613d916001600160801b0384166001615802565b90506000613da18286600161446f565b9050600086901a8380613e6b5750613dda60027f00000000000000000000000000000000000000000000000000000000000000006157ce565b6004830154600290613e5c906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b613e6691906158ac565b60ff16145b15613ec35760ff811660011480613e85575060ff81166002145b613ebe576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016128d2565b613a45565b60ff811615613a45576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016128d2565b6001600160801b03811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213613f5757631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261419057637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6000816000190483118202156141c05763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d782136141fe57919050565b680755bf798b4a1bf1e5821261421c5763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000613967670de0b6b3a7640000836143d086613f01565b6143da91906158f3565b6143e491906159af565b6141d0565b60008061445d837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826144af576144aa6001600160801b0386167f0000000000000000000000000000000000000000000000000000000000000000614e20565b6144c1565b6144c1856001600160801b0316614f5f565b9050600284815481106144d6576144d66153ca565b906000526020600020906005020191505b60048201546001600160801b0382811691161461453057815460028054909163ffffffff1690811061451b5761451b6153ca565b906000526020600020906005020191506144e7565b509392505050565b600080600080600061454986614567565b935093509350935061455d848484846148c0565b9695505050505050565b6000806000806000859050600060028281548110614587576145876153ca565b600091825260209091206004600590920201908101549091507f00000000000000000000000000000000000000000000000000000000000000009061463c906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614676576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f00000000000000000000000000000000000000000000000000000000000000009061471b906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16925082111561479057825463ffffffff1661475a7f00000000000000000000000000000000000000000000000000000000000000006001615428565b8303614764578391505b60028181548110614777576147776153ca565b906000526020600020906005020193508094505061467a565b600481810154908401546001600160801b0391821691166000816001600160801b03166147d56147c9856001600160801b031660011c90565b6001600160801b031690565b6001600160801b0316149050801561486e5760006147fb836001600160801b03166143e9565b6001600160801b0316111561484b57600061482b61482360016001600160801b0386166157e2565b89600161446f565b6003810154600490910154909c506001600160801b03169a506148519050565b6008549a505b600386015460048701549099506001600160801b031697506148b2565b60006148876148236001600160801b0385166001615802565b6003808901546004808b015492840154930154909e506001600160801b039182169d50919b50169850505b505050505050509193509193565b60006001600160801b0384161561491b5760408051602081018790526001600160801b038087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611a47565b82826040516020016149409291909182526001600160801b0316602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b6000806149d3847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b600080600080846000015111614a4c5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e000000000000000060448201526064016128d2565b6020840151805160001a607f8111614a71576000600160009450945094505050614d3e565b60b78111614aed576000614a86608083615676565b905080876000015111614adb5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e0000000000000060448201526064016128d2565b60019550935060009250614d3e915050565b60bf8111614bdc576000614b0260b783615676565b905080876000015111614b575760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e0060448201526064016128d2565b600183015160208290036101000a9004614b718183615428565b885111614bc05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e000000000000000060448201526064016128d2565b614bcb826001615428565b9650945060009350614d3e92505050565b60f78111614c57576000614bf160c083615676565b905080876000015111614c465760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e00000000000000000060448201526064016128d2565b600195509350849250614d3e915050565b6000614c6460f783615676565b905080876000015111614cb95760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e00000060448201526064016128d2565b600183015160208290036101000a9004614cd38183615428565b885111614d225760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e0000000000000000000060448201526064016128d2565b614d2d826001615428565b9650945060019350614d3e92505050565b9193909250565b606060008267ffffffffffffffff811115614d6257614d6261545a565b6040519080825280601f01601f191660200182016040528015614d8c576020820181803683370190505b5090508051600003614d9f579050614e19565b6000614dab8587615428565b90506020820160005b614dbf60208761579b565b811015614df65782518252614dd5602084615428565b9250614de2602083615428565b915080614dee81615440565b915050614db4565b5080519151601f86166020036101000a6000190192831692191691909117905290505b9392505050565b600081614e9d846001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614eb35763b34b5c226000526004601cfd5b614ebc83614f5f565b905081614f39826001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161161396a57613967614f4f836001615428565b6001600160801b03831690614feb565b60008119600183011681614fda827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b60008061505f847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b6000806040838503121561508e57600080fd5b50508035926020909101359150565b60008083601f8401126150af57600080fd5b50813567ffffffffffffffff8111156150c757600080fd5b6020830191508360208285010111156150df57600080fd5b9250929050565b6000806000604084860312156150fb57600080fd5b833567ffffffffffffffff8082111561511357600080fd5b9085019060a0828803121561512757600080fd5b9093506020850135908082111561513d57600080fd5b5061514a8682870161509d565b9497909650939450505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600383106151c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000606084860312156151dc57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b81811015615219576020818501810151868301820152016151fd565b8181111561522b576000602083870101525b50601f01601f19169290920160200192915050565b60208152600061396760208301846151f3565b60006020828403121561526557600080fd5b5035919050565b6001600160a01b038116811461528157600080fd5b50565b60006020828403121561529657600080fd5b8135614e198161526c565b801515811461528157600080fd5b600080600080608085870312156152c557600080fd5b84359350602085013592506040850135915060608501356152e5816152a1565b939692955090935050565b60006020828403121561530257600080fd5b81356001600160801b0381168114614e1957600080fd5b6000806000806000806080878903121561533257600080fd5b863595506020870135615344816152a1565b9450604087013567ffffffffffffffff8082111561536157600080fd5b61536d8a838b0161509d565b9096509450606089013591508082111561538657600080fd5b5061539389828a0161509d565b979a9699509497509295939492505050565b63ffffffff84168152826020820152606060408201526000611a4760608301846151f3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561543b5761543b6153f9565b500190565b60006000198203615453576154536153f9565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156154ac576154ac61545a565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156154db576154db61545a565b604052919050565b600060a082360312156154f557600080fd5b6154fd615489565b82358152602080840135818301526040840135604083015260608401356060830152608084013567ffffffffffffffff8082111561553a57600080fd5b9085019036601f83011261554d57600080fd5b81358181111561555f5761555f61545a565b61557184601f19601f840116016154b2565b9150808252368482850101111561558757600080fd5b808484018584013760009082019093019290925250608082015292915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126155dc57600080fd5b83018035915067ffffffffffffffff8211156155f757600080fd5b6020019150368190038213156150df57600080fd5b6000806000806080858703121561562257600080fd5b8435935060208501356156348161526c565b93969395505050506040820135916060013590565b8183823760009101908152919050565b60006020828403121561566b57600080fd5b8151614e198161526c565b600082821015615688576156886153f9565b500390565b60006020828403121561569f57600080fd5b5051919050565b600067ffffffffffffffff8083168185168083038211156156c9576156c96153f9565b01949350505050565b600067ffffffffffffffff808316818516818304811182151516156156f9576156f96153f9565b02949350505050565b600067ffffffffffffffff83811690831681811015615723576157236153f9565b039392505050565b6000806040838503121561573e57600080fd5b505080516020909101519092909150565b60006020828403121561576157600080fd5b8151614e19816152a1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826157aa576157aa61576c565b500490565b60008160001904831182151516156157c9576157c96153f9565b500290565b6000826157dd576157dd61576c565b500690565b60006001600160801b0383811690831681811015615723576157236153f9565b60006001600160801b038083168185168083038211156156c9576156c96153f9565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b606081526000615863606083018789615824565b8281036020840152615876818688615824565b9150508260408301529695505050505050565b600060ff821660ff8416808210156158a3576158a36153f9565b90039392505050565b600060ff8316806158bf576158bf61576c565b8060ff84160691505092915050565b84815283602082015282604082015260806060820152600061455d60808301846151f3565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615934576159346153f9565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561596f5761596f6153f9565b6000871292508782058712848416161561598b5761598b6153f9565b878505871281841616156159a1576159a16153f9565b505050929093029392505050565b6000826159be576159be61576c565b60001983147f8000000000000000000000000000000000000000000000000000000000000000831416156159f4576159f46153f9565b50059056fea264697066735822122021f9024ff4224416d51d531e0ff1afc9840295f133f7f1407731eeb8b4d2198864736f6c634300080f0033",
  "deployedBytecode": "0x6080604052600436106102f25760003560e01c806370872aa51161018f578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610a19578063fa315aa914610a3d578063fe2bbeb214610a7057600080fd5b8063ec5e630814610996578063eff0f592146109c9578063f8f43ff6146109f957600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610910578063d8cc1a3c14610943578063dabd396d1461096357600080fd5b8063c6f0308c1461084e578063cf09e0d0146108c2578063d5d44d80146108e357600080fd5b80638d450a9511610143578063bcef3b551161011d578063bcef3b55146107ec578063bd8da9561461080e578063c395e1ca1461082e57600080fd5b80638d450a95146106d8578063a445ece61461070b578063bbdc02db146107ab57600080fd5b80638129fc1c116101745780638129fc1c146106995780638980e0cc146106a15780638b85902b146106b657600080fd5b806370872aa5146106715780637b0f0adc1461068657600080fd5b80633fc8cef3116102485780635a5fa2d9116101fc5780636361506d116101d65780636361506d146106095780636b6716c01461062b5780636f0344091461065e57600080fd5b80635a5fa2d9146105b4578063609d3334146105d457806360e27464146105e957600080fd5b8063543acd501161022d578063543acd501461051957806354fd4d501461052e57806357da950e1461058457600080fd5b80633fc8cef3146104d3578063472777c61461050657600080fd5b80632810e1d6116102aa57806337b1b2291161028457806337b1b2291461043e5780633a768463146104605780633e3ac9121461049357600080fd5b80632810e1d6146103d15780632ad69aeb146103e657806330dbe5701461040657600080fd5b80631e31db5a116102db5780631e31db5a14610364578063200d2ed21461038457806325fc2ace146103b257600080fd5b806303c2924d146102f757806319effeb414610319575b600080fd5b34801561030357600080fd5b5061031761031236600461507b565b610aa0565b005b34801561032557600080fd5b506000546103469068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561037057600080fd5b5061031761037f3660046150e6565b611064565b34801561039057600080fd5b506000546103a590600160801b900460ff1681565b60405161035b9190615186565b3480156103be57600080fd5b506008545b60405190815260200161035b565b3480156103dd57600080fd5b506103a561139e565b3480156103f257600080fd5b506103c361040136600461507b565b6118f5565b34801561041257600080fd5b50600154610426906001600160a01b031681565b6040516001600160a01b03909116815260200161035b565b34801561044a57600080fd5b503660011981013560f01c90033560601c610426565b34801561046c57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610426565b34801561049f57600080fd5b506000546104c3907201000000000000000000000000000000000000900460ff1681565b604051901515815260200161035b565b3480156104df57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610426565b6103176105143660046151c7565b61192b565b34801561052557600080fd5b5061042661193d565b34801561053a57600080fd5b506105776040518060400160405280600a81526020017f312e332e302d72632e310000000000000000000000000000000000000000000081525081565b60405161035b9190615240565b34801561059057600080fd5b5060085460095461059f919082565b6040805192835260208301919091520161035b565b3480156105c057600080fd5b506103c36105cf366004615253565b611a16565b3480156105e057600080fd5b50610577611a50565b3480156105f557600080fd5b50610317610604366004615284565b611a5e565b34801561061557600080fd5b503660011981013560f01c9003603401356103c3565b34801561063757600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610346565b61031761066c3660046152af565b611bde565b34801561067d57600080fd5b506009546103c3565b6103176106943660046151c7565b612574565b610317612581565b3480156106ad57600080fd5b506002546103c3565b3480156106c257600080fd5b503660011981013560f01c9003605401356103c3565b3480156106e457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103c3565b34801561071757600080fd5b5061076d610726366004615253565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046001600160801b0316906001600160a01b031684565b60408051941515855263ffffffff90931660208501526001600160801b03909116918301919091526001600160a01b0316606082015260800161035b565b3480156107b757600080fd5b5060405163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161035b565b3480156107f857600080fd5b503660011981013560f01c9003601401356103c3565b34801561081a57600080fd5b50610346610829366004615253565b612bc2565b34801561083a57600080fd5b506103c36108493660046152f0565b612d5c565b34801561085a57600080fd5b5061086e610869366004615253565b612f5d565b6040805163ffffffff90981688526001600160a01b03968716602089015295909416948601949094526001600160801b039182166060860152608085015291821660a08401521660c082015260e00161035b565b3480156108ce57600080fd5b506000546103469067ffffffffffffffff1681565b3480156108ef57600080fd5b506103c36108fe366004615284565b60036020526000908152604090205481565b34801561091c57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103c3565b34801561094f57600080fd5b5061031761095e366004615319565b612fd1565b34801561096f57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610346565b3480156109a257600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103c3565b3480156109d557600080fd5b506104c36109e4366004615253565b60046020526000908152604090205460ff1681565b348015610a0557600080fd5b50610317610a143660046151c7565b61352d565b348015610a2557600080fd5b50610a2e613913565b60405161035b939291906153a5565b348015610a4957600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103c3565b348015610a7c57600080fd5b506104c3610a8b366004615253565b60066020526000908152604090205460ff1681565b60008054600160801b900460ff166002811115610abf57610abf615157565b14610add5760405163067fe19560e41b815260040160405180910390fd5b600060028381548110610af257610af26153ca565b906000526020600020906005020190506000610b0d84612bc2565b905067ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169082161015610b76576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615610bbf576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600560205260409020805480158015610bdc57508515155b15610c5d57835464010000000090046001600160a01b031660008115610c025781610c11565b60018601546001600160a01b03165b9050610c1d8187613970565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046001600160801b031693810193909352600101546001600160a01b03166060830152610ce1576001600160801b036040820152600181526000869003610ce1578195505b600086826020015163ffffffff16610cf99190615428565b90506000838211610d0a5781610d0c565b835b602084015190915063ffffffff165b81811015610e2c576000868281548110610d3757610d376153ca565b6000918252602080832090910154808352600690915260409091205490915060ff16610d8f576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028281548110610da457610da46153ca565b60009182526020909120600590910201805490915064010000000090046001600160a01b0316158015610deb5750600481015460408701516001600160801b039182169116115b15610e175760018101546001600160a01b0316606087015260048101546001600160801b031660408701525b50508080610e2490615440565b915050610d1b565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006001600160801b03909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039093169290921790915584900361105957606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905589158015610f9657506000547201000000000000000000000000000000000000900460ff165b15610ff1576001546001600160a01b0316610fb1818a613970565b88546001600160a01b03909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff909116178855611057565b61101e6001600160a01b038216156110095781611018565b60018901546001600160a01b03165b89613970565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff166401000000006001600160a01b038316021788555b505b505050505050505050565b60008054600160801b900460ff16600281111561108357611083615157565b146110a15760405163067fe19560e41b815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff16156110f4576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61110d3660011981013560f01c90036014013590565b90565b61111e611119856154e3565b613a4e565b14611155576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061116460808501856155a7565b810190611171919061560c565b5092505050808383604051611187929190615649565b6040518091039020146111c6576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061120f61120a85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613a9492505050565b613ac1565b9050600061123682600881518110611229576112296153ca565b6020026020010151613cc0565b9050602081511115611274576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c3660011981013560f01c90036054013581036112cb576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112da60608801356001615428565b8110806112f757506112f460408801356060890135615428565b81115b1561132e576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff167201000000000000000000000000000000000000179055505050565b600080600054600160801b900460ff1660028111156113bf576113bf615157565b146113dd5760405163067fe19560e41b815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff16611441576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b03166002600081548110611460576114606153ca565b600091825260209091206005909102015464010000000090046001600160a01b03161461148e576001611491565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff90911617600160801b83600281111561153557611535615157565b02179055600281111561154a5761154a615157565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a2600181600281111561158757611587615157565b0361110a57604080518082018252601581527f4661756c7450726f6f664c6f636b696e67506f6f6c0000000000000000000000602082015290517fbf40fac10000000000000000000000000000000000000000000000000000000081526000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163bf40fac19161162491600401615240565b602060405180830381865afa158015611641573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116659190615659565b90506001600160a01b03811615611790576000600260008154811061168c5761168c6153ca565b60009182526020909120600590910201546040517fc96be4cb0000000000000000000000000000000000000000000000000000000081526401000000009091046001600160a01b0390811660048301819052925083169063c96be4cb90602401600060405180830381600087803b15801561170657600080fd5b505af1925050508015611717575060015b61178e573d808015611745576040519150601f19603f3d011682016040523d82523d6000602084013e61174a565b606091505b50816001600160a01b03167f17ea47b379a2daf87a43d9fe6e50400125dff97424a6a7686eca528970fffc0f826040516117849190615240565b60405180910390a2505b505b604080518082018252601481527f5374617465436f6d6d69746d656e74436861696e000000000000000000000000602082015290517fbf40fac10000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163bf40fac1916118269190600401615240565b602060405180830381865afa158015611843573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118679190615659565b6001600160a01b0316637fe9b70f6118a1600260008154811061188c5761188c6153ca565b90600052602060002090600502016003015490565b6040518263ffffffff1660e01b81526004016118bf91815260200190565b600060405180830381600087803b1580156118d957600080fd5b505af11580156118ed573d6000803e3d6000fd5b505050505090565b6005602052816000526040600020818154811061191157600080fd5b90600052602060002001600091509150505481565b905090565b6119388383836001611bde565b505050565b604080518082018252601481527f5374617465436f6d6d69746d656e74436861696e000000000000000000000000602082015290517fbf40fac10000000000000000000000000000000000000000000000000000000081526000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163bf40fac1916119d591600401615240565b602060405180830381865afa1580156119f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119269190615659565b60008181526007602090815260408083206005909252822080548254611a4790610100900463ffffffff1682615676565b95945050505050565b606061192660546020613d47565b6001600160a01b038116600090815260036020526040812080549082905590819003611ab6576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a30000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063f3fef3a390604401600060405180830381600087803b158015611b3957600080fd5b505af1158015611b4d573d6000803e3d6000fd5b505050506000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611b9e576040519150601f19603f3d011682016040523d82523d6000602084013e611ba3565b606091505b5050905080611938576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054600160801b900460ff166002811115611bfd57611bfd615157565b14611c1b5760405163067fe19560e41b815260040160405180910390fd5b600060028481548110611c3057611c306153ca565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff811684526001600160a01b0364010000000090910481169484019490945260018101549093169082015260028201546001600160801b03908116606083015260038301546080830181905260049093015480821660a0840152600160801b90041660c082015291508514611cf4576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156001600160801b0383161760011b90506000611d89826001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580611dc45750611dc17f00000000000000000000000000000000000000000000000000000000000000006002615428565b81145b8015611dce575084155b15611e05576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015611e2b575086155b15611e62576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115611ebc576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ee77f00000000000000000000000000000000000000000000000000000000000000006001615428565b8103611ef957611ef986888588613d7b565b34611f0383612d5c565b14611f3a576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611f4588612bc2565b905067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811690821603611fad576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611fda60017f0000000000000000000000000000000000000000000000000000000000000000615676565b83036120fe577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561203e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120629190615659565b6001600160a01b031663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa15801561209f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c3919061568d565b6120f7907f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166156a6565b9050612191565b61212960017f0000000000000000000000000000000000000000000000000000000000000000615676565b8303612164576120f77f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1660026156d2565b507f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff165b6121c5817f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16615702565b67ffffffffffffffff166121e08367ffffffffffffffff1690565b67ffffffffffffffff16111561222757612224817f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16615702565b91505b6000604083901b421760008a8152608087901b6001600160801b038d1617602052604081209192509060008181526004602052604090205490915060ff161561229c576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808d63ffffffff16815260200160006001600160a01b03168152602001336001600160a01b03168152602001346001600160801b031681526020018c8152602001886001600160801b03168152602001846001600160801b0316815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160020160006101000a8154816001600160801b0302191690836001600160801b031602179055506080820151816003015560a08201518160040160006101000a8154816001600160801b0302191690836001600160801b0316021790555060c08201518160040160106101000a8154816001600160801b0302191690836001600160801b031602179055505050600560008c815260200190815260200160002060016002805490506124939190615676565b81546001810183556000928352602083200155604080517fd0e30db000000000000000000000000000000000000000000000000000000000815290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263d0e30db09234926004808301939282900301818588803b15801561251e57600080fd5b505af1158015612532573d6000803e3d6000fd5b50506040513393508d92508e91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a4505050505050505050505050565b6119388383836000611bde565b60005471010000000000000000000000000000000000900460ff16156125d3576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082018252601481527f5374617465436f6d6d69746d656e74436861696e000000000000000000000000602082015290517fbf40fac10000000000000000000000000000000000000000000000000000000081526000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163bf40fac19161266b91600401615240565b602060405180830381865afa158015612688573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ac9190615659565b6040517fa0832c030000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015290915060009081906001600160a01b0384169063a0832c03906024016040805180830381865afa158015612730573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612754919061572b565b90925090508180612791576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5fc993dd000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03851690635fc993dd90602401602060405180830381865afa1580156127ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612813919061574f565b1561284a576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528181526020018290526008819055600982905536607a1461287d57639824bdab6000526004601cfd5b813660011981013560f01c900360540135116128db576040517ff40239db0000000000000000000000000000000000000000000000000000000081523660011981013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff808252600060208301818152600119369081013560f01c90038035606090811c868801908152346001600160801b0381811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace8101805499516001600160a01b03908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad18501555195518216600160801b0295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f00000000000000000000000000000000000000000000000000000000000000009092169363d0e30db093926004828101939282900301818588803b158015612b6f57600080fd5b505af1158015612b83573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff1617905550505050505050565b600080600054600160801b900460ff166002811115612be357612be3615157565b14612c015760405163067fe19560e41b815260040160405180910390fd5b600060028381548110612c1657612c166153ca565b600091825260208220600590910201805490925063ffffffff90811614612c7c57815460028054909163ffffffff16908110612c5457612c546153ca565b906000526020600020906005020160040160109054906101000a90046001600160801b031690505b6004820154600090612ca790600160801b900467ffffffffffffffff165b67ffffffffffffffff1690565b612cbb9067ffffffffffffffff1642615676565b612cd1612c9a846001600160801b031660401c90565b67ffffffffffffffff16612ce59190615428565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff168167ffffffffffffffff1611612d325780611a47565b7f000000000000000000000000000000000000000000000000000000000000000095945050505050565b60006002600081548110612d7257612d726153ca565b60009182526020909120600160059092020101546001600160a01b03163303612d9d57506000919050565b6000612e19836001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000000811115612e78576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000612e93838361579b565b9050670de0b6b3a76400006000612eca827f00000000000000000000000000000000000000000000000000000000000000006157af565b90506000612ee8612ee3670de0b6b3a7640000866157af565b613f01565b90506000612ef68484614153565b90506000612f0483836141a2565b90506000612f11826141d0565b90506000612f3082612f2b670de0b6b3a76400008f6157af565b6143b8565b90506000612f3e8b836141a2565b9050612f4a818d6157af565b9f9e505050505050505050505050505050565b60028181548110612f6d57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff841695506401000000009093046001600160a01b03908116949216926001600160801b03918216929180821691600160801b90041687565b60008054600160801b900460ff166002811115612ff057612ff0615157565b1461300e5760405163067fe19560e41b815260040160405180910390fd5b600060028781548110613023576130236153ca565b6000918252602082206005919091020160048101549092506001600160801b0316908715821760011b90506130797f00000000000000000000000000000000000000000000000000000000000000006001615428565b6130f3826001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161461312d576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808915613209576131807f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000615676565b6001901b613196846001600160801b03166143e9565b6001600160801b03166131a991906157ce565b156131dd576131d46131c560016001600160801b0387166157e2565b865463ffffffff16600061446f565b600301546131ff565b7f00000000000000000000000000000000000000000000000000000000000000005b915084905061322a565b600385015491506132276131c56001600160801b0386166001615802565b90505b600882901b60088a8a604051613241929190615649565b6040518091039020901b14613282576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061328d8c614538565b9050600061329c836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e14ced3290613309908f908f908f908f908a9060040161584f565b6020604051808303816000875af1158015613328573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061334c919061568d565b6004850154911491506000906002906133d5906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61344f896001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6134599190615889565b61346391906158ac565b60ff1615905081151581036134a4576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b875464010000000090046001600160a01b0316156134ee576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054600160801b900460ff16600281111561354c5761354c615157565b1461356a5760405163067fe19560e41b815260040160405180910390fd5b60008060008061357986614567565b9350935093509350600061358f858585856148c0565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136159190615659565b9050600189036136e2576001600160a01b0381166352f0f3ad8a846136463660011981013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af11580156136b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136dc919061568d565b50611059565b60028903613701576001600160a01b0381166352f0f3ad8a8489613646565b60038903613720576001600160a01b0381166352f0f3ad8a8487613646565b6004890361385557600061375d6001600160801b0385167f000000000000000000000000000000000000000000000000000000000000000061495f565b60095461376a9190615428565b613775906001615428565b90503660011981013560f01c90036054013581106137a2573660011981013560f01c9003605401356137a4565b805b90506001600160a01b0382166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561382a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061384e919061568d565b5050611059565b600589036138e1576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000000060c01b604482015260086064820152608481018890526001600160a01b038216906352f0f3ad9060a401613699565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000003660011981013560f01c900360140135606061394e611a50565b9050909192565b6000818310156139655781613967565b825b90505b92915050565b60028101546001600160a01b038316600090815260036020526040812080546001600160801b03909316928392906139a9908490615428565b90915550506040517f7eee288d0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690637eee288d90604401600060405180830381600087803b158015613a3157600080fd5b505af1158015613a45573d6000803e3d6000fd5b50505050505050565b60008160200151826040015183606001518460800151604051602001613a7794939291906158ce565b604051602081830303815290604052805190602001209050919050565b60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b6060600080613acf846149f4565b91935090915060019050816001811115613aeb57613aeb615157565b14613b385760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064016128d2565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081613b515790505090506000835b8651811015613cb55760208210613bfd5760405162461bcd60e51b815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e0000000000000000000000000000000000000000000060648201526084016128d2565b600080613c3a6040518060400160405280858c60000151613c1e9190615676565b8152602001858c60200151613c339190615428565b90526149f4565b509150915060405180604001604052808383613c569190615428565b8152602001848b60200151613c6b9190615428565b815250858581518110613c8057613c806153ca565b6020908102919091010152613c96600185615428565b9350613ca28183615428565b613cac9084615428565b92505050613b7e565b508152949350505050565b60606000806000613cd0856149f4565b919450925090506000816001811115613ceb57613ceb615157565b14613d385760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e000000000000000060448201526064016128d2565b611a4785602001518484614d45565b6040518181523660011981013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b6000613d916001600160801b0384166001615802565b90506000613da18286600161446f565b9050600086901a8380613e6b5750613dda60027f00000000000000000000000000000000000000000000000000000000000000006157ce565b6004830154600290613e5c906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b613e6691906158ac565b60ff16145b15613ec35760ff811660011480613e85575060ff81166002145b613ebe576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016128d2565b613a45565b60ff811615613a45576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016128d2565b6001600160801b03811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213613f5757631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261419057637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6000816000190483118202156141c05763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d782136141fe57919050565b680755bf798b4a1bf1e5821261421c5763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000613967670de0b6b3a7640000836143d086613f01565b6143da91906158f3565b6143e491906159af565b6141d0565b60008061445d837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826144af576144aa6001600160801b0386167f0000000000000000000000000000000000000000000000000000000000000000614e20565b6144c1565b6144c1856001600160801b0316614f5f565b9050600284815481106144d6576144d66153ca565b906000526020600020906005020191505b60048201546001600160801b0382811691161461453057815460028054909163ffffffff1690811061451b5761451b6153ca565b906000526020600020906005020191506144e7565b509392505050565b600080600080600061454986614567565b935093509350935061455d848484846148c0565b9695505050505050565b6000806000806000859050600060028281548110614587576145876153ca565b600091825260209091206004600590920201908101549091507f00000000000000000000000000000000000000000000000000000000000000009061463c906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614676576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f00000000000000000000000000000000000000000000000000000000000000009061471b906001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16925082111561479057825463ffffffff1661475a7f00000000000000000000000000000000000000000000000000000000000000006001615428565b8303614764578391505b60028181548110614777576147776153ca565b906000526020600020906005020193508094505061467a565b600481810154908401546001600160801b0391821691166000816001600160801b03166147d56147c9856001600160801b031660011c90565b6001600160801b031690565b6001600160801b0316149050801561486e5760006147fb836001600160801b03166143e9565b6001600160801b0316111561484b57600061482b61482360016001600160801b0386166157e2565b89600161446f565b6003810154600490910154909c506001600160801b03169a506148519050565b6008549a505b600386015460048701549099506001600160801b031697506148b2565b60006148876148236001600160801b0385166001615802565b6003808901546004808b015492840154930154909e506001600160801b039182169d50919b50169850505b505050505050509193509193565b60006001600160801b0384161561491b5760408051602081018790526001600160801b038087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611a47565b82826040516020016149409291909182526001600160801b0316602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b6000806149d3847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b600080600080846000015111614a4c5760405162461bcd60e51b815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e000000000000000060448201526064016128d2565b6020840151805160001a607f8111614a71576000600160009450945094505050614d3e565b60b78111614aed576000614a86608083615676565b905080876000015111614adb5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e0000000000000060448201526064016128d2565b60019550935060009250614d3e915050565b60bf8111614bdc576000614b0260b783615676565b905080876000015111614b575760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e0060448201526064016128d2565b600183015160208290036101000a9004614b718183615428565b885111614bc05760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e000000000000000060448201526064016128d2565b614bcb826001615428565b9650945060009350614d3e92505050565b60f78111614c57576000614bf160c083615676565b905080876000015111614c465760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e00000000000000000060448201526064016128d2565b600195509350849250614d3e915050565b6000614c6460f783615676565b905080876000015111614cb95760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e00000060448201526064016128d2565b600183015160208290036101000a9004614cd38183615428565b885111614d225760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e0000000000000000000060448201526064016128d2565b614d2d826001615428565b9650945060019350614d3e92505050565b9193909250565b606060008267ffffffffffffffff811115614d6257614d6261545a565b6040519080825280601f01601f191660200182016040528015614d8c576020820181803683370190505b5090508051600003614d9f579050614e19565b6000614dab8587615428565b90506020820160005b614dbf60208761579b565b811015614df65782518252614dd5602084615428565b9250614de2602083615428565b915080614dee81615440565b915050614db4565b5080519151601f86166020036101000a6000190192831692191691909117905290505b9392505050565b600081614e9d846001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614eb35763b34b5c226000526004601cfd5b614ebc83614f5f565b905081614f39826001600160801b03167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161161396a57613967614f4f836001615428565b6001600160801b03831690614feb565b60008119600183011681614fda827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b60008061505f847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f6307c4acdd60e01b67ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b6000806040838503121561508e57600080fd5b50508035926020909101359150565b60008083601f8401126150af57600080fd5b50813567ffffffffffffffff8111156150c757600080fd5b6020830191508360208285010111156150df57600080fd5b9250929050565b6000806000604084860312156150fb57600080fd5b833567ffffffffffffffff8082111561511357600080fd5b9085019060a0828803121561512757600080fd5b9093506020850135908082111561513d57600080fd5b5061514a8682870161509d565b9497909650939450505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600383106151c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000606084860312156151dc57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b81811015615219576020818501810151868301820152016151fd565b8181111561522b576000602083870101525b50601f01601f19169290920160200192915050565b60208152600061396760208301846151f3565b60006020828403121561526557600080fd5b5035919050565b6001600160a01b038116811461528157600080fd5b50565b60006020828403121561529657600080fd5b8135614e198161526c565b801515811461528157600080fd5b600080600080608085870312156152c557600080fd5b84359350602085013592506040850135915060608501356152e5816152a1565b939692955090935050565b60006020828403121561530257600080fd5b81356001600160801b0381168114614e1957600080fd5b6000806000806000806080878903121561533257600080fd5b863595506020870135615344816152a1565b9450604087013567ffffffffffffffff8082111561536157600080fd5b61536d8a838b0161509d565b9096509450606089013591508082111561538657600080fd5b5061539389828a0161509d565b979a9699509497509295939492505050565b63ffffffff84168152826020820152606060408201526000611a4760608301846151f3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561543b5761543b6153f9565b500190565b60006000198203615453576154536153f9565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156154ac576154ac61545a565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156154db576154db61545a565b604052919050565b600060a082360312156154f557600080fd5b6154fd615489565b82358152602080840135818301526040840135604083015260608401356060830152608084013567ffffffffffffffff8082111561553a57600080fd5b9085019036601f83011261554d57600080fd5b81358181111561555f5761555f61545a565b61557184601f19601f840116016154b2565b9150808252368482850101111561558757600080fd5b808484018584013760009082019093019290925250608082015292915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126155dc57600080fd5b83018035915067ffffffffffffffff8211156155f757600080fd5b6020019150368190038213156150df57600080fd5b6000806000806080858703121561562257600080fd5b8435935060208501356156348161526c565b93969395505050506040820135916060013590565b8183823760009101908152919050565b60006020828403121561566b57600080fd5b8151614e198161526c565b600082821015615688576156886153f9565b500390565b60006020828403121561569f57600080fd5b5051919050565b600067ffffffffffffffff8083168185168083038211156156c9576156c96153f9565b01949350505050565b600067ffffffffffffffff808316818516818304811182151516156156f9576156f96153f9565b02949350505050565b600067ffffffffffffffff83811690831681811015615723576157236153f9565b039392505050565b6000806040838503121561573e57600080fd5b505080516020909101519092909150565b60006020828403121561576157600080fd5b8151614e19816152a1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826157aa576157aa61576c565b500490565b60008160001904831182151516156157c9576157c96153f9565b500290565b6000826157dd576157dd61576c565b500690565b60006001600160801b0383811690831681811015615723576157236153f9565b60006001600160801b038083168185168083038211156156c9576156c96153f9565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b606081526000615863606083018789615824565b8281036020840152615876818688615824565b9150508260408301529695505050505050565b600060ff821660ff8416808210156158a3576158a36153f9565b90039392505050565b600060ff8316806158bf576158bf61576c565b8060ff84160691505092915050565b84815283602082015282604082015260806060820152600061455d60808301846151f3565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615934576159346153f9565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561596f5761596f6153f9565b6000871292508782058712848416161561598b5761598b6153f9565b878505871281841616156159a1576159a16153f9565b505050929093029392505050565b6000826159be576159be61576c565b60001983147f8000000000000000000000000000000000000000000000000000000000000000831416156159f4576159f46153f9565b50059056fea264697066735822122021f9024ff4224416d51d531e0ff1afc9840295f133f7f1407731eeb8b4d2198864736f6c634300080f0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
