0xa345f544d4380ed2494760a5a2018577f7bcc0930bc0e5f03bdc7d82366f01626080604052348015600f57600080fd5b506120be8061001f6000396000f3fe6080604052600436106100d25760003560e01c80638a91b0e31161007f578063cea943ee11610059578063cea943ee146101f8578063d29a362814610232578063d958465114610252578063f5b75d2a1461027257600080fd5b80638a91b0e314610199578063937bdca4146101b8578063ac0c12f4146101d857600080fd5b80636d61fe70116100b05780636d61fe7014610142578063765e80931461016457806389e04e0e1461017757600080fd5b80630daf9328146100d757806330a63e11146101005780635d4c0b8914610122575b600080fd5b6100ea6100e53660046115f1565b610293565b6040516100f791906116af565b60405180910390f35b34801561010c57600080fd5b506101156103ac565b6040516100f791906116c9565b34801561012e57600080fd5b506100ea61013d366004611762565b61053a565b34801561014e57600080fd5b5061016261015d36600461177f565b610575565b005b6100ea6101723660046117f3565b610600565b34801561018357600080fd5b5061018c610653565b6040516100f79190611914565b3480156101a557600080fd5b506101626101b436600461177f565b5050565b3480156101c457600080fd5b506100ea6101d3366004611a0b565b6109b4565b3480156101e457600080fd5b506101626101f3366004611a81565b610a2c565b34801561020457600080fd5b5061020d610b17565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f7565b34801561023e57600080fd5b5061016261024d366004611762565b610b54565b34801561025e57600080fd5b506100ea61026d366004611b72565b610bcd565b34801561027e57600080fd5b506040805160208101909152600081526100ea565b6040517f1cd64df400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152600160248201526060903090631cd64df490604401602060405180830381865afa158015610307573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032b9190611c62565b610361576040517f14bc6d3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838060200190518101906103779190611c84565b9050610384818887610be0565b6103a233826040015183608001518861039d9190611d29565b610e1e565b5095945050505050565b61041d604051806101000160405280600081526020016000801916815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600065ffffffffffff168152602001600065ffffffffffff168152602001606081525090565b610425610f56565b6040805161010081018252600383018054825260048401546020830152600584015492820192909252600683015473ffffffffffffffffffffffffffffffffffffffff16606082015260078301546080820152600883015465ffffffffffff80821660a084015266010000000000009091041660c08201526009909201805460e0840191906104b390611d46565b80601f01602080910402602001604051908101604052809291908181526020018280546104df90611d46565b801561052c5780601f106105015761010080835404028352916020019161052c565b820191906000526020600020905b81548152906001019060200180831161050f57829003601f168201915b505050505081525050905090565b6040805173ffffffffffffffffffffffffffffffffffffffff83166020820152606091015b6040516020818303038152906040529050919050565b600061058382840184611762565b905060405180602001604052808273ffffffffffffffffffffffffffffffffffffffff168152506105b2610f56565b9051600290910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055505050565b60606000828060200190518101906106189190611d99565b90506106338685836000015184602001518560400151610f65565b8051602082015161064a91339161039d9088611d29565b50949350505050565b6106876040518060a00160405280600015158152602001606081526020016060815260200160608152602001606081525090565b6040805160028082526060820190925290816020015b60408051602081019091526000815281526020019060019003908161069d575050606082015260408051600480825260a0820190925290602082015b60408051808201909152600080825260208201528152602001906001900390816106d9575050608082015260408051602081019091527f765e80930000000000000000000000000000000000000000000000000000000081526060820151805160009061074857610748611e74565b60200260200101819052506040518060200160405280630daf932860e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815250816060015160018151811061079f5761079f611e74565b6020026020010181905250604051806040016040528063cea943ee60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600081525081608001516000815181106107fd576107fd611e74565b6020026020010181905250604051806040016040528063d29a362860e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020016002815250816080015160018151811061085b5761085b611e74565b602002602001018190525060405180604001604052806330a63e1160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600081525081608001516002815181106108b9576108b9611e74565b6020026020010181905250604051806040016040528063ac0c12f460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020016001815250816080015160038151811061091757610917611e74565b6020908102919091010152604080516001808252818301909252908160200160208202803683375050506020820181905280517f80ac58cd00000000000000000000000000000000000000000000000000000000919060009061097c5761097c611e74565b7fffffffff00000000000000000000000000000000000000000000000000000000909216602092830291909101909101526001815290565b60608160405160200161055f9190600060c08201905065ffffffffffff835116825265ffffffffffff602084015116602083015273ffffffffffffffffffffffffffffffffffffffff6040840151166040830152606083015160608301526080830151608083015260a083015160a083015292915050565b80610a35610f56565b8151600382019081556020830151600483015560408301516005830155606083015160068301805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790556080830151600783015560a083015160088301805460c086015165ffffffffffff9081166601000000000000027fffffffffffffffffffffffffffffffffffffffff00000000000000000000000090921693169290921791909117905560e0830151909160090190610b119082611ef1565b50505050565b600080610b22610f56565b60408051602081019091526002919091015473ffffffffffffffffffffffffffffffffffffffff169081905292915050565b60405180602001604052808273ffffffffffffffffffffffffffffffffffffffff16815250610b81610f56565b9051600290910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117905550565b60608160405160200161055f9190611fec565b825165ffffffffffff16421080610c03575042836020015165ffffffffffff1611155b15610c3a576040517fa04a11a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c42610f56565b60a08401516000908152602091909152604090205460ff1615610c91576040517f249394ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c99610f56565b60030154811115610cd6576040517faf9ef11500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260600151610ce3610f56565b73ffffffffffffffffffffffffffffffffffffffff841660009081526001919091016020526040902054610d179083612062565b1115610d4f576040517fb390ab3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001610d59610f56565b60a085015160009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905580610da3610f56565b6003018054600090610db6908490612075565b90915550819050610dc5610f56565b60010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e149190612062565b9091555050505050565b80600003610e63573415610e5e576040517f3de5a9a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b6000610e6d610f56565b60408051602081019091526002919091015473ffffffffffffffffffffffffffffffffffffffff908116825290915083167fffffffffffffffffffffffff111111111111111111111111111111111111111201610f0e57813414610efd576040517f3de5a9a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051610f09908361133a565b610b11565b3415610f46576040517f3de5a9a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b118385836000015185611356565b6000610f606113b3565b905090565b6000610f6f610f56565b6040805161010081018252600383018054825260048401546020830152600584015492820192909252600683015473ffffffffffffffffffffffffffffffffffffffff16606082015260078301546080820152600883015465ffffffffffff80821660a084015266010000000000009091041660c08201526009909201805460e084019190610ffd90611d46565b80601f016020809104026020016040519081016040528092919081815260200182805461102990611d46565b80156110765780601f1061104b57610100808354040283529160200191611076565b820191906000526020600020905b81548152906001019060200180831161105957829003601f168201915b50505050508152505090508060a0015165ffffffffffff164210806110a75750428160c0015165ffffffffffff1611155b156110de576040517fe106319b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806060015173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580611121575080604001518314155b15611158576040517ffb10278300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051851115611193576040517faf9ef11500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80608001516111a0610f56565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260019190910160205260409020546111d49087612062565b111561120c576040517fb390ab3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020810151156112b35760006112788383602001518960405160200161125d919060609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b60405160208183030381529060405280519060200120611433565b9050806112b1576040517ffdc4d9fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b846112bc610f56565b60030180546000906112cf908490612075565b909155508590506112de610f56565b60010160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461132d9190612062565b9091555050505050505050565b60003860003884865af16101b45763b12d13eb6000526004601cfd5b60405181606052826040528360601b602c526f23b872dd000000000000000000000000600c52602060006064601c6000895af13d1560016000511417166113a557637939f4246000526004601cfd5b600060605260405250505050565b6000807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0061140260017f063f5c9930ebcb24c6e9f871c5cf07f8107734a7831d2d366df33bb963835137612075565b60405160200161141491815260200190565b60408051601f1981840301815291905280516020909101201692915050565b600083511561146e5760208401845160051b81015b8151841160051b9384528151602094851852604060002093909101908082106114485750505b5014919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461149757600080fd5b50565b80356114a581611475565b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156114fc576114fc6114aa565b60405290565b604051610100810167ffffffffffffffff811182821017156114fc576114fc6114aa565b6040516060810167ffffffffffffffff811182821017156114fc576114fc6114aa565b604051601f8201601f1916810167ffffffffffffffff81118282101715611572576115726114aa565b604052919050565b600082601f83011261158b57600080fd5b81356020830160008067ffffffffffffffff8411156115ac576115ac6114aa565b50601f8301601f19166020016115c181611549565b9150508281528583830111156115d657600080fd5b82826020830137600092810160200192909252509392505050565b600080600080600060a0868803121561160957600080fd5b853561161481611475565b94506020860135935060408601359250606086013567ffffffffffffffff81111561163e57600080fd5b61164a8882890161157a565b925050608086013561165b81611475565b809150509295509295909350565b6000815180845260005b8181101561168f57602081850181015186830182015201611673565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006116c26020830184611669565b9392505050565b6020815281516020820152602082015160408201526040820151606082015273ffffffffffffffffffffffffffffffffffffffff6060830151166080820152608082015160a082015265ffffffffffff60a08301511660c0820152600060c083015161173f60e084018265ffffffffffff169052565b5060e08301516101008084015261175a610120840182611669565b949350505050565b60006020828403121561177457600080fd5b81356116c281611475565b6000806020838503121561179257600080fd5b823567ffffffffffffffff8111156117a957600080fd5b8301601f810185136117ba57600080fd5b803567ffffffffffffffff8111156117d157600080fd5b8560208284010111156117e357600080fd5b6020919091019590945092505050565b6000806000806080858703121561180957600080fd5b843561181481611475565b93506020850135925060408501359150606085013567ffffffffffffffff81111561183e57600080fd5b61184a8782880161157a565b91505092959194509250565b600081518084526020840193506020830160005b828110156118aa5781517fffffffff000000000000000000000000000000000000000000000000000000001686526020958601959091019060010161186a565b5093949350505050565b600081518084526020840193506020830160005b828110156118aa57815180517fffffffff0000000000000000000000000000000000000000000000000000000016875260209081015181880152604090960195909101906001016118c8565b602081528151151560208201526000602083015160a0604084015261193c60c0840182611856565b90506040840151601f198483030160608501526119598282611856565b6060860151858203601f19016080870152805180835260209182019450600093509101905b808310156119c4577fffffffff0000000000000000000000000000000000000000000000000000000084515116825260208201915060208401935060018301925061197e565b5060808601519250601f198582030160a08601526119e281846118b4565b9695505050505050565b65ffffffffffff8116811461149757600080fd5b80356114a5816119ec565b600060c0828403128015611a1e57600080fd5b50611a276114d9565b8235611a32816119ec565b81526020830135611a42816119ec565b60208201526040830135611a5581611475565b6040820152606083810135908201526080808401359082015260a0928301359281019290925250919050565b600060208284031215611a9357600080fd5b813567ffffffffffffffff811115611aaa57600080fd5b82016101008185031215611abd57600080fd5b611ac5611502565b813581526020808301359082015260408083013590820152611ae96060830161149a565b606082015260808281013590820152611b0460a08301611a00565b60a0820152611b1560c08301611a00565b60c082015260e082013567ffffffffffffffff811115611b3457600080fd5b611b408682850161157a565b60e083015250949350505050565b600067ffffffffffffffff821115611b6857611b686114aa565b5060051b60200190565b600060208284031215611b8457600080fd5b813567ffffffffffffffff811115611b9b57600080fd5b820160608185031215611bad57600080fd5b611bb5611526565b8135611bc081611475565b815260208281013590820152604082013567ffffffffffffffff811115611be657600080fd5b80830192505084601f830112611bfb57600080fd5b8135611c0e611c0982611b4e565b611549565b8082825260208201915060208360051b860101925087831115611c3057600080fd5b6020850194505b82851015611c52578435825260209485019490910190611c37565b6040840152509095945050505050565b600060208284031215611c7457600080fd5b815180151581146116c257600080fd5b600060c0828403128015611c9757600080fd5b50611ca06114d9565b8251611cab816119ec565b81526020830151611cbb816119ec565b60208201526040830151611cce81611475565b6040820152606083810151908201526080808401519082015260a0928301519281019290925250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417611d4057611d40611cfa565b92915050565b600181811c90821680611d5a57607f821691505b602082108103611d93577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215611dab57600080fd5b815167ffffffffffffffff811115611dc257600080fd5b820160608185031215611dd457600080fd5b611ddc611526565b8151611de781611475565b815260208281015190820152604082015167ffffffffffffffff811115611e0d57600080fd5b80830192505084601f830112611e2257600080fd5b8151611e30611c0982611b4e565b8082825260208201915060208360051b860101925087831115611e5257600080fd5b6020850194505b82851015611c52578451825260209485019490910190611e59565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b601f821115610e5e57806000526020600020601f840160051c81016020851015611eca5750805b601f840160051c820191505b81811015611eea5760008155600101611ed6565b5050505050565b815167ffffffffffffffff811115611f0b57611f0b6114aa565b611f1f81611f198454611d46565b84611ea3565b6020601f821160018114611f715760008315611f3b5750848201515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178455611eea565b600084815260208120601f198516915b82811015611fa15787850151825560209485019460019092019101611f81565b5084821015611fdd57868401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b60f8161c191681555b50505050600190811b01905550565b6020815260006080820173ffffffffffffffffffffffffffffffffffffffff845116602084015260208401516040840152604084015160608085015281815180845260a086019150602083019350600092505b808310156103a2578351825260208201915060208401935060018301925061203f565b80820180821115611d4057611d40611cfa565b81810381811115611d4057611d40611cfa56fea264697066735822122072ff0d9827fc623ac87f962c693f8ab29ba0007361fe554301b6577dd2726eb364736f6c634300081a0033