0x608060405234801561001057600080fd5b50612b55806100206000396000f3fe6080604052600436106102875760003560e01c80637f2e3b1e1161015a578063b49b662e116100c1578063e32438281161007a578063e324382814610a48578063e41ce08514610a68578063eadd2aa114610a95578063ed30386c14610aa8578063f3fa2b1d14610ac8578063fecd039e14610ade57600080fd5b8063b49b662e1461099b578063b952c239146109c8578063c2334ba1146109de578063c23daeed146109fe578063d79ac01814610a1c578063db14f9cf14610a3257600080fd5b80639d76ea58116101135780639d76ea58146108c0578063a30673a9146108e0578063a5b36a3614610900578063a83019fa14610938578063a8c2fe691461094e578063b38feb6d1461097b57600080fd5b80637f2e3b1e14610763578063806cd9ac14610790578063813b142f146107a6578063923108d91461083f578063963ea5501461087357806399591e6e146108a057600080fd5b8063523294c3116101fe5780635ec092b0116101b75780635ec092b0146105e157806365f92bac146105f75780636603791d1461061757806366044bb714610644578063723fe15d1461066257806379e219f11461070f57600080fd5b8063523294c314610421578063579504f51461044e57806357fcf38c146104a55780635b2b4504146105765780635c025467146105965780635d7e79e8146105c357600080fd5b80631ad6a176116102505780631ad6a176146103405780631c8a1e2014610378578063271db008146103985780632e97f436146103c55780633398e9a6146103f55780633f87de151461040b57600080fd5b80629dc3bb1461028c57806306deca99146102b557806309b65e66146102ca578063103afc6d146103145780631a6865021461032a575b600080fd5b34801561029857600080fd5b506102a260da5481565b6040519081526020015b60405180910390f35b6102c86102c33660046124a3565b610b0b565b005b3480156102d657600080fd5b506103046102e53660046124e7565b6001600160e01b03191660009081526086602052604090205460ff1690565b60405190151581526020016102ac565b34801561032057600080fd5b506102a260ea5481565b34801561033657600080fd5b506102a260d95481565b34801561034c57600080fd5b5060f054610360906001600160a01b031681565b6040516001600160a01b0390911681526020016102ac565b34801561038457600080fd5b5060c654610360906001600160a01b031681565b3480156103a457600080fd5b506102a26103b3366004612511565b60ed6020526000908152604090205481565b3480156103d157600080fd5b506103046103e0366004612511565b60cb6020526000908152604090205460ff1681565b34801561040157600080fd5b506102a260e05481565b34801561041757600080fd5b506102a260dc5481565b34801561042d57600080fd5b506102a261043c366004612511565b60ec6020526000908152604090205481565b34801561045a57600080fd5b5061048a61046936600461252c565b60eb6020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102ac565b3480156104b157600080fd5b506105246104c0366004612545565b60d060209081526000928352604080842090915290825290208054600182015460028301546003840154600485015460058601546006909601546001600160401b0380871697600160401b90970416956001600160a01b0395861695909416939088565b604080516001600160401b03998a1681529890971660208901526001600160a01b0395861696880196909652939092166060860152608085015260a084015260c083015260e0820152610100016102ac565b34801561058257600080fd5b506102c8610591366004612511565b610beb565b3480156105a257600080fd5b506102a26105b1366004612511565b60e86020526000908152604090205481565b3480156105cf57600080fd5b50600b546001600160a01b0316610360565b3480156105ed57600080fd5b506102a260e25481565b34801561060357600080fd5b5060c954610360906001600160a01b031681565b34801561062357600080fd5b506102a2610632366004612511565b60e96020526000908152604090205481565b34801561065057600080fd5b50600a546001600160a01b0316610360565b34801561066e57600080fd5b506106d061067d366004612545565b60d160209081526000928352604080842090915290825290208054600182015460028301546003840154600485015460059095015460ff8086169661010090960416946001600160401b03909316929087565b6040805197151588529515156020880152948601939093526001600160401b039091166060850152608084015260a083015260c082015260e0016102ac565b34801561071b57600080fd5b5061074e61072a366004612545565b60f16020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016102ac565b34801561076f57600080fd5b506102a261077e366004612511565b60e46020526000908152604090205481565b34801561079c57600080fd5b506102a260de5481565b3480156107b257600080fd5b506108046107c1366004612511565b60ce602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460079097015495969495939492939192909188565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016102ac565b34801561084b57600080fd5b5061074e61085a36600461252c565b60e3602052600090815260409020805460019091015482565b34801561087f57600080fd5b506102a261088e366004612511565b60e66020526000908152604090205481565b3480156108ac57600080fd5b5060ee54610360906001600160a01b031681565b3480156108cc57600080fd5b5060c754610360906001600160a01b031681565b3480156108ec57600080fd5b506102c86108fb366004612511565b610c25565b34801561090c57600080fd5b5060d854610920906001600160401b031681565b6040516001600160401b0390911681526020016102ac565b34801561094457600080fd5b506102a260d35481565b34801561095a57600080fd5b506102a261096936600461252c565b60d26020526000908152604090205481565b34801561098757600080fd5b5060c854610360906001600160a01b031681565b3480156109a757600080fd5b506102a26109b6366004612511565b60f26020526000908152604090205481565b3480156109d457600080fd5b506102a260db5481565b3480156109ea57600080fd5b5060ef54610360906001600160a01b031681565b348015610a0a57600080fd5b50600c546001600160a01b0316610360565b348015610a2857600080fd5b506102a260df5481565b348015610a3e57600080fd5b506102a260e15481565b348015610a5457600080fd5b506102c8610a63366004612511565b610c5c565b348015610a7457600080fd5b506102a2610a83366004612511565b60e76020526000908152604090205481565b6102c8610aa33660046124a3565b610c93565b348015610ab457600080fd5b5060e554610360906001600160a01b031681565b348015610ad457600080fd5b506102a260dd5481565b348015610aea57600080fd5b506102a2610af9366004612511565b60cd6020526000908152604090205481565b600260185403610b625760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002601855600080356001600160e01b031916808252608660205260409091205460ff1615610bd35760405162461bcd60e51b815260206004820152601b60248201527f5061757361626c652f66756e6374696f6e2d69732d70617573656400000000006044820152606401610b59565b610bdf85858585610d62565b50506001601855505050565b610bf3610ecc565b6001600160a01b038116610c195760405162461bcd60e51b8152600401610b5990612567565b610c2281610ef8565b50565b610c2d610f5a565b6001600160a01b038116610c535760405162461bcd60e51b8152600401610b5990612567565b610c2281610f84565b610c64610fde565b6001600160a01b038116610c8a5760405162461bcd60e51b8152600401610b5990612567565b610c2281611008565b600260185403610ce55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b59565b6002601855600080356001600160e01b031916808252608660205260409091205460ff1615610d565760405162461bcd60e51b815260206004820152601b60248201527f5061757361626c652f66756e6374696f6e2d69732d70617573656400000000006044820152606401610b59565b610bdf85858585611062565b600084815260cf6020908152604080832083805290915281205490610d8686611189565b915050610d938383611264565b9250610daa83610da58360c55461127e565b611264565b600087815260cf60209081526040808320838052909152812080549295508592909190610dd89084906125c4565b90915550610de9905033868561129d565b600086815260cf6020908152604080832083805290915281205433917f3b14556533f7042b915477f82d23d7ae0739dc529ef2db894dc637fbb5d27ace91899190610e359088906125db565b60008b815260cf6020908152604080832083805282529182902054825195865290850193909352830152606082015260800160405180910390a2604080516001600160a01b03878116825286166020820152600081830152606081018590529051879133917f230a4a5eb6aacbb60070665e859a4e05f382ec433deb04b69ad1a116231cdf5e9181900360800190a3505050505050565b600b546001600160a01b03163314610ef65760405162461bcd60e51b8152600401610b59906125f3565b565b600b80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fdd1f9eec248b248cd25a6d4507cc95bce10030a15778aa021a7f8854b19b8bed91015b60405180910390a15050565b600c546001600160a01b03163314610ef65760405162461bcd60e51b8152600401610b59906125f3565b600c80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa21fb928fed80c37c7378d5f0bd3991168350d9c3e67bf18c78b87ef13a776519101610f4e565b600a546001600160a01b03163314610ef65760405162461bcd60e51b8152600401610b59906125f3565b600a80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fefcbc3775999e9a427a36c61e56eb25b9eda33bfb6008872d9541bd19ac1e7659101610f4e565b61106d8383836112bc565b600084815260cf60209081526040808320838052909152812080548392906110969084906125db565b909155506110a89050333085846113a8565b600084815260cf6020908152604080832083805290915281205433917f3b14556533f7042b915477f82d23d7ae0739dc529ef2db894dc637fbb5d27ace918791906110f49086906125c4565b600089815260cf6020908152604080832083805282529182902054825195865290850193909352830152606082015260800160405180910390a2604080516001600160a01b03858116825284166020820152600081830152606081018390529051859133917fdff987638c9a01f2ac5b14fd87f123805456b60439a30a5469b798fd833a88249181900360800190a350505050565b600081815260cf6020908152604080832083805290915281205460c554829182916111b491906113fe565b905060008060006111c487611413565b60008a815260eb602090815260409182902082516060810184528154815260018201549281019290925260020154918101829052939650919450925061120a9085612634565b61121483856125db565b825161122090886125db565b61122a9190612675565b6112349190612634565b815190975061124c906112479089612675565b611509565b95506112588686611264565b95505050505050915091565b60008183106112735781611275565b825b90505b92915050565b6000670de0b6b3a764000061129383856126b4565b61127591906126e9565b80156112b7576112b76001600160a01b038316848361151b565b505050565b806000036112fa5760405162461bcd60e51b815260206004820152600b60248201526a1e995c9bcb585b5bdd5b9d60aa1b6044820152606401610b59565b60c7546001600160a01b0384811691161461134c5760405162461bcd60e51b81526020600482015260126024820152711a5b9d985b1a590b58dbdb1b185d195c985b60721b6044820152606401610b59565b6001600160a01b038216600090815260cb602052604090205460ff166112b75760405162461bcd60e51b81526020600482015260116024820152701d1bdad95b8b5b9bdd0b585b1b1bddd959607a1b6044820152606401610b59565b806000036113e35760405162461bcd60e51b81526020600482015260086024820152670c0b585b5bdd5b9d60c21b6044820152606401610b59565b6113f86001600160a01b03831685858461157e565b50505050565b600081611293670de0b6b3a7640000856126b4565b60c7546000908190819081908190611433906001600160a01b03166115b6565b925050915080156114745760405162461bcd60e51b815260206004820152600b60248201526a70726963652d7374616c6560a81b6044820152606401610b59565b60005b60cc5460ff821610156114ff5760008060006114be8a60cc8660ff16815481106114a3576114a36126fd565b6000918252602090912001546001600160a01b03168861168d565b919450925090506114cf838a612634565b98506114db82896125db565b97506114e781886125db565b965050505080806114f790612713565b915050611477565b5050509193909250565b6000808213156115165750805b919050565b6040516001600160a01b0383166024820152604481018290526112b790849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611a1d565b6040516001600160a01b03808516602483015283166044820152606481018290526113f89085906323b872dd60e01b90608401611547565b60ca546001600160a01b03828116600090815260e460205260408082205490516396834ad360e01b8152919384938493849391909216916396834ad3916116039160040190815260200190565b608060405180830381865afa158015611620573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611644919061275b565b905061164f81611aef565b606082015160d85491955093506116709084906001600160401b03166127ea565b6001600160401b031642111561168557600191505b509193909250565b60c7546000908190819081906116ac906001600160a01b031687611ba0565b600088815260d060209081526040808320848452825280832081516101008101835281546001600160401b03808216808452600160401b909204169482019490945260018201546001600160a01b03908116938201939093526002820154909216606083015260038101546080830152600481015460a0830152600581015460c08301526006015460e08201529293509003611749575050611a14565b60008060006117578a6115b6565b92509250925080156117995760405162461bcd60e51b815260206004820152600b60248201526a70726963652d7374616c6560a81b6044820152606401610b59565b8860c354846117a891906126b4565b6117b291906126e9565b60008c815260d16020908152604080832088516001600160401b039081168552908352818420825160e081018452815460ff8082161515835261010090910416158015828701526001830154828601526002830154841660608084019190915260038401546080840152600484015460a08085019190915260059094015460c0840152928c015160d854938d01516001600160a01b0316885260d6875285882080548751818a0281018a01909852808852999c50929861191a978d97929693958d9594169391908301828280156118a857602002820191906000526020600020905b815481526020019060010190808311611894575b50505060608f01516001600160a01b0316600090815260d760209081526040918290208054835181840281018401909452808452929450925083018282801561191057602002820191906000526020600020905b8154815260200190600101908083116118fc575b5050505050611c07565b90506000826020015161193f5761193a8760a00151886080015184611e77565b611952565b6119528760a00151838960800151611e77565b60608801516001600160a01b0316600090815260ec6020526040902054909150811361197e578061199c565b60608701516001600160a01b0316600090815260ec60205260409020545b9a5060c45460c3546119ae91906126b4565b60608801516001600160a01b0316600090815260cd602052604090205460a08901516119da90856126b4565b6119e491906126b4565b6119ee91906126e9565b9950611a098360200151158860a00151848a60600151611eaa565b985050505050505050505b93509350939050565b6000611a72826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ee29092919063ffffffff16565b8051909150156112b75780806020019051810190611a909190612815565b6112b75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b59565b600080826040015160030b128015611b0e57506000826000015160070b135b611b5a5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964205079746820707269636520646174610000000000000000006044820152606401610b59565b60008260400151611b6a90612837565b8351909150611b7a82601261285a565b611b8590600a612963565b611b98906001600160401b0383166126b4565b949350505050565b6000806000611baf8585611ef1565b6040516bffffffffffffffffffffffff19606089811b8216602084015284811b8216603484015283901b1660488201529193509150605c01604051602081830303815290604052805190602001209250505092915050565b6000670de0b6b3a7640000611c1c888a6126b4565b611c2691906126e9565b604080516002808252606082018352929950600092909160208301908036833701905050905060015b84518160ff161015611d3357848160ff1681518110611c7057611c706126fd565b602002602001015189118015611c96575060018551611c8f91906125c4565b8160ff1614155b611d215783611ca6600183612975565b60ff1681518110611cb957611cb96126fd565b602002602001015182600081518110611cd457611cd46126fd565b602002602001018181525050838160ff1681518110611cf557611cf56126fd565b602002602001015182600181518110611d1057611d106126fd565b602002602001018181525050611d33565b80611d2b81612713565b915050611c4f565b506000866001600160401b0316421115611d9257856001600160401b031668056bc75e2d63100000886001600160401b031642611d7091906125c4565b611d7b9060026126b4565b611d8591906126b4565b611d8f91906126e9565b90505b611da568056bc75e2d6310000082611f22565b90506000611de783600081518110611dbf57611dbf6126fd565b602002602001015184600181518110611dda57611dda6126fd565b6020026020010151611f31565b905068056bc75e2d63100000611dfd82846126b4565b611e0791906126e9565b90508815611e3e5768056bc75e2d63100000611e2382826125db565b611e2d908d6126b4565b611e3791906126e9565b9350611e69565b68056bc75e2d63100000611e5282826125c4565b611e5c908d6126b4565b611e6691906126e9565b93505b505050979650505050505050565b6000670de0b6b3a7640000611e8c8385612675565b611e969086612998565b611ea09190612a1d565b90505b9392505050565b6000611ed960c3548486611ebe91906126b4565b611ec891906126e9565b611ed487878787611fa4565b61214e565b95945050505050565b6060611ea08484600085612164565b600080826001600160a01b0316846001600160a01b031610611f14578284611f17565b83835b909590945092505050565b60008183116112735781611275565b600080425a3a60003643604051602001611f5096959493929190612a4b565b60408051601f1981840301815291905280516020909101209050611f7484846125c4565b600003611f85576000915050611278565b83611f9081856125c4565b611f9a9083612a74565b611b9891906125db565b6001600160a01b038116600090815260ce60209081526040808320815161010081018352815481526001820154938101939093526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c08301526007015460e08201528161205687612025576000612027565b865b835161203391906125db565b8815612040576000612042565b875b846020015161205191906125db565b61228a565b6001600160a01b038516600090815260d4602090815260409182902080548351818402810184019094528084529394506121439390918301828280156120bb57602002820191906000526020600020905b8154815260200190600101908083116120a7575b5050506001600160a01b038816600090815260d560209081526040918290208054835181840281018401909452808452929450925083018282801561211f57602002820191906000526020600020905b81548152602001906001019080831161210b575b505050505060c35488856121339190612998565b61213d9190612a1d565b8a6122a5565b979650505050505050565b600068056bc75e2d6310000061129383856126b4565b6060824710156121c55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610b59565b6001600160a01b0385163b61221c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b59565b600080866001600160a01b031685876040516122389190612ab4565b60006040518083038185875af1925050503d8060008114612275576040519150601f19603f3d011682016040523d82523d6000602084013e61227a565b606091505b5091509150612143828286612438565b60006122968284612634565b15611278576112758284612675565b60008180156122b5575060008313155b806122ca5750811580156122ca575060008312155b611b98576122d783612471565b925060015b85518160ff16101561240657858160ff16815181106122fd576122fd6126fd565b602002602001015184116123f457600085612319600184612975565b60ff168151811061232c5761232c6126fd565b602002602001015190506000868360ff168151811061234d5761234d6126fd565b602002602001015190506000886001856123679190612975565b60ff168151811061237a5761237a6126fd565b602002602001015190506000898560ff168151811061239b5761239b6126fd565b60200260200101519050600082896123b391906125c4565b90506123bf83836125c4565b6123c986866125c4565b6123d390836126b4565b6123dd91906126e9565b6123e790866125db565b9650505050505050611b98565b806123fe81612713565b9150506122dc565b50836001865161241691906125c4565b81518110612426576124266126fd565b60200260200101519050949350505050565b60608315612447575081611ea3565b8251156124575782518084602001fd5b8160405162461bcd60e51b8152600401610b599190612ad0565b60008082136124885761248382612b03565b611278565b5090565b80356001600160a01b038116811461151657600080fd5b600080600080608085870312156124b957600080fd5b843593506124c96020860161248c565b92506124d76040860161248c565b9396929550929360600135925050565b6000602082840312156124f957600080fd5b81356001600160e01b031981168114611ea357600080fd5b60006020828403121561252357600080fd5b6112758261248c565b60006020828403121561253e57600080fd5b5035919050565b6000806040838503121561255857600080fd5b50508035926020909101359150565b60208082526027908201527f4d616e616765722f6e65772d6d616e616765722d69732d7468652d7a65726f2d6040820152666164647265737360c81b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000828210156125d6576125d66125ae565b500390565b600082198211156125ee576125ee6125ae565b500190565b60208082526021908201527f4d616e616765722f63616c6c65722d69732d6e6f742d7468652d6d616e6167656040820152603960f91b606082015260800190565b600080821280156001600160ff1b0384900385131615612656576126566125ae565b600160ff1b839003841281161561266f5761266f6125ae565b50500190565b60008083128015600160ff1b850184121615612693576126936125ae565b6001600160ff1b03840183138116156126ae576126ae6125ae565b50500390565b60008160001904831182151516156126ce576126ce6125ae565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826126f8576126f86126d3565b500490565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff8103612729576127296125ae565b60010192915050565b80516001600160401b038116811461151657600080fd5b8051600381900b811461151657600080fd5b60006080828403121561276d57600080fd5b604051608081018181106001600160401b038211171561279d57634e487b7160e01b600052604160045260246000fd5b6040528251600781900b81146127b257600080fd5b81526127c060208401612732565b60208201526127d160408401612749565b6040820152606083015160608201528091505092915050565b60006001600160401b0380831681851680830382111561280c5761280c6125ae565b01949350505050565b60006020828403121561282757600080fd5b81518015158114611ea357600080fd5b60008160030b637fffffff198103612851576128516125ae565b60000392915050565b600063ffffffff83811690831681811015612877576128776125ae565b039392505050565b600181815b808511156128ba5781600019048211156128a0576128a06125ae565b808516156128ad57918102915b93841c9390800290612884565b509250929050565b6000826128d157506001611278565b816128de57506000611278565b81600181146128f457600281146128fe5761291a565b6001915050611278565b60ff84111561290f5761290f6125ae565b50506001821b611278565b5060208310610133831016604e8410600b841016171561293d575081810a611278565b612947838361287f565b806000190482111561295b5761295b6125ae565b029392505050565b600061127563ffffffff8416836128c2565b600060ff821660ff84168082101561298f5761298f6125ae565b90039392505050565b60006001600160ff1b03818413828413808216868404861116156129be576129be6125ae565b600160ff1b60008712828116878305891216156129dd576129dd6125ae565b600087129250878205871284841616156129f9576129f96125ae565b87850587128184161615612a0f57612a0f6125ae565b505050929093029392505050565b600082612a2c57612a2c6126d3565b600160ff1b821460001984141615612a4657612a466125ae565b500590565b868152856020820152846040820152828460608301376060920191820152608001949350505050565b600082612a8357612a836126d3565b500690565b60005b83811015612aa3578181015183820152602001612a8b565b838111156113f85750506000910152565b60008251612ac6818460208701612a88565b9190910192915050565b6020815260008251806020840152612aef816040850160208701612a88565b601f01601f19169190910160400192915050565b6000600160ff1b8201612b1857612b186125ae565b506000039056fea264697066735822122035f8f5465f9c62891374bd263b4bed5290543be439c4cec2c8e632222cea93d264736f6c634300080f0033