0x608060405234801561001057600080fd5b50612080806100206000396000f3fe6080604052600436106101c65760003560e01c80638456cb59116100f7578063b5b738ee11610095578063e9bf95a211610064578063e9bf95a214610755578063f2fde38b14610775578063f3f4370314610795578063fd765598146107c257610227565b8063b5b738ee1461066f578063c465e49f1461068f578063da35a26f146106a4578063e6ce43af146106c457610227565b8063a0a8e460116100d1578063a0a8e4601461058f578063aa3bf60e146105b3578063aed2968b146105d3578063b42aebf3146105ed57610227565b80638456cb591461051d5780638da5cb5b146105325780639b600c811461056f57610227565b80633ccfd60b116101645780635c975abb1161013e5780635c975abb146104975780635cad65a1146104c8578063715018a6146104e857806377c18ede146104fd57610227565b80633ccfd60b1461044d5780633f4ba83a146104625780635b4e128c1461047757610227565b80631eaa8bae116101a05780631eaa8bae146103b05780632d5996d2146103ed57806336bb69031461040d57806339151ff21461042d57610227565b80630663d7651461035057806310b87688146103705780631ab247301461039057610227565b3661022757600080516020611feb8339815191525460ff16156102255760405162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b60448201526064015b60405180910390fd5b005b34801561023357600080fd5b50600080516020611feb8339815191525460ff16156102895760405162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604482015260640161021c565b6020357f691a5de40aab4e73838a45498cc0fcbeb7fffb787294f17496691794529b29a68101610344576102be602036611cf3565b1561030b5760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964457468736372697074696f6e4c656e67746800000000000000604482015260640161021c565b6000356040356060358015610330578061032533856107d5565b610225848483610833565b61033a33846107d5565b6102258383610947565b61022533600036610a37565b34801561035c57600080fd5b5061022561036b366004611d53565b610b7b565b34801561037c57600080fd5b5061022561038b366004611dbf565b610c34565b34801561039c57600080fd5b506102256103ab366004611df4565b610833565b3480156103bc57600080fd5b506001546103d0906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103f957600080fd5b50610225610408366004611e29565b610cff565b34801561041957600080fd5b50610225610428366004611e6b565b610d3d565b34801561043957600080fd5b50610225610448366004611dbf565b610df7565b34801561045957600080fd5b50610225610ec4565b34801561046e57600080fd5b50610225610feb565b34801561048357600080fd5b50610225610492366004611dbf565b610ffb565b3480156104a357600080fd5b50600080516020611feb8339815191525460ff165b60405190151581526020016103e4565b3480156104d457600080fd5b506104b86104e3366004611e8d565b6110b5565b3480156104f457600080fd5b506102256110cb565b34801561050957600080fd5b50610225610518366004611dbf565b6110dd565b34801561052957600080fd5b5061022561113c565b34801561053e57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166103d0565b34801561057b57600080fd5b5061022561058a366004611eb7565b61114c565b34801561059b57600080fd5b506105a560005481565b6040519081526020016103e4565b3480156105bf57600080fd5b506104b86105ce366004611e8d565b611175565b3480156105df57600080fd5b506005546104b89060ff1681565b3480156105f957600080fd5b5061063e610608366004611dbf565b6003602081905260009182526040909120805460018201546002830154929093015460ff90911692916001600160a01b03169084565b6040516103e49493929190931515845260208401929092526001600160a01b03166040830152606082015260800190565b34801561067b57600080fd5b5061022561068a366004611d53565b6111ab565b34801561069b57600080fd5b506105a5600581565b3480156106b057600080fd5b506102256106bf366004611ed9565b611317565b3480156106d057600080fd5b5061071f6106df366004611dbf565b60026020819052600091825260409091208054600182015492820154600383015460049093015460ff90921693926001600160a01b039182169290911685565b60408051951515865260208601949094526001600160a01b0392831693850193909352606084015216608082015260a0016103e4565b34801561076157600080fd5b506105a5610770366004611e8d565b611446565b34801561078157600080fd5b50610225610790366004611e6b565b6114c8565b3480156107a157600080fd5b506105a56107b0366004611e6b565b60046020526000908152604090205481565b6102256107d0366004611d53565b611506565b6107df82826110b5565b156107fd576040516392aa23a160e01b815260040160405180910390fd5b43600080516020611fcb8339815191526001600160a01b0390931660009081526020938452604080822093825292909352912055565b61083b61161f565b6108453384611175565b15610863576040516362ef5a1960e01b815260040160405180910390fd5b6040805160a0810182526001808252602080830187815233848601908152606085018881526001600160a01b038881166080880181815260008d81526002808952908b902099518a5460ff1916901515178a55955197890197909755925193870180546001600160a01b0319908116958316959095179055905160038701559351600490950180549092169490931693909317909255915184815285917fd4bf3f6990ae2af62f6edc18c8983ebabc98a24346362b70f8e8b2bf1a25ad5a910160405180910390a3610942600160008051602061200b83398151915255565b505050565b6109513383611175565b1561096f576040516362ef5a1960e01b815260040160405180910390fd5b6040805160a0810182526001808252602080830186815233848601908152606085018781526000608087018181528a825260028087528983209851895460ff1916901515178955945196880196909655915192860180546001600160a01b03199081166001600160a01b03958616179091559051600387015593516004909501805490941694909116939093179091559151838152909184917fd4bf3f6990ae2af62f6edc18c8983ebabc98a24346362b70f8e8b2bf1a25ad5a910160405180910390a35050565b610a42602082611cf3565b15610a8f5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c696420657468736372697074696f6e206c656e6774680000000000604482015260640161021c565b60005b610a9d602083611f1b565b811015610b75576000610af484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610aed925086915060209050611f2f565b602061166b565b806020019051810190610b079190611f46565b9050610b1385826110b5565b15610b31576040516392aa23a160e01b815260040160405180910390fd5b6001600160a01b0385166000908152600080516020611fcb833981519152602090815260408083209383529290522043905580610b6d81611f5f565b915050610a92565b50505050565b610b8361161f565b828114610bc55760405162461bcd60e51b815260206004820152601060248201526f098cadccee8d0e640dad2e6dac2e8c6d60831b604482015260640161021c565b60005b83811015610c1c57610c0a858583818110610be557610be5611f78565b90506020020135848484818110610bfe57610bfe611f78565b90506020020135610947565b80610c1481611f5f565b915050610bc8565b50610b75600160008051602061200b83398151915255565b610c3e3382611175565b15610c5c576040516362ef5a1960e01b815260040160405180910390fd5b610c658161172a565b600081815260026020818152604092839020835160a081018552815460ff161580158252600183015493820193909352928101546001600160a01b03908116948401949094526003810154606084015260040154909216608082015290610cfb57610ccf82611735565b60405182907f3dd90fb2a4e0b810ed93d5c15ba32a80ed3d21a909660964869027146a4e88cb90600090a25b5050565b60005b8181101561094257610d2b838383818110610d1f57610d1f611f78565b90506020020135610c34565b80610d3581611f5f565b915050610d02565b610d4561177c565b6001600160a01b038116610da55760405162461bcd60e51b815260206004820152602160248201527f4e657720706f696e747320616464726573732063616e6e6f74206265207a65726044820152606f60f81b606482015260840161021c565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f60dadd5759b5919f12b1b57863ecbcc945efa3f914fb757da7126673cd7f453790600090a35050565b60008051602061202b833981519152805460039190600160401b900460ff1680610e2f5750805467ffffffffffffffff808416911610155b15610e4d5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff191667ffffffffffffffff8316908117600160401b17825560008490556005805460ff19169055815460ff60401b191682556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906020015b60405180910390a1505050565b610ecc61161f565b336000908152600460205260408120549003610f235760405162461bcd60e51b81526020600482015260166024820152754e6f2070656e64696e67207769746864726177616c7360501b604482015260640161021c565b3360008181526004602052604080822054905190929083908381818185875af1925050503d8060008114610f73576040519150601f19603f3d011682016040523d82523d6000602084013e610f78565b606091505b5050905080610fc05760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b604482015260640161021c565b505033600090815260046020526040812055610fe9600160008051602061200b83398151915255565b565b610ff361177c565b610fe96117d7565b60008051602061202b833981519152805460029190600160401b900460ff16806110335750805467ffffffffffffffff808416911610155b156110515760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff191667ffffffffffffffff8316908117600160401b1782556000849055815460ff60401b191682556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602001610eb7565b60006110c18383611175565b1590505b92915050565b6110d361177c565b610fe96000611837565b6110e73382611175565b15611105576040516362ef5a1960e01b815260040160405180910390fd5b61110e81611735565b60405181907f3dd90fb2a4e0b810ed93d5c15ba32a80ed3d21a909660964869027146a4e88cb90600090a250565b61114461177c565b610fe96118a8565b61115461161f565b61115e8282610947565b610cfb600160008051602061200b83398151915255565b6001600160a01b03919091166000908152600080516020611fcb8339815191526020908152604080832093835292905220541590565b6111b361177c565b60055460ff16156112065760405162461bcd60e51b815260206004820181905260248201527f436f6e74726163742068617320616c7265616479206265656e20736565646564604482015260640161021c565b82811461124e5760405162461bcd60e51b8152602060048201526016602482015275082e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b604482015260640161021c565b60005b838110156112c95782828281811061126b5761126b611f78565b905060200201356004600087878581811061128857611288611f78565b905060200201602081019061129d9190611e6b565b6001600160a01b03168152602081019190915260400160002055806112c181611f5f565b915050611251565b506005805460ff191660011790556040517f9e3a1f81f0507f46254a61b1a1d28ce7e7a2c1c1ddbff96ac6940c70ec8ee03c906113099085815260200190565b60405180910390a150505050565b60008051602061202b8339815191528054600160401b810460ff16159067ffffffffffffffff1660008115801561134b5750825b905060008267ffffffffffffffff1660011480156113685750303b155b905081158015611376575080155b156113945760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156113be57845460ff60401b1916600160401b1785555b6113c7336118f1565b6113cf611902565b6113d7611912565b6000879055600180546001600160a01b0319166001600160a01b038816179055831561143d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6001600160a01b0382166000908152600080516020611fcb83398151915260209081526040808320848452909152812054808203611497576040516362ef5a1960e01b815260040160405180910390fd5b60006114a38243611f8e565b9050600581106114b45760006114bf565b6114bf816005611f8e565b95945050505050565b6114d061177c565b6001600160a01b0381166114fa57604051631e4fbdf760e01b81526000600482015260240161021c565b61150381611837565b50565b61150e611922565b61151661161f565b8281146115585760405162461bcd60e51b815260206004820152601060248201526f098cadccee8d0e640dad2e6dac2e8c6d60831b604482015260640161021c565b6000805b848110156115d65761159e86868381811061157957611579611f78565b9050602002013585858481811061159257611592611f78565b90506020020135611953565b8383828181106115b0576115b0611f78565b90506020020135826115c29190611fa1565b9150806115ce81611f5f565b91505061155c565b50803414610c1c5760405162461bcd60e51b8152602060048201526016602482015275125b98dbdc9c9958dd08115d1a195c88185b5bdd5b9d60521b604482015260640161021c565b60008051602061200b83398151915280546001190161165157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b600160008051602061200b83398151915255565b606060008267ffffffffffffffff81111561168857611688611fb4565b6040519080825280601f01601f1916602001820160405280156116b2576020820181803683370190505b50905060005b8381101561172157856116cb8683611fa1565b815181106116db576116db611f78565b602001015160f81c60f81b8282815181106116f8576116f8611f78565b60200101906001600160f81b031916908160001a9053508061171981611f5f565b9150506116b8565b50949350505050565b611503333383611b07565b60009081526002602081905260408220805460ff191681556001810183905590810180546001600160a01b0319908116909155600382019290925560040180549091169055565b336117ae7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610fe95760405163118cdaa760e01b815233600482015260240161021c565b6117df611b89565b600080516020611feb833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6118b0611922565b600080516020611feb833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611819565b6118f9611bb9565b61150381611bf0565b61190a611bb9565b610fe9611bf8565b61191a611bb9565b610fe9611c19565b600080516020611feb8339815191525460ff1615610fe95760405163d93c066560e01b815260040160405180910390fd5b600082815260026020818152604092839020835160a081018552815460ff16158015808352600184015494830194909452938201546001600160a01b0390811695820195909552600382015460608201526004909101549093166080840152906119de575060808101516001600160a01b031615806119de575060808101516001600160a01b031633145b80156119ed5750806060015182145b8015611a06575060408101516001600160a01b03163314155b8015611a125750813410155b611a5e5760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642073616c6520636f6e646974696f6e73000000000000000000604482015260640161021c565b81611a6884611735565b6040808301516001600160a01b03811660009081526004602052918220805491928492611a96908490611fa1565b90915550611aa79050816064611c21565b611ab2813387611b07565b336001600160a01b0316816001600160a01b0316867f3dad1977abafe98eee215647e0f757b6d2681364f0def63ad780cd3ac5547dc087604051611af891815260200190565b60405180910390a45050505050565b611b12838383611c85565b80826001600160a01b0316846001600160a01b03167ff1d95ed4d1680e6f665104f19c296ae52c1f64cd8114e84d55dc6349dbdafea360405160405180910390a46001600160a01b0383166000908152600080516020611fcb83398151915260209081526040808320848452909152812055505050565b600080516020611feb8339815191525460ff16610fe957604051638dfc202b60e01b815260040160405180910390fd5b60008051602061202b83398151915254600160401b900460ff16610fe957604051631afcd79f60e31b815260040160405180910390fd5b6114d0611bb9565b611c00611bb9565b600080516020611feb833981519152805460ff19169055565b611657611bb9565b60015460405163507cd30f60e01b81526001600160a01b0384811660048301526024820184905290911690819063507cd30f90604401600060405180830381600087803b158015611c7157600080fd5b505af115801561143d573d6000803e3d6000fd5b611c8f8382611175565b15611cad576040516362ef5a1960e01b815260040160405180910390fd5b6000611cb98483611446565b90508015610b7557604051633247baf960e21b81526004810182905260240161021c565b634e487b7160e01b600052601260045260246000fd5b600082611d0257611d02611cdd565b500690565b60008083601f840112611d1957600080fd5b50813567ffffffffffffffff811115611d3157600080fd5b6020830191508360208260051b8501011115611d4c57600080fd5b9250929050565b60008060008060408587031215611d6957600080fd5b843567ffffffffffffffff80821115611d8157600080fd5b611d8d88838901611d07565b90965094506020870135915080821115611da657600080fd5b50611db387828801611d07565b95989497509550505050565b600060208284031215611dd157600080fd5b5035919050565b80356001600160a01b0381168114611def57600080fd5b919050565b600080600060608486031215611e0957600080fd5b8335925060208401359150611e2060408501611dd8565b90509250925092565b60008060208385031215611e3c57600080fd5b823567ffffffffffffffff811115611e5357600080fd5b611e5f85828601611d07565b90969095509350505050565b600060208284031215611e7d57600080fd5b611e8682611dd8565b9392505050565b60008060408385031215611ea057600080fd5b611ea983611dd8565b946020939093013593505050565b60008060408385031215611eca57600080fd5b50508035926020909101359150565b60008060408385031215611eec57600080fd5b82359150611efc60208401611dd8565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b600082611f2a57611f2a611cdd565b500490565b80820281158282048414176110c5576110c5611f05565b600060208284031215611f5857600080fd5b5051919050565b600060018201611f7157611f71611f05565b5060010190565b634e487b7160e01b600052603260045260246000fd5b818103818111156110c5576110c5611f05565b808201808211156110c5576110c5611f05565b634e487b7160e01b600052604160045260246000fdfea282d38759ca2a57f8989aea0c5822bcfbf65ad49415379bdbc35dbb78efd8dacd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a264697066735822122046c3c766090c6cdb97569aff5cbb07ca26d0a851a84e3f6b697a49025224662564736f6c63430008140033