608060405234801561000f575f80fd5b506040518060400160405280600781526020017f4d69546f6b656e000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4d49540000000000000000000000000000000000000000000000000000000000815250816003908161008b91906105fd565b50806004908161009b91906105fd565b5050503360055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610118336100f061011d60201b60201c565b60ff16600a6100ff9190610828565b620f424061010d9190610872565b61012560201b60201c565b61099b565b5f6012905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610195575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161018c91906108f2565b60405180910390fd5b6101a65f83836101aa60201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036101fa578060025f8282546101ee919061090b565b925050819055506102c8565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610283578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161027a9392919061094d565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361030f578060025f8282540392505081905550610359565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516103b69190610982565b60405180910390a3505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061043e57607f821691505b602082108103610451576104506103fa565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026104b37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610478565b6104bd8683610478565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6105016104fc6104f7846104d5565b6104de565b6104d5565b9050919050565b5f819050919050565b61051a836104e7565b61052e61052682610508565b848454610484565b825550505050565b5f90565b610542610536565b61054d818484610511565b505050565b5b81811015610570576105655f8261053a565b600181019050610553565b5050565b601f8211156105b55761058681610457565b61058f84610469565b8101602085101561059e578190505b6105b26105aa85610469565b830182610552565b50505b505050565b5f82821c905092915050565b5f6105d55f19846008026105ba565b1980831691505092915050565b5f6105ed83836105c6565b9150826002028217905092915050565b610606826103c3565b67ffffffffffffffff81111561061f5761061e6103cd565b5b6106298254610427565b610634828285610574565b5f60209050601f831160018114610665575f8415610653578287015190505b61065d85826105e2565b8655506106c4565b601f19841661067386610457565b5f5b8281101561069a57848901518255600182019150602085019450602081019050610675565b868310156106b757848901516106b3601f8916826105c6565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111561074e5780860481111561072a576107296106cc565b5b60018516156107395780820291505b8081029050610747856106f9565b945061070e565b94509492505050565b5f826107665760019050610821565b81610773575f9050610821565b81600181146107895760028114610793576107c2565b6001915050610821565b60ff8411156107a5576107a46106cc565b5b8360020a9150848211156107bc576107bb6106cc565b5b50610821565b5060208310610133831016604e8410600b84101617156107f75782820a9050838111156107f2576107f16106cc565b5b610821565b6108048484846001610705565b9250905081840481111561081b5761081a6106cc565b5b81810290505b9392505050565b5f610832826104d5565b915061083d836104d5565b925061086a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484610757565b905092915050565b5f61087c826104d5565b9150610887836104d5565b9250828202610895816104d5565b915082820484148315176108ac576108ab6106cc565b5b5092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6108dc826108b3565b9050919050565b6108ec816108d2565b82525050565b5f6020820190506109055f8301846108e3565b92915050565b5f610915826104d5565b9150610920836104d5565b9250828201905080821115610938576109376106cc565b5b92915050565b610947816104d5565b82525050565b5f6060820190506109605f8301866108e3565b61096d602083018561093e565b61097a604083018461093e565b949350505050565b5f6020820190506109955f83018461093e565b92915050565b611253806109a85f395ff3fe6080604052600436106100a6575f3560e01c806340847d2d1161006357806340847d2d146101bc57806370a08231146101e45780638da5cb5b1461022057806395d89b411461024a578063a9059cbb14610274578063dd62ed3e146102b0576100a6565b806306fdde03146100aa578063095ea7b3146100d457806318160ddd146101105780631afd64e21461013a57806323b872dd14610156578063313ce56714610192575b5f80fd5b3480156100b5575f80fd5b506100be6102ec565b6040516100cb9190610c7f565b60405180910390f35b3480156100df575f80fd5b506100fa60048036038101906100f59190610d30565b61037c565b6040516101079190610d88565b60405180910390f35b34801561011b575f80fd5b5061012461039e565b6040516101319190610db0565b60405180910390f35b610154600480360381019061014f9190610dc9565b6103a7565b005b348015610161575f80fd5b5061017c60048036038101906101779190610df4565b61042a565b6040516101899190610d88565b60405180910390f35b34801561019d575f80fd5b506101a6610458565b6040516101b39190610e5f565b60405180910390f35b3480156101c7575f80fd5b506101e260048036038101906101dd9190610d30565b610460565b005b3480156101ef575f80fd5b5061020a60048036038101906102059190610e78565b61046f565b6040516102179190610db0565b60405180910390f35b34801561022b575f80fd5b506102346104b4565b6040516102419190610eb2565b60405180910390f35b348015610255575f80fd5b5061025e6104d9565b60405161026b9190610c7f565b60405180910390f35b34801561027f575f80fd5b5061029a60048036038101906102959190610d30565b610569565b6040516102a79190610d88565b60405180910390f35b3480156102bb575f80fd5b506102d660048036038101906102d19190610ecb565b61058b565b6040516102e39190610db0565b60405180910390f35b6060600380546102fb90610f36565b80601f016020809104026020016040519081016040528092919081815260200182805461032790610f36565b80156103725780601f1061034957610100808354040283529160200191610372565b820191905f5260205f20905b81548152906001019060200180831161035557829003601f168201915b5050505050905090565b5f8061038661060d565b9050610393818585610614565b600191505092915050565b5f600254905090565b670de0b6b3a7640000816103bb9190610f93565b34146103fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f39061101e565b60405180910390fd5b61042733610408610458565b60ff16600a610417919061116b565b836104229190610f93565b610626565b50565b5f8061043461060d565b90506104418582856106a5565b61044c858585610737565b60019150509392505050565b5f6012905090565b61046b338383610737565b5050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600480546104e890610f36565b80601f016020809104026020016040519081016040528092919081815260200182805461051490610f36565b801561055f5780601f106105365761010080835404028352916020019161055f565b820191905f5260205f20905b81548152906001019060200180831161054257829003601f168201915b5050505050905090565b5f8061057361060d565b9050610580818585610737565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f33905090565b6106218383836001610827565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610696575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161068d9190610eb2565b60405180910390fd5b6106a15f83836109f6565b5050565b5f6106b0848461058b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107315781811015610722578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610719939291906111b5565b60405180910390fd5b61073084848484035f610827565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107a7575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161079e9190610eb2565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610817575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161080e9190610eb2565b60405180910390fd5b6108228383836109f6565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610897575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161088e9190610eb2565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610907575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016108fe9190610eb2565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156109f0578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516109e79190610db0565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a46578060025f828254610a3a91906111ea565b92505081905550610b14565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610acf578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610ac6939291906111b5565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b5b578060025f8282540392505081905550610ba5565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610c029190610db0565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610c5182610c0f565b610c5b8185610c19565b9350610c6b818560208601610c29565b610c7481610c37565b840191505092915050565b5f6020820190508181035f830152610c978184610c47565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610ccc82610ca3565b9050919050565b610cdc81610cc2565b8114610ce6575f80fd5b50565b5f81359050610cf781610cd3565b92915050565b5f819050919050565b610d0f81610cfd565b8114610d19575f80fd5b50565b5f81359050610d2a81610d06565b92915050565b5f8060408385031215610d4657610d45610c9f565b5b5f610d5385828601610ce9565b9250506020610d6485828601610d1c565b9150509250929050565b5f8115159050919050565b610d8281610d6e565b82525050565b5f602082019050610d9b5f830184610d79565b92915050565b610daa81610cfd565b82525050565b5f602082019050610dc35f830184610da1565b92915050565b5f60208284031215610dde57610ddd610c9f565b5b5f610deb84828501610d1c565b91505092915050565b5f805f60608486031215610e0b57610e0a610c9f565b5b5f610e1886828701610ce9565b9350506020610e2986828701610ce9565b9250506040610e3a86828701610d1c565b9150509250925092565b5f60ff82169050919050565b610e5981610e44565b82525050565b5f602082019050610e725f830184610e50565b92915050565b5f60208284031215610e8d57610e8c610c9f565b5b5f610e9a84828501610ce9565b91505092915050565b610eac81610cc2565b82525050565b5f602082019050610ec55f830184610ea3565b92915050565b5f8060408385031215610ee157610ee0610c9f565b5b5f610eee85828601610ce9565b9250506020610eff85828601610ce9565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680610f4d57607f821691505b602082108103610f6057610f5f610f09565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610f9d82610cfd565b9150610fa883610cfd565b9250828202610fb681610cfd565b91508282048414831517610fcd57610fcc610f66565b5b5092915050565b7f43616e746964616420646520657468657220696e636f727265637461000000005f82015250565b5f611008601c83610c19565b915061101382610fd4565b602082019050919050565b5f6020820190508181035f83015261103581610ffc565b9050919050565b5f8160011c9050919050565b5f808291508390505b60018511156110915780860481111561106d5761106c610f66565b5b600185161561107c5780820291505b808102905061108a8561103c565b9450611051565b94509492505050565b5f826110a95760019050611164565b816110b6575f9050611164565b81600181146110cc57600281146110d657611105565b6001915050611164565b60ff8411156110e8576110e7610f66565b5b8360020a9150848211156110ff576110fe610f66565b5b50611164565b5060208310610133831016604e8410600b841016171561113a5782820a90508381111561113557611134610f66565b5b611164565b6111478484846001611048565b9250905081840481111561115e5761115d610f66565b5b81810290505b9392505050565b5f61117582610cfd565b915061118083610cfd565b92506111ad7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461109a565b905092915050565b5f6060820190506111c85f830186610ea3565b6111d56020830185610da1565b6111e26040830184610da1565b949350505050565b5f6111f482610cfd565b91506111ff83610cfd565b925082820190508082111561121757611216610f66565b5b9291505056fea264697066735822122056c78767947fb5193fa762c1a0029d27ac5af8fa416dfc5c4d81fe606522128e64736f6c63430008190033