608060405234801561001057600080fd5b50612c8d806100206000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c8063797669c911610125578063aefb55fe116100ad578063d53913931161007c578063d539139314610490578063d547741f146104b7578063dd62ed3e146104ca578063e31b2425146104dd578063e63ab1e9146104ec57600080fd5b8063aefb55fe14610444578063c4ae316814610464578063c64d4cb51461046c578063ca15c8731461047d57600080fd5b806391d14854116100f457806391d14854146103fb57806395d89b411461040e578063a217fddf14610416578063a457c2d71461041e578063a9059cbb1461043157600080fd5b8063797669c91461038e57806379cc6790146103b55780638456cb59146103c85780639010d07c146103d057600080fd5b8063313ce567116101a857806340c10f191161017757806340c10f191461032057806342966c68146103335780634cd88b76146103465780635c975abb1461035957806370a082311461036557600080fd5b8063313ce567146102e357806336568abe146102f257806339509351146103055780633f4ba83a1461031857600080fd5b806318160ddd116101e457806318160ddd1461028657806323b872dd14610298578063248a9ca3146102ab5780632f2ff15d146102ce57600080fd5b806301ffc9a71461021657806306fdde031461023e578063095ea7b31461025357806313cadb4714610266575b600080fd5b610229610224366004611bce565b610501565b60405190151581526020015b60405180910390f35b61024661052c565b6040516102359190611c1c565b610229610261366004611c66565b6105be565b610279610274366004611e6f565b6105d6565b6040516102359190611fad565b60cb545b604051908152602001610235565b6102296102a6366004611fbc565b610628565b61028a6102b9366004611ff8565b60009081526065602052604090206001015490565b6102e16102dc366004612011565b61064c565b005b60405160008152602001610235565b6102e1610300366004612011565b610676565b610229610313366004611c66565b6106f9565b6102e161071b565b6102e161032e366004611c66565b6107af565b6102e1610341366004611ff8565b6107e3565b6102e16103543660046120ca565b6107ed565b61012d5460ff16610229565b61028a61037336600461212e565b6001600160a01b0316600090815260c9602052604090205490565b61028a7f71f3d55856e4058ed06ee057d79ada615f65cdf5f9ee88181b914225088f834f81565b6102e16103c3366004611c66565b610865565b6102e161087a565b6103e36103de366004612149565b61090c565b6040516001600160a01b039091168152602001610235565b610229610409366004612011565b61092b565b610246610956565b61028a600081565b61022961042c366004611c66565b610965565b61022961043f366004611c66565b6109e0565b610457610452366004612576565b6109ee565b60405161023591906127d6565b6102e1610a44565b6102e161047a3660046128cf565b50565b61028a61048b366004611ff8565b610a8a565b61028a7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6102e16104c5366004612011565b610aa1565b61028a6104d83660046128ec565b610ac6565b60016040516102359190612916565b61028a600080516020612c3883398151915281565b60006001600160e01b03198216635a05180f60e01b1480610526575061052682610af1565b92915050565b606060cc805461053b90612930565b80601f016020809104026020016040519081016040528092919081815260200182805461056790612930565b80156105b45780601f10610589576101008083540402835291602001916105b4565b820191906000526020600020905b81548152906001019060200180831161059757829003601f168201915b5050505050905090565b6000336105cc818585610b26565b5060019392505050565b6105de6119a7565b8215610604576101f48460e0018181516105f89190612980565b61ffff16905250610620565b6105dc8460e0018181516106189190612980565b61ffff169052505b509192915050565b600033610636858285610c4a565b610641858585610cc4565b506001949350505050565b60008281526065602052604090206001015461066781610e9d565b6106718383610ea7565b505050565b6001600160a01b03811633146106eb5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6106f58282610ec9565b5050565b6000336105cc81858561070c8383610ac6565b610716919061299b565b610b26565b610733600080516020612c388339815191523361092b565b6107a55760405162461bcd60e51b815260206004820152603960248201527f45524332305072657365744d696e7465725061757365723a206d75737420686160448201527f76652070617573657220726f6c6520746f20756e70617573650000000000000060648201526084016106e2565b6107ad610eeb565b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66107d981610e9d565b6106718383610f80565b61047a338261106b565b60006107f960016111c5565b90508015610811576000805461ff0019166101001790555b61081b8383611252565b8015610671576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b610870823383610c4a565b6106f5828261106b565b610892600080516020612c388339815191523361092b565b6109045760405162461bcd60e51b815260206004820152603760248201527f45524332305072657365744d696e7465725061757365723a206d75737420686160448201527f76652070617573657220726f6c6520746f20706175736500000000000000000060648201526084016106e2565b6107ad6112b5565b60008281526097602052604081206109249083611332565b9392505050565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060cd805461053b90612930565b600033816109738286610ac6565b9050838110156109d35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106e2565b6106418286868403610b26565b6000336105cc818585610cc4565b6109f6611a1b565b61012d5460ff1615610a3d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106e2565b5090919050565b7f71f3d55856e4058ed06ee057d79ada615f65cdf5f9ee88181b914225088f834f610a6e81610e9d565b61012d5460ff1615610a825761047a610eeb565b61047a6112b5565b60008181526097602052604081206105269061133e565b600082815260656020526040902060010154610abc81610e9d565b6106718383610ec9565b6001600160a01b03918216600090815260ca6020908152604080832093909416825291909152205490565b60006001600160e01b03198216637965db0b60e01b148061052657506301ffc9a760e01b6001600160e01b0319831614610526565b6001600160a01b038316610b885760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106e2565b6001600160a01b038216610be95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106e2565b6001600160a01b03838116600081815260ca602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610c568484610ac6565b90506000198114610cbe5781811015610cb15760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106e2565b610cbe8484848403610b26565b50505050565b6001600160a01b038316610d285760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106e2565b6001600160a01b038216610d8a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106e2565b610d95838383611348565b6001600160a01b038316600090815260c9602052604090205481811015610e0d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106e2565b6001600160a01b03808516600090815260c96020526040808220858503905591851681529081208054849290610e4490849061299b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e9091815260200190565b60405180910390a3610cbe565b61047a8133611353565b610eb182826113b7565b6000828152609760205260409020610671908261143d565b610ed38282611452565b600082815260976020526040902061067190826114b9565b61012d5460ff16610f355760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106e2565b61012d805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038216610fd65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106e2565b610fe260008383611348565b8060cb6000828254610ff4919061299b565b90915550506001600160a01b038216600090815260c960205260408120805483929061102190849061299b565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166110cb5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016106e2565b6110d782600083611348565b6001600160a01b038216600090815260c960205260409020548181101561114b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016106e2565b6001600160a01b038316600090815260c960205260408120838303905560cb805484929061117a9084906129ae565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60008054610100900460ff161561120c578160ff1660011480156111e85750303b155b6112045760405162461bcd60e51b81526004016106e2906129c1565b506000919050565b60005460ff8084169116106112335760405162461bcd60e51b81526004016106e2906129c1565b506000805460ff191660ff92909216919091179055600190565b919050565b600061125e60016111c5565b90508015611276576000805461ff0019166101001790555b61128083836114ce565b61128b6000336114fc565b61081b7f71f3d55856e4058ed06ee057d79ada615f65cdf5f9ee88181b914225088f834f336114fc565b61012d5460ff16156112fc5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106e2565b61012d805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610f633390565b60006109248383611506565b6000610526825490565b610671838383611530565b61135d828261092b565b6106f557611375816001600160a01b03166014611597565b611380836020611597565b604051602001611391929190612a0f565b60408051601f198184030181529082905262461bcd60e51b82526106e291600401611c1c565b6113c1828261092b565b6106f55760008281526065602090815260408083206001600160a01b03851684529091529020805460ff191660011790556113f93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610924836001600160a01b038416611733565b61145c828261092b565b156106f55760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610924836001600160a01b038416611782565b60006114da60016111c5565b905080156114f2576000805461ff0019166101001790555b61081b838361187c565b6106f58282610ea7565b600082600001828154811061151d5761151d612a84565b9060005260206000200154905092915050565b61012d5460ff16156106715760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b60648201526084016106e2565b606060006115a6836002612a9a565b6115b190600261299b565b67ffffffffffffffff8111156115c9576115c9611c90565b6040519080825280601f01601f1916602001820160405280156115f3576020820181803683370190505b509050600360fc1b8160008151811061160e5761160e612a84565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061163d5761163d612a84565b60200101906001600160f81b031916908160001a9053506000611661846002612a9a565b61166c90600161299b565b90505b60018111156116e4576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106116a0576116a0612a84565b1a60f81b8282815181106116b6576116b6612a84565b60200101906001600160f81b031916908160001a90535060049490941c936116dd81612ab1565b905061166f565b5083156109245760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016106e2565b600081815260018301602052604081205461177a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610526565b506000610526565b6000818152600183016020526040812054801561186b5760006117a66001836129ae565b85549091506000906117ba906001906129ae565b905081811461181f5760008660000182815481106117da576117da612a84565b90600052602060002001549050808760000184815481106117fd576117fd612a84565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061183057611830612ac8565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610526565b6000915050610526565b5092915050565b600054610100900460ff166118a35760405162461bcd60e51b81526004016106e290612ade565b6118ad82826118bf565b6118b56118ff565b6106f58282611933565b600054610100900460ff166118e65760405162461bcd60e51b81526004016106e290612ade565b60cc6118f28382612b77565b5060cd6106718282612b77565b600054610100900460ff166119265760405162461bcd60e51b81526004016106e290612ade565b61012d805460ff19169055565b600054610100900460ff1661195a5760405162461bcd60e51b81526004016106e290612ade565b6119656000336114fc565b61198f7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336114fc565b6106f5600080516020612c38833981519152336114fc565b604080516101c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915290565b60405180610100016040528060008152602001611a736040518060c0016040528060008152602001600081526020016000815260200160008152602001600063ffffffff168152602001600063ffffffff1681525090565b8152602001611a80611b6a565b8152602001611aca6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290529060e082015290565b8152604080516101608101825260008082526020828101829052928201819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201529101908152602001611b336119a7565b8152602001611b406119a7565b81526040805160808101825260008082526020828101829052928201819052606082015291015290565b604051806101400160405280600081526020016000815260200160006004811115611b9757611b976125a3565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b600060208284031215611be057600080fd5b81356001600160e01b03198116811461092457600080fd5b60005b83811015611c13578181015183820152602001611bfb565b50506000910152565b6020815260008251806020840152611c3b816040850160208701611bf8565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461124d57600080fd5b60008060408385031215611c7957600080fd5b611c8283611c4f565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b6040516101c0810167ffffffffffffffff81118282101715611cca57611cca611c90565b60405290565b604051610140810167ffffffffffffffff81118282101715611cca57611cca611c90565b604051610100810167ffffffffffffffff81118282101715611cca57611cca611c90565b604051610160810167ffffffffffffffff81118282101715611cca57611cca611c90565b803561ffff8116811461124d57600080fd5b60006101c08284031215611d6157600080fd5b611d69611ca6565b9050611d7482611d3c565b8152611d8260208301611d3c565b6020820152611d9360408301611d3c565b6040820152611da460608301611d3c565b6060820152611db560808301611d3c565b6080820152611dc660a08301611d3c565b60a0820152611dd760c08301611d3c565b60c0820152611de860e08301611d3c565b60e0820152610100611dfb818401611d3c565b90820152610120611e0d838201611d3c565b90820152610140611e1f838201611d3c565b90820152610160611e31838201611d3c565b90820152610180611e43838201611d3c565b908201526101a0611e55838201611d3c565b9082015292915050565b8035801515811461124d57600080fd5b60008060006102008486031215611e8557600080fd5b611e8f8585611d4e565b9250611e9e6101c08501611e5f565b91506101e084013590509250925092565b805161ffff1682526020810151611ecc602084018261ffff169052565b506040810151611ee2604084018261ffff169052565b506060810151611ef8606084018261ffff169052565b506080810151611f0e608084018261ffff169052565b5060a0810151611f2460a084018261ffff169052565b5060c0810151611f3a60c084018261ffff169052565b5060e0810151611f5060e084018261ffff169052565b506101008181015161ffff90811691840191909152610120808301518216908401526101408083015182169084015261016080830151821690840152610180808301518216908401526101a0808301519182168185015290610cbe565b6101c081016105268284611eaf565b600080600060608486031215611fd157600080fd5b611fda84611c4f565b9250611fe860208501611c4f565b9150604084013590509250925092565b60006020828403121561200a57600080fd5b5035919050565b6000806040838503121561202457600080fd5b8235915061203460208401611c4f565b90509250929050565b600082601f83011261204e57600080fd5b813567ffffffffffffffff8082111561206957612069611c90565b604051601f8301601f19908116603f0116810190828211818310171561209157612091611c90565b816040528381528660208588010111156120aa57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156120dd57600080fd5b823567ffffffffffffffff808211156120f557600080fd5b6121018683870161203d565b9350602085013591508082111561211757600080fd5b506121248582860161203d565b9150509250929050565b60006020828403121561214057600080fd5b61092482611c4f565b6000806040838503121561215c57600080fd5b50508035926020909101359150565b803563ffffffff8116811461124d57600080fd5b600060c0828403121561219157600080fd5b60405160c0810181811067ffffffffffffffff821117156121b4576121b4611c90565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201526121ea6080840161216b565b60808201526121fb60a0840161216b565b60a08201525092915050565b80356005811061124d57600080fd5b803560ff8116811461124d57600080fd5b6000610140828403121561223a57600080fd5b612242611cd0565b9050813581526020820135602082015261225e60408301612207565b604082015261226f60608301611e5f565b606082015261228060808301611d3c565b608082015261229160a0830161216b565b60a08201526122a260c0830161216b565b60c08201526122b360e08301612216565b60e08201526101006122c6818401612216565b90820152610120611e55838201612216565b80356002811061124d57600080fd5b600061010082840312156122fa57600080fd5b612302611cf4565b905081358152602082013560208201526040820135604082015261232860608301611d3c565b6060820152608082013567ffffffffffffffff8116811461234857600080fd5b608082015261235960a08301611c4f565b60a082015261236a60c08301612216565b60c082015261237b60e083016122d8565b60e082015292915050565b6000610160828403121561239957600080fd5b6123a1611d18565b90506123ac82611d3c565b81526123ba60208301611d3c565b60208201526123cb60408301611d3c565b60408201526123dc60608301611d3c565b60608201526123ed60808301611d3c565b60808201526123fe60a08301611d3c565b60a082015261240f60c08301611d3c565b60c082015261242060e08301611d3c565b60e0820152610100612433818401611d3c565b90820152610120612445838201611d3c565b90820152610140611e55838201611d3c565b60006080828403121561246957600080fd5b6040516080810181811067ffffffffffffffff8211171561248c5761248c611c90565b60405290508061249b83611d3c565b81526124a960208401611d3c565b60208201526124ba60408401611d3c565b60408201526124cb60608401611d3c565b60608201525092915050565b600061088082840312156124ea57600080fd5b6124f2611cf4565b905081358152612505836020840161217f565b60208201526125178360e08401612227565b604082015261252a8361022084016122e7565b606082015261253d836103208401612386565b6080820152612550836104808401611d4e565b60a0820152612563836106408401611d4e565b60c082015261237b836108008401612457565b6000806108a0838503121561258a57600080fd5b61259484846124d7565b94610880939093013593505050565b634e487b7160e01b600052602160045260246000fd5b600581106125c9576125c96125a3565b9052565b805182526020810151602083015260408101516125ed60408401826125b9565b506060810151612601606084018215159052565b506080810151612617608084018261ffff169052565b5060a081015161262f60a084018263ffffffff169052565b5060c081015161264760c084018263ffffffff169052565b5060e081015161265c60e084018260ff169052565b506101008181015160ff81168483015250506101208181015160ff811684830152610cbe565b80518252602081015160208301526040810151604083015261ffff606082015116606083015267ffffffffffffffff608082015116608083015260018060a01b0360a08201511660a083015260ff60c08201511660c083015260e0810151600281106126f0576126f06125a3565b8060e0840152505050565b805161ffff1682526020810151612718602084018261ffff169052565b50604081015161272e604084018261ffff169052565b506060810151612744606084018261ffff169052565b50608081015161275a608084018261ffff169052565b5060a081015161277060a084018261ffff169052565b5060c081015161278660c084018261ffff169052565b5060e081015161279c60e084018261ffff169052565b506101008181015161ffff81168483015250506101208181015161ffff81168483015250506101408181015161ffff811684830152610cbe565b60006108808201905082518252602083015180516020840152602081015160408401526040810151606084015260608101516080840152608081015163ffffffff80821660a08601528060a08401511660c0860152505050604083015161284060e08401826125cd565b506060830151612854610220840182612682565b5060808301516128686103208401826126fb565b5060a083015161287c610480840182611eaf565b5060c0830151612890610640840182611eaf565b5060e0830151805161ffff9081166108008501526020820151811661082085015260408201518116610840850152606082015116610860840152611875565b600061088082840312156128e257600080fd5b61092483836124d7565b600080604083850312156128ff57600080fd5b61290883611c4f565b915061203460208401611c4f565b602081016007831061292a5761292a6125a3565b91905290565b600181811c9082168061294457607f821691505b60208210810361296457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b61ffff8181168382160190808211156118755761187561296a565b808201808211156105265761052661296a565b818103818111156105265761052661296a565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612a47816017850160208801611bf8565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612a78816028840160208801611bf8565b01602801949350505050565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176105265761052661296a565b600081612ac057612ac061296a565b506000190190565b634e487b7160e01b600052603160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b601f82111561067157600081815260208120601f850160051c81016020861015612b505750805b601f850160051c820191505b81811015612b6f57828155600101612b5c565b505050505050565b815167ffffffffffffffff811115612b9157612b91611c90565b612ba581612b9f8454612930565b84612b29565b602080601f831160018114612bda5760008415612bc25750858301515b600019600386901b1c1916600185901b178555612b6f565b600085815260208120601f198616915b82811015612c0957888601518255948401946001909101908401612bea565b5085821015612c275787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862aa2646970667358221220c31827d48afc4d3da2ed7e859660f5d9d63547754b71607fe2f7d982478790f764736f6c63430008140033