60806040523480156200001157600080fd5b50336040518060400160405280600c81526020017f4861486120546f6b656e203200000000000000000000000000000000000000008152506040518060400160405280600581526020017f484148413200000000000000000000000000000000000000000000000000000081525081600390816200009091906200048d565b508060049081620000a291906200048d565b5050506000600560006101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620001355760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200012c9190620005b9565b60405180910390fd5b62000146816200014d60201b60201c565b50620005d6565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200029557607f821691505b602082108103620002ab57620002aa6200024d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002d6565b620003218683620002d6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200036e62000368620003628462000339565b62000343565b62000339565b9050919050565b6000819050919050565b6200038a836200034d565b620003a2620003998262000375565b848454620002e3565b825550505050565b600090565b620003b9620003aa565b620003c68184846200037f565b505050565b5b81811015620003ee57620003e2600082620003af565b600181019050620003cc565b5050565b601f8211156200043d576200040781620002b1565b6200041284620002c6565b8101602085101562000422578190505b6200043a6200043185620002c6565b830182620003cb565b50505b505050565b600082821c905092915050565b6000620004626000198460080262000442565b1980831691505092915050565b60006200047d83836200044f565b9150826002028217905092915050565b620004988262000213565b67ffffffffffffffff811115620004b457620004b36200021e565b5b620004c082546200027c565b620004cd828285620003f2565b600060209050601f831160018114620005055760008415620004f0578287015190505b620004fc85826200046f565b8655506200056c565b601f1984166200051586620002b1565b60005b828110156200053f5784890151825560018201915060208501945060208101905062000518565b868310156200055f57848901516200055b601f8916826200044f565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005a18262000574565b9050919050565b620005b38162000594565b82525050565b6000602082019050620005d06000830184620005a8565b92915050565b61145680620005e66000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a257806395d89b411161007157806395d89b41146102705780639dc29fac1461028e578063a9059cbb146102aa578063dd62ed3e146102da578063f2fde38b1461030a5761010b565b806370a082311461020e578063715018a61461023e5780638456cb59146102485780638da5cb5b146102525761010b565b8063313ce567116100de578063313ce567146101ac5780633f4ba83a146101ca57806340c10f19146101d45780635c975abb146101f05761010b565b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015e57806323b872dd1461017c575b600080fd5b610118610326565b60405161012591906110aa565b60405180910390f35b61014860048036038101906101439190611165565b6103b8565b60405161015591906111c0565b60405180910390f35b6101666103db565b60405161017391906111ea565b60405180910390f35b61019660048036038101906101919190611205565b6103e5565b6040516101a391906111c0565b60405180910390f35b6101b4610414565b6040516101c19190611274565b60405180910390f35b6101d261041d565b005b6101ee60048036038101906101e99190611165565b61042f565b005b6101f8610445565b60405161020591906111c0565b60405180910390f35b6102286004803603810190610223919061128f565b61045c565b60405161023591906111ea565b60405180910390f35b6102466104a4565b005b6102506104b8565b005b61025a6104ca565b60405161026791906112cb565b60405180910390f35b6102786104f4565b60405161028591906110aa565b60405180910390f35b6102a860048036038101906102a39190611165565b610586565b005b6102c460048036038101906102bf9190611165565b61059c565b6040516102d191906111c0565b60405180910390f35b6102f460048036038101906102ef91906112e6565b6105bf565b60405161030191906111ea565b60405180910390f35b610324600480360381019061031f919061128f565b610646565b005b60606003805461033590611355565b80601f016020809104026020016040519081016040528092919081815260200182805461036190611355565b80156103ae5780601f10610383576101008083540402835291602001916103ae565b820191906000526020600020905b81548152906001019060200180831161039157829003601f168201915b5050505050905090565b6000806103c36106cc565b90506103d08185856106d4565b600191505092915050565b6000600254905090565b6000806103f06106cc565b90506103fd8582856106e6565b61040885858561077a565b60019150509392505050565b60006012905090565b61042561086e565b61042d6108f5565b565b61043761086e565b6104418282610958565b5050565b6000600560009054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6104ac61086e565b6104b660006109da565b565b6104c061086e565b6104c8610aa0565b565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461050390611355565b80601f016020809104026020016040519081016040528092919081815260200182805461052f90611355565b801561057c5780601f106105515761010080835404028352916020019161057c565b820191906000526020600020905b81548152906001019060200180831161055f57829003601f168201915b5050505050905090565b61058e61086e565b6105988282610b03565b5050565b6000806105a76106cc565b90506105b481858561077a565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61064e61086e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036106c05760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016106b791906112cb565b60405180910390fd5b6106c9816109da565b50565b600033905090565b6106e18383836001610b85565b505050565b60006106f284846105bf565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107745781811015610764578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161075b93929190611386565b60405180910390fd5b61077384848484036000610b85565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107ec5760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016107e391906112cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361085e5760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161085591906112cb565b60405180910390fd5b610869838383610d5c565b505050565b6108766106cc565b73ffffffffffffffffffffffffffffffffffffffff166108946104ca565b73ffffffffffffffffffffffffffffffffffffffff16146108f3576108b76106cc565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016108ea91906112cb565b60405180910390fd5b565b6108fd610d74565b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6109416106cc565b60405161094e91906112cb565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109ca5760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016109c191906112cb565b60405180910390fd5b6109d660008383610d5c565b5050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610aa8610db4565b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610aec6106cc565b604051610af991906112cb565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b755760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610b6c91906112cb565b60405180910390fd5b610b8182600083610d5c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610bf75760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610bee91906112cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c695760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610c6091906112cb565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015610d56578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610d4d91906111ea565b60405180910390a35b50505050565b610d64610db4565b610d6f838383610df5565b505050565b610d7c610445565b610db2576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b610dbc610445565b15610df3576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e47578060026000828254610e3b91906113ec565b92505081905550610f1a565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610ed3578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610eca93929190611386565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f635780600260008282540392505081905550610fb0565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161100d91906111ea565b60405180910390a3505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611054578082015181840152602081019050611039565b60008484015250505050565b6000601f19601f8301169050919050565b600061107c8261101a565b6110868185611025565b9350611096818560208601611036565b61109f81611060565b840191505092915050565b600060208201905081810360008301526110c48184611071565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006110fc826110d1565b9050919050565b61110c816110f1565b811461111757600080fd5b50565b60008135905061112981611103565b92915050565b6000819050919050565b6111428161112f565b811461114d57600080fd5b50565b60008135905061115f81611139565b92915050565b6000806040838503121561117c5761117b6110cc565b5b600061118a8582860161111a565b925050602061119b85828601611150565b9150509250929050565b60008115159050919050565b6111ba816111a5565b82525050565b60006020820190506111d560008301846111b1565b92915050565b6111e48161112f565b82525050565b60006020820190506111ff60008301846111db565b92915050565b60008060006060848603121561121e5761121d6110cc565b5b600061122c8682870161111a565b935050602061123d8682870161111a565b925050604061124e86828701611150565b9150509250925092565b600060ff82169050919050565b61126e81611258565b82525050565b60006020820190506112896000830184611265565b92915050565b6000602082840312156112a5576112a46110cc565b5b60006112b38482850161111a565b91505092915050565b6112c5816110f1565b82525050565b60006020820190506112e060008301846112bc565b92915050565b600080604083850312156112fd576112fc6110cc565b5b600061130b8582860161111a565b925050602061131c8582860161111a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061136d57607f821691505b6020821081036113805761137f611326565b5b50919050565b600060608201905061139b60008301866112bc565b6113a860208301856111db565b6113b560408301846111db565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006113f78261112f565b91506114028361112f565b925082820190508082111561141a576114196113bd565b5b9291505056fea2646970667358221220cf116caa892c6af34dd3dd8a47978b5f75194e152682725e3808dc15c8647e9564736f6c63430008180033