60806040526001600560146101000a81548160ff02191690831515021790555034801561002a575f80fd5b50336040518060400160405280600481526020017f74657374000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f746573740000000000000000000000000000000000000000000000000000000081525081600390816100a7919061071d565b5080600490816100b7919061071d565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361012a575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610121919061082b565b60405180910390fd5b6101398161017a60201b60201c565b506101753061014c61023d60201b60201c565b600a61015891906109ac565b66017e9d8602b40061016a91906109f6565b61024560201b60201c565b610ac7565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6012905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036102b5575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016102ac919061082b565b60405180910390fd5b6102c65f83836102ca60201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361031a578060025f82825461030e9190610a37565b925050819055506103e8565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156103a3578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161039a93929190610a79565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361042f578060025f8282540392505081905550610479565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516104d69190610aae565b60405180910390a3505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061055e57607f821691505b6020821081036105715761057061051a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026105d37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610598565b6105dd8683610598565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61062161061c610617846105f5565b6105fe565b6105f5565b9050919050565b5f819050919050565b61063a83610607565b61064e61064682610628565b8484546105a4565b825550505050565b5f90565b610662610656565b61066d818484610631565b505050565b5b81811015610690576106855f8261065a565b600181019050610673565b5050565b601f8211156106d5576106a681610577565b6106af84610589565b810160208510156106be578190505b6106d26106ca85610589565b830182610672565b50505b505050565b5f82821c905092915050565b5f6106f55f19846008026106da565b1980831691505092915050565b5f61070d83836106e6565b9150826002028217905092915050565b610726826104e3565b67ffffffffffffffff81111561073f5761073e6104ed565b5b6107498254610547565b610754828285610694565b5f60209050601f831160018114610785575f8415610773578287015190505b61077d8582610702565b8655506107e4565b601f19841661079386610577565b5f5b828110156107ba57848901518255600182019150602085019450602081019050610795565b868310156107d757848901516107d3601f8916826106e6565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610815826107ec565b9050919050565b6108258161080b565b82525050565b5f60208201905061083e5f83018461081c565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156108c6578086048111156108a2576108a1610844565b5b60018516156108b15780820291505b80810290506108bf85610871565b9450610886565b94509492505050565b5f826108de5760019050610999565b816108eb575f9050610999565b8160018114610901576002811461090b5761093a565b6001915050610999565b60ff84111561091d5761091c610844565b5b8360020a91508482111561093457610933610844565b5b50610999565b5060208310610133831016604e8410600b841016171561096f5782820a90508381111561096a57610969610844565b5b610999565b61097c848484600161087d565b9250905081840481111561099357610992610844565b5b81810290505b9392505050565b5f60ff82169050919050565b5f6109b6826105f5565b91506109c1836109a0565b92506109ee7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846108cf565b905092915050565b5f610a00826105f5565b9150610a0b836105f5565b9250828202610a19816105f5565b91508282048414831517610a3057610a2f610844565b5b5092915050565b5f610a41826105f5565b9150610a4c836105f5565b9250828201905080821115610a6457610a63610844565b5b92915050565b610a73816105f5565b82525050565b5f606082019050610a8c5f83018661081c565b610a996020830185610a6a565b610aa66040830184610a6a565b949350505050565b5f602082019050610ac15f830184610a6a565b92915050565b61186180610ad45f395ff3fe6080604052600436106100eb575f3560e01c8063715018a611610089578063ad5c464811610058578063ad5c4648146102e8578063c45a015514610312578063dd62ed3e1461033c578063f2fde38b14610378576100f2565b8063715018a6146102425780638da5cb5b1461025857806395d89b4114610282578063a9059cbb146102ac576100f2565b806323b872dd116100c557806323b872dd1461018457806330c9473c146101c0578063313ce567146101dc57806370a0823114610206576100f2565b806306fdde03146100f4578063095ea7b31461011e57806318160ddd1461015a576100f2565b366100f257005b005b3480156100ff575f80fd5b506101086103a0565b60405161011591906110a8565b60405180910390f35b348015610129575f80fd5b50610144600480360381019061013f919061115d565b610430565b60405161015191906111b5565b60405180910390f35b348015610165575f80fd5b5061016e610452565b60405161017b91906111dd565b60405180910390f35b34801561018f575f80fd5b506101aa60048036038101906101a591906111f6565b61045b565b6040516101b791906111b5565b60405180910390f35b6101da60048036038101906101d59190611351565b6104e1565b005b3480156101e7575f80fd5b506101f06106ac565b6040516101fd919061141c565b60405180910390f35b348015610211575f80fd5b5061022c60048036038101906102279190611435565b6106b4565b60405161023991906111dd565b60405180910390f35b34801561024d575f80fd5b506102566106f9565b005b348015610263575f80fd5b5061026c61070c565b604051610279919061146f565b60405180910390f35b34801561028d575f80fd5b50610296610734565b6040516102a391906110a8565b60405180910390f35b3480156102b7575f80fd5b506102d260048036038101906102cd919061115d565b6107c4565b6040516102df91906111b5565b60405180910390f35b3480156102f3575f80fd5b506102fc6107e6565b604051610309919061146f565b60405180910390f35b34801561031d575f80fd5b5061032661081c565b604051610333919061146f565b60405180910390f35b348015610347575f80fd5b50610362600480360381019061035d9190611488565b610837565b60405161036f91906111dd565b60405180910390f35b348015610383575f80fd5b5061039e60048036038101906103999190611435565b6108b9565b005b6060600380546103af906114f3565b80601f01602080910402602001604051908101604052809291908181526020018280546103db906114f3565b80156104265780601f106103fd57610100808354040283529160200191610426565b820191905f5260205f20905b81548152906001019060200180831161040957829003601f168201915b5050505050905090565b5f8061043a61093d565b9050610447818585610944565b600191505092915050565b5f600254905090565b5f728ec83599cc011e884eabe64a1efb9dc8a6fc0573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036104cd57600560149054906101000a900460ff1615600560146101000a81548160ff0219169083151502179055505b6104d8848484610956565b90509392505050565b6104e9610984565b838390508686905014610531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052890611593565b60405180910390fd5b818190508686905014610579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057090611621565b60405180910390fd5b5f5b868690508110156106a3575f87878381811061059a5761059961163f565b5b90506020020160208101906105af9190611435565b73ffffffffffffffffffffffffffffffffffffffff168484848181106105d8576105d761163f565b5b905060200201358787858181106105f2576105f161163f565b5b90506020028101906106049190611678565b604051610612929190611716565b5f6040518083038185875af1925050503d805f811461064c576040519150601f19603f3d011682016040523d82523d5f602084013e610651565b606091505b5050905080610695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068c90611778565b60405180910390fd5b50808060010191505061057b565b50505050505050565b5f6012905090565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610701610984565b61070a5f610a0b565b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610743906114f3565b80601f016020809104026020016040519081016040528092919081815260200182805461076f906114f3565b80156107ba5780601f10610791576101008083540402835291602001916107ba565b820191905f5260205f20905b81548152906001019060200180831161079d57829003601f168201915b5050505050905090565b5f806107ce61093d565b90506107db818585610ace565b600191505092915050565b5f600560149054906101000a900460ff166108015730610817565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b905090565b5f735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f905090565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6108c1610984565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610931575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610928919061146f565b60405180910390fd5b61093a81610a0b565b50565b5f33905090565b6109518383836001610bbe565b505050565b5f8061096061093d565b905061096d858285610d8d565b610978858585610ace565b60019150509392505050565b61098c61093d565b73ffffffffffffffffffffffffffffffffffffffff166109aa61070c565b73ffffffffffffffffffffffffffffffffffffffff1614610a09576109cd61093d565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610a00919061146f565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b3e575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610b35919061146f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bae575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610ba5919061146f565b60405180910390fd5b610bb9838383610e1f565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610c2e575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610c25919061146f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c9e575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610c95919061146f565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015610d87578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610d7e91906111dd565b60405180910390a35b50505050565b5f610d988484610837565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e195781811015610e0a578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610e0193929190611796565b60405180910390fd5b610e1884848484035f610bbe565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e6f578060025f828254610e6391906117f8565b92505081905550610f3d565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610ef8578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610eef93929190611796565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f84578060025f8282540392505081905550610fce565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161102b91906111dd565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61107a82611038565b6110848185611042565b9350611094818560208601611052565b61109d81611060565b840191505092915050565b5f6020820190508181035f8301526110c08184611070565b905092915050565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6110f9826110d0565b9050919050565b611109816110ef565b8114611113575f80fd5b50565b5f8135905061112481611100565b92915050565b5f819050919050565b61113c8161112a565b8114611146575f80fd5b50565b5f8135905061115781611133565b92915050565b5f8060408385031215611173576111726110c8565b5b5f61118085828601611116565b925050602061119185828601611149565b9150509250929050565b5f8115159050919050565b6111af8161119b565b82525050565b5f6020820190506111c85f8301846111a6565b92915050565b6111d78161112a565b82525050565b5f6020820190506111f05f8301846111ce565b92915050565b5f805f6060848603121561120d5761120c6110c8565b5b5f61121a86828701611116565b935050602061122b86828701611116565b925050604061123c86828701611149565b9150509250925092565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261126757611266611246565b5b8235905067ffffffffffffffff8111156112845761128361124a565b5b6020830191508360208202830111156112a05761129f61124e565b5b9250929050565b5f8083601f8401126112bc576112bb611246565b5b8235905067ffffffffffffffff8111156112d9576112d861124a565b5b6020830191508360208202830111156112f5576112f461124e565b5b9250929050565b5f8083601f84011261131157611310611246565b5b8235905067ffffffffffffffff81111561132e5761132d61124a565b5b60208301915083602082028301111561134a5761134961124e565b5b9250929050565b5f805f805f806060878903121561136b5761136a6110c8565b5b5f87013567ffffffffffffffff811115611388576113876110cc565b5b61139489828a01611252565b9650965050602087013567ffffffffffffffff8111156113b7576113b66110cc565b5b6113c389828a016112a7565b9450945050604087013567ffffffffffffffff8111156113e6576113e56110cc565b5b6113f289828a016112fc565b92509250509295509295509295565b5f60ff82169050919050565b61141681611401565b82525050565b5f60208201905061142f5f83018461140d565b92915050565b5f6020828403121561144a576114496110c8565b5b5f61145784828501611116565b91505092915050565b611469816110ef565b82525050565b5f6020820190506114825f830184611460565b92915050565b5f806040838503121561149e5761149d6110c8565b5b5f6114ab85828601611116565b92505060206114bc85828601611116565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061150a57607f821691505b60208210810361151d5761151c6114c6565b5b50919050565b7f7461726765747320616e642063616c6c44617461206c656e677468206d69736d5f8201527f6174636800000000000000000000000000000000000000000000000000000000602082015250565b5f61157d602483611042565b915061158882611523565b604082019050919050565b5f6020820190508181035f8301526115aa81611571565b9050919050565b7f7461726765747320616e642076616c756573206c656e677468206d69736d61745f8201527f6368000000000000000000000000000000000000000000000000000000000000602082015250565b5f61160b602283611042565b9150611616826115b1565b604082019050919050565b5f6020820190508181035f830152611638816115ff565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f80833560016020038436030381126116945761169361166c565b5b80840192508235915067ffffffffffffffff8211156116b6576116b5611670565b5b6020830192506001820236038313156116d2576116d1611674565b5b509250929050565b5f81905092915050565b828183375f83830152505050565b5f6116fd83856116da565b935061170a8385846116e4565b82840190509392505050565b5f6117228284866116f2565b91508190509392505050565b7f43616c6c206661696c65640000000000000000000000000000000000000000005f82015250565b5f611762600b83611042565b915061176d8261172e565b602082019050919050565b5f6020820190508181035f83015261178f81611756565b9050919050565b5f6060820190506117a95f830186611460565b6117b660208301856111ce565b6117c360408301846111ce565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6118028261112a565b915061180d8361112a565b9250828201905080821115611825576118246117cb565b5b9291505056fea26469706673582212205e53ded5db0c11de005d6e14020bcc1e716743c1c62d8fa67f1886b2e4f2e60464736f6c634300081a0033