From c7bac3f5486828ab5199572fdaf43d9669ed3963 Mon Sep 17 00:00:00 2001 From: David Meister Date: Sun, 27 Sep 2026 15:40:39 +0000 Subject: [PATCH 1/2] bump rain-math-float 0.2.1 -> 0.2.4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `LibDecimalFloat.agree` landed in 0.2.2 and gained its tolerance guard in 0.2.4. rainlang needs 0.2.4 for the `agree` word, and cannot take it while this package pins 0.2.1: soldeer keys `[dependencies]` by package name, so a consumer cannot hold two versions of `rain-math-float` at once, and `LibDecimalFloatDeploy` imports `LOG_TABLE_DISAMBIGUATOR` and `LogTablesNotDeployed` from the pinned one. That is what fails rainlang's CI at compile today. THE `DecimalFloat` CANDIDATE PIN MOVES. The concrete embeds `LibDecimalFloat`, which changed between 0.2.1 and 0.2.4 — `agree` and its guard, and the comparison set moving to the unpacked implementation — so its creation code and therefore its Zoltu address change: bytecode hash 0xdc468883... -> 0x12b70b2f... address 0x799632d2... -> 0x16cf47be... The new address needs deploying, and anything pinning the old one keeps talking to the 0.2.1 contract. `LogTables` DOES NOT MOVE — hash `0x2573004a...` and address `0xc51a1425...` are unchanged, because the tables do not depend on `LibDecimalFloat`. No table redeploy, and no consumer of the tables is affected. Measured by regenerating both candidates and diffing, not assumed. `src/generated/candidate/DecimalFloat.sol` regenerated via `script/Build.sol`, and `crates/float/abi/DecimalFloat.json` via `script/CopyArtifacts.sol` — the test that guards the committed artifact named that script and it is the sanctioned path. 41 suites, 72 passing. The 6 failures are the `*_RPC_URL` fork tests with no env vars locally; CI holds those secrets. Lint and fmt clean. Co-Authored-By: Claude Opus 5 (1M context) --- crates/float/abi/DecimalFloat.json | 4 ++-- foundry.toml | 2 +- script/Build.sol | 2 +- soldeer.lock | 8 ++++---- src/concrete/DecimalFloat.sol | 8 ++++---- src/generated/candidate/DecimalFloat.sol | 8 ++++---- src/lib/deploy/LibDecimalFloatDeploy.sol | 4 ++-- test/concrete/DecimalFloat.packLossless.t.sol | 2 +- test/concrete/TestDecimalFloat.sol | 4 ++-- test/concrete/TestDecimalFloat.unpack.t.sol | 2 +- test/src/concrete/DecimalFloat.abs.t.sol | 2 +- test/src/concrete/DecimalFloat.add.t.sol | 2 +- test/src/concrete/DecimalFloat.ceil.t.sol | 2 +- test/src/concrete/DecimalFloat.constants.t.sol | 2 +- test/src/concrete/DecimalFloat.constructor.t.sol | 2 +- test/src/concrete/DecimalFloat.div.t.sol | 2 +- test/src/concrete/DecimalFloat.eq.t.sol | 2 +- test/src/concrete/DecimalFloat.floor.t.sol | 2 +- test/src/concrete/DecimalFloat.format.t.sol | 6 +++--- test/src/concrete/DecimalFloat.frac.t.sol | 2 +- .../concrete/DecimalFloat.fromFixedDecimalLossless.t.sol | 2 +- .../src/concrete/DecimalFloat.fromFixedDecimalLossy.t.sol | 2 +- test/src/concrete/DecimalFloat.gt.t.sol | 2 +- test/src/concrete/DecimalFloat.gte.t.sol | 2 +- test/src/concrete/DecimalFloat.integer.t.sol | 2 +- test/src/concrete/DecimalFloat.inv.t.sol | 2 +- test/src/concrete/DecimalFloat.isZero.t.sol | 2 +- test/src/concrete/DecimalFloat.log10.t.sol | 2 +- test/src/concrete/DecimalFloat.lt.t.sol | 2 +- test/src/concrete/DecimalFloat.lte.t.sol | 2 +- test/src/concrete/DecimalFloat.max.t.sol | 2 +- test/src/concrete/DecimalFloat.min.t.sol | 2 +- test/src/concrete/DecimalFloat.minus.t.sol | 2 +- test/src/concrete/DecimalFloat.mul.t.sol | 2 +- test/src/concrete/DecimalFloat.parse.t.sol | 4 ++-- test/src/concrete/DecimalFloat.pow.t.sol | 2 +- test/src/concrete/DecimalFloat.pow10.t.sol | 2 +- test/src/concrete/DecimalFloat.sqrt.t.sol | 2 +- test/src/concrete/DecimalFloat.sub.t.sol | 2 +- .../concrete/DecimalFloat.toFixedDecimalLossless.t.sol | 2 +- test/src/concrete/DecimalFloat.toFixedDecimalLossy.t.sol | 4 ++-- .../LibDecimalFloatDeploy.checkLogTablesDeployed.t.sol | 2 +- test/src/lib/table/LibLogTable.bytes.t.sol | 2 +- 43 files changed, 59 insertions(+), 59 deletions(-) diff --git a/crates/float/abi/DecimalFloat.json b/crates/float/abi/DecimalFloat.json index 80b90a5..91392f2 100644 --- a/crates/float/abi/DecimalFloat.json +++ b/crates/float/abi/DecimalFloat.json @@ -1102,9 +1102,9 @@ } ], "bytecode": { - "object": "0x6080604052348015600e575f80fd5b5060156019565b60b8565b73c51a14251b0dcf0ae24a96b7153991378938f5f53f7f2573004ac3a9ee7fc8d73654d76386f1b6b99e34cdf86a689c4691e47143420f811460b557604051630912d0ff60e31b815273c51a14251b0dcf0ae24a96b7153991378938f5f560048201527f2573004ac3a9ee7fc8d73654d76386f1b6b99e34cdf86a689c4691e47143420f60248201526044810182905260640160405180910390fd5b50565b614ddd806100c55f395ff3fe608060405234801561000f575f80fd5b506004361061029d575f3560e01c806381f7e2f511610171578063cde72ef3116100d2578063dd64691711610088578063e5526ecd1161006e578063e5526ecd1461062e578063e75f991f14610641578063ffae15ba14610654575f80fd5b8063dd64691714610608578063e0db58881461061b575f80fd5b8063d1de592a116100b8578063d1de592a146105bb578063d35273a7146105ce578063d3d6ffa8146105f5575f80fd5b8063cde72ef314610582578063d102b4d3146105a8575f80fd5b8063a19684b711610127578063bc1b392d1161010d578063bc1b392d1461050b578063bc62d8d814610511578063cb09682b1461055c575f80fd5b8063a19684b7146104d2578063a90d041a146104f8575f80fd5b806396ce1ec71161015757806396ce1ec7146104885780639b4afd991461049b578063a100a3d9146104bf575f80fd5b806381f7e2f5146104625780638dc2980714610475575f80fd5b80633447c0301161021b5780635ca0e7a4116101d1578063719cd99d116101b7578063719cd99d1461042957806373bfb2831461043c57806381a822721461044f575f80fd5b80635ca0e7a4146103f0578063602c35fc14610403575f80fd5b80633b3bd868116102015780633b3bd868146103b757806341aa0080146103ca5780635b23771d146103dd575f80fd5b80633447c03014610374578063371493ce14610397575f80fd5b80631ee62f111161027057806328fa1f011161025657806328fa1f011461033b5780633004fa411461034e5780633029740014610361575f80fd5b80631ee62f11146103155780632538835014610328575f80fd5b806304327dc5146102a1578063078b665b146102c75780630b6429bc146102da578063146e82ad14610302575b5f80fd5b6102b46102af36600461475f565b61067a565b6040519081526020015b60405180910390f35b6102b46102d5366004614776565b61068a565b6102ed6102e83660046147a6565b61069c565b604080519283529015156020830152016102be565b6102b461031036600461475f565b6106b4565b6102b461032336600461475f565b6106d3565b6102b461033636600461475f565b6106f2565b6102b461034936600461475f565b610711565b6102b461035c366004614776565b61071b565b6102b461036f366004614776565b61073b565b610387610382366004614776565b610746565b60405190151581526020016102be565b6103aa6103a53660046147d0565b610751565b6040516102be9190614802565b6102b46103c53660046147a6565b61075d565b6102b46103d8366004614776565b610768565b6102b46103eb3660046147a6565b610773565b6102b46103fe36600461475f565b61077e565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b6102b461043736600461475f565b610788565b61038761044a366004614776565b610792565b6102b461045d36600461475f565b61079d565b610387610470366004614776565b6107a7565b610387610483366004614776565b6107b2565b6102b4610496366004614776565b6107bd565b6102b47c090000000000000000000000000000000000000000000000000000000181565b6103aa6104cd36600461475f565b6107c8565b7f80000000000000000000000000000000000000000000000000000000000000016102b4565b6102b4610506366004614776565b610812565b5f6102b4565b61052461051f366004614882565b61081d565b604080517fffffffff0000000000000000000000000000000000000000000000000000000090931683526020830191909152016102be565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b7f7fffffff800000000000000000000000000000000000000000000000000000006102b4565b6103876105b6366004614776565b610836565b6102b46105c9366004614776565b610841565b6102b47ffffffffc0000000000000000000000000000000000000000000000000000000181565b6102b461060336600461475f565b61084c565b61038761061636600461475f565b610856565b6102b461062936600461475f565b61087c565b6103aa61063c36600461494b565b610886565b6102ed61064f3660046147a6565b61090f565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc6102b4565b5f6106848261091b565b92915050565b5f610695838361095d565b9392505050565b5f806106a88484610979565b915091505b9250929050565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109ba565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109e6565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f5610a33565b5f61068482610a66565b5f610695838373c51a14251b0dcf0ae24a96b7153991378938f5f5610aa7565b5f6106958383610d01565b5f6106958383610d63565b60606106958383610db1565b5f6106958383610e44565b5f6106958383610e5f565b5f6106958383610ea4565b5f61068482610ed7565b5f61068482610f8d565b5f6106958383611039565b5f61068482611089565b5f61069583836110ce565b5f610695838361111e565b5f610695838361116d565b6060610684827ffffffffc000000000000000000000000000000000000000000000000000000017c0900000000000000000000000000000000000000000000000000000001610886565b5f61069583836111b2565b5f805f8061082a856111bd565b90969095509350505050565b5f61069583836112ab565b5f61069583836112fa565b5f6106848261133f565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821615610684565b5f61068482611371565b606061089283836112ab565b6108d7576040517f3be5bf9400000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044015b60405180910390fd5b5f6108e185611089565b9050610906856108f183876112ab565b806109015750610901838661111e565b610db1565b95945050505050565b5f806106a884846113b2565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826113f2565b90925090505f6109068383611440565b5f610968838361111e565b6109725781610695565b5090919050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6109ad8282876114a6565b9350935050509250929050565b5f610695837fffffffff0000000000000000000000000000000000000000000000000000000584610aa7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a198483836116b0565b90925090505f610a298383611440565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a19848383611821565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82610a998383611b56565b9150505f610a298284611440565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516610ae45750600191506106959050565b5f8213610b7d57815f03610b4157610afc855f6112ab565b15610b36576040517f8be82972000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b505f91506106959050565b6040517fcceba0f100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b610b88856001610d63565b8015610b995750610b99865f61111e565b15610ba8578592505050610695565b610bb2855f6112ab565b15610bdb57610bd2610bc38761091b565b610bcc8761133f565b86610aa7565b92505050610695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80610c0e8484611b56565b915091505f610c1e83855f611bbe565b905060015f8080610c558f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510610c9c5784600116600103610c7f57610c7984848484611cd5565b90945092505b600185901c9450610c9282828484611cd5565b9092509050610c5a565b5f80610ca98f8e8e611821565b91509150610cb982828a8d611cd5565b9092509050610cc98f83836116b0565b9092509050610cda82828888611cd5565b90925090505f610cea8383611440565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611df4565b915091505f610d558383611440565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da684848484612418565b979650505050505050565b60607bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d5f829003610e21576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525092505050610684565b8315610e3a57610e31828261242f565b92505050610684565b610906828261276c565b5f805f610e518585612f96565b915091506109068282612ff8565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d468686868661304a565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610906828286613074565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610f0e57509192915050565b5f80610f1a8484611b56565b915091505f84128015610f2c57508015155b15610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb461304a565b935091505b5f610da68385611440565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610fc457509192915050565b5f80610fd08484611b56565b91509150805f03610fe5575093949350505050565b5f811315610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb46130d0565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61107c84848484613200565b1315979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828212156110c35761094d82826132d4565b5f6109068383611440565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61111184848484613200565b1215979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61116184848484613200565b12979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611cd5565b5f61096883836112ab565b80515f908190602084810191850101828080806111da8686613377565b929650909450925090507fffffffff0000000000000000000000000000000000000000000000000000000084165f0361129c5784830361126c575f806112208484613816565b915091508061125b57507f32b8b8be000000000000000000000000000000000000000000000000000000009a5f9a5098505050505050505050565b505f9a909950975050505050505050565b507fad384e8700000000000000000000000000000000000000000000000000000000985f98509650505050505050565b5091975f975095505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6112ee84848484613200565b13979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d46868686866130d0565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826132d4565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d826113a48383611b56565b5090505f610a298284611440565b5f805f805f6113c1878761391c565b9250925092505f806113d38585613816565b91509150818380156113e25750815b9650965050505050509250929050565b5f806106a87f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686611df4565b5f805f61144d8585613816565b915091508015801561145d575081155b1561149e576040517f8eba4d0700000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b509392505050565b5f805f8512156114ec576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b845f036114fe57505f905060016116a8565b8460ff8416850185811215611549576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f805f8312156115b3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb383121561158a575f8095509550505050506116a8565b825f03600a0a91508184816115a1576115a1614974565b04955050840290911491506116a89050565b5f83131561169d57604d831315611609576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8161163e5761163e614974565b0484111561168b576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b50919091029250600191506116a89050565b509193506001925050505b935093915050565b5f805f8412156116ec576116c484846132d4565b90945092506116d48585856116b0565b90945092506116e384846113f2565b915091506116a8565b5f806116f88686611b56565b9092509050845f808061170b8585613978565b9194509250905061270d6127106117236001826149ce565b851461173a576117348d8686613a67565b90925090505b83156117c5575f61174c8660016149f4565b90505b80848583028161176157611761614974565b051461177857600a84059350600a8805975061174f565b6117b96117858588614a1b565b896117908785614a1b565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc613b20565b909d509b506117ec9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866117fd84835f611bbe565b6118088860016149f4565b61181291906149f4565b94509450505050935093915050565b5f80838361182f8282613bbd565b90965094505f86136118b057855f03611874576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b5050837f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000036118ee576118e483604c6149f4565b5f915091506116a8565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000008412158061193d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb561195f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412611b1a575f805f805f8561197857604b61197b565b604c5b611985908a6149f4565b90505f80876119b2577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000006119d3565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c81611a0557611a05614974565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050611a3e8c82613c13565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414611aca576123278114611aa557611a808c82600101613c13565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002611ac7565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50611afa838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613b20565b909a509850611b0b8a8a835f6130d0565b975097505050505050506116a8565b611b2485856113f2565b9095509350611b34868686611821565b9095509350611b4385856132d4565b92509250506116a8565b50935093915050565b5f805f8312611b6957508290505f6106ad565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4831215611b9b57505f9050826106ad565b5f839003600a0a808581611bb157611bb1614974565b0794859003959350505050565b5f818303611bcd575082610695565b82821315611c1057828203604c811380611be757505f8113155b15611bf5575f915050610695565b80600a0a8581611c0757611c07614974565b05915050610695565b818303604c811380611c2257505f8113155b15611c6a576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604481018490526064016108ce565b600a81900a85810286828281611c8257611c82614974565b0514611ccb576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604481018690526064016108ce565b9250610695915050565b5f8085158415178015611ced575f92505f9150611dea565b611cf784876149f4565b91505f611d0388613c9a565b90505f611d0f87613c9a565b90505f611d1c8383613d00565b5090505f6f0785ee10d5da46d900f436a000000000821115611d51576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115611d7257670de0b6b3a7640000820491506012015b633b9aca00821115611d8b57633b9aca00820491506009015b612710821115611da057612710820491506004015b8115611db457600a82049150600101611da0565b611dbe81876149f4565b9550611de08b8a611dda8787611dd587600a614b84565b613d3b565b89613e20565b9097509550505050505b5094509492505050565b5f80835f03611e39576040517f7a97930f00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b855f03611e4a57505f90508061240f565b5f805f80611e588a8a613f27565b919b5099509150611e698888613f27565b919950975090505f611e7a8b613c9a565b90505f611e868a613c9a565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c818310156122a3578415611ee457507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b612262565b6f4b3b4ca85a86c47a098a22400000000083101561201057678ac7230489e80000831015611f74576402540be400831015611f4257620186a0831015611f325750620186a0905060056121eb565b506402540be4009050600a6121eb565b655af3107a4000831015611f615750655af3107a40009050600e6121eb565b50678ac7230489e80000905060136121eb565b6b204fce5e3e25026110000000831015611fc65769152d02c7e14af6800000831015611faf575069152d02c7e14af6800000905060176121eb565b506b204fce5e3e250261100000009050601c6121eb565b6d314dc6448d9338c15b0a00000000831015611ff557506d314dc6448d9338c15b0a00000000905060216121eb565b506f4b3b4ca85a86c47a098a224000000000905060266121eb565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156121085773af298d050e4395d69670b12b7f410000000000008310156120a3577172cb5bd86321e38cb6ce6682e8000000000083101561208457507172cb5bd86321e38cb6ce6682e800000000009050602b6121eb565b5073af298d050e4395d69670b12b7f41000000000000905060306121eb565b76010b46c6cdd6e3e0828f4db456ff0c8ea00000000000008310156120e4575076010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000905060356121eb565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a6121eb565b7c03b58e88c75313ec9d329eaaa18fb92f75215b1710000000000000000083101561219e577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561217657507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f6121eb565b507c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000905060446121eb565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000008310156121eb57507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b81831161221f57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016121eb565b815f03612262576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c90526044016108ce565b856122a3576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e90526044016108ce565b807f8000000000000000000000000000000000000000000000000000000000000000018d126122d657808d039c50612349565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f81131561234957807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b1361233657998a0199612349565b5f8099509950505050505050505061240f565b5f808e12801561235857505f8c135b15612395577f80000000000000000000000000000000000000000000000000000000000000008e01808d1361238d575f612391565b808d035b9150505b8b818f010397506123b28f8e6123ac888789613d3b565b8b613e20565b90995097505f8113156123fc57604c8113156123dc575f809a509a5050505050505050505061240f565b80600a0a89816123ee576123ee614974565b059850885f036123fc575f97505b5096985094965061240f95505050505050565b94509492505050565b5f61242585858585613200565b1495945050505050565b60608161243c8482613bbd565b90945092505f8061246d7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000087614b8f565b1561249d57507f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000009050604c6124c4565b507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b5b5f6124cf8388614b8f565b90505f6124dc8489614bf6565b90505f808312156124f6575060016124f383614c09565b92505b5f82121561250d5750600161250a82614c09565b91505b60408051602081019091525f81528215612616575f8061252e600a89614c39565b90505b61253b8186614b8f565b5f036125605761254c600a82614c39565b90508161255881614c4c565b925050612531565b60408051602081019091525f8082525b838110156125c157816040516020016125899190614c9a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529150600101612570565b505b6125ce600a87614bf6565b5f036125e6576125df600a87614b8f565b95506125c3565b806125f0876141c8565b604051602001612601929190614cd2565b60405160208183030381529060405293505050505b5f612620856141c8565b90505f61262d878c6149f4565b9050637fffffff81138061266057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000081125b1561269a576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018a90526024016108ce565b5f81156126ce576126aa826141c8565b6040516020016126ba9190614d14565b6040516020818303038152906040526126de565b60405180602001604052805f8152505b90505f856126fa5760405180602001604052805f815250612731565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90508084868460405160200161274a9493929190614d45565b6040516020818303038152906040529b50505050505050505050505092915050565b60606103e882138061278757506127846103e8614c09565b82125b156127c1576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018390526024016108ce565b5f8084129081156127dc576127d585614c09565b90506127df565b50835b5f8413156128a2578360448110612825576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5b8281101561286157612857600a83614c39565b9150600101612844565b508083111561289f576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018790526024016108ce565b50505b5f6128ac82614254565b80519091505f5b818110801561292f575082816128ca600185614d65565b6128d49190614d65565b815181106128e4576128e4614d78565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f3000000000000000000000000000000000000000000000000000000000000000145b15612946578061293e81614c4c565b9150506128b3565b5f6129518284614d65565b90505f61295e838a6149f4565b90505f8761297a5760405180602001604052805f8152506129b1565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90505f8212612b2b57815f6129c68286614da5565b67ffffffffffffffff8111156129de576129de614855565b6040519080825280601f01601f191660200182016040528015612a08576020820181803683370190505b5090505f5b85811015612a7a57888181518110612a2757612a27614d78565b602001015160f81c60f81b828281518110612a4457612a44614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a0d565b505f5b82811015612af7577f300000000000000000000000000000000000000000000000000000000000000082612ab18389614da5565b81518110612ac157612ac1614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a7d565b508281604051602001612b0b929190614db8565b6040516020818303038152906040529a5050505050505050505050610684565b5f612b3583614c09565b905080841115612d4c575f612b4a8286614d65565b90505f612b58866001614da5565b67ffffffffffffffff811115612b7057612b70614855565b6040519080825280601f01601f191660200182016040528015612b9a576020820181803683370190505b5090505f5b82811015612c0c57898181518110612bb957612bb9614d78565b602001015160f81c60f81b828281518110612bd657612bd6614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612b9f565b507f2e00000000000000000000000000000000000000000000000000000000000000818381518110612c4057612c40614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b83811015612d175789612c838285614da5565b81518110612c9357612c93614d78565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612cc7866001614da5565b612cd19190614da5565b81518110612ce157612ce1614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612c70565b508381604051602001612d2b929190614db8565b6040516020818303038152906040529b505050505050505050505050610684565b5f612d578583614d65565b90505f85612d66836002614da5565b612d709190614da5565b67ffffffffffffffff811115612d8857612d88614855565b6040519080825280601f01601f191660200182016040528015612db2576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110612de857612de8614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f2e0000000000000000000000000000000000000000000000000000000000000081600181518110612e4a57612e4a614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b82811015612ef5577f300000000000000000000000000000000000000000000000000000000000000082612eaf836002614da5565b81518110612ebf57612ebf614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612e7a565b505f5b86811015612d1757898181518110612f1257612f12614d78565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612f46866002614da5565b612f509190614da5565b81518110612f6057612f60614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612ef8565b5f805f805f612fa5878761391c565b92509250925080612fec576040517fc471796600000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016108ce565b50909590945092505050565b5f805f6130058585613816565b915091508061149e576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b5f8061305684846132d4565b9094509250613067868686866130d0565b9150915094509492505050565b5f805f6130828686866114a6565b91509150806130c7576040517f05e4767800000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b50949350505050565b5f80851584151780156130fc57865f036130f0578484925092505061240f565b8686925092505061240f565b6131068787613bbd565b90975095506131158585613bbd565b909550935085841315613129579395929492935b838603604c81111561314257878793509350505061240f565b80600a0a868161315457613154614974565b0595505086850180881860ff90811c151589881890911c151680156131ef57877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036131d6576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a9052602481018990526044016108ce565b600a9687900596909805860197600197909701966131f3565b8198505b5096979596505050505050565b5f8085158415178187128286121817858414178015613225578685925092505061240f565b505f85841315613239575092949193919260015b8386035f8112604c821317801561326c57821561325e575f899450945050505061240f565b885f9450945050505061240f565b600a82900a8981028a82828161328457613284614974565b05146132b05784156132a0575f8b96509650505050505061240f565b8a5f96509650505050505061240f565b84156132c557889650945061240f9350505050565b955087945061240f9350505050565b5f807f8000000000000000000000000000000000000000000000000000000000000000840361336d577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303613360576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101859052602481018490526044016108ce565b600a840593508260010192505b50505f9190910391565b5f82818061338c838665200000000000614310565b925085831415836133a681886703ff000000000000614310565b94508085036133e057507f34bd20690000000000000000000000000000000000000000000000000000000094505f925082915061380d9050565b5f806133ec8a88614339565b90925090507fffffffff0000000000000000000000000000000000000000000000000000000082161561342a575095505f935083925061380d915050565b86519095506540000000000060015f9290921a9190911b1615158887101691505080156136b957506001909301925f8461346d81896703ff000000000000614310565b95508086036134a857507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f935083925061380d915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613517577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016134aa565b81811461356e575f8061352a8484614339565b90925090507fffffffff0000000000000000000000000000000000000000000000000000000082161561356a575097505f955085945061380d9350505050565b9350505b5f8312156135a957507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f945084935061380d92505050565b83156135b557825f0392505b80820394505f8513156135f557507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f945084935061380d92505050565b855f03613604578295506136b6565b5f859003604381111561364557507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f955085945061380d9350505050565b600a0a8681025f8883838161365c5761365c614974565b0514159050601b82900b82141581806136725750805b156136ae57507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f985088975061380d9650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b1615158786101680156137fe57600190950194856136f9818a65200000000000614310565b96508661370f818b6703ff000000000000614310565b975080880361374c57507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f955085945061380d9350505050565b505f80613759838a614339565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613799575097505f955085945061380d9350505050565b9250508482015f831380156137ad57508581125b806137c157505f831280156137c157508581135b156137fa57507fd556b1110000000000000000000000000000000000000000000000000000000097505f955085945061380d9350505050565b9450505b845f03613809575f93505b5050505b92959194509250565b5f601b83900b831483838261387a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561385a57620186a0860595506005850194505b8586601b0b1461387557600a8605955084600101945061385a565b613890565b855f0361389057505f9250600191506106ad9050565b848560030b146138ec575f8512156138b057505f92508291506106ad9050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86111561396757600a860460018201600a88065f1493509350935050613971565b8593509150600190505b9250925092565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc036139b057508391505f90506001613971565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc841215613a3e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0841215613a0f57505f9150508215156001613971565b5f846004015f03600a0a90505f818781613a2b57613a2b614974565b0594505080840286141592509050613971565b5f8412613a5357505f91508190506001613971565b50505060048101600a0a82025f6001613971565b5f80806064613a79600a612328614c39565b613a86600a612328614c39565b613a91906002614dc6565b613a9c906001614da5565b613aa69190614da5565b613ab09190614da5565b9050613af4565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b613aff858288613ab7565b92508315611b4d57613b15600186018288613ab7565b915050935093915050565b5f80888803613b33575083905081613bb1565b5f805f80613b438c8b8f8d61304a565b915091505f80613b558a8a8d8c61304a565b91509150613b6584848484611cd5565b8096508197505050505050505f80613b7f8b8b8f8d61304a565b915091505f80613b9186868686611df4565b915091505f80613ba384848f8e6130d0565b909a50985050505050505050505b97509795505050505050565b5f805f805f613bcc8787613f27565b92509250925080612fec576040517f05e51ecb00000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f80613c22600a612328614c39565b613c2d906002614dc6565b613c38906001614da5565b90505f613c48600a612328614c39565b90506002600a8504026001015f8052600281601e883c505f51617fff81169350618000811615613c7757918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f80821215613cf7577f80000000000000000000000000000000000000000000000000000000000000008203613cf157507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b919050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f613d488686613d00565b91509150815f03613d6c57838181613d6257613d62614974565b0492505050610695565b838210613db6576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016108ce565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215613eea577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613ed757613e7f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001614da5565b8403613eaf57507f800000000000000000000000000000000000000000000000000000000000000090508161240f565b613eba600a85614c39565b613ec390614c09565b613ece8460016149f4565b9150915061240f565b613ee084614c09565b839150915061240f565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613f1d57613ec3600a85614c39565b508290508161240f565b5f805f845f03613f3f57505f91508190506001613971565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f03614153576f4b3b4ca85a86c47a098a2240000000008505158015613fa857507f80000000000000000000000000000000000000000000000000000000000000268412155b15613fc9576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a00000000000000850515801561401157507f80000000000000000000000000000000000000000000000000000000000000138412155b1561402a57678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000850515801561407657507f800000000000000000000000000000000000000000000000000000000000000a8412155b1561408c576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000085051580156140db57507f80000000000000000000000000000000000000000000000000000000000000028412155b156140f15760648502945060028403935061408c565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000850515801561414157507f80000000000000000000000000000000000000000000000000000000000000018412155b1561415357600a850294506001840393505b600a8086029081058614801561418957507f80000000000000000000000000000000000000000000000000000000000000018512155b15614198578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b60605f82126141e55760405180602001604052805f81525061421c565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b61422d60ff84901d80850118614254565b60405160200161423e929190614db8565b6040516020818303038152906040529050919050565b60605f61426083614463565b60010190505f8167ffffffffffffffff81111561427f5761427f614855565b6040519080825280601f01601f1916602001820160405280156142a9576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846142b357509392505050565b5f5b5f82600186515f1a1b1611838510161561433157600184019350614312565b509192915050565b81515f90819065200000000000600191831a9190911b161515838510168085019082806143668488614544565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156143a1575093505f92506106ad915050565b825f03614404577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81116143d5575f6143f7565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b955093506106ad92505050565b7f80000000000000000000000000000000000000000000000000000000000000008111614431575f614453565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106144ab577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106144d7576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106144f557662386f26fc10000830492506010015b6305f5e100831061450d576305f5e100830492506008015b612710831061452157612710830492506004015b60648310614533576064830492506002015b600a83106106845760010192915050565b5f8082841061457757507f34bd20690000000000000000000000000000000000000000000000000000000090505f6106ad565b835f036145b0576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b8782101580156145e85750604d83105b1561462b57815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a85900302016145d8565b8782106147515781515f1a849003600181111561467357507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b600a84900a81028281018311156146b657507f0fdc26350000000000000000000000000000000000000000000000000000000096505f95506106ad945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b8782106147515781515f1a6030811461472657507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101906146e2565b5f9890975095505050505050565b5f6020828403121561476f575f80fd5b5035919050565b5f8060408385031215614787575f80fd5b50508035926020909101359150565b803560ff81168114613cfb575f80fd5b5f80604083850312156147b7575f80fd5b823591506147c760208401614796565b90509250929050565b5f80604083850312156147e1575f80fd5b82359150602083013580151581146147f7575f80fd5b809150509250929050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215614892575f80fd5b813567ffffffffffffffff808211156148a9575f80fd5b818401915084601f8301126148bc575f80fd5b8135818111156148ce576148ce614855565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561491457614914614855565b8160405282815287602084870101111561492c575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f6060848603121561495d575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181035f8312801583831316838312821617156149ed576149ed6149a1565b5092915050565b8082018281125f831280158216821582161715614a1357614a136149a1565b505092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615614a5257614a526149a1565b8181058314821517610684576106846149a1565b600181815b80851115614abf57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614aa557614aa56149a1565b80851615614ab257918102915b93841c9390800290614a6b565b509250929050565b5f82614ad557506001610684565b81614ae157505f610684565b8160018114614af75760028114614b0157614b1d565b6001915050610684565b60ff841115614b1257614b126149a1565b50506001821b610684565b5060208310610133831016604e8410600b8410161715614b40575081810a610684565b614b4a8383614a66565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614b7c57614b7c6149a1565b029392505050565b5f6106958383614ac7565b5f82614b9d57614b9d614974565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614bf157614bf16149a1565b500590565b5f82614c0457614c04614974565b500790565b5f7f80000000000000000000000000000000000000000000000000000000000000008203613cf157613cf16149a1565b5f82614c4757614c47614974565b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c7c57614c7c6149a1565b5060010190565b5f81518060208401855e5f93019283525090919050565b5f614ca58284614c83565b7f300000000000000000000000000000000000000000000000000000000000000081526001019392505050565b7f2e0000000000000000000000000000000000000000000000000000000000000081525f614d0c614d066001840186614c83565b84614c83565b949350505050565b7f650000000000000000000000000000000000000000000000000000000000000081525f6106956001830184614c83565b5f610a29614d06614d5f614d59858a614c83565b88614c83565b86614c83565b81810381811115610684576106846149a1565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b80820180821115610684576106846149a1565b5f614d0c614d068386614c83565b8082028115828204841417610684576106846149a156" + "object": "0x6080604052348015600e575f80fd5b5060156019565b60b8565b73c51a14251b0dcf0ae24a96b7153991378938f5f53f7f2573004ac3a9ee7fc8d73654d76386f1b6b99e34cdf86a689c4691e47143420f811460b557604051630912d0ff60e31b815273c51a14251b0dcf0ae24a96b7153991378938f5f560048201527f2573004ac3a9ee7fc8d73654d76386f1b6b99e34cdf86a689c4691e47143420f60248201526044810182905260640160405180910390fd5b50565b614e19806100c55f395ff3fe608060405234801561000f575f80fd5b506004361061029d575f3560e01c806381f7e2f511610171578063cde72ef3116100d2578063dd64691711610088578063e5526ecd1161006e578063e5526ecd1461062e578063e75f991f14610641578063ffae15ba14610654575f80fd5b8063dd64691714610608578063e0db58881461061b575f80fd5b8063d1de592a116100b8578063d1de592a146105bb578063d35273a7146105ce578063d3d6ffa8146105f5575f80fd5b8063cde72ef314610582578063d102b4d3146105a8575f80fd5b8063a19684b711610127578063bc1b392d1161010d578063bc1b392d1461050b578063bc62d8d814610511578063cb09682b1461055c575f80fd5b8063a19684b7146104d2578063a90d041a146104f8575f80fd5b806396ce1ec71161015757806396ce1ec7146104885780639b4afd991461049b578063a100a3d9146104bf575f80fd5b806381f7e2f5146104625780638dc2980714610475575f80fd5b80633447c0301161021b5780635ca0e7a4116101d1578063719cd99d116101b7578063719cd99d1461042957806373bfb2831461043c57806381a822721461044f575f80fd5b80635ca0e7a4146103f0578063602c35fc14610403575f80fd5b80633b3bd868116102015780633b3bd868146103b757806341aa0080146103ca5780635b23771d146103dd575f80fd5b80633447c03014610374578063371493ce14610397575f80fd5b80631ee62f111161027057806328fa1f011161025657806328fa1f011461033b5780633004fa411461034e5780633029740014610361575f80fd5b80631ee62f11146103155780632538835014610328575f80fd5b806304327dc5146102a1578063078b665b146102c75780630b6429bc146102da578063146e82ad14610302575b5f80fd5b6102b46102af36600461479b565b61067a565b6040519081526020015b60405180910390f35b6102b46102d53660046147b2565b61068a565b6102ed6102e83660046147e2565b61069c565b604080519283529015156020830152016102be565b6102b461031036600461479b565b6106b4565b6102b461032336600461479b565b6106d3565b6102b461033636600461479b565b6106f2565b6102b461034936600461479b565b610711565b6102b461035c3660046147b2565b61071b565b6102b461036f3660046147b2565b61073b565b6103876103823660046147b2565b610746565b60405190151581526020016102be565b6103aa6103a536600461480c565b610751565b6040516102be919061483e565b6102b46103c53660046147e2565b61075d565b6102b46103d83660046147b2565b610768565b6102b46103eb3660046147e2565b610773565b6102b46103fe36600461479b565b61077e565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b6102b461043736600461479b565b610788565b61038761044a3660046147b2565b610792565b6102b461045d36600461479b565b61079d565b6103876104703660046147b2565b6107a7565b6103876104833660046147b2565b6107b2565b6102b46104963660046147b2565b6107bd565b6102b47c090000000000000000000000000000000000000000000000000000000181565b6103aa6104cd36600461479b565b6107c8565b7f80000000000000000000000000000000000000000000000000000000000000016102b4565b6102b46105063660046147b2565b610812565b5f6102b4565b61052461051f3660046148be565b61081d565b604080517fffffffff0000000000000000000000000000000000000000000000000000000090931683526020830191909152016102be565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b7f7fffffff800000000000000000000000000000000000000000000000000000006102b4565b6103876105b63660046147b2565b610836565b6102b46105c93660046147b2565b610841565b6102b47ffffffffc0000000000000000000000000000000000000000000000000000000181565b6102b461060336600461479b565b61084c565b61038761061636600461479b565b610856565b6102b461062936600461479b565b61087c565b6103aa61063c366004614987565b610886565b6102ed61064f3660046147e2565b61090f565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc6102b4565b5f6106848261091b565b92915050565b5f610695838361095d565b9392505050565b5f806106a88484610979565b915091505b9250929050565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109ba565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109e6565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f5610a33565b5f61068482610a66565b5f610695838373c51a14251b0dcf0ae24a96b7153991378938f5f5610aa7565b5f6106958383610d01565b5f6106958383610d63565b60606106958383610db1565b5f6106958383610e44565b5f6106958383610e5f565b5f6106958383610ea4565b5f61068482610ed7565b5f61068482610f8d565b5f6106958383611039565b5f6106848261107c565b5f61069583836110c1565b5f6106958383611104565b5f6106958383611147565b6060610684827ffffffffc000000000000000000000000000000000000000000000000000000017c0900000000000000000000000000000000000000000000000000000001610886565b5f610695838361118c565b5f805f8061082a85611197565b90969095509350505050565b5f6106958383611285565b5f61069583836112c8565b5f6106848261130d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821615610684565b5f6106848261133f565b60606108928383611285565b6108d7576040517f3be5bf9400000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044015b60405180910390fd5b5f6108e18561107c565b9050610906856108f18387611285565b8061090157506109018386611104565b610db1565b95945050505050565b5f806106a88484611380565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826113c0565b90925090505f610906838361140e565b5f6109688383611104565b6109725781610695565b5090919050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6109ad828287611474565b9350935050509250929050565b5f610695837fffffffff0000000000000000000000000000000000000000000000000000000584610aa7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a1984838361167e565b90925090505f610a29838361140e565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a198483836117ef565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82610a998383611b24565b9150505f610a29828461140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516610ae45750600191506106959050565b5f8213610b7d57815f03610b4157610afc855f611285565b15610b36576040517f8be82972000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b505f91506106959050565b6040517fcceba0f100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b610b88856001610d63565b8015610b995750610b99865f611104565b15610ba8578592505050610695565b610bb2855f611285565b15610bdb57610bd2610bc38761091b565b610bcc8761130d565b86610aa7565b92505050610695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80610c0e8484611b24565b915091505f610c1e83855f611b8c565b905060015f8080610c558f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510610c9c5784600116600103610c7f57610c7984848484611ca3565b90945092505b600185901c9450610c9282828484611ca3565b9092509050610c5a565b5f80610ca98f8e8e6117ef565b91509150610cb982828a8d611ca3565b9092509050610cc98f838361167e565b9092509050610cda82828888611ca3565b90925090505f610cea838361140e565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611dc2565b915091505f610d55838361140e565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846123e6565b979650505050505050565b60607bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d5f829003610e21576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525092505050610684565b8315610e3a57610e3182826123fd565b92505050610684565b610906828261273a565b5f805f610e518585612f64565b915091506109068282612fc6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686613018565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610906828286613042565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610f0e57509192915050565b5f80610f1a8484611b24565b915091505f84128015610f2c57508015155b15610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613018565b935091505b5f610da6838561140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610fc457509192915050565b5f80610fd08484611b24565b91509150805f03610fe5575093949350505050565b5f811315610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb461309e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846131ce565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828212156110b65761094d82826131ea565b5f610906838361140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da68484848461328d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846132a9565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611ca3565b5f6109688383611285565b80515f908190602084810191850101828080806111b486866132c4565b929650909450925090507fffffffff0000000000000000000000000000000000000000000000000000000084165f0361127657848303611246575f806111fa8484613763565b915091508061123557507f32b8b8be000000000000000000000000000000000000000000000000000000009a5f9a5098505050505050505050565b505f9a909950975050505050505050565b507fad384e8700000000000000000000000000000000000000000000000000000000985f98509650505050505050565b5091975f975095505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da684848484613869565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d468686868661309e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826131ea565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d826113728383611b24565b5090505f610a29828461140e565b5f805f805f61138f8787613884565b9250925092505f806113a18585613763565b91509150818380156113b05750815b9650965050505050509250929050565b5f806106a87f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686611dc2565b5f805f61141b8585613763565b915091508015801561142b575081155b1561146c576040517f8eba4d0700000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b509392505050565b5f805f8512156114ba576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b845f036114cc57505f90506001611676565b8460ff8416850185811215611517576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f805f831215611581577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3831215611558575f809550955050505050611676565b825f03600a0a915081848161156f5761156f6149b0565b04955050840290911491506116769050565b5f83131561166b57604d8313156115d7576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8161160c5761160c6149b0565b04841115611659576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b50919091029250600191506116769050565b509193506001925050505b935093915050565b5f805f8412156116ba5761169284846131ea565b90945092506116a285858561167e565b90945092506116b184846113c0565b91509150611676565b5f806116c68686611b24565b9092509050845f80806116d985856138e0565b9194509250905061270d6127106116f1600182614a0a565b8514611708576117028d86866139cf565b90925090505b8315611793575f61171a866001614a30565b90505b80848583028161172f5761172f6149b0565b051461174657600a84059350600a8805975061171d565b6117876117538588614a57565b8961175e8785614a57565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc613a88565b909d509b506117ba9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866117cb84835f611b8c565b6117d6886001614a30565b6117e09190614a30565b94509450505050935093915050565b5f8083836117fd8282613b25565b90965094505f861361187e57855f03611842576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b5050837f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000036118bc576118b283604c614a30565b5f91509150611676565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000008412158061190b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb561192d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412611ae8575f805f805f8561194657604b611949565b604c5b611953908a614a30565b90505f8087611980577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000006119a1565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c816119d3576119d36149b0565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050611a0c8c82613b7b565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414611a98576123278114611a7357611a4e8c82600101613b7b565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002611a95565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50611ac8838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613a88565b909a509850611ad98a8a835f61309e565b97509750505050505050611676565b611af285856113c0565b9095509350611b028686866117ef565b9095509350611b1185856131ea565b9250925050611676565b50935093915050565b5f805f8312611b3757508290505f6106ad565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4831215611b6957505f9050826106ad565b5f839003600a0a808581611b7f57611b7f6149b0565b0794859003959350505050565b5f818303611b9b575082610695565b82821315611bde57828203604c811380611bb557505f8113155b15611bc3575f915050610695565b80600a0a8581611bd557611bd56149b0565b05915050610695565b818303604c811380611bf057505f8113155b15611c38576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604481018490526064016108ce565b600a81900a85810286828281611c5057611c506149b0565b0514611c99576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604481018690526064016108ce565b9250610695915050565b5f8085158415178015611cbb575f92505f9150611db8565b611cc58487614a30565b91505f611cd188613c02565b90505f611cdd87613c02565b90505f611cea8383613c68565b5090505f6f0785ee10d5da46d900f436a000000000821115611d1f576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115611d4057670de0b6b3a7640000820491506012015b633b9aca00821115611d5957633b9aca00820491506009015b612710821115611d6e57612710820491506004015b8115611d8257600a82049150600101611d6e565b611d8c8187614a30565b9550611dae8b8a611da88787611da387600a614bc0565b613ca3565b89613d88565b9097509550505050505b5094509492505050565b5f80835f03611e07576040517f7a97930f00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b855f03611e1857505f9050806123dd565b5f805f80611e268a8a613e8f565b919b5099509150611e378888613e8f565b919950975090505f611e488b613c02565b90505f611e548a613c02565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c81831015612271578415611eb257507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b612230565b6f4b3b4ca85a86c47a098a224000000000831015611fde57678ac7230489e80000831015611f42576402540be400831015611f1057620186a0831015611f005750620186a0905060056121b9565b506402540be4009050600a6121b9565b655af3107a4000831015611f2f5750655af3107a40009050600e6121b9565b50678ac7230489e80000905060136121b9565b6b204fce5e3e25026110000000831015611f945769152d02c7e14af6800000831015611f7d575069152d02c7e14af6800000905060176121b9565b506b204fce5e3e250261100000009050601c6121b9565b6d314dc6448d9338c15b0a00000000831015611fc357506d314dc6448d9338c15b0a00000000905060216121b9565b506f4b3b4ca85a86c47a098a224000000000905060266121b9565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156120d65773af298d050e4395d69670b12b7f41000000000000831015612071577172cb5bd86321e38cb6ce6682e8000000000083101561205257507172cb5bd86321e38cb6ce6682e800000000009050602b6121b9565b5073af298d050e4395d69670b12b7f41000000000000905060306121b9565b76010b46c6cdd6e3e0828f4db456ff0c8ea00000000000008310156120b2575076010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000905060356121b9565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a6121b9565b7c03b58e88c75313ec9d329eaaa18fb92f75215b1710000000000000000083101561216c577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561214457507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f6121b9565b507c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000905060446121b9565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000008310156121b957507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b8183116121ed57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016121b9565b815f03612230576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c90526044016108ce565b85612271576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e90526044016108ce565b807f8000000000000000000000000000000000000000000000000000000000000000018d126122a457808d039c50612317565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f81131561231757807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b1361230457998a0199612317565b5f809950995050505050505050506123dd565b5f808e12801561232657505f8c135b15612363577f80000000000000000000000000000000000000000000000000000000000000008e01808d1361235b575f61235f565b808d035b9150505b8b818f010397506123808f8e61237a888789613ca3565b8b613d88565b90995097505f8113156123ca57604c8113156123aa575f809a509a505050505050505050506123dd565b80600a0a89816123bc576123bc6149b0565b059850885f036123ca575f97505b509698509496506123dd95505050505050565b94509492505050565b5f6123f385858585614130565b1495945050505050565b60608161240a8482613b25565b90945092505f8061243b7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000087614bcb565b1561246b57507f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000009050604c612492565b507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b5b5f61249d8388614bcb565b90505f6124aa8489614c32565b90505f808312156124c4575060016124c183614c45565b92505b5f8212156124db575060016124d882614c45565b91505b60408051602081019091525f815282156125e4575f806124fc600a89614c75565b90505b6125098186614bcb565b5f0361252e5761251a600a82614c75565b90508161252681614c88565b9250506124ff565b60408051602081019091525f8082525b8381101561258f57816040516020016125579190614cd6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052915060010161253e565b505b61259c600a87614c32565b5f036125b4576125ad600a87614bcb565b9550612591565b806125be87614204565b6040516020016125cf929190614d0e565b60405160208183030381529060405293505050505b5f6125ee85614204565b90505f6125fb878c614a30565b9050637fffffff81138061262e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000081125b15612668576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018a90526024016108ce565b5f811561269c5761267882614204565b6040516020016126889190614d50565b6040516020818303038152906040526126ac565b60405180602001604052805f8152505b90505f856126c85760405180602001604052805f8152506126ff565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b9050808486846040516020016127189493929190614d81565b6040516020818303038152906040529b50505050505050505050505092915050565b60606103e882138061275557506127526103e8614c45565b82125b1561278f576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018390526024016108ce565b5f8084129081156127aa576127a385614c45565b90506127ad565b50835b5f8413156128705783604481106127f3576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5b8281101561282f57612825600a83614c75565b9150600101612812565b508083111561286d576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018790526024016108ce565b50505b5f61287a82614290565b80519091505f5b81811080156128fd57508281612898600185614da1565b6128a29190614da1565b815181106128b2576128b2614db4565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f3000000000000000000000000000000000000000000000000000000000000000145b15612914578061290c81614c88565b915050612881565b5f61291f8284614da1565b90505f61292c838a614a30565b90505f876129485760405180602001604052805f81525061297f565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90505f8212612af957815f6129948286614de1565b67ffffffffffffffff8111156129ac576129ac614891565b6040519080825280601f01601f1916602001820160405280156129d6576020820181803683370190505b5090505f5b85811015612a48578881815181106129f5576129f5614db4565b602001015160f81c60f81b828281518110612a1257612a12614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506001016129db565b505f5b82811015612ac5577f300000000000000000000000000000000000000000000000000000000000000082612a7f8389614de1565b81518110612a8f57612a8f614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a4b565b508281604051602001612ad9929190614df4565b6040516020818303038152906040529a5050505050505050505050610684565b5f612b0383614c45565b905080841115612d1a575f612b188286614da1565b90505f612b26866001614de1565b67ffffffffffffffff811115612b3e57612b3e614891565b6040519080825280601f01601f191660200182016040528015612b68576020820181803683370190505b5090505f5b82811015612bda57898181518110612b8757612b87614db4565b602001015160f81c60f81b828281518110612ba457612ba4614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612b6d565b507f2e00000000000000000000000000000000000000000000000000000000000000818381518110612c0e57612c0e614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b83811015612ce55789612c518285614de1565b81518110612c6157612c61614db4565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612c95866001614de1565b612c9f9190614de1565b81518110612caf57612caf614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612c3e565b508381604051602001612cf9929190614df4565b6040516020818303038152906040529b505050505050505050505050610684565b5f612d258583614da1565b90505f85612d34836002614de1565b612d3e9190614de1565b67ffffffffffffffff811115612d5657612d56614891565b6040519080825280601f01601f191660200182016040528015612d80576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110612db657612db6614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f2e0000000000000000000000000000000000000000000000000000000000000081600181518110612e1857612e18614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b82811015612ec3577f300000000000000000000000000000000000000000000000000000000000000082612e7d836002614de1565b81518110612e8d57612e8d614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612e48565b505f5b86811015612ce557898181518110612ee057612ee0614db4565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612f14866002614de1565b612f1e9190614de1565b81518110612f2e57612f2e614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612ec6565b5f805f805f612f738787613884565b92509250925080612fba576040517fc471796600000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016108ce565b50909590945092505050565b5f805f612fd38585613763565b915091508061146c576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b5f8061302484846131ea565b90945092506130358686868661309e565b9150915094509492505050565b5f805f613050868686611474565b9150915080613095576040517f05e4767800000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b50949350505050565b5f80851584151780156130ca57865f036130be57848492509250506123dd565b868692509250506123dd565b6130d48787613b25565b90975095506130e38585613b25565b9095509350858413156130f7579395929492935b838603604c8111156131105787879350935050506123dd565b80600a0a8681613122576131226149b0565b0595505086850180881860ff90811c151589881890911c151680156131bd57877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036131a4576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a9052602481018990526044016108ce565b600a9687900596909805860197600197909701966131c1565b8198505b5096979596505050505050565b5f805f6131dd87878787614130565b1315979650505050505050565b5f807f80000000000000000000000000000000000000000000000000000000000000008403613283577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303613276576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101859052602481018490526044016108ce565b600a840593508260010192505b50505f9190910391565b5f805f61329c87878787614130565b1215979650505050505050565b5f805f6132b887878787614130565b12979650505050505050565b5f8281806132d983866520000000000061434c565b925085831415836132f381886703ff00000000000061434c565b945080850361332d57507f34bd20690000000000000000000000000000000000000000000000000000000094505f925082915061375a9050565b5f806133398a88614375565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613377575095505f935083925061375a915050565b86519095506540000000000060015f9290921a9190911b16151588871016915050801561360657506001909301925f846133ba81896703ff00000000000061434c565b95508086036133f557507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f935083925061375a915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613464577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016133f7565b8181146134bb575f806134778484614375565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156134b7575097505f955085945061375a9350505050565b9350505b5f8312156134f657507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f945084935061375a92505050565b831561350257825f0392505b80820394505f85131561354257507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f945084935061375a92505050565b855f0361355157829550613603565b5f859003604381111561359257507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b600a0a8681025f888383816135a9576135a96149b0565b0514159050601b82900b82141581806135bf5750805b156135fb57507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f985088975061375a9650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b16151587861016801561374b5760019095019485613646818a6520000000000061434c565b96508661365c818b6703ff00000000000061434c565b975080880361369957507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b505f806136a6838a614375565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156136e6575097505f955085945061375a9350505050565b9250508482015f831380156136fa57508581125b8061370e57505f8312801561370e57508581135b1561374757507fd556b1110000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b9450505b845f03613756575f93505b5050505b92959194509250565b5f601b83900b83148383826137c7577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156137a757620186a0860595506005850194505b8586601b0b146137c257600a860595508460010194506137a7565b6137dd565b855f036137dd57505f9250600191506106ad9050565b848560030b14613839575f8512156137fd57505f92508291506106ad9050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f61387887878787614130565b13979650505050505050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156138cf57600a860460018201600a88065f14935093509350506138d9565b8593509150600190505b9250925092565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0361391857508391505f905060016138d9565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8412156139a6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb084121561397757505f91505082151560016138d9565b5f846004015f03600a0a90505f818781613993576139936149b0565b05945050808402861415925090506138d9565b5f84126139bb57505f915081905060016138d9565b50505060048101600a0a82025f60016138d9565b5f808060646139e1600a612328614c75565b6139ee600a612328614c75565b6139f9906002614e02565b613a04906001614de1565b613a0e9190614de1565b613a189190614de1565b9050613a5c565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b613a67858288613a1f565b92508315611b1b57613a7d600186018288613a1f565b915050935093915050565b5f80888803613a9b575083905081613b19565b5f805f80613aab8c8b8f8d613018565b915091505f80613abd8a8a8d8c613018565b91509150613acd84848484611ca3565b8096508197505050505050505f80613ae78b8b8f8d613018565b915091505f80613af986868686611dc2565b915091505f80613b0b84848f8e61309e565b909a50985050505050505050505b97509795505050505050565b5f805f805f613b348787613e8f565b92509250925080612fba576040517f05e51ecb00000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f80613b8a600a612328614c75565b613b95906002614e02565b613ba0906001614de1565b90505f613bb0600a612328614c75565b90506002600a8504026001015f8052600281601e883c505f51617fff81169350618000811615613bdf57918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f80821215613c5f577f80000000000000000000000000000000000000000000000000000000000000008203613c5957507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b919050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f613cb08686613c68565b91509150815f03613cd457838181613cca57613cca6149b0565b0492505050610695565b838210613d1e576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016108ce565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215613e52577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613e3f57613de77f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001614de1565b8403613e1757507f80000000000000000000000000000000000000000000000000000000000000009050816123dd565b613e22600a85614c75565b613e2b90614c45565b613e36846001614a30565b915091506123dd565b613e4884614c45565b83915091506123dd565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613e8557613e2b600a85614c75565b50829050816123dd565b5f805f845f03613ea757505f915081905060016138d9565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f036140bb576f4b3b4ca85a86c47a098a2240000000008505158015613f1057507f80000000000000000000000000000000000000000000000000000000000000268412155b15613f31576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a000000000000008505158015613f7957507f80000000000000000000000000000000000000000000000000000000000000138412155b15613f9257678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008505158015613fde57507f800000000000000000000000000000000000000000000000000000000000000a8412155b15613ff4576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000850515801561404357507f80000000000000000000000000000000000000000000000000000000000000028412155b1561405957606485029450600284039350613ff4565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085051580156140a957507f80000000000000000000000000000000000000000000000000000000000000018412155b156140bb57600a850294506001840393505b600a808602908105861480156140f157507f80000000000000000000000000000000000000000000000000000000000000018512155b15614100578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f808515841517818712828612181785841417801561415557868592509250506123dd565b505f85841315614169575092949193919260015b8386035f8112604c821317801561419c57821561418e575f89945094505050506123dd565b885f945094505050506123dd565b600a82900a8981028a8282816141b4576141b46149b0565b05146141e05784156141d0575f8b9650965050505050506123dd565b8a5f9650965050505050506123dd565b84156141f55788965094506123dd9350505050565b95508794506123dd9350505050565b60605f82126142215760405180602001604052805f815250614258565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b61426960ff84901d80850118614290565b60405160200161427a929190614df4565b6040516020818303038152906040529050919050565b60605f61429c8361449f565b60010190505f8167ffffffffffffffff8111156142bb576142bb614891565b6040519080825280601f01601f1916602001820160405280156142e5576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846142ef57509392505050565b5f5b5f82600186515f1a1b1611838510161561436d5760018401935061434e565b509192915050565b81515f90819065200000000000600191831a9190911b161515838510168085019082806143a28488614580565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156143dd575093505f92506106ad915050565b825f03614440577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111614411575f614433565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b955093506106ad92505050565b7f8000000000000000000000000000000000000000000000000000000000000000811161446d575f61448f565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106144e7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310614513576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061453157662386f26fc10000830492506010015b6305f5e1008310614549576305f5e100830492506008015b612710831061455d57612710830492506004015b6064831061456f576064830492506002015b600a83106106845760010192915050565b5f808284106145b357507f34bd20690000000000000000000000000000000000000000000000000000000090505f6106ad565b835f036145ec576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b8782101580156146245750604d83105b1561466757815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a8590030201614614565b87821061478d5781515f1a84900360018111156146af57507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b600a84900a81028281018311156146f257507f0fdc26350000000000000000000000000000000000000000000000000000000096505f95506106ad945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b87821061478d5781515f1a6030811461476257507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091019061471e565b5f9890975095505050505050565b5f602082840312156147ab575f80fd5b5035919050565b5f80604083850312156147c3575f80fd5b50508035926020909101359150565b803560ff81168114613c63575f80fd5b5f80604083850312156147f3575f80fd5b82359150614803602084016147d2565b90509250929050565b5f806040838503121561481d575f80fd5b8235915060208301358015158114614833575f80fd5b809150509250929050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f602082840312156148ce575f80fd5b813567ffffffffffffffff808211156148e5575f80fd5b818401915084601f8301126148f8575f80fd5b81358181111561490a5761490a614891565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561495057614950614891565b81604052828152876020848701011115614968575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215614999575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181035f831280158383131683831282161715614a2957614a296149dd565b5092915050565b8082018281125f831280158216821582161715614a4f57614a4f6149dd565b505092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615614a8e57614a8e6149dd565b8181058314821517610684576106846149dd565b600181815b80851115614afb57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614ae157614ae16149dd565b80851615614aee57918102915b93841c9390800290614aa7565b509250929050565b5f82614b1157506001610684565b81614b1d57505f610684565b8160018114614b335760028114614b3d57614b59565b6001915050610684565b60ff841115614b4e57614b4e6149dd565b50506001821b610684565b5060208310610133831016604e8410600b8410161715614b7c575081810a610684565b614b868383614aa2565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614bb857614bb86149dd565b029392505050565b5f6106958383614b03565b5f82614bd957614bd96149b0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614c2d57614c2d6149dd565b500590565b5f82614c4057614c406149b0565b500790565b5f7f80000000000000000000000000000000000000000000000000000000000000008203613c5957613c596149dd565b5f82614c8357614c836149b0565b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614cb857614cb86149dd565b5060010190565b5f81518060208401855e5f93019283525090919050565b5f614ce18284614cbf565b7f300000000000000000000000000000000000000000000000000000000000000081526001019392505050565b7f2e0000000000000000000000000000000000000000000000000000000000000081525f614d48614d426001840186614cbf565b84614cbf565b949350505050565b7f650000000000000000000000000000000000000000000000000000000000000081525f6106956001830184614cbf565b5f610a29614d42614d9b614d95858a614cbf565b88614cbf565b86614cbf565b81810381811115610684576106846149dd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b80820180821115610684576106846149dd565b5f614d48614d428386614cbf565b8082028115828204841417610684576106846149dd56" }, "deployedBytecode": { - "object": "0x608060405234801561000f575f80fd5b506004361061029d575f3560e01c806381f7e2f511610171578063cde72ef3116100d2578063dd64691711610088578063e5526ecd1161006e578063e5526ecd1461062e578063e75f991f14610641578063ffae15ba14610654575f80fd5b8063dd64691714610608578063e0db58881461061b575f80fd5b8063d1de592a116100b8578063d1de592a146105bb578063d35273a7146105ce578063d3d6ffa8146105f5575f80fd5b8063cde72ef314610582578063d102b4d3146105a8575f80fd5b8063a19684b711610127578063bc1b392d1161010d578063bc1b392d1461050b578063bc62d8d814610511578063cb09682b1461055c575f80fd5b8063a19684b7146104d2578063a90d041a146104f8575f80fd5b806396ce1ec71161015757806396ce1ec7146104885780639b4afd991461049b578063a100a3d9146104bf575f80fd5b806381f7e2f5146104625780638dc2980714610475575f80fd5b80633447c0301161021b5780635ca0e7a4116101d1578063719cd99d116101b7578063719cd99d1461042957806373bfb2831461043c57806381a822721461044f575f80fd5b80635ca0e7a4146103f0578063602c35fc14610403575f80fd5b80633b3bd868116102015780633b3bd868146103b757806341aa0080146103ca5780635b23771d146103dd575f80fd5b80633447c03014610374578063371493ce14610397575f80fd5b80631ee62f111161027057806328fa1f011161025657806328fa1f011461033b5780633004fa411461034e5780633029740014610361575f80fd5b80631ee62f11146103155780632538835014610328575f80fd5b806304327dc5146102a1578063078b665b146102c75780630b6429bc146102da578063146e82ad14610302575b5f80fd5b6102b46102af36600461475f565b61067a565b6040519081526020015b60405180910390f35b6102b46102d5366004614776565b61068a565b6102ed6102e83660046147a6565b61069c565b604080519283529015156020830152016102be565b6102b461031036600461475f565b6106b4565b6102b461032336600461475f565b6106d3565b6102b461033636600461475f565b6106f2565b6102b461034936600461475f565b610711565b6102b461035c366004614776565b61071b565b6102b461036f366004614776565b61073b565b610387610382366004614776565b610746565b60405190151581526020016102be565b6103aa6103a53660046147d0565b610751565b6040516102be9190614802565b6102b46103c53660046147a6565b61075d565b6102b46103d8366004614776565b610768565b6102b46103eb3660046147a6565b610773565b6102b46103fe36600461475f565b61077e565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b6102b461043736600461475f565b610788565b61038761044a366004614776565b610792565b6102b461045d36600461475f565b61079d565b610387610470366004614776565b6107a7565b610387610483366004614776565b6107b2565b6102b4610496366004614776565b6107bd565b6102b47c090000000000000000000000000000000000000000000000000000000181565b6103aa6104cd36600461475f565b6107c8565b7f80000000000000000000000000000000000000000000000000000000000000016102b4565b6102b4610506366004614776565b610812565b5f6102b4565b61052461051f366004614882565b61081d565b604080517fffffffff0000000000000000000000000000000000000000000000000000000090931683526020830191909152016102be565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b7f7fffffff800000000000000000000000000000000000000000000000000000006102b4565b6103876105b6366004614776565b610836565b6102b46105c9366004614776565b610841565b6102b47ffffffffc0000000000000000000000000000000000000000000000000000000181565b6102b461060336600461475f565b61084c565b61038761061636600461475f565b610856565b6102b461062936600461475f565b61087c565b6103aa61063c36600461494b565b610886565b6102ed61064f3660046147a6565b61090f565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc6102b4565b5f6106848261091b565b92915050565b5f610695838361095d565b9392505050565b5f806106a88484610979565b915091505b9250929050565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109ba565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109e6565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f5610a33565b5f61068482610a66565b5f610695838373c51a14251b0dcf0ae24a96b7153991378938f5f5610aa7565b5f6106958383610d01565b5f6106958383610d63565b60606106958383610db1565b5f6106958383610e44565b5f6106958383610e5f565b5f6106958383610ea4565b5f61068482610ed7565b5f61068482610f8d565b5f6106958383611039565b5f61068482611089565b5f61069583836110ce565b5f610695838361111e565b5f610695838361116d565b6060610684827ffffffffc000000000000000000000000000000000000000000000000000000017c0900000000000000000000000000000000000000000000000000000001610886565b5f61069583836111b2565b5f805f8061082a856111bd565b90969095509350505050565b5f61069583836112ab565b5f61069583836112fa565b5f6106848261133f565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821615610684565b5f61068482611371565b606061089283836112ab565b6108d7576040517f3be5bf9400000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044015b60405180910390fd5b5f6108e185611089565b9050610906856108f183876112ab565b806109015750610901838661111e565b610db1565b95945050505050565b5f806106a884846113b2565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826113f2565b90925090505f6109068383611440565b5f610968838361111e565b6109725781610695565b5090919050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6109ad8282876114a6565b9350935050509250929050565b5f610695837fffffffff0000000000000000000000000000000000000000000000000000000584610aa7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a198483836116b0565b90925090505f610a298383611440565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a19848383611821565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82610a998383611b56565b9150505f610a298284611440565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516610ae45750600191506106959050565b5f8213610b7d57815f03610b4157610afc855f6112ab565b15610b36576040517f8be82972000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b505f91506106959050565b6040517fcceba0f100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b610b88856001610d63565b8015610b995750610b99865f61111e565b15610ba8578592505050610695565b610bb2855f6112ab565b15610bdb57610bd2610bc38761091b565b610bcc8761133f565b86610aa7565b92505050610695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80610c0e8484611b56565b915091505f610c1e83855f611bbe565b905060015f8080610c558f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510610c9c5784600116600103610c7f57610c7984848484611cd5565b90945092505b600185901c9450610c9282828484611cd5565b9092509050610c5a565b5f80610ca98f8e8e611821565b91509150610cb982828a8d611cd5565b9092509050610cc98f83836116b0565b9092509050610cda82828888611cd5565b90925090505f610cea8383611440565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611df4565b915091505f610d558383611440565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da684848484612418565b979650505050505050565b60607bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d5f829003610e21576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525092505050610684565b8315610e3a57610e31828261242f565b92505050610684565b610906828261276c565b5f805f610e518585612f96565b915091506109068282612ff8565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d468686868661304a565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610906828286613074565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610f0e57509192915050565b5f80610f1a8484611b56565b915091505f84128015610f2c57508015155b15610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb461304a565b935091505b5f610da68385611440565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610fc457509192915050565b5f80610fd08484611b56565b91509150805f03610fe5575093949350505050565b5f811315610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb46130d0565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61107c84848484613200565b1315979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828212156110c35761094d82826132d4565b5f6109068383611440565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61111184848484613200565b1215979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61116184848484613200565b12979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611cd5565b5f61096883836112ab565b80515f908190602084810191850101828080806111da8686613377565b929650909450925090507fffffffff0000000000000000000000000000000000000000000000000000000084165f0361129c5784830361126c575f806112208484613816565b915091508061125b57507f32b8b8be000000000000000000000000000000000000000000000000000000009a5f9a5098505050505050505050565b505f9a909950975050505050505050565b507fad384e8700000000000000000000000000000000000000000000000000000000985f98509650505050505050565b5091975f975095505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6112ee84848484613200565b13979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d46868686866130d0565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826132d4565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d826113a48383611b56565b5090505f610a298284611440565b5f805f805f6113c1878761391c565b9250925092505f806113d38585613816565b91509150818380156113e25750815b9650965050505050509250929050565b5f806106a87f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686611df4565b5f805f61144d8585613816565b915091508015801561145d575081155b1561149e576040517f8eba4d0700000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b509392505050565b5f805f8512156114ec576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b845f036114fe57505f905060016116a8565b8460ff8416850185811215611549576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f805f8312156115b3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb383121561158a575f8095509550505050506116a8565b825f03600a0a91508184816115a1576115a1614974565b04955050840290911491506116a89050565b5f83131561169d57604d831315611609576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8161163e5761163e614974565b0484111561168b576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b50919091029250600191506116a89050565b509193506001925050505b935093915050565b5f805f8412156116ec576116c484846132d4565b90945092506116d48585856116b0565b90945092506116e384846113f2565b915091506116a8565b5f806116f88686611b56565b9092509050845f808061170b8585613978565b9194509250905061270d6127106117236001826149ce565b851461173a576117348d8686613a67565b90925090505b83156117c5575f61174c8660016149f4565b90505b80848583028161176157611761614974565b051461177857600a84059350600a8805975061174f565b6117b96117858588614a1b565b896117908785614a1b565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc613b20565b909d509b506117ec9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866117fd84835f611bbe565b6118088860016149f4565b61181291906149f4565b94509450505050935093915050565b5f80838361182f8282613bbd565b90965094505f86136118b057855f03611874576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b5050837f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000036118ee576118e483604c6149f4565b5f915091506116a8565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000008412158061193d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb561195f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412611b1a575f805f805f8561197857604b61197b565b604c5b611985908a6149f4565b90505f80876119b2577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000006119d3565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c81611a0557611a05614974565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050611a3e8c82613c13565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414611aca576123278114611aa557611a808c82600101613c13565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002611ac7565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50611afa838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613b20565b909a509850611b0b8a8a835f6130d0565b975097505050505050506116a8565b611b2485856113f2565b9095509350611b34868686611821565b9095509350611b4385856132d4565b92509250506116a8565b50935093915050565b5f805f8312611b6957508290505f6106ad565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4831215611b9b57505f9050826106ad565b5f839003600a0a808581611bb157611bb1614974565b0794859003959350505050565b5f818303611bcd575082610695565b82821315611c1057828203604c811380611be757505f8113155b15611bf5575f915050610695565b80600a0a8581611c0757611c07614974565b05915050610695565b818303604c811380611c2257505f8113155b15611c6a576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604481018490526064016108ce565b600a81900a85810286828281611c8257611c82614974565b0514611ccb576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604481018690526064016108ce565b9250610695915050565b5f8085158415178015611ced575f92505f9150611dea565b611cf784876149f4565b91505f611d0388613c9a565b90505f611d0f87613c9a565b90505f611d1c8383613d00565b5090505f6f0785ee10d5da46d900f436a000000000821115611d51576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115611d7257670de0b6b3a7640000820491506012015b633b9aca00821115611d8b57633b9aca00820491506009015b612710821115611da057612710820491506004015b8115611db457600a82049150600101611da0565b611dbe81876149f4565b9550611de08b8a611dda8787611dd587600a614b84565b613d3b565b89613e20565b9097509550505050505b5094509492505050565b5f80835f03611e39576040517f7a97930f00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b855f03611e4a57505f90508061240f565b5f805f80611e588a8a613f27565b919b5099509150611e698888613f27565b919950975090505f611e7a8b613c9a565b90505f611e868a613c9a565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c818310156122a3578415611ee457507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b612262565b6f4b3b4ca85a86c47a098a22400000000083101561201057678ac7230489e80000831015611f74576402540be400831015611f4257620186a0831015611f325750620186a0905060056121eb565b506402540be4009050600a6121eb565b655af3107a4000831015611f615750655af3107a40009050600e6121eb565b50678ac7230489e80000905060136121eb565b6b204fce5e3e25026110000000831015611fc65769152d02c7e14af6800000831015611faf575069152d02c7e14af6800000905060176121eb565b506b204fce5e3e250261100000009050601c6121eb565b6d314dc6448d9338c15b0a00000000831015611ff557506d314dc6448d9338c15b0a00000000905060216121eb565b506f4b3b4ca85a86c47a098a224000000000905060266121eb565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156121085773af298d050e4395d69670b12b7f410000000000008310156120a3577172cb5bd86321e38cb6ce6682e8000000000083101561208457507172cb5bd86321e38cb6ce6682e800000000009050602b6121eb565b5073af298d050e4395d69670b12b7f41000000000000905060306121eb565b76010b46c6cdd6e3e0828f4db456ff0c8ea00000000000008310156120e4575076010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000905060356121eb565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a6121eb565b7c03b58e88c75313ec9d329eaaa18fb92f75215b1710000000000000000083101561219e577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561217657507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f6121eb565b507c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000905060446121eb565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000008310156121eb57507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b81831161221f57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016121eb565b815f03612262576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c90526044016108ce565b856122a3576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e90526044016108ce565b807f8000000000000000000000000000000000000000000000000000000000000000018d126122d657808d039c50612349565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f81131561234957807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b1361233657998a0199612349565b5f8099509950505050505050505061240f565b5f808e12801561235857505f8c135b15612395577f80000000000000000000000000000000000000000000000000000000000000008e01808d1361238d575f612391565b808d035b9150505b8b818f010397506123b28f8e6123ac888789613d3b565b8b613e20565b90995097505f8113156123fc57604c8113156123dc575f809a509a5050505050505050505061240f565b80600a0a89816123ee576123ee614974565b059850885f036123fc575f97505b5096985094965061240f95505050505050565b94509492505050565b5f61242585858585613200565b1495945050505050565b60608161243c8482613bbd565b90945092505f8061246d7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000087614b8f565b1561249d57507f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000009050604c6124c4565b507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b5b5f6124cf8388614b8f565b90505f6124dc8489614bf6565b90505f808312156124f6575060016124f383614c09565b92505b5f82121561250d5750600161250a82614c09565b91505b60408051602081019091525f81528215612616575f8061252e600a89614c39565b90505b61253b8186614b8f565b5f036125605761254c600a82614c39565b90508161255881614c4c565b925050612531565b60408051602081019091525f8082525b838110156125c157816040516020016125899190614c9a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529150600101612570565b505b6125ce600a87614bf6565b5f036125e6576125df600a87614b8f565b95506125c3565b806125f0876141c8565b604051602001612601929190614cd2565b60405160208183030381529060405293505050505b5f612620856141c8565b90505f61262d878c6149f4565b9050637fffffff81138061266057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000081125b1561269a576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018a90526024016108ce565b5f81156126ce576126aa826141c8565b6040516020016126ba9190614d14565b6040516020818303038152906040526126de565b60405180602001604052805f8152505b90505f856126fa5760405180602001604052805f815250612731565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90508084868460405160200161274a9493929190614d45565b6040516020818303038152906040529b50505050505050505050505092915050565b60606103e882138061278757506127846103e8614c09565b82125b156127c1576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018390526024016108ce565b5f8084129081156127dc576127d585614c09565b90506127df565b50835b5f8413156128a2578360448110612825576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5b8281101561286157612857600a83614c39565b9150600101612844565b508083111561289f576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018790526024016108ce565b50505b5f6128ac82614254565b80519091505f5b818110801561292f575082816128ca600185614d65565b6128d49190614d65565b815181106128e4576128e4614d78565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f3000000000000000000000000000000000000000000000000000000000000000145b15612946578061293e81614c4c565b9150506128b3565b5f6129518284614d65565b90505f61295e838a6149f4565b90505f8761297a5760405180602001604052805f8152506129b1565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90505f8212612b2b57815f6129c68286614da5565b67ffffffffffffffff8111156129de576129de614855565b6040519080825280601f01601f191660200182016040528015612a08576020820181803683370190505b5090505f5b85811015612a7a57888181518110612a2757612a27614d78565b602001015160f81c60f81b828281518110612a4457612a44614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a0d565b505f5b82811015612af7577f300000000000000000000000000000000000000000000000000000000000000082612ab18389614da5565b81518110612ac157612ac1614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a7d565b508281604051602001612b0b929190614db8565b6040516020818303038152906040529a5050505050505050505050610684565b5f612b3583614c09565b905080841115612d4c575f612b4a8286614d65565b90505f612b58866001614da5565b67ffffffffffffffff811115612b7057612b70614855565b6040519080825280601f01601f191660200182016040528015612b9a576020820181803683370190505b5090505f5b82811015612c0c57898181518110612bb957612bb9614d78565b602001015160f81c60f81b828281518110612bd657612bd6614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612b9f565b507f2e00000000000000000000000000000000000000000000000000000000000000818381518110612c4057612c40614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b83811015612d175789612c838285614da5565b81518110612c9357612c93614d78565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612cc7866001614da5565b612cd19190614da5565b81518110612ce157612ce1614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612c70565b508381604051602001612d2b929190614db8565b6040516020818303038152906040529b505050505050505050505050610684565b5f612d578583614d65565b90505f85612d66836002614da5565b612d709190614da5565b67ffffffffffffffff811115612d8857612d88614855565b6040519080825280601f01601f191660200182016040528015612db2576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110612de857612de8614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f2e0000000000000000000000000000000000000000000000000000000000000081600181518110612e4a57612e4a614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b82811015612ef5577f300000000000000000000000000000000000000000000000000000000000000082612eaf836002614da5565b81518110612ebf57612ebf614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612e7a565b505f5b86811015612d1757898181518110612f1257612f12614d78565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612f46866002614da5565b612f509190614da5565b81518110612f6057612f60614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612ef8565b5f805f805f612fa5878761391c565b92509250925080612fec576040517fc471796600000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016108ce565b50909590945092505050565b5f805f6130058585613816565b915091508061149e576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b5f8061305684846132d4565b9094509250613067868686866130d0565b9150915094509492505050565b5f805f6130828686866114a6565b91509150806130c7576040517f05e4767800000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b50949350505050565b5f80851584151780156130fc57865f036130f0578484925092505061240f565b8686925092505061240f565b6131068787613bbd565b90975095506131158585613bbd565b909550935085841315613129579395929492935b838603604c81111561314257878793509350505061240f565b80600a0a868161315457613154614974565b0595505086850180881860ff90811c151589881890911c151680156131ef57877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036131d6576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a9052602481018990526044016108ce565b600a9687900596909805860197600197909701966131f3565b8198505b5096979596505050505050565b5f8085158415178187128286121817858414178015613225578685925092505061240f565b505f85841315613239575092949193919260015b8386035f8112604c821317801561326c57821561325e575f899450945050505061240f565b885f9450945050505061240f565b600a82900a8981028a82828161328457613284614974565b05146132b05784156132a0575f8b96509650505050505061240f565b8a5f96509650505050505061240f565b84156132c557889650945061240f9350505050565b955087945061240f9350505050565b5f807f8000000000000000000000000000000000000000000000000000000000000000840361336d577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303613360576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101859052602481018490526044016108ce565b600a840593508260010192505b50505f9190910391565b5f82818061338c838665200000000000614310565b925085831415836133a681886703ff000000000000614310565b94508085036133e057507f34bd20690000000000000000000000000000000000000000000000000000000094505f925082915061380d9050565b5f806133ec8a88614339565b90925090507fffffffff0000000000000000000000000000000000000000000000000000000082161561342a575095505f935083925061380d915050565b86519095506540000000000060015f9290921a9190911b1615158887101691505080156136b957506001909301925f8461346d81896703ff000000000000614310565b95508086036134a857507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f935083925061380d915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613517577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016134aa565b81811461356e575f8061352a8484614339565b90925090507fffffffff0000000000000000000000000000000000000000000000000000000082161561356a575097505f955085945061380d9350505050565b9350505b5f8312156135a957507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f945084935061380d92505050565b83156135b557825f0392505b80820394505f8513156135f557507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f945084935061380d92505050565b855f03613604578295506136b6565b5f859003604381111561364557507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f955085945061380d9350505050565b600a0a8681025f8883838161365c5761365c614974565b0514159050601b82900b82141581806136725750805b156136ae57507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f985088975061380d9650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b1615158786101680156137fe57600190950194856136f9818a65200000000000614310565b96508661370f818b6703ff000000000000614310565b975080880361374c57507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f955085945061380d9350505050565b505f80613759838a614339565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613799575097505f955085945061380d9350505050565b9250508482015f831380156137ad57508581125b806137c157505f831280156137c157508581135b156137fa57507fd556b1110000000000000000000000000000000000000000000000000000000097505f955085945061380d9350505050565b9450505b845f03613809575f93505b5050505b92959194509250565b5f601b83900b831483838261387a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561385a57620186a0860595506005850194505b8586601b0b1461387557600a8605955084600101945061385a565b613890565b855f0361389057505f9250600191506106ad9050565b848560030b146138ec575f8512156138b057505f92508291506106ad9050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86111561396757600a860460018201600a88065f1493509350935050613971565b8593509150600190505b9250925092565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc036139b057508391505f90506001613971565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc841215613a3e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0841215613a0f57505f9150508215156001613971565b5f846004015f03600a0a90505f818781613a2b57613a2b614974565b0594505080840286141592509050613971565b5f8412613a5357505f91508190506001613971565b50505060048101600a0a82025f6001613971565b5f80806064613a79600a612328614c39565b613a86600a612328614c39565b613a91906002614dc6565b613a9c906001614da5565b613aa69190614da5565b613ab09190614da5565b9050613af4565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b613aff858288613ab7565b92508315611b4d57613b15600186018288613ab7565b915050935093915050565b5f80888803613b33575083905081613bb1565b5f805f80613b438c8b8f8d61304a565b915091505f80613b558a8a8d8c61304a565b91509150613b6584848484611cd5565b8096508197505050505050505f80613b7f8b8b8f8d61304a565b915091505f80613b9186868686611df4565b915091505f80613ba384848f8e6130d0565b909a50985050505050505050505b97509795505050505050565b5f805f805f613bcc8787613f27565b92509250925080612fec576040517f05e51ecb00000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f80613c22600a612328614c39565b613c2d906002614dc6565b613c38906001614da5565b90505f613c48600a612328614c39565b90506002600a8504026001015f8052600281601e883c505f51617fff81169350618000811615613c7757918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f80821215613cf7577f80000000000000000000000000000000000000000000000000000000000000008203613cf157507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b919050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f613d488686613d00565b91509150815f03613d6c57838181613d6257613d62614974565b0492505050610695565b838210613db6576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016108ce565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215613eea577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613ed757613e7f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001614da5565b8403613eaf57507f800000000000000000000000000000000000000000000000000000000000000090508161240f565b613eba600a85614c39565b613ec390614c09565b613ece8460016149f4565b9150915061240f565b613ee084614c09565b839150915061240f565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613f1d57613ec3600a85614c39565b508290508161240f565b5f805f845f03613f3f57505f91508190506001613971565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f03614153576f4b3b4ca85a86c47a098a2240000000008505158015613fa857507f80000000000000000000000000000000000000000000000000000000000000268412155b15613fc9576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a00000000000000850515801561401157507f80000000000000000000000000000000000000000000000000000000000000138412155b1561402a57678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000850515801561407657507f800000000000000000000000000000000000000000000000000000000000000a8412155b1561408c576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000085051580156140db57507f80000000000000000000000000000000000000000000000000000000000000028412155b156140f15760648502945060028403935061408c565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000850515801561414157507f80000000000000000000000000000000000000000000000000000000000000018412155b1561415357600a850294506001840393505b600a8086029081058614801561418957507f80000000000000000000000000000000000000000000000000000000000000018512155b15614198578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b60605f82126141e55760405180602001604052805f81525061421c565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b61422d60ff84901d80850118614254565b60405160200161423e929190614db8565b6040516020818303038152906040529050919050565b60605f61426083614463565b60010190505f8167ffffffffffffffff81111561427f5761427f614855565b6040519080825280601f01601f1916602001820160405280156142a9576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846142b357509392505050565b5f5b5f82600186515f1a1b1611838510161561433157600184019350614312565b509192915050565b81515f90819065200000000000600191831a9190911b161515838510168085019082806143668488614544565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156143a1575093505f92506106ad915050565b825f03614404577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81116143d5575f6143f7565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b955093506106ad92505050565b7f80000000000000000000000000000000000000000000000000000000000000008111614431575f614453565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106144ab577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106144d7576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106144f557662386f26fc10000830492506010015b6305f5e100831061450d576305f5e100830492506008015b612710831061452157612710830492506004015b60648310614533576064830492506002015b600a83106106845760010192915050565b5f8082841061457757507f34bd20690000000000000000000000000000000000000000000000000000000090505f6106ad565b835f036145b0576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b8782101580156145e85750604d83105b1561462b57815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a85900302016145d8565b8782106147515781515f1a849003600181111561467357507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b600a84900a81028281018311156146b657507f0fdc26350000000000000000000000000000000000000000000000000000000096505f95506106ad945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b8782106147515781515f1a6030811461472657507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101906146e2565b5f9890975095505050505050565b5f6020828403121561476f575f80fd5b5035919050565b5f8060408385031215614787575f80fd5b50508035926020909101359150565b803560ff81168114613cfb575f80fd5b5f80604083850312156147b7575f80fd5b823591506147c760208401614796565b90509250929050565b5f80604083850312156147e1575f80fd5b82359150602083013580151581146147f7575f80fd5b809150509250929050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215614892575f80fd5b813567ffffffffffffffff808211156148a9575f80fd5b818401915084601f8301126148bc575f80fd5b8135818111156148ce576148ce614855565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561491457614914614855565b8160405282815287602084870101111561492c575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f6060848603121561495d575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181035f8312801583831316838312821617156149ed576149ed6149a1565b5092915050565b8082018281125f831280158216821582161715614a1357614a136149a1565b505092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615614a5257614a526149a1565b8181058314821517610684576106846149a1565b600181815b80851115614abf57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614aa557614aa56149a1565b80851615614ab257918102915b93841c9390800290614a6b565b509250929050565b5f82614ad557506001610684565b81614ae157505f610684565b8160018114614af75760028114614b0157614b1d565b6001915050610684565b60ff841115614b1257614b126149a1565b50506001821b610684565b5060208310610133831016604e8410600b8410161715614b40575081810a610684565b614b4a8383614a66565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614b7c57614b7c6149a1565b029392505050565b5f6106958383614ac7565b5f82614b9d57614b9d614974565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614bf157614bf16149a1565b500590565b5f82614c0457614c04614974565b500790565b5f7f80000000000000000000000000000000000000000000000000000000000000008203613cf157613cf16149a1565b5f82614c4757614c47614974565b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c7c57614c7c6149a1565b5060010190565b5f81518060208401855e5f93019283525090919050565b5f614ca58284614c83565b7f300000000000000000000000000000000000000000000000000000000000000081526001019392505050565b7f2e0000000000000000000000000000000000000000000000000000000000000081525f614d0c614d066001840186614c83565b84614c83565b949350505050565b7f650000000000000000000000000000000000000000000000000000000000000081525f6106956001830184614c83565b5f610a29614d06614d5f614d59858a614c83565b88614c83565b86614c83565b81810381811115610684576106846149a1565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b80820180821115610684576106846149a1565b5f614d0c614d068386614c83565b8082028115828204841417610684576106846149a156" + "object": "0x608060405234801561000f575f80fd5b506004361061029d575f3560e01c806381f7e2f511610171578063cde72ef3116100d2578063dd64691711610088578063e5526ecd1161006e578063e5526ecd1461062e578063e75f991f14610641578063ffae15ba14610654575f80fd5b8063dd64691714610608578063e0db58881461061b575f80fd5b8063d1de592a116100b8578063d1de592a146105bb578063d35273a7146105ce578063d3d6ffa8146105f5575f80fd5b8063cde72ef314610582578063d102b4d3146105a8575f80fd5b8063a19684b711610127578063bc1b392d1161010d578063bc1b392d1461050b578063bc62d8d814610511578063cb09682b1461055c575f80fd5b8063a19684b7146104d2578063a90d041a146104f8575f80fd5b806396ce1ec71161015757806396ce1ec7146104885780639b4afd991461049b578063a100a3d9146104bf575f80fd5b806381f7e2f5146104625780638dc2980714610475575f80fd5b80633447c0301161021b5780635ca0e7a4116101d1578063719cd99d116101b7578063719cd99d1461042957806373bfb2831461043c57806381a822721461044f575f80fd5b80635ca0e7a4146103f0578063602c35fc14610403575f80fd5b80633b3bd868116102015780633b3bd868146103b757806341aa0080146103ca5780635b23771d146103dd575f80fd5b80633447c03014610374578063371493ce14610397575f80fd5b80631ee62f111161027057806328fa1f011161025657806328fa1f011461033b5780633004fa411461034e5780633029740014610361575f80fd5b80631ee62f11146103155780632538835014610328575f80fd5b806304327dc5146102a1578063078b665b146102c75780630b6429bc146102da578063146e82ad14610302575b5f80fd5b6102b46102af36600461479b565b61067a565b6040519081526020015b60405180910390f35b6102b46102d53660046147b2565b61068a565b6102ed6102e83660046147e2565b61069c565b604080519283529015156020830152016102be565b6102b461031036600461479b565b6106b4565b6102b461032336600461479b565b6106d3565b6102b461033636600461479b565b6106f2565b6102b461034936600461479b565b610711565b6102b461035c3660046147b2565b61071b565b6102b461036f3660046147b2565b61073b565b6103876103823660046147b2565b610746565b60405190151581526020016102be565b6103aa6103a536600461480c565b610751565b6040516102be919061483e565b6102b46103c53660046147e2565b61075d565b6102b46103d83660046147b2565b610768565b6102b46103eb3660046147e2565b610773565b6102b46103fe36600461479b565b61077e565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b6102b461043736600461479b565b610788565b61038761044a3660046147b2565b610792565b6102b461045d36600461479b565b61079d565b6103876104703660046147b2565b6107a7565b6103876104833660046147b2565b6107b2565b6102b46104963660046147b2565b6107bd565b6102b47c090000000000000000000000000000000000000000000000000000000181565b6103aa6104cd36600461479b565b6107c8565b7f80000000000000000000000000000000000000000000000000000000000000016102b4565b6102b46105063660046147b2565b610812565b5f6102b4565b61052461051f3660046148be565b61081d565b604080517fffffffff0000000000000000000000000000000000000000000000000000000090931683526020830191909152016102be565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b7f7fffffff800000000000000000000000000000000000000000000000000000006102b4565b6103876105b63660046147b2565b610836565b6102b46105c93660046147b2565b610841565b6102b47ffffffffc0000000000000000000000000000000000000000000000000000000181565b6102b461060336600461479b565b61084c565b61038761061636600461479b565b610856565b6102b461062936600461479b565b61087c565b6103aa61063c366004614987565b610886565b6102ed61064f3660046147e2565b61090f565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc6102b4565b5f6106848261091b565b92915050565b5f610695838361095d565b9392505050565b5f806106a88484610979565b915091505b9250929050565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109ba565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109e6565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f5610a33565b5f61068482610a66565b5f610695838373c51a14251b0dcf0ae24a96b7153991378938f5f5610aa7565b5f6106958383610d01565b5f6106958383610d63565b60606106958383610db1565b5f6106958383610e44565b5f6106958383610e5f565b5f6106958383610ea4565b5f61068482610ed7565b5f61068482610f8d565b5f6106958383611039565b5f6106848261107c565b5f61069583836110c1565b5f6106958383611104565b5f6106958383611147565b6060610684827ffffffffc000000000000000000000000000000000000000000000000000000017c0900000000000000000000000000000000000000000000000000000001610886565b5f610695838361118c565b5f805f8061082a85611197565b90969095509350505050565b5f6106958383611285565b5f61069583836112c8565b5f6106848261130d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821615610684565b5f6106848261133f565b60606108928383611285565b6108d7576040517f3be5bf9400000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044015b60405180910390fd5b5f6108e18561107c565b9050610906856108f18387611285565b8061090157506109018386611104565b610db1565b95945050505050565b5f806106a88484611380565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826113c0565b90925090505f610906838361140e565b5f6109688383611104565b6109725781610695565b5090919050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6109ad828287611474565b9350935050509250929050565b5f610695837fffffffff0000000000000000000000000000000000000000000000000000000584610aa7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a1984838361167e565b90925090505f610a29838361140e565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a198483836117ef565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82610a998383611b24565b9150505f610a29828461140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516610ae45750600191506106959050565b5f8213610b7d57815f03610b4157610afc855f611285565b15610b36576040517f8be82972000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b505f91506106959050565b6040517fcceba0f100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b610b88856001610d63565b8015610b995750610b99865f611104565b15610ba8578592505050610695565b610bb2855f611285565b15610bdb57610bd2610bc38761091b565b610bcc8761130d565b86610aa7565b92505050610695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80610c0e8484611b24565b915091505f610c1e83855f611b8c565b905060015f8080610c558f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510610c9c5784600116600103610c7f57610c7984848484611ca3565b90945092505b600185901c9450610c9282828484611ca3565b9092509050610c5a565b5f80610ca98f8e8e6117ef565b91509150610cb982828a8d611ca3565b9092509050610cc98f838361167e565b9092509050610cda82828888611ca3565b90925090505f610cea838361140e565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611dc2565b915091505f610d55838361140e565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846123e6565b979650505050505050565b60607bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d5f829003610e21576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525092505050610684565b8315610e3a57610e3182826123fd565b92505050610684565b610906828261273a565b5f805f610e518585612f64565b915091506109068282612fc6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686613018565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610906828286613042565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610f0e57509192915050565b5f80610f1a8484611b24565b915091505f84128015610f2c57508015155b15610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613018565b935091505b5f610da6838561140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610fc457509192915050565b5f80610fd08484611b24565b91509150805f03610fe5575093949350505050565b5f811315610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb461309e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846131ce565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828212156110b65761094d82826131ea565b5f610906838361140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da68484848461328d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846132a9565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611ca3565b5f6109688383611285565b80515f908190602084810191850101828080806111b486866132c4565b929650909450925090507fffffffff0000000000000000000000000000000000000000000000000000000084165f0361127657848303611246575f806111fa8484613763565b915091508061123557507f32b8b8be000000000000000000000000000000000000000000000000000000009a5f9a5098505050505050505050565b505f9a909950975050505050505050565b507fad384e8700000000000000000000000000000000000000000000000000000000985f98509650505050505050565b5091975f975095505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da684848484613869565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d468686868661309e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826131ea565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d826113728383611b24565b5090505f610a29828461140e565b5f805f805f61138f8787613884565b9250925092505f806113a18585613763565b91509150818380156113b05750815b9650965050505050509250929050565b5f806106a87f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686611dc2565b5f805f61141b8585613763565b915091508015801561142b575081155b1561146c576040517f8eba4d0700000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b509392505050565b5f805f8512156114ba576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b845f036114cc57505f90506001611676565b8460ff8416850185811215611517576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f805f831215611581577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3831215611558575f809550955050505050611676565b825f03600a0a915081848161156f5761156f6149b0565b04955050840290911491506116769050565b5f83131561166b57604d8313156115d7576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8161160c5761160c6149b0565b04841115611659576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b50919091029250600191506116769050565b509193506001925050505b935093915050565b5f805f8412156116ba5761169284846131ea565b90945092506116a285858561167e565b90945092506116b184846113c0565b91509150611676565b5f806116c68686611b24565b9092509050845f80806116d985856138e0565b9194509250905061270d6127106116f1600182614a0a565b8514611708576117028d86866139cf565b90925090505b8315611793575f61171a866001614a30565b90505b80848583028161172f5761172f6149b0565b051461174657600a84059350600a8805975061171d565b6117876117538588614a57565b8961175e8785614a57565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc613a88565b909d509b506117ba9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866117cb84835f611b8c565b6117d6886001614a30565b6117e09190614a30565b94509450505050935093915050565b5f8083836117fd8282613b25565b90965094505f861361187e57855f03611842576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b5050837f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000036118bc576118b283604c614a30565b5f91509150611676565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000008412158061190b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb561192d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412611ae8575f805f805f8561194657604b611949565b604c5b611953908a614a30565b90505f8087611980577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000006119a1565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c816119d3576119d36149b0565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050611a0c8c82613b7b565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414611a98576123278114611a7357611a4e8c82600101613b7b565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002611a95565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50611ac8838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613a88565b909a509850611ad98a8a835f61309e565b97509750505050505050611676565b611af285856113c0565b9095509350611b028686866117ef565b9095509350611b1185856131ea565b9250925050611676565b50935093915050565b5f805f8312611b3757508290505f6106ad565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4831215611b6957505f9050826106ad565b5f839003600a0a808581611b7f57611b7f6149b0565b0794859003959350505050565b5f818303611b9b575082610695565b82821315611bde57828203604c811380611bb557505f8113155b15611bc3575f915050610695565b80600a0a8581611bd557611bd56149b0565b05915050610695565b818303604c811380611bf057505f8113155b15611c38576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604481018490526064016108ce565b600a81900a85810286828281611c5057611c506149b0565b0514611c99576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604481018690526064016108ce565b9250610695915050565b5f8085158415178015611cbb575f92505f9150611db8565b611cc58487614a30565b91505f611cd188613c02565b90505f611cdd87613c02565b90505f611cea8383613c68565b5090505f6f0785ee10d5da46d900f436a000000000821115611d1f576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115611d4057670de0b6b3a7640000820491506012015b633b9aca00821115611d5957633b9aca00820491506009015b612710821115611d6e57612710820491506004015b8115611d8257600a82049150600101611d6e565b611d8c8187614a30565b9550611dae8b8a611da88787611da387600a614bc0565b613ca3565b89613d88565b9097509550505050505b5094509492505050565b5f80835f03611e07576040517f7a97930f00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b855f03611e1857505f9050806123dd565b5f805f80611e268a8a613e8f565b919b5099509150611e378888613e8f565b919950975090505f611e488b613c02565b90505f611e548a613c02565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c81831015612271578415611eb257507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b612230565b6f4b3b4ca85a86c47a098a224000000000831015611fde57678ac7230489e80000831015611f42576402540be400831015611f1057620186a0831015611f005750620186a0905060056121b9565b506402540be4009050600a6121b9565b655af3107a4000831015611f2f5750655af3107a40009050600e6121b9565b50678ac7230489e80000905060136121b9565b6b204fce5e3e25026110000000831015611f945769152d02c7e14af6800000831015611f7d575069152d02c7e14af6800000905060176121b9565b506b204fce5e3e250261100000009050601c6121b9565b6d314dc6448d9338c15b0a00000000831015611fc357506d314dc6448d9338c15b0a00000000905060216121b9565b506f4b3b4ca85a86c47a098a224000000000905060266121b9565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156120d65773af298d050e4395d69670b12b7f41000000000000831015612071577172cb5bd86321e38cb6ce6682e8000000000083101561205257507172cb5bd86321e38cb6ce6682e800000000009050602b6121b9565b5073af298d050e4395d69670b12b7f41000000000000905060306121b9565b76010b46c6cdd6e3e0828f4db456ff0c8ea00000000000008310156120b2575076010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000905060356121b9565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a6121b9565b7c03b58e88c75313ec9d329eaaa18fb92f75215b1710000000000000000083101561216c577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561214457507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f6121b9565b507c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000905060446121b9565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000008310156121b957507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b8183116121ed57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016121b9565b815f03612230576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c90526044016108ce565b85612271576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e90526044016108ce565b807f8000000000000000000000000000000000000000000000000000000000000000018d126122a457808d039c50612317565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f81131561231757807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b1361230457998a0199612317565b5f809950995050505050505050506123dd565b5f808e12801561232657505f8c135b15612363577f80000000000000000000000000000000000000000000000000000000000000008e01808d1361235b575f61235f565b808d035b9150505b8b818f010397506123808f8e61237a888789613ca3565b8b613d88565b90995097505f8113156123ca57604c8113156123aa575f809a509a505050505050505050506123dd565b80600a0a89816123bc576123bc6149b0565b059850885f036123ca575f97505b509698509496506123dd95505050505050565b94509492505050565b5f6123f385858585614130565b1495945050505050565b60608161240a8482613b25565b90945092505f8061243b7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000087614bcb565b1561246b57507f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000009050604c612492565b507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b5b5f61249d8388614bcb565b90505f6124aa8489614c32565b90505f808312156124c4575060016124c183614c45565b92505b5f8212156124db575060016124d882614c45565b91505b60408051602081019091525f815282156125e4575f806124fc600a89614c75565b90505b6125098186614bcb565b5f0361252e5761251a600a82614c75565b90508161252681614c88565b9250506124ff565b60408051602081019091525f8082525b8381101561258f57816040516020016125579190614cd6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052915060010161253e565b505b61259c600a87614c32565b5f036125b4576125ad600a87614bcb565b9550612591565b806125be87614204565b6040516020016125cf929190614d0e565b60405160208183030381529060405293505050505b5f6125ee85614204565b90505f6125fb878c614a30565b9050637fffffff81138061262e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000081125b15612668576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018a90526024016108ce565b5f811561269c5761267882614204565b6040516020016126889190614d50565b6040516020818303038152906040526126ac565b60405180602001604052805f8152505b90505f856126c85760405180602001604052805f8152506126ff565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b9050808486846040516020016127189493929190614d81565b6040516020818303038152906040529b50505050505050505050505092915050565b60606103e882138061275557506127526103e8614c45565b82125b1561278f576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018390526024016108ce565b5f8084129081156127aa576127a385614c45565b90506127ad565b50835b5f8413156128705783604481106127f3576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5b8281101561282f57612825600a83614c75565b9150600101612812565b508083111561286d576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018790526024016108ce565b50505b5f61287a82614290565b80519091505f5b81811080156128fd57508281612898600185614da1565b6128a29190614da1565b815181106128b2576128b2614db4565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f3000000000000000000000000000000000000000000000000000000000000000145b15612914578061290c81614c88565b915050612881565b5f61291f8284614da1565b90505f61292c838a614a30565b90505f876129485760405180602001604052805f81525061297f565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90505f8212612af957815f6129948286614de1565b67ffffffffffffffff8111156129ac576129ac614891565b6040519080825280601f01601f1916602001820160405280156129d6576020820181803683370190505b5090505f5b85811015612a48578881815181106129f5576129f5614db4565b602001015160f81c60f81b828281518110612a1257612a12614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506001016129db565b505f5b82811015612ac5577f300000000000000000000000000000000000000000000000000000000000000082612a7f8389614de1565b81518110612a8f57612a8f614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a4b565b508281604051602001612ad9929190614df4565b6040516020818303038152906040529a5050505050505050505050610684565b5f612b0383614c45565b905080841115612d1a575f612b188286614da1565b90505f612b26866001614de1565b67ffffffffffffffff811115612b3e57612b3e614891565b6040519080825280601f01601f191660200182016040528015612b68576020820181803683370190505b5090505f5b82811015612bda57898181518110612b8757612b87614db4565b602001015160f81c60f81b828281518110612ba457612ba4614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612b6d565b507f2e00000000000000000000000000000000000000000000000000000000000000818381518110612c0e57612c0e614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b83811015612ce55789612c518285614de1565b81518110612c6157612c61614db4565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612c95866001614de1565b612c9f9190614de1565b81518110612caf57612caf614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612c3e565b508381604051602001612cf9929190614df4565b6040516020818303038152906040529b505050505050505050505050610684565b5f612d258583614da1565b90505f85612d34836002614de1565b612d3e9190614de1565b67ffffffffffffffff811115612d5657612d56614891565b6040519080825280601f01601f191660200182016040528015612d80576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110612db657612db6614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f2e0000000000000000000000000000000000000000000000000000000000000081600181518110612e1857612e18614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b82811015612ec3577f300000000000000000000000000000000000000000000000000000000000000082612e7d836002614de1565b81518110612e8d57612e8d614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612e48565b505f5b86811015612ce557898181518110612ee057612ee0614db4565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612f14866002614de1565b612f1e9190614de1565b81518110612f2e57612f2e614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612ec6565b5f805f805f612f738787613884565b92509250925080612fba576040517fc471796600000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016108ce565b50909590945092505050565b5f805f612fd38585613763565b915091508061146c576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b5f8061302484846131ea565b90945092506130358686868661309e565b9150915094509492505050565b5f805f613050868686611474565b9150915080613095576040517f05e4767800000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b50949350505050565b5f80851584151780156130ca57865f036130be57848492509250506123dd565b868692509250506123dd565b6130d48787613b25565b90975095506130e38585613b25565b9095509350858413156130f7579395929492935b838603604c8111156131105787879350935050506123dd565b80600a0a8681613122576131226149b0565b0595505086850180881860ff90811c151589881890911c151680156131bd57877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036131a4576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a9052602481018990526044016108ce565b600a9687900596909805860197600197909701966131c1565b8198505b5096979596505050505050565b5f805f6131dd87878787614130565b1315979650505050505050565b5f807f80000000000000000000000000000000000000000000000000000000000000008403613283577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303613276576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101859052602481018490526044016108ce565b600a840593508260010192505b50505f9190910391565b5f805f61329c87878787614130565b1215979650505050505050565b5f805f6132b887878787614130565b12979650505050505050565b5f8281806132d983866520000000000061434c565b925085831415836132f381886703ff00000000000061434c565b945080850361332d57507f34bd20690000000000000000000000000000000000000000000000000000000094505f925082915061375a9050565b5f806133398a88614375565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613377575095505f935083925061375a915050565b86519095506540000000000060015f9290921a9190911b16151588871016915050801561360657506001909301925f846133ba81896703ff00000000000061434c565b95508086036133f557507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f935083925061375a915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613464577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016133f7565b8181146134bb575f806134778484614375565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156134b7575097505f955085945061375a9350505050565b9350505b5f8312156134f657507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f945084935061375a92505050565b831561350257825f0392505b80820394505f85131561354257507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f945084935061375a92505050565b855f0361355157829550613603565b5f859003604381111561359257507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b600a0a8681025f888383816135a9576135a96149b0565b0514159050601b82900b82141581806135bf5750805b156135fb57507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f985088975061375a9650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b16151587861016801561374b5760019095019485613646818a6520000000000061434c565b96508661365c818b6703ff00000000000061434c565b975080880361369957507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b505f806136a6838a614375565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156136e6575097505f955085945061375a9350505050565b9250508482015f831380156136fa57508581125b8061370e57505f8312801561370e57508581135b1561374757507fd556b1110000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b9450505b845f03613756575f93505b5050505b92959194509250565b5f601b83900b83148383826137c7577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156137a757620186a0860595506005850194505b8586601b0b146137c257600a860595508460010194506137a7565b6137dd565b855f036137dd57505f9250600191506106ad9050565b848560030b14613839575f8512156137fd57505f92508291506106ad9050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f61387887878787614130565b13979650505050505050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156138cf57600a860460018201600a88065f14935093509350506138d9565b8593509150600190505b9250925092565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0361391857508391505f905060016138d9565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8412156139a6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb084121561397757505f91505082151560016138d9565b5f846004015f03600a0a90505f818781613993576139936149b0565b05945050808402861415925090506138d9565b5f84126139bb57505f915081905060016138d9565b50505060048101600a0a82025f60016138d9565b5f808060646139e1600a612328614c75565b6139ee600a612328614c75565b6139f9906002614e02565b613a04906001614de1565b613a0e9190614de1565b613a189190614de1565b9050613a5c565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b613a67858288613a1f565b92508315611b1b57613a7d600186018288613a1f565b915050935093915050565b5f80888803613a9b575083905081613b19565b5f805f80613aab8c8b8f8d613018565b915091505f80613abd8a8a8d8c613018565b91509150613acd84848484611ca3565b8096508197505050505050505f80613ae78b8b8f8d613018565b915091505f80613af986868686611dc2565b915091505f80613b0b84848f8e61309e565b909a50985050505050505050505b97509795505050505050565b5f805f805f613b348787613e8f565b92509250925080612fba576040517f05e51ecb00000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f80613b8a600a612328614c75565b613b95906002614e02565b613ba0906001614de1565b90505f613bb0600a612328614c75565b90506002600a8504026001015f8052600281601e883c505f51617fff81169350618000811615613bdf57918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f80821215613c5f577f80000000000000000000000000000000000000000000000000000000000000008203613c5957507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b919050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f613cb08686613c68565b91509150815f03613cd457838181613cca57613cca6149b0565b0492505050610695565b838210613d1e576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016108ce565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215613e52577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613e3f57613de77f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001614de1565b8403613e1757507f80000000000000000000000000000000000000000000000000000000000000009050816123dd565b613e22600a85614c75565b613e2b90614c45565b613e36846001614a30565b915091506123dd565b613e4884614c45565b83915091506123dd565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613e8557613e2b600a85614c75565b50829050816123dd565b5f805f845f03613ea757505f915081905060016138d9565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f036140bb576f4b3b4ca85a86c47a098a2240000000008505158015613f1057507f80000000000000000000000000000000000000000000000000000000000000268412155b15613f31576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a000000000000008505158015613f7957507f80000000000000000000000000000000000000000000000000000000000000138412155b15613f9257678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008505158015613fde57507f800000000000000000000000000000000000000000000000000000000000000a8412155b15613ff4576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000850515801561404357507f80000000000000000000000000000000000000000000000000000000000000028412155b1561405957606485029450600284039350613ff4565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085051580156140a957507f80000000000000000000000000000000000000000000000000000000000000018412155b156140bb57600a850294506001840393505b600a808602908105861480156140f157507f80000000000000000000000000000000000000000000000000000000000000018512155b15614100578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f808515841517818712828612181785841417801561415557868592509250506123dd565b505f85841315614169575092949193919260015b8386035f8112604c821317801561419c57821561418e575f89945094505050506123dd565b885f945094505050506123dd565b600a82900a8981028a8282816141b4576141b46149b0565b05146141e05784156141d0575f8b9650965050505050506123dd565b8a5f9650965050505050506123dd565b84156141f55788965094506123dd9350505050565b95508794506123dd9350505050565b60605f82126142215760405180602001604052805f815250614258565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b61426960ff84901d80850118614290565b60405160200161427a929190614df4565b6040516020818303038152906040529050919050565b60605f61429c8361449f565b60010190505f8167ffffffffffffffff8111156142bb576142bb614891565b6040519080825280601f01601f1916602001820160405280156142e5576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846142ef57509392505050565b5f5b5f82600186515f1a1b1611838510161561436d5760018401935061434e565b509192915050565b81515f90819065200000000000600191831a9190911b161515838510168085019082806143a28488614580565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156143dd575093505f92506106ad915050565b825f03614440577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111614411575f614433565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b955093506106ad92505050565b7f8000000000000000000000000000000000000000000000000000000000000000811161446d575f61448f565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106144e7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310614513576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061453157662386f26fc10000830492506010015b6305f5e1008310614549576305f5e100830492506008015b612710831061455d57612710830492506004015b6064831061456f576064830492506002015b600a83106106845760010192915050565b5f808284106145b357507f34bd20690000000000000000000000000000000000000000000000000000000090505f6106ad565b835f036145ec576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b8782101580156146245750604d83105b1561466757815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a8590030201614614565b87821061478d5781515f1a84900360018111156146af57507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b600a84900a81028281018311156146f257507f0fdc26350000000000000000000000000000000000000000000000000000000096505f95506106ad945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b87821061478d5781515f1a6030811461476257507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091019061471e565b5f9890975095505050505050565b5f602082840312156147ab575f80fd5b5035919050565b5f80604083850312156147c3575f80fd5b50508035926020909101359150565b803560ff81168114613c63575f80fd5b5f80604083850312156147f3575f80fd5b82359150614803602084016147d2565b90509250929050565b5f806040838503121561481d575f80fd5b8235915060208301358015158114614833575f80fd5b809150509250929050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f602082840312156148ce575f80fd5b813567ffffffffffffffff808211156148e5575f80fd5b818401915084601f8301126148f8575f80fd5b81358181111561490a5761490a614891565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561495057614950614891565b81604052828152876020848701011115614968575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215614999575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181035f831280158383131683831282161715614a2957614a296149dd565b5092915050565b8082018281125f831280158216821582161715614a4f57614a4f6149dd565b505092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615614a8e57614a8e6149dd565b8181058314821517610684576106846149dd565b600181815b80851115614afb57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614ae157614ae16149dd565b80851615614aee57918102915b93841c9390800290614aa7565b509250929050565b5f82614b1157506001610684565b81614b1d57505f610684565b8160018114614b335760028114614b3d57614b59565b6001915050610684565b60ff841115614b4e57614b4e6149dd565b50506001821b610684565b5060208310610133831016604e8410600b8410161715614b7c575081810a610684565b614b868383614aa2565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614bb857614bb86149dd565b029392505050565b5f6106958383614b03565b5f82614bd957614bd96149b0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614c2d57614c2d6149dd565b500590565b5f82614c4057614c406149b0565b500790565b5f7f80000000000000000000000000000000000000000000000000000000000000008203613c5957613c596149dd565b5f82614c8357614c836149b0565b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614cb857614cb86149dd565b5060010190565b5f81518060208401855e5f93019283525090919050565b5f614ce18284614cbf565b7f300000000000000000000000000000000000000000000000000000000000000081526001019392505050565b7f2e0000000000000000000000000000000000000000000000000000000000000081525f614d48614d426001840186614cbf565b84614cbf565b949350505050565b7f650000000000000000000000000000000000000000000000000000000000000081525f6106956001830184614cbf565b5f610a29614d42614d9b614d95858a614cbf565b88614cbf565b86614cbf565b81810381811115610684576106846149dd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b80820180821115610684576106846149dd565b5f614d48614d428386614cbf565b8082028115828204841417610684576106846149dd56" } } \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index ac91a1a..10d63d2 100644 --- a/foundry.toml +++ b/foundry.toml @@ -79,7 +79,7 @@ forge-std = "1.16.2" "rain-datacontract" = "0.1.9" "rain-deploy" = "0.1.10" "rain-sol-codegen" = "0.1.37" -"rain-math-float" = "0.2.1" +"rain-math-float" = "0.2.4" [soldeer] recursive_deps = false diff --git a/script/Build.sol b/script/Build.sol index ca194f4..dede431 100644 --- a/script/Build.sol +++ b/script/Build.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {BuildScript} from "rain-deploy-0.1.10/src/abstract/BuildScript.sol"; import {LibCodeGen} from "rain-sol-codegen-0.1.37/src/lib/LibCodeGen.sol"; -import {LibLogTable} from "rain-math-float-0.2.1/src/lib/table/LibLogTable.sol"; +import {LibLogTable} from "rain-math-float-0.2.4/src/lib/table/LibLogTable.sol"; import {LibRainDeploySnapshot} from "rain-deploy-0.1.10/src/lib/LibRainDeploySnapshot.sol"; import {DeployCandidate} from "../src/abstract/RainDeploySuitesBase.sol"; import {DecimalFloatDeploySuites} from "../src/abstract/DecimalFloatDeploySuites.sol"; diff --git a/soldeer.lock b/soldeer.lock index 7c0d7e2..127ef70 100644 --- a/soldeer.lock +++ b/soldeer.lock @@ -28,10 +28,10 @@ integrity = "b3b3fac62525531638135a8d8b731dfe8749e98b28ac5f61a2cd878d30adb047" [[dependencies]] name = "rain-math-float" -version = "0.2.1" -url = "https://soldeer-revisions.s3.amazonaws.com/rain-math-float/0_2_1_08-09-2026_07:26:32_rain.math.zip" -checksum = "d9433a80d1a546b73e80ba3ccda6e2a88e2986222522a6526173a1a0d5d13bef" -integrity = "c24a336446be885b680026d4e7d937e6d4559997a2cb0ee385f4c9be95990d77" +version = "0.2.4" +url = "https://soldeer-revisions.s3.amazonaws.com/rain-math-float/0_2_4_27-09-2026_15:02:57_rain.math.zip" +checksum = "a13f6e73e32324a38a2da2826484c2a03dd1ed1514851c557d90ec8f3323b940" +integrity = "70b5b63f234f24b7719bf6a296caafb9120ce185d7a3dced231a660aca7adf83" [[dependencies]] name = "rain-sol-codegen" diff --git a/src/concrete/DecimalFloat.sol b/src/concrete/DecimalFloat.sol index 9fed7a6..a3014ad 100644 --- a/src/concrete/DecimalFloat.sol +++ b/src/concrete/DecimalFloat.sol @@ -2,11 +2,11 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LibDecimalFloatDeploy} from "../lib/deploy/LibDecimalFloatDeploy.sol"; -import {LibFormatDecimalFloat} from "rain-math-float-0.2.1/src/lib/format/LibFormatDecimalFloat.sol"; -import {LibParseDecimalFloat} from "rain-math-float-0.2.1/src/lib/parse/LibParseDecimalFloat.sol"; -import {ScientificMinNotLessThanMax} from "rain-math-float-0.2.1/src/error/ErrDecimalFloat.sol"; +import {LibFormatDecimalFloat} from "rain-math-float-0.2.4/src/lib/format/LibFormatDecimalFloat.sol"; +import {LibParseDecimalFloat} from "rain-math-float-0.2.4/src/lib/parse/LibParseDecimalFloat.sol"; +import {ScientificMinNotLessThanMax} from "rain-math-float-0.2.4/src/error/ErrDecimalFloat.sol"; contract DecimalFloat { using LibDecimalFloat for Float; diff --git a/src/generated/candidate/DecimalFloat.sol b/src/generated/candidate/DecimalFloat.sol index cfe51a5..4d1830c 100644 --- a/src/generated/candidate/DecimalFloat.sol +++ b/src/generated/candidate/DecimalFloat.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xdc468883c345d41c0abd98ef2fd933c370bd1682522d37e6f6b729793301f55e); +bytes32 constant BYTECODE_HASH = bytes32(0x12b70b2f9324ec3572c5a0c4d83305d43af5b6b7c82597730320f7ee20cda082); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x799632d282178e770C7465cad54aDA1021A913D6); +address constant DEPLOYED_ADDRESS = address(0x16cf47be475864dAb406E7A65A5A4D939Cc85608); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060156019565b60b8565b73c51a14251b0dcf0ae24a96b7153991378938f5f53f7f2573004ac3a9ee7fc8d73654d76386f1b6b99e34cdf86a689c4691e47143420f811460b557604051630912d0ff60e31b815273c51a14251b0dcf0ae24a96b7153991378938f5f560048201527f2573004ac3a9ee7fc8d73654d76386f1b6b99e34cdf86a689c4691e47143420f60248201526044810182905260640160405180910390fd5b50565b614ddd806100c55f395ff3fe608060405234801561000f575f80fd5b506004361061029d575f3560e01c806381f7e2f511610171578063cde72ef3116100d2578063dd64691711610088578063e5526ecd1161006e578063e5526ecd1461062e578063e75f991f14610641578063ffae15ba14610654575f80fd5b8063dd64691714610608578063e0db58881461061b575f80fd5b8063d1de592a116100b8578063d1de592a146105bb578063d35273a7146105ce578063d3d6ffa8146105f5575f80fd5b8063cde72ef314610582578063d102b4d3146105a8575f80fd5b8063a19684b711610127578063bc1b392d1161010d578063bc1b392d1461050b578063bc62d8d814610511578063cb09682b1461055c575f80fd5b8063a19684b7146104d2578063a90d041a146104f8575f80fd5b806396ce1ec71161015757806396ce1ec7146104885780639b4afd991461049b578063a100a3d9146104bf575f80fd5b806381f7e2f5146104625780638dc2980714610475575f80fd5b80633447c0301161021b5780635ca0e7a4116101d1578063719cd99d116101b7578063719cd99d1461042957806373bfb2831461043c57806381a822721461044f575f80fd5b80635ca0e7a4146103f0578063602c35fc14610403575f80fd5b80633b3bd868116102015780633b3bd868146103b757806341aa0080146103ca5780635b23771d146103dd575f80fd5b80633447c03014610374578063371493ce14610397575f80fd5b80631ee62f111161027057806328fa1f011161025657806328fa1f011461033b5780633004fa411461034e5780633029740014610361575f80fd5b80631ee62f11146103155780632538835014610328575f80fd5b806304327dc5146102a1578063078b665b146102c75780630b6429bc146102da578063146e82ad14610302575b5f80fd5b6102b46102af36600461475f565b61067a565b6040519081526020015b60405180910390f35b6102b46102d5366004614776565b61068a565b6102ed6102e83660046147a6565b61069c565b604080519283529015156020830152016102be565b6102b461031036600461475f565b6106b4565b6102b461032336600461475f565b6106d3565b6102b461033636600461475f565b6106f2565b6102b461034936600461475f565b610711565b6102b461035c366004614776565b61071b565b6102b461036f366004614776565b61073b565b610387610382366004614776565b610746565b60405190151581526020016102be565b6103aa6103a53660046147d0565b610751565b6040516102be9190614802565b6102b46103c53660046147a6565b61075d565b6102b46103d8366004614776565b610768565b6102b46103eb3660046147a6565b610773565b6102b46103fe36600461475f565b61077e565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b6102b461043736600461475f565b610788565b61038761044a366004614776565b610792565b6102b461045d36600461475f565b61079d565b610387610470366004614776565b6107a7565b610387610483366004614776565b6107b2565b6102b4610496366004614776565b6107bd565b6102b47c090000000000000000000000000000000000000000000000000000000181565b6103aa6104cd36600461475f565b6107c8565b7f80000000000000000000000000000000000000000000000000000000000000016102b4565b6102b4610506366004614776565b610812565b5f6102b4565b61052461051f366004614882565b61081d565b604080517fffffffff0000000000000000000000000000000000000000000000000000000090931683526020830191909152016102be565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b7f7fffffff800000000000000000000000000000000000000000000000000000006102b4565b6103876105b6366004614776565b610836565b6102b46105c9366004614776565b610841565b6102b47ffffffffc0000000000000000000000000000000000000000000000000000000181565b6102b461060336600461475f565b61084c565b61038761061636600461475f565b610856565b6102b461062936600461475f565b61087c565b6103aa61063c36600461494b565b610886565b6102ed61064f3660046147a6565b61090f565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc6102b4565b5f6106848261091b565b92915050565b5f610695838361095d565b9392505050565b5f806106a88484610979565b915091505b9250929050565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109ba565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109e6565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f5610a33565b5f61068482610a66565b5f610695838373c51a14251b0dcf0ae24a96b7153991378938f5f5610aa7565b5f6106958383610d01565b5f6106958383610d63565b60606106958383610db1565b5f6106958383610e44565b5f6106958383610e5f565b5f6106958383610ea4565b5f61068482610ed7565b5f61068482610f8d565b5f6106958383611039565b5f61068482611089565b5f61069583836110ce565b5f610695838361111e565b5f610695838361116d565b6060610684827ffffffffc000000000000000000000000000000000000000000000000000000017c0900000000000000000000000000000000000000000000000000000001610886565b5f61069583836111b2565b5f805f8061082a856111bd565b90969095509350505050565b5f61069583836112ab565b5f61069583836112fa565b5f6106848261133f565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821615610684565b5f61068482611371565b606061089283836112ab565b6108d7576040517f3be5bf9400000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044015b60405180910390fd5b5f6108e185611089565b9050610906856108f183876112ab565b806109015750610901838661111e565b610db1565b95945050505050565b5f806106a884846113b2565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826113f2565b90925090505f6109068383611440565b5f610968838361111e565b6109725781610695565b5090919050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6109ad8282876114a6565b9350935050509250929050565b5f610695837fffffffff0000000000000000000000000000000000000000000000000000000584610aa7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a198483836116b0565b90925090505f610a298383611440565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a19848383611821565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82610a998383611b56565b9150505f610a298284611440565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516610ae45750600191506106959050565b5f8213610b7d57815f03610b4157610afc855f6112ab565b15610b36576040517f8be82972000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b505f91506106959050565b6040517fcceba0f100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b610b88856001610d63565b8015610b995750610b99865f61111e565b15610ba8578592505050610695565b610bb2855f6112ab565b15610bdb57610bd2610bc38761091b565b610bcc8761133f565b86610aa7565b92505050610695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80610c0e8484611b56565b915091505f610c1e83855f611bbe565b905060015f8080610c558f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510610c9c5784600116600103610c7f57610c7984848484611cd5565b90945092505b600185901c9450610c9282828484611cd5565b9092509050610c5a565b5f80610ca98f8e8e611821565b91509150610cb982828a8d611cd5565b9092509050610cc98f83836116b0565b9092509050610cda82828888611cd5565b90925090505f610cea8383611440565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611df4565b915091505f610d558383611440565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da684848484612418565b979650505050505050565b60607bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d5f829003610e21576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525092505050610684565b8315610e3a57610e31828261242f565b92505050610684565b610906828261276c565b5f805f610e518585612f96565b915091506109068282612ff8565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d468686868661304a565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610906828286613074565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610f0e57509192915050565b5f80610f1a8484611b56565b915091505f84128015610f2c57508015155b15610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb461304a565b935091505b5f610da68385611440565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610fc457509192915050565b5f80610fd08484611b56565b91509150805f03610fe5575093949350505050565b5f811315610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb46130d0565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61107c84848484613200565b1315979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828212156110c35761094d82826132d4565b5f6109068383611440565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61111184848484613200565b1215979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61116184848484613200565b12979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611cd5565b5f61096883836112ab565b80515f908190602084810191850101828080806111da8686613377565b929650909450925090507fffffffff0000000000000000000000000000000000000000000000000000000084165f0361129c5784830361126c575f806112208484613816565b915091508061125b57507f32b8b8be000000000000000000000000000000000000000000000000000000009a5f9a5098505050505050505050565b505f9a909950975050505050505050565b507fad384e8700000000000000000000000000000000000000000000000000000000985f98509650505050505050565b5091975f975095505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6112ee84848484613200565b13979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d46868686866130d0565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826132d4565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d826113a48383611b56565b5090505f610a298284611440565b5f805f805f6113c1878761391c565b9250925092505f806113d38585613816565b91509150818380156113e25750815b9650965050505050509250929050565b5f806106a87f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686611df4565b5f805f61144d8585613816565b915091508015801561145d575081155b1561149e576040517f8eba4d0700000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b509392505050565b5f805f8512156114ec576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b845f036114fe57505f905060016116a8565b8460ff8416850185811215611549576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f805f8312156115b3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb383121561158a575f8095509550505050506116a8565b825f03600a0a91508184816115a1576115a1614974565b04955050840290911491506116a89050565b5f83131561169d57604d831315611609576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8161163e5761163e614974565b0484111561168b576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b50919091029250600191506116a89050565b509193506001925050505b935093915050565b5f805f8412156116ec576116c484846132d4565b90945092506116d48585856116b0565b90945092506116e384846113f2565b915091506116a8565b5f806116f88686611b56565b9092509050845f808061170b8585613978565b9194509250905061270d6127106117236001826149ce565b851461173a576117348d8686613a67565b90925090505b83156117c5575f61174c8660016149f4565b90505b80848583028161176157611761614974565b051461177857600a84059350600a8805975061174f565b6117b96117858588614a1b565b896117908785614a1b565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc613b20565b909d509b506117ec9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866117fd84835f611bbe565b6118088860016149f4565b61181291906149f4565b94509450505050935093915050565b5f80838361182f8282613bbd565b90965094505f86136118b057855f03611874576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b5050837f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000036118ee576118e483604c6149f4565b5f915091506116a8565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000008412158061193d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb561195f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412611b1a575f805f805f8561197857604b61197b565b604c5b611985908a6149f4565b90505f80876119b2577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000006119d3565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c81611a0557611a05614974565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050611a3e8c82613c13565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414611aca576123278114611aa557611a808c82600101613c13565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002611ac7565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50611afa838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613b20565b909a509850611b0b8a8a835f6130d0565b975097505050505050506116a8565b611b2485856113f2565b9095509350611b34868686611821565b9095509350611b4385856132d4565b92509250506116a8565b50935093915050565b5f805f8312611b6957508290505f6106ad565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4831215611b9b57505f9050826106ad565b5f839003600a0a808581611bb157611bb1614974565b0794859003959350505050565b5f818303611bcd575082610695565b82821315611c1057828203604c811380611be757505f8113155b15611bf5575f915050610695565b80600a0a8581611c0757611c07614974565b05915050610695565b818303604c811380611c2257505f8113155b15611c6a576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604481018490526064016108ce565b600a81900a85810286828281611c8257611c82614974565b0514611ccb576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604481018690526064016108ce565b9250610695915050565b5f8085158415178015611ced575f92505f9150611dea565b611cf784876149f4565b91505f611d0388613c9a565b90505f611d0f87613c9a565b90505f611d1c8383613d00565b5090505f6f0785ee10d5da46d900f436a000000000821115611d51576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115611d7257670de0b6b3a7640000820491506012015b633b9aca00821115611d8b57633b9aca00820491506009015b612710821115611da057612710820491506004015b8115611db457600a82049150600101611da0565b611dbe81876149f4565b9550611de08b8a611dda8787611dd587600a614b84565b613d3b565b89613e20565b9097509550505050505b5094509492505050565b5f80835f03611e39576040517f7a97930f00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b855f03611e4a57505f90508061240f565b5f805f80611e588a8a613f27565b919b5099509150611e698888613f27565b919950975090505f611e7a8b613c9a565b90505f611e868a613c9a565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c818310156122a3578415611ee457507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b612262565b6f4b3b4ca85a86c47a098a22400000000083101561201057678ac7230489e80000831015611f74576402540be400831015611f4257620186a0831015611f325750620186a0905060056121eb565b506402540be4009050600a6121eb565b655af3107a4000831015611f615750655af3107a40009050600e6121eb565b50678ac7230489e80000905060136121eb565b6b204fce5e3e25026110000000831015611fc65769152d02c7e14af6800000831015611faf575069152d02c7e14af6800000905060176121eb565b506b204fce5e3e250261100000009050601c6121eb565b6d314dc6448d9338c15b0a00000000831015611ff557506d314dc6448d9338c15b0a00000000905060216121eb565b506f4b3b4ca85a86c47a098a224000000000905060266121eb565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156121085773af298d050e4395d69670b12b7f410000000000008310156120a3577172cb5bd86321e38cb6ce6682e8000000000083101561208457507172cb5bd86321e38cb6ce6682e800000000009050602b6121eb565b5073af298d050e4395d69670b12b7f41000000000000905060306121eb565b76010b46c6cdd6e3e0828f4db456ff0c8ea00000000000008310156120e4575076010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000905060356121eb565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a6121eb565b7c03b58e88c75313ec9d329eaaa18fb92f75215b1710000000000000000083101561219e577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561217657507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f6121eb565b507c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000905060446121eb565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000008310156121eb57507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b81831161221f57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016121eb565b815f03612262576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c90526044016108ce565b856122a3576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e90526044016108ce565b807f8000000000000000000000000000000000000000000000000000000000000000018d126122d657808d039c50612349565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f81131561234957807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b1361233657998a0199612349565b5f8099509950505050505050505061240f565b5f808e12801561235857505f8c135b15612395577f80000000000000000000000000000000000000000000000000000000000000008e01808d1361238d575f612391565b808d035b9150505b8b818f010397506123b28f8e6123ac888789613d3b565b8b613e20565b90995097505f8113156123fc57604c8113156123dc575f809a509a5050505050505050505061240f565b80600a0a89816123ee576123ee614974565b059850885f036123fc575f97505b5096985094965061240f95505050505050565b94509492505050565b5f61242585858585613200565b1495945050505050565b60608161243c8482613bbd565b90945092505f8061246d7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000087614b8f565b1561249d57507f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000009050604c6124c4565b507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b5b5f6124cf8388614b8f565b90505f6124dc8489614bf6565b90505f808312156124f6575060016124f383614c09565b92505b5f82121561250d5750600161250a82614c09565b91505b60408051602081019091525f81528215612616575f8061252e600a89614c39565b90505b61253b8186614b8f565b5f036125605761254c600a82614c39565b90508161255881614c4c565b925050612531565b60408051602081019091525f8082525b838110156125c157816040516020016125899190614c9a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529150600101612570565b505b6125ce600a87614bf6565b5f036125e6576125df600a87614b8f565b95506125c3565b806125f0876141c8565b604051602001612601929190614cd2565b60405160208183030381529060405293505050505b5f612620856141c8565b90505f61262d878c6149f4565b9050637fffffff81138061266057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000081125b1561269a576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018a90526024016108ce565b5f81156126ce576126aa826141c8565b6040516020016126ba9190614d14565b6040516020818303038152906040526126de565b60405180602001604052805f8152505b90505f856126fa5760405180602001604052805f815250612731565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90508084868460405160200161274a9493929190614d45565b6040516020818303038152906040529b50505050505050505050505092915050565b60606103e882138061278757506127846103e8614c09565b82125b156127c1576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018390526024016108ce565b5f8084129081156127dc576127d585614c09565b90506127df565b50835b5f8413156128a2578360448110612825576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5b8281101561286157612857600a83614c39565b9150600101612844565b508083111561289f576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018790526024016108ce565b50505b5f6128ac82614254565b80519091505f5b818110801561292f575082816128ca600185614d65565b6128d49190614d65565b815181106128e4576128e4614d78565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f3000000000000000000000000000000000000000000000000000000000000000145b15612946578061293e81614c4c565b9150506128b3565b5f6129518284614d65565b90505f61295e838a6149f4565b90505f8761297a5760405180602001604052805f8152506129b1565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90505f8212612b2b57815f6129c68286614da5565b67ffffffffffffffff8111156129de576129de614855565b6040519080825280601f01601f191660200182016040528015612a08576020820181803683370190505b5090505f5b85811015612a7a57888181518110612a2757612a27614d78565b602001015160f81c60f81b828281518110612a4457612a44614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a0d565b505f5b82811015612af7577f300000000000000000000000000000000000000000000000000000000000000082612ab18389614da5565b81518110612ac157612ac1614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a7d565b508281604051602001612b0b929190614db8565b6040516020818303038152906040529a5050505050505050505050610684565b5f612b3583614c09565b905080841115612d4c575f612b4a8286614d65565b90505f612b58866001614da5565b67ffffffffffffffff811115612b7057612b70614855565b6040519080825280601f01601f191660200182016040528015612b9a576020820181803683370190505b5090505f5b82811015612c0c57898181518110612bb957612bb9614d78565b602001015160f81c60f81b828281518110612bd657612bd6614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612b9f565b507f2e00000000000000000000000000000000000000000000000000000000000000818381518110612c4057612c40614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b83811015612d175789612c838285614da5565b81518110612c9357612c93614d78565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612cc7866001614da5565b612cd19190614da5565b81518110612ce157612ce1614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612c70565b508381604051602001612d2b929190614db8565b6040516020818303038152906040529b505050505050505050505050610684565b5f612d578583614d65565b90505f85612d66836002614da5565b612d709190614da5565b67ffffffffffffffff811115612d8857612d88614855565b6040519080825280601f01601f191660200182016040528015612db2576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110612de857612de8614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f2e0000000000000000000000000000000000000000000000000000000000000081600181518110612e4a57612e4a614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b82811015612ef5577f300000000000000000000000000000000000000000000000000000000000000082612eaf836002614da5565b81518110612ebf57612ebf614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612e7a565b505f5b86811015612d1757898181518110612f1257612f12614d78565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612f46866002614da5565b612f509190614da5565b81518110612f6057612f60614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612ef8565b5f805f805f612fa5878761391c565b92509250925080612fec576040517fc471796600000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016108ce565b50909590945092505050565b5f805f6130058585613816565b915091508061149e576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b5f8061305684846132d4565b9094509250613067868686866130d0565b9150915094509492505050565b5f805f6130828686866114a6565b91509150806130c7576040517f05e4767800000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b50949350505050565b5f80851584151780156130fc57865f036130f0578484925092505061240f565b8686925092505061240f565b6131068787613bbd565b90975095506131158585613bbd565b909550935085841315613129579395929492935b838603604c81111561314257878793509350505061240f565b80600a0a868161315457613154614974565b0595505086850180881860ff90811c151589881890911c151680156131ef57877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036131d6576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a9052602481018990526044016108ce565b600a9687900596909805860197600197909701966131f3565b8198505b5096979596505050505050565b5f8085158415178187128286121817858414178015613225578685925092505061240f565b505f85841315613239575092949193919260015b8386035f8112604c821317801561326c57821561325e575f899450945050505061240f565b885f9450945050505061240f565b600a82900a8981028a82828161328457613284614974565b05146132b05784156132a0575f8b96509650505050505061240f565b8a5f96509650505050505061240f565b84156132c557889650945061240f9350505050565b955087945061240f9350505050565b5f807f8000000000000000000000000000000000000000000000000000000000000000840361336d577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303613360576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101859052602481018490526044016108ce565b600a840593508260010192505b50505f9190910391565b5f82818061338c838665200000000000614310565b925085831415836133a681886703ff000000000000614310565b94508085036133e057507f34bd20690000000000000000000000000000000000000000000000000000000094505f925082915061380d9050565b5f806133ec8a88614339565b90925090507fffffffff0000000000000000000000000000000000000000000000000000000082161561342a575095505f935083925061380d915050565b86519095506540000000000060015f9290921a9190911b1615158887101691505080156136b957506001909301925f8461346d81896703ff000000000000614310565b95508086036134a857507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f935083925061380d915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613517577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016134aa565b81811461356e575f8061352a8484614339565b90925090507fffffffff0000000000000000000000000000000000000000000000000000000082161561356a575097505f955085945061380d9350505050565b9350505b5f8312156135a957507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f945084935061380d92505050565b83156135b557825f0392505b80820394505f8513156135f557507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f945084935061380d92505050565b855f03613604578295506136b6565b5f859003604381111561364557507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f955085945061380d9350505050565b600a0a8681025f8883838161365c5761365c614974565b0514159050601b82900b82141581806136725750805b156136ae57507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f985088975061380d9650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b1615158786101680156137fe57600190950194856136f9818a65200000000000614310565b96508661370f818b6703ff000000000000614310565b975080880361374c57507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f955085945061380d9350505050565b505f80613759838a614339565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613799575097505f955085945061380d9350505050565b9250508482015f831380156137ad57508581125b806137c157505f831280156137c157508581135b156137fa57507fd556b1110000000000000000000000000000000000000000000000000000000097505f955085945061380d9350505050565b9450505b845f03613809575f93505b5050505b92959194509250565b5f601b83900b831483838261387a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561385a57620186a0860595506005850194505b8586601b0b1461387557600a8605955084600101945061385a565b613890565b855f0361389057505f9250600191506106ad9050565b848560030b146138ec575f8512156138b057505f92508291506106ad9050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86111561396757600a860460018201600a88065f1493509350935050613971565b8593509150600190505b9250925092565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc036139b057508391505f90506001613971565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc841215613a3e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0841215613a0f57505f9150508215156001613971565b5f846004015f03600a0a90505f818781613a2b57613a2b614974565b0594505080840286141592509050613971565b5f8412613a5357505f91508190506001613971565b50505060048101600a0a82025f6001613971565b5f80806064613a79600a612328614c39565b613a86600a612328614c39565b613a91906002614dc6565b613a9c906001614da5565b613aa69190614da5565b613ab09190614da5565b9050613af4565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b613aff858288613ab7565b92508315611b4d57613b15600186018288613ab7565b915050935093915050565b5f80888803613b33575083905081613bb1565b5f805f80613b438c8b8f8d61304a565b915091505f80613b558a8a8d8c61304a565b91509150613b6584848484611cd5565b8096508197505050505050505f80613b7f8b8b8f8d61304a565b915091505f80613b9186868686611df4565b915091505f80613ba384848f8e6130d0565b909a50985050505050505050505b97509795505050505050565b5f805f805f613bcc8787613f27565b92509250925080612fec576040517f05e51ecb00000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f80613c22600a612328614c39565b613c2d906002614dc6565b613c38906001614da5565b90505f613c48600a612328614c39565b90506002600a8504026001015f8052600281601e883c505f51617fff81169350618000811615613c7757918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f80821215613cf7577f80000000000000000000000000000000000000000000000000000000000000008203613cf157507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b919050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f613d488686613d00565b91509150815f03613d6c57838181613d6257613d62614974565b0492505050610695565b838210613db6576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016108ce565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215613eea577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613ed757613e7f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001614da5565b8403613eaf57507f800000000000000000000000000000000000000000000000000000000000000090508161240f565b613eba600a85614c39565b613ec390614c09565b613ece8460016149f4565b9150915061240f565b613ee084614c09565b839150915061240f565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613f1d57613ec3600a85614c39565b508290508161240f565b5f805f845f03613f3f57505f91508190506001613971565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f03614153576f4b3b4ca85a86c47a098a2240000000008505158015613fa857507f80000000000000000000000000000000000000000000000000000000000000268412155b15613fc9576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a00000000000000850515801561401157507f80000000000000000000000000000000000000000000000000000000000000138412155b1561402a57678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000850515801561407657507f800000000000000000000000000000000000000000000000000000000000000a8412155b1561408c576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000085051580156140db57507f80000000000000000000000000000000000000000000000000000000000000028412155b156140f15760648502945060028403935061408c565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000850515801561414157507f80000000000000000000000000000000000000000000000000000000000000018412155b1561415357600a850294506001840393505b600a8086029081058614801561418957507f80000000000000000000000000000000000000000000000000000000000000018512155b15614198578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b60605f82126141e55760405180602001604052805f81525061421c565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b61422d60ff84901d80850118614254565b60405160200161423e929190614db8565b6040516020818303038152906040529050919050565b60605f61426083614463565b60010190505f8167ffffffffffffffff81111561427f5761427f614855565b6040519080825280601f01601f1916602001820160405280156142a9576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846142b357509392505050565b5f5b5f82600186515f1a1b1611838510161561433157600184019350614312565b509192915050565b81515f90819065200000000000600191831a9190911b161515838510168085019082806143668488614544565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156143a1575093505f92506106ad915050565b825f03614404577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81116143d5575f6143f7565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b955093506106ad92505050565b7f80000000000000000000000000000000000000000000000000000000000000008111614431575f614453565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106144ab577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106144d7576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106144f557662386f26fc10000830492506010015b6305f5e100831061450d576305f5e100830492506008015b612710831061452157612710830492506004015b60648310614533576064830492506002015b600a83106106845760010192915050565b5f8082841061457757507f34bd20690000000000000000000000000000000000000000000000000000000090505f6106ad565b835f036145b0576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b8782101580156145e85750604d83105b1561462b57815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a85900302016145d8565b8782106147515781515f1a849003600181111561467357507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b600a84900a81028281018311156146b657507f0fdc26350000000000000000000000000000000000000000000000000000000096505f95506106ad945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b8782106147515781515f1a6030811461472657507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101906146e2565b5f9890975095505050505050565b5f6020828403121561476f575f80fd5b5035919050565b5f8060408385031215614787575f80fd5b50508035926020909101359150565b803560ff81168114613cfb575f80fd5b5f80604083850312156147b7575f80fd5b823591506147c760208401614796565b90509250929050565b5f80604083850312156147e1575f80fd5b82359150602083013580151581146147f7575f80fd5b809150509250929050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215614892575f80fd5b813567ffffffffffffffff808211156148a9575f80fd5b818401915084601f8301126148bc575f80fd5b8135818111156148ce576148ce614855565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561491457614914614855565b8160405282815287602084870101111561492c575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f6060848603121561495d575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181035f8312801583831316838312821617156149ed576149ed6149a1565b5092915050565b8082018281125f831280158216821582161715614a1357614a136149a1565b505092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615614a5257614a526149a1565b8181058314821517610684576106846149a1565b600181815b80851115614abf57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614aa557614aa56149a1565b80851615614ab257918102915b93841c9390800290614a6b565b509250929050565b5f82614ad557506001610684565b81614ae157505f610684565b8160018114614af75760028114614b0157614b1d565b6001915050610684565b60ff841115614b1257614b126149a1565b50506001821b610684565b5060208310610133831016604e8410600b8410161715614b40575081810a610684565b614b4a8383614a66565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614b7c57614b7c6149a1565b029392505050565b5f6106958383614ac7565b5f82614b9d57614b9d614974565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614bf157614bf16149a1565b500590565b5f82614c0457614c04614974565b500790565b5f7f80000000000000000000000000000000000000000000000000000000000000008203613cf157613cf16149a1565b5f82614c4757614c47614974565b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c7c57614c7c6149a1565b5060010190565b5f81518060208401855e5f93019283525090919050565b5f614ca58284614c83565b7f300000000000000000000000000000000000000000000000000000000000000081526001019392505050565b7f2e0000000000000000000000000000000000000000000000000000000000000081525f614d0c614d066001840186614c83565b84614c83565b949350505050565b7f650000000000000000000000000000000000000000000000000000000000000081525f6106956001830184614c83565b5f610a29614d06614d5f614d59858a614c83565b88614c83565b86614c83565b81810381811115610684576106846149a1565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b80820180821115610684576106846149a1565b5f614d0c614d068386614c83565b8082028115828204841417610684576106846149a156"; + hex"6080604052348015600e575f80fd5b5060156019565b60b8565b73c51a14251b0dcf0ae24a96b7153991378938f5f53f7f2573004ac3a9ee7fc8d73654d76386f1b6b99e34cdf86a689c4691e47143420f811460b557604051630912d0ff60e31b815273c51a14251b0dcf0ae24a96b7153991378938f5f560048201527f2573004ac3a9ee7fc8d73654d76386f1b6b99e34cdf86a689c4691e47143420f60248201526044810182905260640160405180910390fd5b50565b614e19806100c55f395ff3fe608060405234801561000f575f80fd5b506004361061029d575f3560e01c806381f7e2f511610171578063cde72ef3116100d2578063dd64691711610088578063e5526ecd1161006e578063e5526ecd1461062e578063e75f991f14610641578063ffae15ba14610654575f80fd5b8063dd64691714610608578063e0db58881461061b575f80fd5b8063d1de592a116100b8578063d1de592a146105bb578063d35273a7146105ce578063d3d6ffa8146105f5575f80fd5b8063cde72ef314610582578063d102b4d3146105a8575f80fd5b8063a19684b711610127578063bc1b392d1161010d578063bc1b392d1461050b578063bc62d8d814610511578063cb09682b1461055c575f80fd5b8063a19684b7146104d2578063a90d041a146104f8575f80fd5b806396ce1ec71161015757806396ce1ec7146104885780639b4afd991461049b578063a100a3d9146104bf575f80fd5b806381f7e2f5146104625780638dc2980714610475575f80fd5b80633447c0301161021b5780635ca0e7a4116101d1578063719cd99d116101b7578063719cd99d1461042957806373bfb2831461043c57806381a822721461044f575f80fd5b80635ca0e7a4146103f0578063602c35fc14610403575f80fd5b80633b3bd868116102015780633b3bd868146103b757806341aa0080146103ca5780635b23771d146103dd575f80fd5b80633447c03014610374578063371493ce14610397575f80fd5b80631ee62f111161027057806328fa1f011161025657806328fa1f011461033b5780633004fa411461034e5780633029740014610361575f80fd5b80631ee62f11146103155780632538835014610328575f80fd5b806304327dc5146102a1578063078b665b146102c75780630b6429bc146102da578063146e82ad14610302575b5f80fd5b6102b46102af36600461479b565b61067a565b6040519081526020015b60405180910390f35b6102b46102d53660046147b2565b61068a565b6102ed6102e83660046147e2565b61069c565b604080519283529015156020830152016102be565b6102b461031036600461479b565b6106b4565b6102b461032336600461479b565b6106d3565b6102b461033636600461479b565b6106f2565b6102b461034936600461479b565b610711565b6102b461035c3660046147b2565b61071b565b6102b461036f3660046147b2565b61073b565b6103876103823660046147b2565b610746565b60405190151581526020016102be565b6103aa6103a536600461480c565b610751565b6040516102be919061483e565b6102b46103c53660046147e2565b61075d565b6102b46103d83660046147b2565b610768565b6102b46103eb3660046147e2565b610773565b6102b46103fe36600461479b565b61077e565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b6102b461043736600461479b565b610788565b61038761044a3660046147b2565b610792565b6102b461045d36600461479b565b61079d565b6103876104703660046147b2565b6107a7565b6103876104833660046147b2565b6107b2565b6102b46104963660046147b2565b6107bd565b6102b47c090000000000000000000000000000000000000000000000000000000181565b6103aa6104cd36600461479b565b6107c8565b7f80000000000000000000000000000000000000000000000000000000000000016102b4565b6102b46105063660046147b2565b610812565b5f6102b4565b61052461051f3660046148be565b61081d565b604080517fffffffff0000000000000000000000000000000000000000000000000000000090931683526020830191909152016102be565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b7f7fffffff800000000000000000000000000000000000000000000000000000006102b4565b6103876105b63660046147b2565b610836565b6102b46105c93660046147b2565b610841565b6102b47ffffffffc0000000000000000000000000000000000000000000000000000000181565b6102b461060336600461479b565b61084c565b61038761061636600461479b565b610856565b6102b461062936600461479b565b61087c565b6103aa61063c366004614987565b610886565b6102ed61064f3660046147e2565b61090f565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc6102b4565b5f6106848261091b565b92915050565b5f610695838361095d565b9392505050565b5f806106a88484610979565b915091505b9250929050565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109ba565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109e6565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f5610a33565b5f61068482610a66565b5f610695838373c51a14251b0dcf0ae24a96b7153991378938f5f5610aa7565b5f6106958383610d01565b5f6106958383610d63565b60606106958383610db1565b5f6106958383610e44565b5f6106958383610e5f565b5f6106958383610ea4565b5f61068482610ed7565b5f61068482610f8d565b5f6106958383611039565b5f6106848261107c565b5f61069583836110c1565b5f6106958383611104565b5f6106958383611147565b6060610684827ffffffffc000000000000000000000000000000000000000000000000000000017c0900000000000000000000000000000000000000000000000000000001610886565b5f610695838361118c565b5f805f8061082a85611197565b90969095509350505050565b5f6106958383611285565b5f61069583836112c8565b5f6106848261130d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821615610684565b5f6106848261133f565b60606108928383611285565b6108d7576040517f3be5bf9400000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044015b60405180910390fd5b5f6108e18561107c565b9050610906856108f18387611285565b8061090157506109018386611104565b610db1565b95945050505050565b5f806106a88484611380565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826113c0565b90925090505f610906838361140e565b5f6109688383611104565b6109725781610695565b5090919050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6109ad828287611474565b9350935050509250929050565b5f610695837fffffffff0000000000000000000000000000000000000000000000000000000584610aa7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a1984838361167e565b90925090505f610a29838361140e565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a198483836117ef565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82610a998383611b24565b9150505f610a29828461140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516610ae45750600191506106959050565b5f8213610b7d57815f03610b4157610afc855f611285565b15610b36576040517f8be82972000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b505f91506106959050565b6040517fcceba0f100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b610b88856001610d63565b8015610b995750610b99865f611104565b15610ba8578592505050610695565b610bb2855f611285565b15610bdb57610bd2610bc38761091b565b610bcc8761130d565b86610aa7565b92505050610695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80610c0e8484611b24565b915091505f610c1e83855f611b8c565b905060015f8080610c558f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510610c9c5784600116600103610c7f57610c7984848484611ca3565b90945092505b600185901c9450610c9282828484611ca3565b9092509050610c5a565b5f80610ca98f8e8e6117ef565b91509150610cb982828a8d611ca3565b9092509050610cc98f838361167e565b9092509050610cda82828888611ca3565b90925090505f610cea838361140e565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611dc2565b915091505f610d55838361140e565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846123e6565b979650505050505050565b60607bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d5f829003610e21576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525092505050610684565b8315610e3a57610e3182826123fd565b92505050610684565b610906828261273a565b5f805f610e518585612f64565b915091506109068282612fc6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686613018565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610906828286613042565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610f0e57509192915050565b5f80610f1a8484611b24565b915091505f84128015610f2c57508015155b15610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613018565b935091505b5f610da6838561140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610fc457509192915050565b5f80610fd08484611b24565b91509150805f03610fe5575093949350505050565b5f811315610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb461309e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846131ce565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828212156110b65761094d82826131ea565b5f610906838361140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da68484848461328d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846132a9565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611ca3565b5f6109688383611285565b80515f908190602084810191850101828080806111b486866132c4565b929650909450925090507fffffffff0000000000000000000000000000000000000000000000000000000084165f0361127657848303611246575f806111fa8484613763565b915091508061123557507f32b8b8be000000000000000000000000000000000000000000000000000000009a5f9a5098505050505050505050565b505f9a909950975050505050505050565b507fad384e8700000000000000000000000000000000000000000000000000000000985f98509650505050505050565b5091975f975095505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da684848484613869565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d468686868661309e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826131ea565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d826113728383611b24565b5090505f610a29828461140e565b5f805f805f61138f8787613884565b9250925092505f806113a18585613763565b91509150818380156113b05750815b9650965050505050509250929050565b5f806106a87f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686611dc2565b5f805f61141b8585613763565b915091508015801561142b575081155b1561146c576040517f8eba4d0700000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b509392505050565b5f805f8512156114ba576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b845f036114cc57505f90506001611676565b8460ff8416850185811215611517576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f805f831215611581577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3831215611558575f809550955050505050611676565b825f03600a0a915081848161156f5761156f6149b0565b04955050840290911491506116769050565b5f83131561166b57604d8313156115d7576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8161160c5761160c6149b0565b04841115611659576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b50919091029250600191506116769050565b509193506001925050505b935093915050565b5f805f8412156116ba5761169284846131ea565b90945092506116a285858561167e565b90945092506116b184846113c0565b91509150611676565b5f806116c68686611b24565b9092509050845f80806116d985856138e0565b9194509250905061270d6127106116f1600182614a0a565b8514611708576117028d86866139cf565b90925090505b8315611793575f61171a866001614a30565b90505b80848583028161172f5761172f6149b0565b051461174657600a84059350600a8805975061171d565b6117876117538588614a57565b8961175e8785614a57565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc613a88565b909d509b506117ba9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866117cb84835f611b8c565b6117d6886001614a30565b6117e09190614a30565b94509450505050935093915050565b5f8083836117fd8282613b25565b90965094505f861361187e57855f03611842576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b5050837f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000036118bc576118b283604c614a30565b5f91509150611676565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000008412158061190b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb561192d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412611ae8575f805f805f8561194657604b611949565b604c5b611953908a614a30565b90505f8087611980577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000006119a1565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c816119d3576119d36149b0565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050611a0c8c82613b7b565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414611a98576123278114611a7357611a4e8c82600101613b7b565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002611a95565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50611ac8838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613a88565b909a509850611ad98a8a835f61309e565b97509750505050505050611676565b611af285856113c0565b9095509350611b028686866117ef565b9095509350611b1185856131ea565b9250925050611676565b50935093915050565b5f805f8312611b3757508290505f6106ad565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4831215611b6957505f9050826106ad565b5f839003600a0a808581611b7f57611b7f6149b0565b0794859003959350505050565b5f818303611b9b575082610695565b82821315611bde57828203604c811380611bb557505f8113155b15611bc3575f915050610695565b80600a0a8581611bd557611bd56149b0565b05915050610695565b818303604c811380611bf057505f8113155b15611c38576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604481018490526064016108ce565b600a81900a85810286828281611c5057611c506149b0565b0514611c99576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604481018690526064016108ce565b9250610695915050565b5f8085158415178015611cbb575f92505f9150611db8565b611cc58487614a30565b91505f611cd188613c02565b90505f611cdd87613c02565b90505f611cea8383613c68565b5090505f6f0785ee10d5da46d900f436a000000000821115611d1f576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115611d4057670de0b6b3a7640000820491506012015b633b9aca00821115611d5957633b9aca00820491506009015b612710821115611d6e57612710820491506004015b8115611d8257600a82049150600101611d6e565b611d8c8187614a30565b9550611dae8b8a611da88787611da387600a614bc0565b613ca3565b89613d88565b9097509550505050505b5094509492505050565b5f80835f03611e07576040517f7a97930f00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b855f03611e1857505f9050806123dd565b5f805f80611e268a8a613e8f565b919b5099509150611e378888613e8f565b919950975090505f611e488b613c02565b90505f611e548a613c02565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c81831015612271578415611eb257507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b612230565b6f4b3b4ca85a86c47a098a224000000000831015611fde57678ac7230489e80000831015611f42576402540be400831015611f1057620186a0831015611f005750620186a0905060056121b9565b506402540be4009050600a6121b9565b655af3107a4000831015611f2f5750655af3107a40009050600e6121b9565b50678ac7230489e80000905060136121b9565b6b204fce5e3e25026110000000831015611f945769152d02c7e14af6800000831015611f7d575069152d02c7e14af6800000905060176121b9565b506b204fce5e3e250261100000009050601c6121b9565b6d314dc6448d9338c15b0a00000000831015611fc357506d314dc6448d9338c15b0a00000000905060216121b9565b506f4b3b4ca85a86c47a098a224000000000905060266121b9565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156120d65773af298d050e4395d69670b12b7f41000000000000831015612071577172cb5bd86321e38cb6ce6682e8000000000083101561205257507172cb5bd86321e38cb6ce6682e800000000009050602b6121b9565b5073af298d050e4395d69670b12b7f41000000000000905060306121b9565b76010b46c6cdd6e3e0828f4db456ff0c8ea00000000000008310156120b2575076010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000905060356121b9565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a6121b9565b7c03b58e88c75313ec9d329eaaa18fb92f75215b1710000000000000000083101561216c577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561214457507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f6121b9565b507c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000905060446121b9565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000008310156121b957507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b8183116121ed57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016121b9565b815f03612230576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c90526044016108ce565b85612271576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e90526044016108ce565b807f8000000000000000000000000000000000000000000000000000000000000000018d126122a457808d039c50612317565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f81131561231757807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b1361230457998a0199612317565b5f809950995050505050505050506123dd565b5f808e12801561232657505f8c135b15612363577f80000000000000000000000000000000000000000000000000000000000000008e01808d1361235b575f61235f565b808d035b9150505b8b818f010397506123808f8e61237a888789613ca3565b8b613d88565b90995097505f8113156123ca57604c8113156123aa575f809a509a505050505050505050506123dd565b80600a0a89816123bc576123bc6149b0565b059850885f036123ca575f97505b509698509496506123dd95505050505050565b94509492505050565b5f6123f385858585614130565b1495945050505050565b60608161240a8482613b25565b90945092505f8061243b7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000087614bcb565b1561246b57507f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000009050604c612492565b507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b5b5f61249d8388614bcb565b90505f6124aa8489614c32565b90505f808312156124c4575060016124c183614c45565b92505b5f8212156124db575060016124d882614c45565b91505b60408051602081019091525f815282156125e4575f806124fc600a89614c75565b90505b6125098186614bcb565b5f0361252e5761251a600a82614c75565b90508161252681614c88565b9250506124ff565b60408051602081019091525f8082525b8381101561258f57816040516020016125579190614cd6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052915060010161253e565b505b61259c600a87614c32565b5f036125b4576125ad600a87614bcb565b9550612591565b806125be87614204565b6040516020016125cf929190614d0e565b60405160208183030381529060405293505050505b5f6125ee85614204565b90505f6125fb878c614a30565b9050637fffffff81138061262e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000081125b15612668576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018a90526024016108ce565b5f811561269c5761267882614204565b6040516020016126889190614d50565b6040516020818303038152906040526126ac565b60405180602001604052805f8152505b90505f856126c85760405180602001604052805f8152506126ff565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b9050808486846040516020016127189493929190614d81565b6040516020818303038152906040529b50505050505050505050505092915050565b60606103e882138061275557506127526103e8614c45565b82125b1561278f576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018390526024016108ce565b5f8084129081156127aa576127a385614c45565b90506127ad565b50835b5f8413156128705783604481106127f3576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5b8281101561282f57612825600a83614c75565b9150600101612812565b508083111561286d576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018790526024016108ce565b50505b5f61287a82614290565b80519091505f5b81811080156128fd57508281612898600185614da1565b6128a29190614da1565b815181106128b2576128b2614db4565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f3000000000000000000000000000000000000000000000000000000000000000145b15612914578061290c81614c88565b915050612881565b5f61291f8284614da1565b90505f61292c838a614a30565b90505f876129485760405180602001604052805f81525061297f565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90505f8212612af957815f6129948286614de1565b67ffffffffffffffff8111156129ac576129ac614891565b6040519080825280601f01601f1916602001820160405280156129d6576020820181803683370190505b5090505f5b85811015612a48578881815181106129f5576129f5614db4565b602001015160f81c60f81b828281518110612a1257612a12614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506001016129db565b505f5b82811015612ac5577f300000000000000000000000000000000000000000000000000000000000000082612a7f8389614de1565b81518110612a8f57612a8f614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a4b565b508281604051602001612ad9929190614df4565b6040516020818303038152906040529a5050505050505050505050610684565b5f612b0383614c45565b905080841115612d1a575f612b188286614da1565b90505f612b26866001614de1565b67ffffffffffffffff811115612b3e57612b3e614891565b6040519080825280601f01601f191660200182016040528015612b68576020820181803683370190505b5090505f5b82811015612bda57898181518110612b8757612b87614db4565b602001015160f81c60f81b828281518110612ba457612ba4614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612b6d565b507f2e00000000000000000000000000000000000000000000000000000000000000818381518110612c0e57612c0e614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b83811015612ce55789612c518285614de1565b81518110612c6157612c61614db4565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612c95866001614de1565b612c9f9190614de1565b81518110612caf57612caf614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612c3e565b508381604051602001612cf9929190614df4565b6040516020818303038152906040529b505050505050505050505050610684565b5f612d258583614da1565b90505f85612d34836002614de1565b612d3e9190614de1565b67ffffffffffffffff811115612d5657612d56614891565b6040519080825280601f01601f191660200182016040528015612d80576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110612db657612db6614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f2e0000000000000000000000000000000000000000000000000000000000000081600181518110612e1857612e18614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b82811015612ec3577f300000000000000000000000000000000000000000000000000000000000000082612e7d836002614de1565b81518110612e8d57612e8d614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612e48565b505f5b86811015612ce557898181518110612ee057612ee0614db4565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612f14866002614de1565b612f1e9190614de1565b81518110612f2e57612f2e614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612ec6565b5f805f805f612f738787613884565b92509250925080612fba576040517fc471796600000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016108ce565b50909590945092505050565b5f805f612fd38585613763565b915091508061146c576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b5f8061302484846131ea565b90945092506130358686868661309e565b9150915094509492505050565b5f805f613050868686611474565b9150915080613095576040517f05e4767800000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b50949350505050565b5f80851584151780156130ca57865f036130be57848492509250506123dd565b868692509250506123dd565b6130d48787613b25565b90975095506130e38585613b25565b9095509350858413156130f7579395929492935b838603604c8111156131105787879350935050506123dd565b80600a0a8681613122576131226149b0565b0595505086850180881860ff90811c151589881890911c151680156131bd57877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036131a4576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a9052602481018990526044016108ce565b600a9687900596909805860197600197909701966131c1565b8198505b5096979596505050505050565b5f805f6131dd87878787614130565b1315979650505050505050565b5f807f80000000000000000000000000000000000000000000000000000000000000008403613283577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303613276576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101859052602481018490526044016108ce565b600a840593508260010192505b50505f9190910391565b5f805f61329c87878787614130565b1215979650505050505050565b5f805f6132b887878787614130565b12979650505050505050565b5f8281806132d983866520000000000061434c565b925085831415836132f381886703ff00000000000061434c565b945080850361332d57507f34bd20690000000000000000000000000000000000000000000000000000000094505f925082915061375a9050565b5f806133398a88614375565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613377575095505f935083925061375a915050565b86519095506540000000000060015f9290921a9190911b16151588871016915050801561360657506001909301925f846133ba81896703ff00000000000061434c565b95508086036133f557507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f935083925061375a915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613464577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016133f7565b8181146134bb575f806134778484614375565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156134b7575097505f955085945061375a9350505050565b9350505b5f8312156134f657507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f945084935061375a92505050565b831561350257825f0392505b80820394505f85131561354257507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f945084935061375a92505050565b855f0361355157829550613603565b5f859003604381111561359257507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b600a0a8681025f888383816135a9576135a96149b0565b0514159050601b82900b82141581806135bf5750805b156135fb57507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f985088975061375a9650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b16151587861016801561374b5760019095019485613646818a6520000000000061434c565b96508661365c818b6703ff00000000000061434c565b975080880361369957507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b505f806136a6838a614375565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156136e6575097505f955085945061375a9350505050565b9250508482015f831380156136fa57508581125b8061370e57505f8312801561370e57508581135b1561374757507fd556b1110000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b9450505b845f03613756575f93505b5050505b92959194509250565b5f601b83900b83148383826137c7577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156137a757620186a0860595506005850194505b8586601b0b146137c257600a860595508460010194506137a7565b6137dd565b855f036137dd57505f9250600191506106ad9050565b848560030b14613839575f8512156137fd57505f92508291506106ad9050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f61387887878787614130565b13979650505050505050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156138cf57600a860460018201600a88065f14935093509350506138d9565b8593509150600190505b9250925092565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0361391857508391505f905060016138d9565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8412156139a6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb084121561397757505f91505082151560016138d9565b5f846004015f03600a0a90505f818781613993576139936149b0565b05945050808402861415925090506138d9565b5f84126139bb57505f915081905060016138d9565b50505060048101600a0a82025f60016138d9565b5f808060646139e1600a612328614c75565b6139ee600a612328614c75565b6139f9906002614e02565b613a04906001614de1565b613a0e9190614de1565b613a189190614de1565b9050613a5c565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b613a67858288613a1f565b92508315611b1b57613a7d600186018288613a1f565b915050935093915050565b5f80888803613a9b575083905081613b19565b5f805f80613aab8c8b8f8d613018565b915091505f80613abd8a8a8d8c613018565b91509150613acd84848484611ca3565b8096508197505050505050505f80613ae78b8b8f8d613018565b915091505f80613af986868686611dc2565b915091505f80613b0b84848f8e61309e565b909a50985050505050505050505b97509795505050505050565b5f805f805f613b348787613e8f565b92509250925080612fba576040517f05e51ecb00000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f80613b8a600a612328614c75565b613b95906002614e02565b613ba0906001614de1565b90505f613bb0600a612328614c75565b90506002600a8504026001015f8052600281601e883c505f51617fff81169350618000811615613bdf57918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f80821215613c5f577f80000000000000000000000000000000000000000000000000000000000000008203613c5957507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b919050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f613cb08686613c68565b91509150815f03613cd457838181613cca57613cca6149b0565b0492505050610695565b838210613d1e576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016108ce565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215613e52577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613e3f57613de77f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001614de1565b8403613e1757507f80000000000000000000000000000000000000000000000000000000000000009050816123dd565b613e22600a85614c75565b613e2b90614c45565b613e36846001614a30565b915091506123dd565b613e4884614c45565b83915091506123dd565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613e8557613e2b600a85614c75565b50829050816123dd565b5f805f845f03613ea757505f915081905060016138d9565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f036140bb576f4b3b4ca85a86c47a098a2240000000008505158015613f1057507f80000000000000000000000000000000000000000000000000000000000000268412155b15613f31576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a000000000000008505158015613f7957507f80000000000000000000000000000000000000000000000000000000000000138412155b15613f9257678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008505158015613fde57507f800000000000000000000000000000000000000000000000000000000000000a8412155b15613ff4576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000850515801561404357507f80000000000000000000000000000000000000000000000000000000000000028412155b1561405957606485029450600284039350613ff4565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085051580156140a957507f80000000000000000000000000000000000000000000000000000000000000018412155b156140bb57600a850294506001840393505b600a808602908105861480156140f157507f80000000000000000000000000000000000000000000000000000000000000018512155b15614100578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f808515841517818712828612181785841417801561415557868592509250506123dd565b505f85841315614169575092949193919260015b8386035f8112604c821317801561419c57821561418e575f89945094505050506123dd565b885f945094505050506123dd565b600a82900a8981028a8282816141b4576141b46149b0565b05146141e05784156141d0575f8b9650965050505050506123dd565b8a5f9650965050505050506123dd565b84156141f55788965094506123dd9350505050565b95508794506123dd9350505050565b60605f82126142215760405180602001604052805f815250614258565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b61426960ff84901d80850118614290565b60405160200161427a929190614df4565b6040516020818303038152906040529050919050565b60605f61429c8361449f565b60010190505f8167ffffffffffffffff8111156142bb576142bb614891565b6040519080825280601f01601f1916602001820160405280156142e5576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846142ef57509392505050565b5f5b5f82600186515f1a1b1611838510161561436d5760018401935061434e565b509192915050565b81515f90819065200000000000600191831a9190911b161515838510168085019082806143a28488614580565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156143dd575093505f92506106ad915050565b825f03614440577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111614411575f614433565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b955093506106ad92505050565b7f8000000000000000000000000000000000000000000000000000000000000000811161446d575f61448f565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106144e7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310614513576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061453157662386f26fc10000830492506010015b6305f5e1008310614549576305f5e100830492506008015b612710831061455d57612710830492506004015b6064831061456f576064830492506002015b600a83106106845760010192915050565b5f808284106145b357507f34bd20690000000000000000000000000000000000000000000000000000000090505f6106ad565b835f036145ec576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b8782101580156146245750604d83105b1561466757815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a8590030201614614565b87821061478d5781515f1a84900360018111156146af57507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b600a84900a81028281018311156146f257507f0fdc26350000000000000000000000000000000000000000000000000000000096505f95506106ad945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b87821061478d5781515f1a6030811461476257507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091019061471e565b5f9890975095505050505050565b5f602082840312156147ab575f80fd5b5035919050565b5f80604083850312156147c3575f80fd5b50508035926020909101359150565b803560ff81168114613c63575f80fd5b5f80604083850312156147f3575f80fd5b82359150614803602084016147d2565b90509250929050565b5f806040838503121561481d575f80fd5b8235915060208301358015158114614833575f80fd5b809150509250929050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f602082840312156148ce575f80fd5b813567ffffffffffffffff808211156148e5575f80fd5b818401915084601f8301126148f8575f80fd5b81358181111561490a5761490a614891565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561495057614950614891565b81604052828152876020848701011115614968575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215614999575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181035f831280158383131683831282161715614a2957614a296149dd565b5092915050565b8082018281125f831280158216821582161715614a4f57614a4f6149dd565b505092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615614a8e57614a8e6149dd565b8181058314821517610684576106846149dd565b600181815b80851115614afb57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614ae157614ae16149dd565b80851615614aee57918102915b93841c9390800290614aa7565b509250929050565b5f82614b1157506001610684565b81614b1d57505f610684565b8160018114614b335760028114614b3d57614b59565b6001915050610684565b60ff841115614b4e57614b4e6149dd565b50506001821b610684565b5060208310610133831016604e8410600b8410161715614b7c575081810a610684565b614b868383614aa2565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614bb857614bb86149dd565b029392505050565b5f6106958383614b03565b5f82614bd957614bd96149b0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614c2d57614c2d6149dd565b500590565b5f82614c4057614c406149b0565b500790565b5f7f80000000000000000000000000000000000000000000000000000000000000008203613c5957613c596149dd565b5f82614c8357614c836149b0565b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614cb857614cb86149dd565b5060010190565b5f81518060208401855e5f93019283525090919050565b5f614ce18284614cbf565b7f300000000000000000000000000000000000000000000000000000000000000081526001019392505050565b7f2e0000000000000000000000000000000000000000000000000000000000000081525f614d48614d426001840186614cbf565b84614cbf565b949350505050565b7f650000000000000000000000000000000000000000000000000000000000000081525f6106956001830184614cbf565b5f610a29614d42614d9b614d95858a614cbf565b88614cbf565b86614cbf565b81810381811115610684576106846149dd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b80820180821115610684576106846149dd565b5f614d48614d428386614cbf565b8082028115828204841417610684576106846149dd56"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b506004361061029d575f3560e01c806381f7e2f511610171578063cde72ef3116100d2578063dd64691711610088578063e5526ecd1161006e578063e5526ecd1461062e578063e75f991f14610641578063ffae15ba14610654575f80fd5b8063dd64691714610608578063e0db58881461061b575f80fd5b8063d1de592a116100b8578063d1de592a146105bb578063d35273a7146105ce578063d3d6ffa8146105f5575f80fd5b8063cde72ef314610582578063d102b4d3146105a8575f80fd5b8063a19684b711610127578063bc1b392d1161010d578063bc1b392d1461050b578063bc62d8d814610511578063cb09682b1461055c575f80fd5b8063a19684b7146104d2578063a90d041a146104f8575f80fd5b806396ce1ec71161015757806396ce1ec7146104885780639b4afd991461049b578063a100a3d9146104bf575f80fd5b806381f7e2f5146104625780638dc2980714610475575f80fd5b80633447c0301161021b5780635ca0e7a4116101d1578063719cd99d116101b7578063719cd99d1461042957806373bfb2831461043c57806381a822721461044f575f80fd5b80635ca0e7a4146103f0578063602c35fc14610403575f80fd5b80633b3bd868116102015780633b3bd868146103b757806341aa0080146103ca5780635b23771d146103dd575f80fd5b80633447c03014610374578063371493ce14610397575f80fd5b80631ee62f111161027057806328fa1f011161025657806328fa1f011461033b5780633004fa411461034e5780633029740014610361575f80fd5b80631ee62f11146103155780632538835014610328575f80fd5b806304327dc5146102a1578063078b665b146102c75780630b6429bc146102da578063146e82ad14610302575b5f80fd5b6102b46102af36600461475f565b61067a565b6040519081526020015b60405180910390f35b6102b46102d5366004614776565b61068a565b6102ed6102e83660046147a6565b61069c565b604080519283529015156020830152016102be565b6102b461031036600461475f565b6106b4565b6102b461032336600461475f565b6106d3565b6102b461033636600461475f565b6106f2565b6102b461034936600461475f565b610711565b6102b461035c366004614776565b61071b565b6102b461036f366004614776565b61073b565b610387610382366004614776565b610746565b60405190151581526020016102be565b6103aa6103a53660046147d0565b610751565b6040516102be9190614802565b6102b46103c53660046147a6565b61075d565b6102b46103d8366004614776565b610768565b6102b46103eb3660046147a6565b610773565b6102b46103fe36600461475f565b61077e565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b6102b461043736600461475f565b610788565b61038761044a366004614776565b610792565b6102b461045d36600461475f565b61079d565b610387610470366004614776565b6107a7565b610387610483366004614776565b6107b2565b6102b4610496366004614776565b6107bd565b6102b47c090000000000000000000000000000000000000000000000000000000181565b6103aa6104cd36600461475f565b6107c8565b7f80000000000000000000000000000000000000000000000000000000000000016102b4565b6102b4610506366004614776565b610812565b5f6102b4565b61052461051f366004614882565b61081d565b604080517fffffffff0000000000000000000000000000000000000000000000000000000090931683526020830191909152016102be565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b7f7fffffff800000000000000000000000000000000000000000000000000000006102b4565b6103876105b6366004614776565b610836565b6102b46105c9366004614776565b610841565b6102b47ffffffffc0000000000000000000000000000000000000000000000000000000181565b6102b461060336600461475f565b61084c565b61038761061636600461475f565b610856565b6102b461062936600461475f565b61087c565b6103aa61063c36600461494b565b610886565b6102ed61064f3660046147a6565b61090f565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc6102b4565b5f6106848261091b565b92915050565b5f610695838361095d565b9392505050565b5f806106a88484610979565b915091505b9250929050565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109ba565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109e6565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f5610a33565b5f61068482610a66565b5f610695838373c51a14251b0dcf0ae24a96b7153991378938f5f5610aa7565b5f6106958383610d01565b5f6106958383610d63565b60606106958383610db1565b5f6106958383610e44565b5f6106958383610e5f565b5f6106958383610ea4565b5f61068482610ed7565b5f61068482610f8d565b5f6106958383611039565b5f61068482611089565b5f61069583836110ce565b5f610695838361111e565b5f610695838361116d565b6060610684827ffffffffc000000000000000000000000000000000000000000000000000000017c0900000000000000000000000000000000000000000000000000000001610886565b5f61069583836111b2565b5f805f8061082a856111bd565b90969095509350505050565b5f61069583836112ab565b5f61069583836112fa565b5f6106848261133f565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821615610684565b5f61068482611371565b606061089283836112ab565b6108d7576040517f3be5bf9400000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044015b60405180910390fd5b5f6108e185611089565b9050610906856108f183876112ab565b806109015750610901838661111e565b610db1565b95945050505050565b5f806106a884846113b2565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826113f2565b90925090505f6109068383611440565b5f610968838361111e565b6109725781610695565b5090919050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6109ad8282876114a6565b9350935050509250929050565b5f610695837fffffffff0000000000000000000000000000000000000000000000000000000584610aa7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a198483836116b0565b90925090505f610a298383611440565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a19848383611821565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82610a998383611b56565b9150505f610a298284611440565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516610ae45750600191506106959050565b5f8213610b7d57815f03610b4157610afc855f6112ab565b15610b36576040517f8be82972000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b505f91506106959050565b6040517fcceba0f100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b610b88856001610d63565b8015610b995750610b99865f61111e565b15610ba8578592505050610695565b610bb2855f6112ab565b15610bdb57610bd2610bc38761091b565b610bcc8761133f565b86610aa7565b92505050610695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80610c0e8484611b56565b915091505f610c1e83855f611bbe565b905060015f8080610c558f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510610c9c5784600116600103610c7f57610c7984848484611cd5565b90945092505b600185901c9450610c9282828484611cd5565b9092509050610c5a565b5f80610ca98f8e8e611821565b91509150610cb982828a8d611cd5565b9092509050610cc98f83836116b0565b9092509050610cda82828888611cd5565b90925090505f610cea8383611440565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611df4565b915091505f610d558383611440565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da684848484612418565b979650505050505050565b60607bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d5f829003610e21576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525092505050610684565b8315610e3a57610e31828261242f565b92505050610684565b610906828261276c565b5f805f610e518585612f96565b915091506109068282612ff8565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d468686868661304a565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610906828286613074565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610f0e57509192915050565b5f80610f1a8484611b56565b915091505f84128015610f2c57508015155b15610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb461304a565b935091505b5f610da68385611440565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610fc457509192915050565b5f80610fd08484611b56565b91509150805f03610fe5575093949350505050565b5f811315610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb46130d0565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61107c84848484613200565b1315979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828212156110c35761094d82826132d4565b5f6109068383611440565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61111184848484613200565b1215979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61116184848484613200565b12979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611cd5565b5f61096883836112ab565b80515f908190602084810191850101828080806111da8686613377565b929650909450925090507fffffffff0000000000000000000000000000000000000000000000000000000084165f0361129c5784830361126c575f806112208484613816565b915091508061125b57507f32b8b8be000000000000000000000000000000000000000000000000000000009a5f9a5098505050505050505050565b505f9a909950975050505050505050565b507fad384e8700000000000000000000000000000000000000000000000000000000985f98509650505050505050565b5091975f975095505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6112ee84848484613200565b13979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d46868686866130d0565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826132d4565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d826113a48383611b56565b5090505f610a298284611440565b5f805f805f6113c1878761391c565b9250925092505f806113d38585613816565b91509150818380156113e25750815b9650965050505050509250929050565b5f806106a87f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686611df4565b5f805f61144d8585613816565b915091508015801561145d575081155b1561149e576040517f8eba4d0700000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b509392505050565b5f805f8512156114ec576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b845f036114fe57505f905060016116a8565b8460ff8416850185811215611549576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f805f8312156115b3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb383121561158a575f8095509550505050506116a8565b825f03600a0a91508184816115a1576115a1614974565b04955050840290911491506116a89050565b5f83131561169d57604d831315611609576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8161163e5761163e614974565b0484111561168b576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b50919091029250600191506116a89050565b509193506001925050505b935093915050565b5f805f8412156116ec576116c484846132d4565b90945092506116d48585856116b0565b90945092506116e384846113f2565b915091506116a8565b5f806116f88686611b56565b9092509050845f808061170b8585613978565b9194509250905061270d6127106117236001826149ce565b851461173a576117348d8686613a67565b90925090505b83156117c5575f61174c8660016149f4565b90505b80848583028161176157611761614974565b051461177857600a84059350600a8805975061174f565b6117b96117858588614a1b565b896117908785614a1b565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc613b20565b909d509b506117ec9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866117fd84835f611bbe565b6118088860016149f4565b61181291906149f4565b94509450505050935093915050565b5f80838361182f8282613bbd565b90965094505f86136118b057855f03611874576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b5050837f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000036118ee576118e483604c6149f4565b5f915091506116a8565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000008412158061193d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb561195f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412611b1a575f805f805f8561197857604b61197b565b604c5b611985908a6149f4565b90505f80876119b2577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000006119d3565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c81611a0557611a05614974565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050611a3e8c82613c13565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414611aca576123278114611aa557611a808c82600101613c13565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002611ac7565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50611afa838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613b20565b909a509850611b0b8a8a835f6130d0565b975097505050505050506116a8565b611b2485856113f2565b9095509350611b34868686611821565b9095509350611b4385856132d4565b92509250506116a8565b50935093915050565b5f805f8312611b6957508290505f6106ad565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4831215611b9b57505f9050826106ad565b5f839003600a0a808581611bb157611bb1614974565b0794859003959350505050565b5f818303611bcd575082610695565b82821315611c1057828203604c811380611be757505f8113155b15611bf5575f915050610695565b80600a0a8581611c0757611c07614974565b05915050610695565b818303604c811380611c2257505f8113155b15611c6a576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604481018490526064016108ce565b600a81900a85810286828281611c8257611c82614974565b0514611ccb576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604481018690526064016108ce565b9250610695915050565b5f8085158415178015611ced575f92505f9150611dea565b611cf784876149f4565b91505f611d0388613c9a565b90505f611d0f87613c9a565b90505f611d1c8383613d00565b5090505f6f0785ee10d5da46d900f436a000000000821115611d51576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115611d7257670de0b6b3a7640000820491506012015b633b9aca00821115611d8b57633b9aca00820491506009015b612710821115611da057612710820491506004015b8115611db457600a82049150600101611da0565b611dbe81876149f4565b9550611de08b8a611dda8787611dd587600a614b84565b613d3b565b89613e20565b9097509550505050505b5094509492505050565b5f80835f03611e39576040517f7a97930f00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b855f03611e4a57505f90508061240f565b5f805f80611e588a8a613f27565b919b5099509150611e698888613f27565b919950975090505f611e7a8b613c9a565b90505f611e868a613c9a565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c818310156122a3578415611ee457507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b612262565b6f4b3b4ca85a86c47a098a22400000000083101561201057678ac7230489e80000831015611f74576402540be400831015611f4257620186a0831015611f325750620186a0905060056121eb565b506402540be4009050600a6121eb565b655af3107a4000831015611f615750655af3107a40009050600e6121eb565b50678ac7230489e80000905060136121eb565b6b204fce5e3e25026110000000831015611fc65769152d02c7e14af6800000831015611faf575069152d02c7e14af6800000905060176121eb565b506b204fce5e3e250261100000009050601c6121eb565b6d314dc6448d9338c15b0a00000000831015611ff557506d314dc6448d9338c15b0a00000000905060216121eb565b506f4b3b4ca85a86c47a098a224000000000905060266121eb565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156121085773af298d050e4395d69670b12b7f410000000000008310156120a3577172cb5bd86321e38cb6ce6682e8000000000083101561208457507172cb5bd86321e38cb6ce6682e800000000009050602b6121eb565b5073af298d050e4395d69670b12b7f41000000000000905060306121eb565b76010b46c6cdd6e3e0828f4db456ff0c8ea00000000000008310156120e4575076010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000905060356121eb565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a6121eb565b7c03b58e88c75313ec9d329eaaa18fb92f75215b1710000000000000000083101561219e577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561217657507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f6121eb565b507c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000905060446121eb565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000008310156121eb57507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b81831161221f57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016121eb565b815f03612262576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c90526044016108ce565b856122a3576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e90526044016108ce565b807f8000000000000000000000000000000000000000000000000000000000000000018d126122d657808d039c50612349565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f81131561234957807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b1361233657998a0199612349565b5f8099509950505050505050505061240f565b5f808e12801561235857505f8c135b15612395577f80000000000000000000000000000000000000000000000000000000000000008e01808d1361238d575f612391565b808d035b9150505b8b818f010397506123b28f8e6123ac888789613d3b565b8b613e20565b90995097505f8113156123fc57604c8113156123dc575f809a509a5050505050505050505061240f565b80600a0a89816123ee576123ee614974565b059850885f036123fc575f97505b5096985094965061240f95505050505050565b94509492505050565b5f61242585858585613200565b1495945050505050565b60608161243c8482613bbd565b90945092505f8061246d7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000087614b8f565b1561249d57507f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000009050604c6124c4565b507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b5b5f6124cf8388614b8f565b90505f6124dc8489614bf6565b90505f808312156124f6575060016124f383614c09565b92505b5f82121561250d5750600161250a82614c09565b91505b60408051602081019091525f81528215612616575f8061252e600a89614c39565b90505b61253b8186614b8f565b5f036125605761254c600a82614c39565b90508161255881614c4c565b925050612531565b60408051602081019091525f8082525b838110156125c157816040516020016125899190614c9a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529150600101612570565b505b6125ce600a87614bf6565b5f036125e6576125df600a87614b8f565b95506125c3565b806125f0876141c8565b604051602001612601929190614cd2565b60405160208183030381529060405293505050505b5f612620856141c8565b90505f61262d878c6149f4565b9050637fffffff81138061266057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000081125b1561269a576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018a90526024016108ce565b5f81156126ce576126aa826141c8565b6040516020016126ba9190614d14565b6040516020818303038152906040526126de565b60405180602001604052805f8152505b90505f856126fa5760405180602001604052805f815250612731565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90508084868460405160200161274a9493929190614d45565b6040516020818303038152906040529b50505050505050505050505092915050565b60606103e882138061278757506127846103e8614c09565b82125b156127c1576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018390526024016108ce565b5f8084129081156127dc576127d585614c09565b90506127df565b50835b5f8413156128a2578360448110612825576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5b8281101561286157612857600a83614c39565b9150600101612844565b508083111561289f576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018790526024016108ce565b50505b5f6128ac82614254565b80519091505f5b818110801561292f575082816128ca600185614d65565b6128d49190614d65565b815181106128e4576128e4614d78565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f3000000000000000000000000000000000000000000000000000000000000000145b15612946578061293e81614c4c565b9150506128b3565b5f6129518284614d65565b90505f61295e838a6149f4565b90505f8761297a5760405180602001604052805f8152506129b1565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90505f8212612b2b57815f6129c68286614da5565b67ffffffffffffffff8111156129de576129de614855565b6040519080825280601f01601f191660200182016040528015612a08576020820181803683370190505b5090505f5b85811015612a7a57888181518110612a2757612a27614d78565b602001015160f81c60f81b828281518110612a4457612a44614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a0d565b505f5b82811015612af7577f300000000000000000000000000000000000000000000000000000000000000082612ab18389614da5565b81518110612ac157612ac1614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a7d565b508281604051602001612b0b929190614db8565b6040516020818303038152906040529a5050505050505050505050610684565b5f612b3583614c09565b905080841115612d4c575f612b4a8286614d65565b90505f612b58866001614da5565b67ffffffffffffffff811115612b7057612b70614855565b6040519080825280601f01601f191660200182016040528015612b9a576020820181803683370190505b5090505f5b82811015612c0c57898181518110612bb957612bb9614d78565b602001015160f81c60f81b828281518110612bd657612bd6614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612b9f565b507f2e00000000000000000000000000000000000000000000000000000000000000818381518110612c4057612c40614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b83811015612d175789612c838285614da5565b81518110612c9357612c93614d78565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612cc7866001614da5565b612cd19190614da5565b81518110612ce157612ce1614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612c70565b508381604051602001612d2b929190614db8565b6040516020818303038152906040529b505050505050505050505050610684565b5f612d578583614d65565b90505f85612d66836002614da5565b612d709190614da5565b67ffffffffffffffff811115612d8857612d88614855565b6040519080825280601f01601f191660200182016040528015612db2576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110612de857612de8614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f2e0000000000000000000000000000000000000000000000000000000000000081600181518110612e4a57612e4a614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b82811015612ef5577f300000000000000000000000000000000000000000000000000000000000000082612eaf836002614da5565b81518110612ebf57612ebf614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612e7a565b505f5b86811015612d1757898181518110612f1257612f12614d78565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612f46866002614da5565b612f509190614da5565b81518110612f6057612f60614d78565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612ef8565b5f805f805f612fa5878761391c565b92509250925080612fec576040517fc471796600000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016108ce565b50909590945092505050565b5f805f6130058585613816565b915091508061149e576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b5f8061305684846132d4565b9094509250613067868686866130d0565b9150915094509492505050565b5f805f6130828686866114a6565b91509150806130c7576040517f05e4767800000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b50949350505050565b5f80851584151780156130fc57865f036130f0578484925092505061240f565b8686925092505061240f565b6131068787613bbd565b90975095506131158585613bbd565b909550935085841315613129579395929492935b838603604c81111561314257878793509350505061240f565b80600a0a868161315457613154614974565b0595505086850180881860ff90811c151589881890911c151680156131ef57877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036131d6576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a9052602481018990526044016108ce565b600a9687900596909805860197600197909701966131f3565b8198505b5096979596505050505050565b5f8085158415178187128286121817858414178015613225578685925092505061240f565b505f85841315613239575092949193919260015b8386035f8112604c821317801561326c57821561325e575f899450945050505061240f565b885f9450945050505061240f565b600a82900a8981028a82828161328457613284614974565b05146132b05784156132a0575f8b96509650505050505061240f565b8a5f96509650505050505061240f565b84156132c557889650945061240f9350505050565b955087945061240f9350505050565b5f807f8000000000000000000000000000000000000000000000000000000000000000840361336d577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303613360576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101859052602481018490526044016108ce565b600a840593508260010192505b50505f9190910391565b5f82818061338c838665200000000000614310565b925085831415836133a681886703ff000000000000614310565b94508085036133e057507f34bd20690000000000000000000000000000000000000000000000000000000094505f925082915061380d9050565b5f806133ec8a88614339565b90925090507fffffffff0000000000000000000000000000000000000000000000000000000082161561342a575095505f935083925061380d915050565b86519095506540000000000060015f9290921a9190911b1615158887101691505080156136b957506001909301925f8461346d81896703ff000000000000614310565b95508086036134a857507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f935083925061380d915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613517577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016134aa565b81811461356e575f8061352a8484614339565b90925090507fffffffff0000000000000000000000000000000000000000000000000000000082161561356a575097505f955085945061380d9350505050565b9350505b5f8312156135a957507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f945084935061380d92505050565b83156135b557825f0392505b80820394505f8513156135f557507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f945084935061380d92505050565b855f03613604578295506136b6565b5f859003604381111561364557507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f955085945061380d9350505050565b600a0a8681025f8883838161365c5761365c614974565b0514159050601b82900b82141581806136725750805b156136ae57507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f985088975061380d9650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b1615158786101680156137fe57600190950194856136f9818a65200000000000614310565b96508661370f818b6703ff000000000000614310565b975080880361374c57507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f955085945061380d9350505050565b505f80613759838a614339565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613799575097505f955085945061380d9350505050565b9250508482015f831380156137ad57508581125b806137c157505f831280156137c157508581135b156137fa57507fd556b1110000000000000000000000000000000000000000000000000000000097505f955085945061380d9350505050565b9450505b845f03613809575f93505b5050505b92959194509250565b5f601b83900b831483838261387a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561385a57620186a0860595506005850194505b8586601b0b1461387557600a8605955084600101945061385a565b613890565b855f0361389057505f9250600191506106ad9050565b848560030b146138ec575f8512156138b057505f92508291506106ad9050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86111561396757600a860460018201600a88065f1493509350935050613971565b8593509150600190505b9250925092565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc036139b057508391505f90506001613971565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc841215613a3e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0841215613a0f57505f9150508215156001613971565b5f846004015f03600a0a90505f818781613a2b57613a2b614974565b0594505080840286141592509050613971565b5f8412613a5357505f91508190506001613971565b50505060048101600a0a82025f6001613971565b5f80806064613a79600a612328614c39565b613a86600a612328614c39565b613a91906002614dc6565b613a9c906001614da5565b613aa69190614da5565b613ab09190614da5565b9050613af4565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b613aff858288613ab7565b92508315611b4d57613b15600186018288613ab7565b915050935093915050565b5f80888803613b33575083905081613bb1565b5f805f80613b438c8b8f8d61304a565b915091505f80613b558a8a8d8c61304a565b91509150613b6584848484611cd5565b8096508197505050505050505f80613b7f8b8b8f8d61304a565b915091505f80613b9186868686611df4565b915091505f80613ba384848f8e6130d0565b909a50985050505050505050505b97509795505050505050565b5f805f805f613bcc8787613f27565b92509250925080612fec576040517f05e51ecb00000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f80613c22600a612328614c39565b613c2d906002614dc6565b613c38906001614da5565b90505f613c48600a612328614c39565b90506002600a8504026001015f8052600281601e883c505f51617fff81169350618000811615613c7757918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f80821215613cf7577f80000000000000000000000000000000000000000000000000000000000000008203613cf157507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b919050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f613d488686613d00565b91509150815f03613d6c57838181613d6257613d62614974565b0492505050610695565b838210613db6576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016108ce565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215613eea577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613ed757613e7f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001614da5565b8403613eaf57507f800000000000000000000000000000000000000000000000000000000000000090508161240f565b613eba600a85614c39565b613ec390614c09565b613ece8460016149f4565b9150915061240f565b613ee084614c09565b839150915061240f565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613f1d57613ec3600a85614c39565b508290508161240f565b5f805f845f03613f3f57505f91508190506001613971565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f03614153576f4b3b4ca85a86c47a098a2240000000008505158015613fa857507f80000000000000000000000000000000000000000000000000000000000000268412155b15613fc9576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a00000000000000850515801561401157507f80000000000000000000000000000000000000000000000000000000000000138412155b1561402a57678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000850515801561407657507f800000000000000000000000000000000000000000000000000000000000000a8412155b1561408c576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000085051580156140db57507f80000000000000000000000000000000000000000000000000000000000000028412155b156140f15760648502945060028403935061408c565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000850515801561414157507f80000000000000000000000000000000000000000000000000000000000000018412155b1561415357600a850294506001840393505b600a8086029081058614801561418957507f80000000000000000000000000000000000000000000000000000000000000018512155b15614198578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b60605f82126141e55760405180602001604052805f81525061421c565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b61422d60ff84901d80850118614254565b60405160200161423e929190614db8565b6040516020818303038152906040529050919050565b60605f61426083614463565b60010190505f8167ffffffffffffffff81111561427f5761427f614855565b6040519080825280601f01601f1916602001820160405280156142a9576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846142b357509392505050565b5f5b5f82600186515f1a1b1611838510161561433157600184019350614312565b509192915050565b81515f90819065200000000000600191831a9190911b161515838510168085019082806143668488614544565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156143a1575093505f92506106ad915050565b825f03614404577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81116143d5575f6143f7565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b955093506106ad92505050565b7f80000000000000000000000000000000000000000000000000000000000000008111614431575f614453565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106144ab577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106144d7576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106144f557662386f26fc10000830492506010015b6305f5e100831061450d576305f5e100830492506008015b612710831061452157612710830492506004015b60648310614533576064830492506002015b600a83106106845760010192915050565b5f8082841061457757507f34bd20690000000000000000000000000000000000000000000000000000000090505f6106ad565b835f036145b0576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b8782101580156145e85750604d83105b1561462b57815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a85900302016145d8565b8782106147515781515f1a849003600181111561467357507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b600a84900a81028281018311156146b657507f0fdc26350000000000000000000000000000000000000000000000000000000096505f95506106ad945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b8782106147515781515f1a6030811461472657507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101906146e2565b5f9890975095505050505050565b5f6020828403121561476f575f80fd5b5035919050565b5f8060408385031215614787575f80fd5b50508035926020909101359150565b803560ff81168114613cfb575f80fd5b5f80604083850312156147b7575f80fd5b823591506147c760208401614796565b90509250929050565b5f80604083850312156147e1575f80fd5b82359150602083013580151581146147f7575f80fd5b809150509250929050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215614892575f80fd5b813567ffffffffffffffff808211156148a9575f80fd5b818401915084601f8301126148bc575f80fd5b8135818111156148ce576148ce614855565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561491457614914614855565b8160405282815287602084870101111561492c575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f6060848603121561495d575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181035f8312801583831316838312821617156149ed576149ed6149a1565b5092915050565b8082018281125f831280158216821582161715614a1357614a136149a1565b505092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615614a5257614a526149a1565b8181058314821517610684576106846149a1565b600181815b80851115614abf57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614aa557614aa56149a1565b80851615614ab257918102915b93841c9390800290614a6b565b509250929050565b5f82614ad557506001610684565b81614ae157505f610684565b8160018114614af75760028114614b0157614b1d565b6001915050610684565b60ff841115614b1257614b126149a1565b50506001821b610684565b5060208310610133831016604e8410600b8410161715614b40575081810a610684565b614b4a8383614a66565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614b7c57614b7c6149a1565b029392505050565b5f6106958383614ac7565b5f82614b9d57614b9d614974565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614bf157614bf16149a1565b500590565b5f82614c0457614c04614974565b500790565b5f7f80000000000000000000000000000000000000000000000000000000000000008203613cf157613cf16149a1565b5f82614c4757614c47614974565b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c7c57614c7c6149a1565b5060010190565b5f81518060208401855e5f93019283525090919050565b5f614ca58284614c83565b7f300000000000000000000000000000000000000000000000000000000000000081526001019392505050565b7f2e0000000000000000000000000000000000000000000000000000000000000081525f614d0c614d066001840186614c83565b84614c83565b949350505050565b7f650000000000000000000000000000000000000000000000000000000000000081525f6106956001830184614c83565b5f610a29614d06614d5f614d59858a614c83565b88614c83565b86614c83565b81810381811115610684576106846149a1565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b80820180821115610684576106846149a1565b5f614d0c614d068386614c83565b8082028115828204841417610684576106846149a156"; + hex"608060405234801561000f575f80fd5b506004361061029d575f3560e01c806381f7e2f511610171578063cde72ef3116100d2578063dd64691711610088578063e5526ecd1161006e578063e5526ecd1461062e578063e75f991f14610641578063ffae15ba14610654575f80fd5b8063dd64691714610608578063e0db58881461061b575f80fd5b8063d1de592a116100b8578063d1de592a146105bb578063d35273a7146105ce578063d3d6ffa8146105f5575f80fd5b8063cde72ef314610582578063d102b4d3146105a8575f80fd5b8063a19684b711610127578063bc1b392d1161010d578063bc1b392d1461050b578063bc62d8d814610511578063cb09682b1461055c575f80fd5b8063a19684b7146104d2578063a90d041a146104f8575f80fd5b806396ce1ec71161015757806396ce1ec7146104885780639b4afd991461049b578063a100a3d9146104bf575f80fd5b806381f7e2f5146104625780638dc2980714610475575f80fd5b80633447c0301161021b5780635ca0e7a4116101d1578063719cd99d116101b7578063719cd99d1461042957806373bfb2831461043c57806381a822721461044f575f80fd5b80635ca0e7a4146103f0578063602c35fc14610403575f80fd5b80633b3bd868116102015780633b3bd868146103b757806341aa0080146103ca5780635b23771d146103dd575f80fd5b80633447c03014610374578063371493ce14610397575f80fd5b80631ee62f111161027057806328fa1f011161025657806328fa1f011461033b5780633004fa411461034e5780633029740014610361575f80fd5b80631ee62f11146103155780632538835014610328575f80fd5b806304327dc5146102a1578063078b665b146102c75780630b6429bc146102da578063146e82ad14610302575b5f80fd5b6102b46102af36600461479b565b61067a565b6040519081526020015b60405180910390f35b6102b46102d53660046147b2565b61068a565b6102ed6102e83660046147e2565b61069c565b604080519283529015156020830152016102be565b6102b461031036600461479b565b6106b4565b6102b461032336600461479b565b6106d3565b6102b461033636600461479b565b6106f2565b6102b461034936600461479b565b610711565b6102b461035c3660046147b2565b61071b565b6102b461036f3660046147b2565b61073b565b6103876103823660046147b2565b610746565b60405190151581526020016102be565b6103aa6103a536600461480c565b610751565b6040516102be919061483e565b6102b46103c53660046147e2565b61075d565b6102b46103d83660046147b2565b610768565b6102b46103eb3660046147e2565b610773565b6102b46103fe36600461479b565b61077e565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b6102b461043736600461479b565b610788565b61038761044a3660046147b2565b610792565b6102b461045d36600461479b565b61079d565b6103876104703660046147b2565b6107a7565b6103876104833660046147b2565b6107b2565b6102b46104963660046147b2565b6107bd565b6102b47c090000000000000000000000000000000000000000000000000000000181565b6103aa6104cd36600461479b565b6107c8565b7f80000000000000000000000000000000000000000000000000000000000000016102b4565b6102b46105063660046147b2565b610812565b5f6102b4565b61052461051f3660046148be565b61081d565b604080517fffffffff0000000000000000000000000000000000000000000000000000000090931683526020830191909152016102be565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b7f7fffffff800000000000000000000000000000000000000000000000000000006102b4565b6103876105b63660046147b2565b610836565b6102b46105c93660046147b2565b610841565b6102b47ffffffffc0000000000000000000000000000000000000000000000000000000181565b6102b461060336600461479b565b61084c565b61038761061636600461479b565b610856565b6102b461062936600461479b565b61087c565b6103aa61063c366004614987565b610886565b6102ed61064f3660046147e2565b61090f565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc6102b4565b5f6106848261091b565b92915050565b5f610695838361095d565b9392505050565b5f806106a88484610979565b915091505b9250929050565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109ba565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109e6565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f5610a33565b5f61068482610a66565b5f610695838373c51a14251b0dcf0ae24a96b7153991378938f5f5610aa7565b5f6106958383610d01565b5f6106958383610d63565b60606106958383610db1565b5f6106958383610e44565b5f6106958383610e5f565b5f6106958383610ea4565b5f61068482610ed7565b5f61068482610f8d565b5f6106958383611039565b5f6106848261107c565b5f61069583836110c1565b5f6106958383611104565b5f6106958383611147565b6060610684827ffffffffc000000000000000000000000000000000000000000000000000000017c0900000000000000000000000000000000000000000000000000000001610886565b5f610695838361118c565b5f805f8061082a85611197565b90969095509350505050565b5f6106958383611285565b5f61069583836112c8565b5f6106848261130d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821615610684565b5f6106848261133f565b60606108928383611285565b6108d7576040517f3be5bf9400000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044015b60405180910390fd5b5f6108e18561107c565b9050610906856108f18387611285565b8061090157506109018386611104565b610db1565b95945050505050565b5f806106a88484611380565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826113c0565b90925090505f610906838361140e565b5f6109688383611104565b6109725781610695565b5090919050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6109ad828287611474565b9350935050509250929050565b5f610695837fffffffff0000000000000000000000000000000000000000000000000000000584610aa7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a1984838361167e565b90925090505f610a29838361140e565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a198483836117ef565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82610a998383611b24565b9150505f610a29828461140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516610ae45750600191506106959050565b5f8213610b7d57815f03610b4157610afc855f611285565b15610b36576040517f8be82972000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b505f91506106959050565b6040517fcceba0f100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b610b88856001610d63565b8015610b995750610b99865f611104565b15610ba8578592505050610695565b610bb2855f611285565b15610bdb57610bd2610bc38761091b565b610bcc8761130d565b86610aa7565b92505050610695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80610c0e8484611b24565b915091505f610c1e83855f611b8c565b905060015f8080610c558f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510610c9c5784600116600103610c7f57610c7984848484611ca3565b90945092505b600185901c9450610c9282828484611ca3565b9092509050610c5a565b5f80610ca98f8e8e6117ef565b91509150610cb982828a8d611ca3565b9092509050610cc98f838361167e565b9092509050610cda82828888611ca3565b90925090505f610cea838361140e565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611dc2565b915091505f610d55838361140e565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846123e6565b979650505050505050565b60607bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d5f829003610e21576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525092505050610684565b8315610e3a57610e3182826123fd565b92505050610684565b610906828261273a565b5f805f610e518585612f64565b915091506109068282612fc6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686613018565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610906828286613042565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610f0e57509192915050565b5f80610f1a8484611b24565b915091505f84128015610f2c57508015155b15610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613018565b935091505b5f610da6838561140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610fc457509192915050565b5f80610fd08484611b24565b91509150805f03610fe5575093949350505050565b5f811315610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb461309e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846131ce565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828212156110b65761094d82826131ea565b5f610906838361140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da68484848461328d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846132a9565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611ca3565b5f6109688383611285565b80515f908190602084810191850101828080806111b486866132c4565b929650909450925090507fffffffff0000000000000000000000000000000000000000000000000000000084165f0361127657848303611246575f806111fa8484613763565b915091508061123557507f32b8b8be000000000000000000000000000000000000000000000000000000009a5f9a5098505050505050505050565b505f9a909950975050505050505050565b507fad384e8700000000000000000000000000000000000000000000000000000000985f98509650505050505050565b5091975f975095505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da684848484613869565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d468686868661309e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826131ea565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d826113728383611b24565b5090505f610a29828461140e565b5f805f805f61138f8787613884565b9250925092505f806113a18585613763565b91509150818380156113b05750815b9650965050505050509250929050565b5f806106a87f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686611dc2565b5f805f61141b8585613763565b915091508015801561142b575081155b1561146c576040517f8eba4d0700000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b509392505050565b5f805f8512156114ba576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b845f036114cc57505f90506001611676565b8460ff8416850185811215611517576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f805f831215611581577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3831215611558575f809550955050505050611676565b825f03600a0a915081848161156f5761156f6149b0565b04955050840290911491506116769050565b5f83131561166b57604d8313156115d7576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8161160c5761160c6149b0565b04841115611659576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b50919091029250600191506116769050565b509193506001925050505b935093915050565b5f805f8412156116ba5761169284846131ea565b90945092506116a285858561167e565b90945092506116b184846113c0565b91509150611676565b5f806116c68686611b24565b9092509050845f80806116d985856138e0565b9194509250905061270d6127106116f1600182614a0a565b8514611708576117028d86866139cf565b90925090505b8315611793575f61171a866001614a30565b90505b80848583028161172f5761172f6149b0565b051461174657600a84059350600a8805975061171d565b6117876117538588614a57565b8961175e8785614a57565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc613a88565b909d509b506117ba9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866117cb84835f611b8c565b6117d6886001614a30565b6117e09190614a30565b94509450505050935093915050565b5f8083836117fd8282613b25565b90965094505f861361187e57855f03611842576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b5050837f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000036118bc576118b283604c614a30565b5f91509150611676565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000008412158061190b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb561192d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412611ae8575f805f805f8561194657604b611949565b604c5b611953908a614a30565b90505f8087611980577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000006119a1565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c816119d3576119d36149b0565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050611a0c8c82613b7b565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414611a98576123278114611a7357611a4e8c82600101613b7b565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002611a95565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50611ac8838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613a88565b909a509850611ad98a8a835f61309e565b97509750505050505050611676565b611af285856113c0565b9095509350611b028686866117ef565b9095509350611b1185856131ea565b9250925050611676565b50935093915050565b5f805f8312611b3757508290505f6106ad565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4831215611b6957505f9050826106ad565b5f839003600a0a808581611b7f57611b7f6149b0565b0794859003959350505050565b5f818303611b9b575082610695565b82821315611bde57828203604c811380611bb557505f8113155b15611bc3575f915050610695565b80600a0a8581611bd557611bd56149b0565b05915050610695565b818303604c811380611bf057505f8113155b15611c38576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604481018490526064016108ce565b600a81900a85810286828281611c5057611c506149b0565b0514611c99576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604481018690526064016108ce565b9250610695915050565b5f8085158415178015611cbb575f92505f9150611db8565b611cc58487614a30565b91505f611cd188613c02565b90505f611cdd87613c02565b90505f611cea8383613c68565b5090505f6f0785ee10d5da46d900f436a000000000821115611d1f576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115611d4057670de0b6b3a7640000820491506012015b633b9aca00821115611d5957633b9aca00820491506009015b612710821115611d6e57612710820491506004015b8115611d8257600a82049150600101611d6e565b611d8c8187614a30565b9550611dae8b8a611da88787611da387600a614bc0565b613ca3565b89613d88565b9097509550505050505b5094509492505050565b5f80835f03611e07576040517f7a97930f00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b855f03611e1857505f9050806123dd565b5f805f80611e268a8a613e8f565b919b5099509150611e378888613e8f565b919950975090505f611e488b613c02565b90505f611e548a613c02565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c81831015612271578415611eb257507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b612230565b6f4b3b4ca85a86c47a098a224000000000831015611fde57678ac7230489e80000831015611f42576402540be400831015611f1057620186a0831015611f005750620186a0905060056121b9565b506402540be4009050600a6121b9565b655af3107a4000831015611f2f5750655af3107a40009050600e6121b9565b50678ac7230489e80000905060136121b9565b6b204fce5e3e25026110000000831015611f945769152d02c7e14af6800000831015611f7d575069152d02c7e14af6800000905060176121b9565b506b204fce5e3e250261100000009050601c6121b9565b6d314dc6448d9338c15b0a00000000831015611fc357506d314dc6448d9338c15b0a00000000905060216121b9565b506f4b3b4ca85a86c47a098a224000000000905060266121b9565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156120d65773af298d050e4395d69670b12b7f41000000000000831015612071577172cb5bd86321e38cb6ce6682e8000000000083101561205257507172cb5bd86321e38cb6ce6682e800000000009050602b6121b9565b5073af298d050e4395d69670b12b7f41000000000000905060306121b9565b76010b46c6cdd6e3e0828f4db456ff0c8ea00000000000008310156120b2575076010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000905060356121b9565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a6121b9565b7c03b58e88c75313ec9d329eaaa18fb92f75215b1710000000000000000083101561216c577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561214457507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f6121b9565b507c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000905060446121b9565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000008310156121b957507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b8183116121ed57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016121b9565b815f03612230576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c90526044016108ce565b85612271576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e90526044016108ce565b807f8000000000000000000000000000000000000000000000000000000000000000018d126122a457808d039c50612317565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f81131561231757807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b1361230457998a0199612317565b5f809950995050505050505050506123dd565b5f808e12801561232657505f8c135b15612363577f80000000000000000000000000000000000000000000000000000000000000008e01808d1361235b575f61235f565b808d035b9150505b8b818f010397506123808f8e61237a888789613ca3565b8b613d88565b90995097505f8113156123ca57604c8113156123aa575f809a509a505050505050505050506123dd565b80600a0a89816123bc576123bc6149b0565b059850885f036123ca575f97505b509698509496506123dd95505050505050565b94509492505050565b5f6123f385858585614130565b1495945050505050565b60608161240a8482613b25565b90945092505f8061243b7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000087614bcb565b1561246b57507f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000009050604c612492565b507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b5b5f61249d8388614bcb565b90505f6124aa8489614c32565b90505f808312156124c4575060016124c183614c45565b92505b5f8212156124db575060016124d882614c45565b91505b60408051602081019091525f815282156125e4575f806124fc600a89614c75565b90505b6125098186614bcb565b5f0361252e5761251a600a82614c75565b90508161252681614c88565b9250506124ff565b60408051602081019091525f8082525b8381101561258f57816040516020016125579190614cd6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052915060010161253e565b505b61259c600a87614c32565b5f036125b4576125ad600a87614bcb565b9550612591565b806125be87614204565b6040516020016125cf929190614d0e565b60405160208183030381529060405293505050505b5f6125ee85614204565b90505f6125fb878c614a30565b9050637fffffff81138061262e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000081125b15612668576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018a90526024016108ce565b5f811561269c5761267882614204565b6040516020016126889190614d50565b6040516020818303038152906040526126ac565b60405180602001604052805f8152505b90505f856126c85760405180602001604052805f8152506126ff565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b9050808486846040516020016127189493929190614d81565b6040516020818303038152906040529b50505050505050505050505092915050565b60606103e882138061275557506127526103e8614c45565b82125b1561278f576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018390526024016108ce565b5f8084129081156127aa576127a385614c45565b90506127ad565b50835b5f8413156128705783604481106127f3576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5b8281101561282f57612825600a83614c75565b9150600101612812565b508083111561286d576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018790526024016108ce565b50505b5f61287a82614290565b80519091505f5b81811080156128fd57508281612898600185614da1565b6128a29190614da1565b815181106128b2576128b2614db4565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f3000000000000000000000000000000000000000000000000000000000000000145b15612914578061290c81614c88565b915050612881565b5f61291f8284614da1565b90505f61292c838a614a30565b90505f876129485760405180602001604052805f81525061297f565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90505f8212612af957815f6129948286614de1565b67ffffffffffffffff8111156129ac576129ac614891565b6040519080825280601f01601f1916602001820160405280156129d6576020820181803683370190505b5090505f5b85811015612a48578881815181106129f5576129f5614db4565b602001015160f81c60f81b828281518110612a1257612a12614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506001016129db565b505f5b82811015612ac5577f300000000000000000000000000000000000000000000000000000000000000082612a7f8389614de1565b81518110612a8f57612a8f614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a4b565b508281604051602001612ad9929190614df4565b6040516020818303038152906040529a5050505050505050505050610684565b5f612b0383614c45565b905080841115612d1a575f612b188286614da1565b90505f612b26866001614de1565b67ffffffffffffffff811115612b3e57612b3e614891565b6040519080825280601f01601f191660200182016040528015612b68576020820181803683370190505b5090505f5b82811015612bda57898181518110612b8757612b87614db4565b602001015160f81c60f81b828281518110612ba457612ba4614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612b6d565b507f2e00000000000000000000000000000000000000000000000000000000000000818381518110612c0e57612c0e614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b83811015612ce55789612c518285614de1565b81518110612c6157612c61614db4565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612c95866001614de1565b612c9f9190614de1565b81518110612caf57612caf614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612c3e565b508381604051602001612cf9929190614df4565b6040516020818303038152906040529b505050505050505050505050610684565b5f612d258583614da1565b90505f85612d34836002614de1565b612d3e9190614de1565b67ffffffffffffffff811115612d5657612d56614891565b6040519080825280601f01601f191660200182016040528015612d80576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110612db657612db6614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f2e0000000000000000000000000000000000000000000000000000000000000081600181518110612e1857612e18614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b82811015612ec3577f300000000000000000000000000000000000000000000000000000000000000082612e7d836002614de1565b81518110612e8d57612e8d614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612e48565b505f5b86811015612ce557898181518110612ee057612ee0614db4565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612f14866002614de1565b612f1e9190614de1565b81518110612f2e57612f2e614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612ec6565b5f805f805f612f738787613884565b92509250925080612fba576040517fc471796600000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016108ce565b50909590945092505050565b5f805f612fd38585613763565b915091508061146c576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b5f8061302484846131ea565b90945092506130358686868661309e565b9150915094509492505050565b5f805f613050868686611474565b9150915080613095576040517f05e4767800000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b50949350505050565b5f80851584151780156130ca57865f036130be57848492509250506123dd565b868692509250506123dd565b6130d48787613b25565b90975095506130e38585613b25565b9095509350858413156130f7579395929492935b838603604c8111156131105787879350935050506123dd565b80600a0a8681613122576131226149b0565b0595505086850180881860ff90811c151589881890911c151680156131bd57877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036131a4576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a9052602481018990526044016108ce565b600a9687900596909805860197600197909701966131c1565b8198505b5096979596505050505050565b5f805f6131dd87878787614130565b1315979650505050505050565b5f807f80000000000000000000000000000000000000000000000000000000000000008403613283577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303613276576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101859052602481018490526044016108ce565b600a840593508260010192505b50505f9190910391565b5f805f61329c87878787614130565b1215979650505050505050565b5f805f6132b887878787614130565b12979650505050505050565b5f8281806132d983866520000000000061434c565b925085831415836132f381886703ff00000000000061434c565b945080850361332d57507f34bd20690000000000000000000000000000000000000000000000000000000094505f925082915061375a9050565b5f806133398a88614375565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613377575095505f935083925061375a915050565b86519095506540000000000060015f9290921a9190911b16151588871016915050801561360657506001909301925f846133ba81896703ff00000000000061434c565b95508086036133f557507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f935083925061375a915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613464577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016133f7565b8181146134bb575f806134778484614375565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156134b7575097505f955085945061375a9350505050565b9350505b5f8312156134f657507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f945084935061375a92505050565b831561350257825f0392505b80820394505f85131561354257507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f945084935061375a92505050565b855f0361355157829550613603565b5f859003604381111561359257507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b600a0a8681025f888383816135a9576135a96149b0565b0514159050601b82900b82141581806135bf5750805b156135fb57507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f985088975061375a9650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b16151587861016801561374b5760019095019485613646818a6520000000000061434c565b96508661365c818b6703ff00000000000061434c565b975080880361369957507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b505f806136a6838a614375565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156136e6575097505f955085945061375a9350505050565b9250508482015f831380156136fa57508581125b8061370e57505f8312801561370e57508581135b1561374757507fd556b1110000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b9450505b845f03613756575f93505b5050505b92959194509250565b5f601b83900b83148383826137c7577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156137a757620186a0860595506005850194505b8586601b0b146137c257600a860595508460010194506137a7565b6137dd565b855f036137dd57505f9250600191506106ad9050565b848560030b14613839575f8512156137fd57505f92508291506106ad9050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f61387887878787614130565b13979650505050505050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156138cf57600a860460018201600a88065f14935093509350506138d9565b8593509150600190505b9250925092565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0361391857508391505f905060016138d9565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8412156139a6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb084121561397757505f91505082151560016138d9565b5f846004015f03600a0a90505f818781613993576139936149b0565b05945050808402861415925090506138d9565b5f84126139bb57505f915081905060016138d9565b50505060048101600a0a82025f60016138d9565b5f808060646139e1600a612328614c75565b6139ee600a612328614c75565b6139f9906002614e02565b613a04906001614de1565b613a0e9190614de1565b613a189190614de1565b9050613a5c565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b613a67858288613a1f565b92508315611b1b57613a7d600186018288613a1f565b915050935093915050565b5f80888803613a9b575083905081613b19565b5f805f80613aab8c8b8f8d613018565b915091505f80613abd8a8a8d8c613018565b91509150613acd84848484611ca3565b8096508197505050505050505f80613ae78b8b8f8d613018565b915091505f80613af986868686611dc2565b915091505f80613b0b84848f8e61309e565b909a50985050505050505050505b97509795505050505050565b5f805f805f613b348787613e8f565b92509250925080612fba576040517f05e51ecb00000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f80613b8a600a612328614c75565b613b95906002614e02565b613ba0906001614de1565b90505f613bb0600a612328614c75565b90506002600a8504026001015f8052600281601e883c505f51617fff81169350618000811615613bdf57918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f80821215613c5f577f80000000000000000000000000000000000000000000000000000000000000008203613c5957507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b919050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f613cb08686613c68565b91509150815f03613cd457838181613cca57613cca6149b0565b0492505050610695565b838210613d1e576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016108ce565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215613e52577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613e3f57613de77f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001614de1565b8403613e1757507f80000000000000000000000000000000000000000000000000000000000000009050816123dd565b613e22600a85614c75565b613e2b90614c45565b613e36846001614a30565b915091506123dd565b613e4884614c45565b83915091506123dd565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613e8557613e2b600a85614c75565b50829050816123dd565b5f805f845f03613ea757505f915081905060016138d9565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f036140bb576f4b3b4ca85a86c47a098a2240000000008505158015613f1057507f80000000000000000000000000000000000000000000000000000000000000268412155b15613f31576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a000000000000008505158015613f7957507f80000000000000000000000000000000000000000000000000000000000000138412155b15613f9257678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008505158015613fde57507f800000000000000000000000000000000000000000000000000000000000000a8412155b15613ff4576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000850515801561404357507f80000000000000000000000000000000000000000000000000000000000000028412155b1561405957606485029450600284039350613ff4565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085051580156140a957507f80000000000000000000000000000000000000000000000000000000000000018412155b156140bb57600a850294506001840393505b600a808602908105861480156140f157507f80000000000000000000000000000000000000000000000000000000000000018512155b15614100578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f808515841517818712828612181785841417801561415557868592509250506123dd565b505f85841315614169575092949193919260015b8386035f8112604c821317801561419c57821561418e575f89945094505050506123dd565b885f945094505050506123dd565b600a82900a8981028a8282816141b4576141b46149b0565b05146141e05784156141d0575f8b9650965050505050506123dd565b8a5f9650965050505050506123dd565b84156141f55788965094506123dd9350505050565b95508794506123dd9350505050565b60605f82126142215760405180602001604052805f815250614258565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b61426960ff84901d80850118614290565b60405160200161427a929190614df4565b6040516020818303038152906040529050919050565b60605f61429c8361449f565b60010190505f8167ffffffffffffffff8111156142bb576142bb614891565b6040519080825280601f01601f1916602001820160405280156142e5576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846142ef57509392505050565b5f5b5f82600186515f1a1b1611838510161561436d5760018401935061434e565b509192915050565b81515f90819065200000000000600191831a9190911b161515838510168085019082806143a28488614580565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156143dd575093505f92506106ad915050565b825f03614440577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111614411575f614433565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b955093506106ad92505050565b7f8000000000000000000000000000000000000000000000000000000000000000811161446d575f61448f565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106144e7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310614513576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061453157662386f26fc10000830492506010015b6305f5e1008310614549576305f5e100830492506008015b612710831061455d57612710830492506004015b6064831061456f576064830492506002015b600a83106106845760010192915050565b5f808284106145b357507f34bd20690000000000000000000000000000000000000000000000000000000090505f6106ad565b835f036145ec576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b8782101580156146245750604d83105b1561466757815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a8590030201614614565b87821061478d5781515f1a84900360018111156146af57507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b600a84900a81028281018311156146f257507f0fdc26350000000000000000000000000000000000000000000000000000000096505f95506106ad945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b87821061478d5781515f1a6030811461476257507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091019061471e565b5f9890975095505050505050565b5f602082840312156147ab575f80fd5b5035919050565b5f80604083850312156147c3575f80fd5b50508035926020909101359150565b803560ff81168114613c63575f80fd5b5f80604083850312156147f3575f80fd5b82359150614803602084016147d2565b90509250929050565b5f806040838503121561481d575f80fd5b8235915060208301358015158114614833575f80fd5b809150509250929050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f602082840312156148ce575f80fd5b813567ffffffffffffffff808211156148e5575f80fd5b818401915084601f8301126148f8575f80fd5b81358181111561490a5761490a614891565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561495057614950614891565b81604052828152876020848701011115614968575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215614999575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181035f831280158383131683831282161715614a2957614a296149dd565b5092915050565b8082018281125f831280158216821582161715614a4f57614a4f6149dd565b505092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615614a8e57614a8e6149dd565b8181058314821517610684576106846149dd565b600181815b80851115614afb57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614ae157614ae16149dd565b80851615614aee57918102915b93841c9390800290614aa7565b509250929050565b5f82614b1157506001610684565b81614b1d57505f610684565b8160018114614b335760028114614b3d57614b59565b6001915050610684565b60ff841115614b4e57614b4e6149dd565b50506001821b610684565b5060208310610133831016604e8410600b8410161715614b7c575081810a610684565b614b868383614aa2565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614bb857614bb86149dd565b029392505050565b5f6106958383614b03565b5f82614bd957614bd96149b0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614c2d57614c2d6149dd565b500590565b5f82614c4057614c406149b0565b500790565b5f7f80000000000000000000000000000000000000000000000000000000000000008203613c5957613c596149dd565b5f82614c8357614c836149b0565b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614cb857614cb86149dd565b5060010190565b5f81518060208401855e5f93019283525090919050565b5f614ce18284614cbf565b7f300000000000000000000000000000000000000000000000000000000000000081526001019392505050565b7f2e0000000000000000000000000000000000000000000000000000000000000081525f614d48614d426001840186614cbf565b84614cbf565b949350505050565b7f650000000000000000000000000000000000000000000000000000000000000081525f6106956001830184614cbf565b5f610a29614d42614d9b614d95858a614cbf565b88614cbf565b86614cbf565b81810381811115610684576106846149dd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b80820180821115610684576106846149dd565b5f614d48614d428386614cbf565b8082028115828204841417610684576106846149dd56"; /// @dev The addresses that MUST already have code on a network before /// this release can be broadcast there, `abi.encode`d as an `address[]` diff --git a/src/lib/deploy/LibDecimalFloatDeploy.sol b/src/lib/deploy/LibDecimalFloatDeploy.sol index 7e3dcb8..dfcc2ba 100644 --- a/src/lib/deploy/LibDecimalFloatDeploy.sol +++ b/src/lib/deploy/LibDecimalFloatDeploy.sol @@ -17,8 +17,8 @@ import { DEPLOYED_ADDRESS as DECIMAL_FLOAT_CANDIDATE_ADDRESS, BYTECODE_HASH as DECIMAL_FLOAT_CANDIDATE_HASH } from "../../generated/candidate/DecimalFloat.sol"; -import {LOG_TABLE_DISAMBIGUATOR} from "rain-math-float-0.2.1/src/lib/table/LibLogTable.sol"; -import {LogTablesNotDeployed} from "rain-math-float-0.2.1/src/error/ErrDecimalFloat.sol"; +import {LOG_TABLE_DISAMBIGUATOR} from "rain-math-float-0.2.4/src/lib/table/LibLogTable.sol"; +import {LogTablesNotDeployed} from "rain-math-float-0.2.4/src/error/ErrDecimalFloat.sol"; /// @title LibDecimalFloatDeploy /// @notice The consumer-facing deploy surface of this package: the Zoltu diff --git a/test/concrete/DecimalFloat.packLossless.t.sol b/test/concrete/DecimalFloat.packLossless.t.sol index 122eaee..fdc77cd 100644 --- a/test/concrete/DecimalFloat.packLossless.t.sol +++ b/test/concrete/DecimalFloat.packLossless.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.16.2/src/Test.sol"; import {TestDecimalFloat} from "./TestDecimalFloat.sol"; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; contract DecimalFloatPackLosslessTest is Test { function packLosslessExternal(int224 signedCoefficient, int32 exponent) external pure returns (Float) { diff --git a/test/concrete/TestDecimalFloat.sol b/test/concrete/TestDecimalFloat.sol index 0ce2dc1..4ffd12c 100644 --- a/test/concrete/TestDecimalFloat.sol +++ b/test/concrete/TestDecimalFloat.sol @@ -2,8 +2,8 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; -import {LibLogTable, ALT_TABLE_FLAG} from "rain-math-float-0.2.1/src/lib/table/LibLogTable.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; +import {LibLogTable, ALT_TABLE_FLAG} from "rain-math-float-0.2.4/src/lib/table/LibLogTable.sol"; /// Exposes the library internals the Rust bindings' tests need beside the /// `DecimalFloat` ABI: packing, and the log tables as `LibLogTable` ships diff --git a/test/concrete/TestDecimalFloat.unpack.t.sol b/test/concrete/TestDecimalFloat.unpack.t.sol index 06aba54..0d93a43 100644 --- a/test/concrete/TestDecimalFloat.unpack.t.sol +++ b/test/concrete/TestDecimalFloat.unpack.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.16.2/src/Test.sol"; import {TestDecimalFloat} from "./TestDecimalFloat.sol"; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; contract TestDecimalFloatUnpackTest is Test { using LibDecimalFloat for Float; diff --git a/test/src/concrete/DecimalFloat.abs.t.sol b/test/src/concrete/DecimalFloat.abs.t.sol index 9f8a6e2..5e84883 100644 --- a/test/src/concrete/DecimalFloat.abs.t.sol +++ b/test/src/concrete/DecimalFloat.abs.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.add.t.sol b/test/src/concrete/DecimalFloat.add.t.sol index fd4b7a0..5f8f600 100644 --- a/test/src/concrete/DecimalFloat.add.t.sol +++ b/test/src/concrete/DecimalFloat.add.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.ceil.t.sol b/test/src/concrete/DecimalFloat.ceil.t.sol index 2428240..53fa0eb 100644 --- a/test/src/concrete/DecimalFloat.ceil.t.sol +++ b/test/src/concrete/DecimalFloat.ceil.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.constants.t.sol b/test/src/concrete/DecimalFloat.constants.t.sol index 14523be..f390518 100644 --- a/test/src/concrete/DecimalFloat.constants.t.sol +++ b/test/src/concrete/DecimalFloat.constants.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.constructor.t.sol b/test/src/concrete/DecimalFloat.constructor.t.sol index fe7e6bc..502a730 100644 --- a/test/src/concrete/DecimalFloat.constructor.t.sol +++ b/test/src/concrete/DecimalFloat.constructor.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.16.2/src/Test.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; import {LibDecimalFloatDeploy} from "src/lib/deploy/LibDecimalFloatDeploy.sol"; -import {LogTablesNotDeployed} from "rain-math-float-0.2.1/src/error/ErrDecimalFloat.sol"; +import {LogTablesNotDeployed} from "rain-math-float-0.2.4/src/error/ErrDecimalFloat.sol"; import {LibEtchLogTables} from "script/lib/LibEtchLogTables.sol"; /// Direct tests for the `DecimalFloat` constructor's log-tables guard. These diff --git a/test/src/concrete/DecimalFloat.div.t.sol b/test/src/concrete/DecimalFloat.div.t.sol index fc01ee8..ae7fb7e 100644 --- a/test/src/concrete/DecimalFloat.div.t.sol +++ b/test/src/concrete/DecimalFloat.div.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.eq.t.sol b/test/src/concrete/DecimalFloat.eq.t.sol index 74c3514..866eeb4 100644 --- a/test/src/concrete/DecimalFloat.eq.t.sol +++ b/test/src/concrete/DecimalFloat.eq.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.floor.t.sol b/test/src/concrete/DecimalFloat.floor.t.sol index 2c64a94..d31f819 100644 --- a/test/src/concrete/DecimalFloat.floor.t.sol +++ b/test/src/concrete/DecimalFloat.floor.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.format.t.sol b/test/src/concrete/DecimalFloat.format.t.sol index 98f8ec8..7679d3e 100644 --- a/test/src/concrete/DecimalFloat.format.t.sol +++ b/test/src/concrete/DecimalFloat.format.t.sol @@ -2,11 +2,11 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; -import {LibFormatDecimalFloat} from "rain-math-float-0.2.1/src/lib/format/LibFormatDecimalFloat.sol"; -import {ScientificMinNotLessThanMax} from "rain-math-float-0.2.1/src/error/ErrDecimalFloat.sol"; +import {LibFormatDecimalFloat} from "rain-math-float-0.2.4/src/lib/format/LibFormatDecimalFloat.sol"; +import {ScientificMinNotLessThanMax} from "rain-math-float-0.2.4/src/error/ErrDecimalFloat.sol"; contract DecimalFloatFormatTest is LogTest { using LibDecimalFloat for Float; diff --git a/test/src/concrete/DecimalFloat.frac.t.sol b/test/src/concrete/DecimalFloat.frac.t.sol index 20ebc2a..66fc3b6 100644 --- a/test/src/concrete/DecimalFloat.frac.t.sol +++ b/test/src/concrete/DecimalFloat.frac.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.fromFixedDecimalLossless.t.sol b/test/src/concrete/DecimalFloat.fromFixedDecimalLossless.t.sol index 8072e0d..5ce91a7 100644 --- a/test/src/concrete/DecimalFloat.fromFixedDecimalLossless.t.sol +++ b/test/src/concrete/DecimalFloat.fromFixedDecimalLossless.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; contract DecimalFloatFromFixedDecimalLosslessTest is LogTest { using LibDecimalFloat for Float; diff --git a/test/src/concrete/DecimalFloat.fromFixedDecimalLossy.t.sol b/test/src/concrete/DecimalFloat.fromFixedDecimalLossy.t.sol index dd236e8..fcd827e 100644 --- a/test/src/concrete/DecimalFloat.fromFixedDecimalLossy.t.sol +++ b/test/src/concrete/DecimalFloat.fromFixedDecimalLossy.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; contract DecimalFloatFromFixedDecimalLossyTest is LogTest { using LibDecimalFloat for Float; diff --git a/test/src/concrete/DecimalFloat.gt.t.sol b/test/src/concrete/DecimalFloat.gt.t.sol index 910f769..aadcaec 100644 --- a/test/src/concrete/DecimalFloat.gt.t.sol +++ b/test/src/concrete/DecimalFloat.gt.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.gte.t.sol b/test/src/concrete/DecimalFloat.gte.t.sol index 4f41eaf..1dafe21 100644 --- a/test/src/concrete/DecimalFloat.gte.t.sol +++ b/test/src/concrete/DecimalFloat.gte.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.integer.t.sol b/test/src/concrete/DecimalFloat.integer.t.sol index 8afc15d..a63abf1 100644 --- a/test/src/concrete/DecimalFloat.integer.t.sol +++ b/test/src/concrete/DecimalFloat.integer.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.inv.t.sol b/test/src/concrete/DecimalFloat.inv.t.sol index f83a436..fe7b886 100644 --- a/test/src/concrete/DecimalFloat.inv.t.sol +++ b/test/src/concrete/DecimalFloat.inv.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.isZero.t.sol b/test/src/concrete/DecimalFloat.isZero.t.sol index dc97f31..8cc3aba 100644 --- a/test/src/concrete/DecimalFloat.isZero.t.sol +++ b/test/src/concrete/DecimalFloat.isZero.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.log10.t.sol b/test/src/concrete/DecimalFloat.log10.t.sol index 4a7d149..0999d66 100644 --- a/test/src/concrete/DecimalFloat.log10.t.sol +++ b/test/src/concrete/DecimalFloat.log10.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LibDecimalFloatDeploy} from "src/lib/deploy/LibDecimalFloatDeploy.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.lt.t.sol b/test/src/concrete/DecimalFloat.lt.t.sol index 6364bb5..6395786 100644 --- a/test/src/concrete/DecimalFloat.lt.t.sol +++ b/test/src/concrete/DecimalFloat.lt.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.lte.t.sol b/test/src/concrete/DecimalFloat.lte.t.sol index 435b11a..bc5e134 100644 --- a/test/src/concrete/DecimalFloat.lte.t.sol +++ b/test/src/concrete/DecimalFloat.lte.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.max.t.sol b/test/src/concrete/DecimalFloat.max.t.sol index 172f061..38ada4b 100644 --- a/test/src/concrete/DecimalFloat.max.t.sol +++ b/test/src/concrete/DecimalFloat.max.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.min.t.sol b/test/src/concrete/DecimalFloat.min.t.sol index 9119a13..6a47539 100644 --- a/test/src/concrete/DecimalFloat.min.t.sol +++ b/test/src/concrete/DecimalFloat.min.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; diff --git a/test/src/concrete/DecimalFloat.minus.t.sol b/test/src/concrete/DecimalFloat.minus.t.sol index 12c9c7f..143c948 100644 --- a/test/src/concrete/DecimalFloat.minus.t.sol +++ b/test/src/concrete/DecimalFloat.minus.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.mul.t.sol b/test/src/concrete/DecimalFloat.mul.t.sol index 706d1ca..9a4f8ea 100644 --- a/test/src/concrete/DecimalFloat.mul.t.sol +++ b/test/src/concrete/DecimalFloat.mul.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; contract DecimalFloatMulTest is LogTest { using LibDecimalFloat for Float; diff --git a/test/src/concrete/DecimalFloat.parse.t.sol b/test/src/concrete/DecimalFloat.parse.t.sol index a781ff8..6ae9e9b 100644 --- a/test/src/concrete/DecimalFloat.parse.t.sol +++ b/test/src/concrete/DecimalFloat.parse.t.sol @@ -4,8 +4,8 @@ pragma solidity =0.8.25; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; -import {LibParseDecimalFloat} from "rain-math-float-0.2.1/src/lib/parse/LibParseDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; +import {LibParseDecimalFloat} from "rain-math-float-0.2.4/src/lib/parse/LibParseDecimalFloat.sol"; contract DecimalFloatParseTest is LogTest { using LibDecimalFloat for Float; diff --git a/test/src/concrete/DecimalFloat.pow.t.sol b/test/src/concrete/DecimalFloat.pow.t.sol index 65eadd2..1d61520 100644 --- a/test/src/concrete/DecimalFloat.pow.t.sol +++ b/test/src/concrete/DecimalFloat.pow.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LibDecimalFloatDeploy} from "src/lib/deploy/LibDecimalFloatDeploy.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.pow10.t.sol b/test/src/concrete/DecimalFloat.pow10.t.sol index ec70d97..98c0b89 100644 --- a/test/src/concrete/DecimalFloat.pow10.t.sol +++ b/test/src/concrete/DecimalFloat.pow10.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LibDecimalFloatDeploy} from "src/lib/deploy/LibDecimalFloatDeploy.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.sqrt.t.sol b/test/src/concrete/DecimalFloat.sqrt.t.sol index 29387c8..fb103c9 100644 --- a/test/src/concrete/DecimalFloat.sqrt.t.sol +++ b/test/src/concrete/DecimalFloat.sqrt.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LibDecimalFloatDeploy} from "src/lib/deploy/LibDecimalFloatDeploy.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.sub.t.sol b/test/src/concrete/DecimalFloat.sub.t.sol index 32e26f9..4cb2595 100644 --- a/test/src/concrete/DecimalFloat.sub.t.sol +++ b/test/src/concrete/DecimalFloat.sub.t.sol @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; diff --git a/test/src/concrete/DecimalFloat.toFixedDecimalLossless.t.sol b/test/src/concrete/DecimalFloat.toFixedDecimalLossless.t.sol index 0a1430f..0f71dc8 100644 --- a/test/src/concrete/DecimalFloat.toFixedDecimalLossless.t.sol +++ b/test/src/concrete/DecimalFloat.toFixedDecimalLossless.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; contract DecimalFloatToFixedDecimalLosslessTest is LogTest { using LibDecimalFloat for Float; diff --git a/test/src/concrete/DecimalFloat.toFixedDecimalLossy.t.sol b/test/src/concrete/DecimalFloat.toFixedDecimalLossy.t.sol index 295f4a6..911d442 100644 --- a/test/src/concrete/DecimalFloat.toFixedDecimalLossy.t.sol +++ b/test/src/concrete/DecimalFloat.toFixedDecimalLossy.t.sol @@ -4,8 +4,8 @@ pragma solidity =0.8.25; import {LogTest} from "test/abstract/LogTest.sol"; import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; -import {LibDecimalFloat, Float} from "rain-math-float-0.2.1/src/lib/LibDecimalFloat.sol"; -import {FixedDecimalOverflow} from "rain-math-float-0.2.1/src/error/ErrDecimalFloat.sol"; +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; +import {FixedDecimalOverflow} from "rain-math-float-0.2.4/src/error/ErrDecimalFloat.sol"; contract DecimalFloatToFixedDecimalLossyTest is LogTest { using LibDecimalFloat for Float; diff --git a/test/src/lib/deploy/LibDecimalFloatDeploy.checkLogTablesDeployed.t.sol b/test/src/lib/deploy/LibDecimalFloatDeploy.checkLogTablesDeployed.t.sol index ae42efa..52e28ad 100644 --- a/test/src/lib/deploy/LibDecimalFloatDeploy.checkLogTablesDeployed.t.sol +++ b/test/src/lib/deploy/LibDecimalFloatDeploy.checkLogTablesDeployed.t.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.16.2/src/Test.sol"; import {LibDecimalFloatDeploy} from "src/lib/deploy/LibDecimalFloatDeploy.sol"; import {LibDataContract} from "rain-datacontract-0.1.9/src/lib/LibDataContract.sol"; -import {LogTablesNotDeployed} from "rain-math-float-0.2.1/src/error/ErrDecimalFloat.sol"; +import {LogTablesNotDeployed} from "rain-math-float-0.2.4/src/error/ErrDecimalFloat.sol"; /// Direct tests for `LibDecimalFloatDeploy.checkLogTablesDeployed`. These /// deliberately do NOT inherit `LogTest` so the table address starts empty. diff --git a/test/src/lib/table/LibLogTable.bytes.t.sol b/test/src/lib/table/LibLogTable.bytes.t.sol index e32cb47..f336999 100644 --- a/test/src/lib/table/LibLogTable.bytes.t.sol +++ b/test/src/lib/table/LibLogTable.bytes.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.16.2/src/Test.sol"; -import {LibLogTable} from "rain-math-float-0.2.1/src/lib/table/LibLogTable.sol"; +import {LibLogTable} from "rain-math-float-0.2.4/src/lib/table/LibLogTable.sol"; import { LOG_TABLES, LOG_TABLES_SMALL, From 3040ce6c38edfa04a9aba03250a7267bcebeee28 Mon Sep 17 00:00:00 2001 From: David Meister Date: Sun, 27 Sep 2026 16:02:41 +0000 Subject: [PATCH 2/2] expose agree on the DecimalFloat concrete MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without this the bump moved the concrete's Zoltu address while its external surface stayed byte-identical: the ABI diff was two `object` lines, bytecode only. The address change bought consumers of the concrete nothing, and adding `agree` after the release would have moved it a second time. `agree` is now exposed alongside the comparisons it belongs with, so the Rust bindings can call it — which is what this concrete is for. The tolerance guard reaches an offchain caller as a revert rather than a silent answer, so `AgreeToleranceNegative` and `AgreeNoPositiveTolerance` are now part of this contract's observable behaviour. Address moves once, to the value that includes `agree`: bytecode hash 0xdc468883... -> 0x0d43af49... address 0x799632d2... -> 0xEc632ea4... `LogTables` is still untouched at `0xc51a1425...`. Three tests, following the file-per-function pattern the other concrete tests use: - `testAgreeDeployed` fuzzes all four operands as arbitrary packed words and asserts the deployed contract answers what the library answers, or reverts with the same data. Arbitrary words means the guard's rejections are exercised alongside the ordinary answers. - `testAgreeDeployedRejectsBadTolerances` pins both errors with their tolerances. The fuzz above would pass if both sides returned the same wrong thing; this will not. - `testAgreeDeployedBoundary` pins a concrete answer either side of the limit, so the exposed function is tied to the formula rather than to whatever the library happens to return. 42 suites, 75 passing. The 6 failures are the `*_RPC_URL` fork tests with no env vars locally. Lint and fmt clean. Co-Authored-By: Claude Opus 5 (1M context) --- crates/float/abi/DecimalFloat.json | 70 +++++++++++++++++++++- src/concrete/DecimalFloat.sol | 16 +++++ src/generated/candidate/DecimalFloat.sol | 8 +-- test/src/concrete/DecimalFloat.agree.t.sol | 64 ++++++++++++++++++++ 4 files changed, 152 insertions(+), 6 deletions(-) create mode 100644 test/src/concrete/DecimalFloat.agree.t.sol diff --git a/crates/float/abi/DecimalFloat.json b/crates/float/abi/DecimalFloat.json index 91392f2..f1d4c7c 100644 --- a/crates/float/abi/DecimalFloat.json +++ b/crates/float/abi/DecimalFloat.json @@ -74,6 +74,40 @@ ], "stateMutability": "pure" }, + { + "type": "function", + "name": "agree", + "inputs": [ + { + "name": "absolute", + "type": "bytes32", + "internalType": "Float" + }, + { + "name": "proportional", + "type": "bytes32", + "internalType": "Float" + }, + { + "name": "lowest", + "type": "bytes32", + "internalType": "Float" + }, + { + "name": "highest", + "type": "bytes32", + "internalType": "Float" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "pure" + }, { "type": "function", "name": "ceil", @@ -808,6 +842,38 @@ ], "stateMutability": "pure" }, + { + "type": "error", + "name": "AgreeNoPositiveTolerance", + "inputs": [ + { + "name": "absolute", + "type": "bytes32", + "internalType": "Float" + }, + { + "name": "proportional", + "type": "bytes32", + "internalType": "Float" + } + ] + }, + { + "type": "error", + "name": "AgreeToleranceNegative", + "inputs": [ + { + "name": "absolute", + "type": "bytes32", + "internalType": "Float" + }, + { + "name": "proportional", + "type": "bytes32", + "internalType": "Float" + } + ] + }, { "type": "error", "name": "CoefficientOverflow", @@ -1102,9 +1168,9 @@ } ], "bytecode": { - "object": "0x6080604052348015600e575f80fd5b5060156019565b60b8565b73c51a14251b0dcf0ae24a96b7153991378938f5f53f7f2573004ac3a9ee7fc8d73654d76386f1b6b99e34cdf86a689c4691e47143420f811460b557604051630912d0ff60e31b815273c51a14251b0dcf0ae24a96b7153991378938f5f560048201527f2573004ac3a9ee7fc8d73654d76386f1b6b99e34cdf86a689c4691e47143420f60248201526044810182905260640160405180910390fd5b50565b614e19806100c55f395ff3fe608060405234801561000f575f80fd5b506004361061029d575f3560e01c806381f7e2f511610171578063cde72ef3116100d2578063dd64691711610088578063e5526ecd1161006e578063e5526ecd1461062e578063e75f991f14610641578063ffae15ba14610654575f80fd5b8063dd64691714610608578063e0db58881461061b575f80fd5b8063d1de592a116100b8578063d1de592a146105bb578063d35273a7146105ce578063d3d6ffa8146105f5575f80fd5b8063cde72ef314610582578063d102b4d3146105a8575f80fd5b8063a19684b711610127578063bc1b392d1161010d578063bc1b392d1461050b578063bc62d8d814610511578063cb09682b1461055c575f80fd5b8063a19684b7146104d2578063a90d041a146104f8575f80fd5b806396ce1ec71161015757806396ce1ec7146104885780639b4afd991461049b578063a100a3d9146104bf575f80fd5b806381f7e2f5146104625780638dc2980714610475575f80fd5b80633447c0301161021b5780635ca0e7a4116101d1578063719cd99d116101b7578063719cd99d1461042957806373bfb2831461043c57806381a822721461044f575f80fd5b80635ca0e7a4146103f0578063602c35fc14610403575f80fd5b80633b3bd868116102015780633b3bd868146103b757806341aa0080146103ca5780635b23771d146103dd575f80fd5b80633447c03014610374578063371493ce14610397575f80fd5b80631ee62f111161027057806328fa1f011161025657806328fa1f011461033b5780633004fa411461034e5780633029740014610361575f80fd5b80631ee62f11146103155780632538835014610328575f80fd5b806304327dc5146102a1578063078b665b146102c75780630b6429bc146102da578063146e82ad14610302575b5f80fd5b6102b46102af36600461479b565b61067a565b6040519081526020015b60405180910390f35b6102b46102d53660046147b2565b61068a565b6102ed6102e83660046147e2565b61069c565b604080519283529015156020830152016102be565b6102b461031036600461479b565b6106b4565b6102b461032336600461479b565b6106d3565b6102b461033636600461479b565b6106f2565b6102b461034936600461479b565b610711565b6102b461035c3660046147b2565b61071b565b6102b461036f3660046147b2565b61073b565b6103876103823660046147b2565b610746565b60405190151581526020016102be565b6103aa6103a536600461480c565b610751565b6040516102be919061483e565b6102b46103c53660046147e2565b61075d565b6102b46103d83660046147b2565b610768565b6102b46103eb3660046147e2565b610773565b6102b46103fe36600461479b565b61077e565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b6102b461043736600461479b565b610788565b61038761044a3660046147b2565b610792565b6102b461045d36600461479b565b61079d565b6103876104703660046147b2565b6107a7565b6103876104833660046147b2565b6107b2565b6102b46104963660046147b2565b6107bd565b6102b47c090000000000000000000000000000000000000000000000000000000181565b6103aa6104cd36600461479b565b6107c8565b7f80000000000000000000000000000000000000000000000000000000000000016102b4565b6102b46105063660046147b2565b610812565b5f6102b4565b61052461051f3660046148be565b61081d565b604080517fffffffff0000000000000000000000000000000000000000000000000000000090931683526020830191909152016102be565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b7f7fffffff800000000000000000000000000000000000000000000000000000006102b4565b6103876105b63660046147b2565b610836565b6102b46105c93660046147b2565b610841565b6102b47ffffffffc0000000000000000000000000000000000000000000000000000000181565b6102b461060336600461479b565b61084c565b61038761061636600461479b565b610856565b6102b461062936600461479b565b61087c565b6103aa61063c366004614987565b610886565b6102ed61064f3660046147e2565b61090f565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc6102b4565b5f6106848261091b565b92915050565b5f610695838361095d565b9392505050565b5f806106a88484610979565b915091505b9250929050565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109ba565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109e6565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f5610a33565b5f61068482610a66565b5f610695838373c51a14251b0dcf0ae24a96b7153991378938f5f5610aa7565b5f6106958383610d01565b5f6106958383610d63565b60606106958383610db1565b5f6106958383610e44565b5f6106958383610e5f565b5f6106958383610ea4565b5f61068482610ed7565b5f61068482610f8d565b5f6106958383611039565b5f6106848261107c565b5f61069583836110c1565b5f6106958383611104565b5f6106958383611147565b6060610684827ffffffffc000000000000000000000000000000000000000000000000000000017c0900000000000000000000000000000000000000000000000000000001610886565b5f610695838361118c565b5f805f8061082a85611197565b90969095509350505050565b5f6106958383611285565b5f61069583836112c8565b5f6106848261130d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821615610684565b5f6106848261133f565b60606108928383611285565b6108d7576040517f3be5bf9400000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044015b60405180910390fd5b5f6108e18561107c565b9050610906856108f18387611285565b8061090157506109018386611104565b610db1565b95945050505050565b5f806106a88484611380565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826113c0565b90925090505f610906838361140e565b5f6109688383611104565b6109725781610695565b5090919050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6109ad828287611474565b9350935050509250929050565b5f610695837fffffffff0000000000000000000000000000000000000000000000000000000584610aa7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a1984838361167e565b90925090505f610a29838361140e565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a198483836117ef565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82610a998383611b24565b9150505f610a29828461140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516610ae45750600191506106959050565b5f8213610b7d57815f03610b4157610afc855f611285565b15610b36576040517f8be82972000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b505f91506106959050565b6040517fcceba0f100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b610b88856001610d63565b8015610b995750610b99865f611104565b15610ba8578592505050610695565b610bb2855f611285565b15610bdb57610bd2610bc38761091b565b610bcc8761130d565b86610aa7565b92505050610695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80610c0e8484611b24565b915091505f610c1e83855f611b8c565b905060015f8080610c558f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510610c9c5784600116600103610c7f57610c7984848484611ca3565b90945092505b600185901c9450610c9282828484611ca3565b9092509050610c5a565b5f80610ca98f8e8e6117ef565b91509150610cb982828a8d611ca3565b9092509050610cc98f838361167e565b9092509050610cda82828888611ca3565b90925090505f610cea838361140e565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611dc2565b915091505f610d55838361140e565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846123e6565b979650505050505050565b60607bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d5f829003610e21576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525092505050610684565b8315610e3a57610e3182826123fd565b92505050610684565b610906828261273a565b5f805f610e518585612f64565b915091506109068282612fc6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686613018565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610906828286613042565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610f0e57509192915050565b5f80610f1a8484611b24565b915091505f84128015610f2c57508015155b15610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613018565b935091505b5f610da6838561140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610fc457509192915050565b5f80610fd08484611b24565b91509150805f03610fe5575093949350505050565b5f811315610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb461309e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846131ce565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828212156110b65761094d82826131ea565b5f610906838361140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da68484848461328d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846132a9565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611ca3565b5f6109688383611285565b80515f908190602084810191850101828080806111b486866132c4565b929650909450925090507fffffffff0000000000000000000000000000000000000000000000000000000084165f0361127657848303611246575f806111fa8484613763565b915091508061123557507f32b8b8be000000000000000000000000000000000000000000000000000000009a5f9a5098505050505050505050565b505f9a909950975050505050505050565b507fad384e8700000000000000000000000000000000000000000000000000000000985f98509650505050505050565b5091975f975095505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da684848484613869565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d468686868661309e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826131ea565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d826113728383611b24565b5090505f610a29828461140e565b5f805f805f61138f8787613884565b9250925092505f806113a18585613763565b91509150818380156113b05750815b9650965050505050509250929050565b5f806106a87f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686611dc2565b5f805f61141b8585613763565b915091508015801561142b575081155b1561146c576040517f8eba4d0700000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b509392505050565b5f805f8512156114ba576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b845f036114cc57505f90506001611676565b8460ff8416850185811215611517576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f805f831215611581577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3831215611558575f809550955050505050611676565b825f03600a0a915081848161156f5761156f6149b0565b04955050840290911491506116769050565b5f83131561166b57604d8313156115d7576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8161160c5761160c6149b0565b04841115611659576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b50919091029250600191506116769050565b509193506001925050505b935093915050565b5f805f8412156116ba5761169284846131ea565b90945092506116a285858561167e565b90945092506116b184846113c0565b91509150611676565b5f806116c68686611b24565b9092509050845f80806116d985856138e0565b9194509250905061270d6127106116f1600182614a0a565b8514611708576117028d86866139cf565b90925090505b8315611793575f61171a866001614a30565b90505b80848583028161172f5761172f6149b0565b051461174657600a84059350600a8805975061171d565b6117876117538588614a57565b8961175e8785614a57565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc613a88565b909d509b506117ba9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866117cb84835f611b8c565b6117d6886001614a30565b6117e09190614a30565b94509450505050935093915050565b5f8083836117fd8282613b25565b90965094505f861361187e57855f03611842576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b5050837f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000036118bc576118b283604c614a30565b5f91509150611676565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000008412158061190b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb561192d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412611ae8575f805f805f8561194657604b611949565b604c5b611953908a614a30565b90505f8087611980577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000006119a1565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c816119d3576119d36149b0565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050611a0c8c82613b7b565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414611a98576123278114611a7357611a4e8c82600101613b7b565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002611a95565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50611ac8838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613a88565b909a509850611ad98a8a835f61309e565b97509750505050505050611676565b611af285856113c0565b9095509350611b028686866117ef565b9095509350611b1185856131ea565b9250925050611676565b50935093915050565b5f805f8312611b3757508290505f6106ad565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4831215611b6957505f9050826106ad565b5f839003600a0a808581611b7f57611b7f6149b0565b0794859003959350505050565b5f818303611b9b575082610695565b82821315611bde57828203604c811380611bb557505f8113155b15611bc3575f915050610695565b80600a0a8581611bd557611bd56149b0565b05915050610695565b818303604c811380611bf057505f8113155b15611c38576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604481018490526064016108ce565b600a81900a85810286828281611c5057611c506149b0565b0514611c99576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604481018690526064016108ce565b9250610695915050565b5f8085158415178015611cbb575f92505f9150611db8565b611cc58487614a30565b91505f611cd188613c02565b90505f611cdd87613c02565b90505f611cea8383613c68565b5090505f6f0785ee10d5da46d900f436a000000000821115611d1f576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115611d4057670de0b6b3a7640000820491506012015b633b9aca00821115611d5957633b9aca00820491506009015b612710821115611d6e57612710820491506004015b8115611d8257600a82049150600101611d6e565b611d8c8187614a30565b9550611dae8b8a611da88787611da387600a614bc0565b613ca3565b89613d88565b9097509550505050505b5094509492505050565b5f80835f03611e07576040517f7a97930f00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b855f03611e1857505f9050806123dd565b5f805f80611e268a8a613e8f565b919b5099509150611e378888613e8f565b919950975090505f611e488b613c02565b90505f611e548a613c02565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c81831015612271578415611eb257507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b612230565b6f4b3b4ca85a86c47a098a224000000000831015611fde57678ac7230489e80000831015611f42576402540be400831015611f1057620186a0831015611f005750620186a0905060056121b9565b506402540be4009050600a6121b9565b655af3107a4000831015611f2f5750655af3107a40009050600e6121b9565b50678ac7230489e80000905060136121b9565b6b204fce5e3e25026110000000831015611f945769152d02c7e14af6800000831015611f7d575069152d02c7e14af6800000905060176121b9565b506b204fce5e3e250261100000009050601c6121b9565b6d314dc6448d9338c15b0a00000000831015611fc357506d314dc6448d9338c15b0a00000000905060216121b9565b506f4b3b4ca85a86c47a098a224000000000905060266121b9565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156120d65773af298d050e4395d69670b12b7f41000000000000831015612071577172cb5bd86321e38cb6ce6682e8000000000083101561205257507172cb5bd86321e38cb6ce6682e800000000009050602b6121b9565b5073af298d050e4395d69670b12b7f41000000000000905060306121b9565b76010b46c6cdd6e3e0828f4db456ff0c8ea00000000000008310156120b2575076010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000905060356121b9565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a6121b9565b7c03b58e88c75313ec9d329eaaa18fb92f75215b1710000000000000000083101561216c577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561214457507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f6121b9565b507c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000905060446121b9565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000008310156121b957507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b8183116121ed57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016121b9565b815f03612230576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c90526044016108ce565b85612271576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e90526044016108ce565b807f8000000000000000000000000000000000000000000000000000000000000000018d126122a457808d039c50612317565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f81131561231757807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b1361230457998a0199612317565b5f809950995050505050505050506123dd565b5f808e12801561232657505f8c135b15612363577f80000000000000000000000000000000000000000000000000000000000000008e01808d1361235b575f61235f565b808d035b9150505b8b818f010397506123808f8e61237a888789613ca3565b8b613d88565b90995097505f8113156123ca57604c8113156123aa575f809a509a505050505050505050506123dd565b80600a0a89816123bc576123bc6149b0565b059850885f036123ca575f97505b509698509496506123dd95505050505050565b94509492505050565b5f6123f385858585614130565b1495945050505050565b60608161240a8482613b25565b90945092505f8061243b7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000087614bcb565b1561246b57507f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000009050604c612492565b507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b5b5f61249d8388614bcb565b90505f6124aa8489614c32565b90505f808312156124c4575060016124c183614c45565b92505b5f8212156124db575060016124d882614c45565b91505b60408051602081019091525f815282156125e4575f806124fc600a89614c75565b90505b6125098186614bcb565b5f0361252e5761251a600a82614c75565b90508161252681614c88565b9250506124ff565b60408051602081019091525f8082525b8381101561258f57816040516020016125579190614cd6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052915060010161253e565b505b61259c600a87614c32565b5f036125b4576125ad600a87614bcb565b9550612591565b806125be87614204565b6040516020016125cf929190614d0e565b60405160208183030381529060405293505050505b5f6125ee85614204565b90505f6125fb878c614a30565b9050637fffffff81138061262e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000081125b15612668576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018a90526024016108ce565b5f811561269c5761267882614204565b6040516020016126889190614d50565b6040516020818303038152906040526126ac565b60405180602001604052805f8152505b90505f856126c85760405180602001604052805f8152506126ff565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b9050808486846040516020016127189493929190614d81565b6040516020818303038152906040529b50505050505050505050505092915050565b60606103e882138061275557506127526103e8614c45565b82125b1561278f576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018390526024016108ce565b5f8084129081156127aa576127a385614c45565b90506127ad565b50835b5f8413156128705783604481106127f3576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5b8281101561282f57612825600a83614c75565b9150600101612812565b508083111561286d576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018790526024016108ce565b50505b5f61287a82614290565b80519091505f5b81811080156128fd57508281612898600185614da1565b6128a29190614da1565b815181106128b2576128b2614db4565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f3000000000000000000000000000000000000000000000000000000000000000145b15612914578061290c81614c88565b915050612881565b5f61291f8284614da1565b90505f61292c838a614a30565b90505f876129485760405180602001604052805f81525061297f565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90505f8212612af957815f6129948286614de1565b67ffffffffffffffff8111156129ac576129ac614891565b6040519080825280601f01601f1916602001820160405280156129d6576020820181803683370190505b5090505f5b85811015612a48578881815181106129f5576129f5614db4565b602001015160f81c60f81b828281518110612a1257612a12614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506001016129db565b505f5b82811015612ac5577f300000000000000000000000000000000000000000000000000000000000000082612a7f8389614de1565b81518110612a8f57612a8f614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a4b565b508281604051602001612ad9929190614df4565b6040516020818303038152906040529a5050505050505050505050610684565b5f612b0383614c45565b905080841115612d1a575f612b188286614da1565b90505f612b26866001614de1565b67ffffffffffffffff811115612b3e57612b3e614891565b6040519080825280601f01601f191660200182016040528015612b68576020820181803683370190505b5090505f5b82811015612bda57898181518110612b8757612b87614db4565b602001015160f81c60f81b828281518110612ba457612ba4614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612b6d565b507f2e00000000000000000000000000000000000000000000000000000000000000818381518110612c0e57612c0e614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b83811015612ce55789612c518285614de1565b81518110612c6157612c61614db4565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612c95866001614de1565b612c9f9190614de1565b81518110612caf57612caf614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612c3e565b508381604051602001612cf9929190614df4565b6040516020818303038152906040529b505050505050505050505050610684565b5f612d258583614da1565b90505f85612d34836002614de1565b612d3e9190614de1565b67ffffffffffffffff811115612d5657612d56614891565b6040519080825280601f01601f191660200182016040528015612d80576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110612db657612db6614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f2e0000000000000000000000000000000000000000000000000000000000000081600181518110612e1857612e18614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b82811015612ec3577f300000000000000000000000000000000000000000000000000000000000000082612e7d836002614de1565b81518110612e8d57612e8d614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612e48565b505f5b86811015612ce557898181518110612ee057612ee0614db4565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612f14866002614de1565b612f1e9190614de1565b81518110612f2e57612f2e614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612ec6565b5f805f805f612f738787613884565b92509250925080612fba576040517fc471796600000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016108ce565b50909590945092505050565b5f805f612fd38585613763565b915091508061146c576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b5f8061302484846131ea565b90945092506130358686868661309e565b9150915094509492505050565b5f805f613050868686611474565b9150915080613095576040517f05e4767800000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b50949350505050565b5f80851584151780156130ca57865f036130be57848492509250506123dd565b868692509250506123dd565b6130d48787613b25565b90975095506130e38585613b25565b9095509350858413156130f7579395929492935b838603604c8111156131105787879350935050506123dd565b80600a0a8681613122576131226149b0565b0595505086850180881860ff90811c151589881890911c151680156131bd57877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036131a4576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a9052602481018990526044016108ce565b600a9687900596909805860197600197909701966131c1565b8198505b5096979596505050505050565b5f805f6131dd87878787614130565b1315979650505050505050565b5f807f80000000000000000000000000000000000000000000000000000000000000008403613283577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303613276576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101859052602481018490526044016108ce565b600a840593508260010192505b50505f9190910391565b5f805f61329c87878787614130565b1215979650505050505050565b5f805f6132b887878787614130565b12979650505050505050565b5f8281806132d983866520000000000061434c565b925085831415836132f381886703ff00000000000061434c565b945080850361332d57507f34bd20690000000000000000000000000000000000000000000000000000000094505f925082915061375a9050565b5f806133398a88614375565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613377575095505f935083925061375a915050565b86519095506540000000000060015f9290921a9190911b16151588871016915050801561360657506001909301925f846133ba81896703ff00000000000061434c565b95508086036133f557507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f935083925061375a915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613464577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016133f7565b8181146134bb575f806134778484614375565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156134b7575097505f955085945061375a9350505050565b9350505b5f8312156134f657507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f945084935061375a92505050565b831561350257825f0392505b80820394505f85131561354257507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f945084935061375a92505050565b855f0361355157829550613603565b5f859003604381111561359257507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b600a0a8681025f888383816135a9576135a96149b0565b0514159050601b82900b82141581806135bf5750805b156135fb57507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f985088975061375a9650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b16151587861016801561374b5760019095019485613646818a6520000000000061434c565b96508661365c818b6703ff00000000000061434c565b975080880361369957507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b505f806136a6838a614375565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156136e6575097505f955085945061375a9350505050565b9250508482015f831380156136fa57508581125b8061370e57505f8312801561370e57508581135b1561374757507fd556b1110000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b9450505b845f03613756575f93505b5050505b92959194509250565b5f601b83900b83148383826137c7577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156137a757620186a0860595506005850194505b8586601b0b146137c257600a860595508460010194506137a7565b6137dd565b855f036137dd57505f9250600191506106ad9050565b848560030b14613839575f8512156137fd57505f92508291506106ad9050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f61387887878787614130565b13979650505050505050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156138cf57600a860460018201600a88065f14935093509350506138d9565b8593509150600190505b9250925092565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0361391857508391505f905060016138d9565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8412156139a6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb084121561397757505f91505082151560016138d9565b5f846004015f03600a0a90505f818781613993576139936149b0565b05945050808402861415925090506138d9565b5f84126139bb57505f915081905060016138d9565b50505060048101600a0a82025f60016138d9565b5f808060646139e1600a612328614c75565b6139ee600a612328614c75565b6139f9906002614e02565b613a04906001614de1565b613a0e9190614de1565b613a189190614de1565b9050613a5c565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b613a67858288613a1f565b92508315611b1b57613a7d600186018288613a1f565b915050935093915050565b5f80888803613a9b575083905081613b19565b5f805f80613aab8c8b8f8d613018565b915091505f80613abd8a8a8d8c613018565b91509150613acd84848484611ca3565b8096508197505050505050505f80613ae78b8b8f8d613018565b915091505f80613af986868686611dc2565b915091505f80613b0b84848f8e61309e565b909a50985050505050505050505b97509795505050505050565b5f805f805f613b348787613e8f565b92509250925080612fba576040517f05e51ecb00000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f80613b8a600a612328614c75565b613b95906002614e02565b613ba0906001614de1565b90505f613bb0600a612328614c75565b90506002600a8504026001015f8052600281601e883c505f51617fff81169350618000811615613bdf57918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f80821215613c5f577f80000000000000000000000000000000000000000000000000000000000000008203613c5957507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b919050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f613cb08686613c68565b91509150815f03613cd457838181613cca57613cca6149b0565b0492505050610695565b838210613d1e576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016108ce565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215613e52577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613e3f57613de77f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001614de1565b8403613e1757507f80000000000000000000000000000000000000000000000000000000000000009050816123dd565b613e22600a85614c75565b613e2b90614c45565b613e36846001614a30565b915091506123dd565b613e4884614c45565b83915091506123dd565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613e8557613e2b600a85614c75565b50829050816123dd565b5f805f845f03613ea757505f915081905060016138d9565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f036140bb576f4b3b4ca85a86c47a098a2240000000008505158015613f1057507f80000000000000000000000000000000000000000000000000000000000000268412155b15613f31576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a000000000000008505158015613f7957507f80000000000000000000000000000000000000000000000000000000000000138412155b15613f9257678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008505158015613fde57507f800000000000000000000000000000000000000000000000000000000000000a8412155b15613ff4576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000850515801561404357507f80000000000000000000000000000000000000000000000000000000000000028412155b1561405957606485029450600284039350613ff4565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085051580156140a957507f80000000000000000000000000000000000000000000000000000000000000018412155b156140bb57600a850294506001840393505b600a808602908105861480156140f157507f80000000000000000000000000000000000000000000000000000000000000018512155b15614100578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f808515841517818712828612181785841417801561415557868592509250506123dd565b505f85841315614169575092949193919260015b8386035f8112604c821317801561419c57821561418e575f89945094505050506123dd565b885f945094505050506123dd565b600a82900a8981028a8282816141b4576141b46149b0565b05146141e05784156141d0575f8b9650965050505050506123dd565b8a5f9650965050505050506123dd565b84156141f55788965094506123dd9350505050565b95508794506123dd9350505050565b60605f82126142215760405180602001604052805f815250614258565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b61426960ff84901d80850118614290565b60405160200161427a929190614df4565b6040516020818303038152906040529050919050565b60605f61429c8361449f565b60010190505f8167ffffffffffffffff8111156142bb576142bb614891565b6040519080825280601f01601f1916602001820160405280156142e5576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846142ef57509392505050565b5f5b5f82600186515f1a1b1611838510161561436d5760018401935061434e565b509192915050565b81515f90819065200000000000600191831a9190911b161515838510168085019082806143a28488614580565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156143dd575093505f92506106ad915050565b825f03614440577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111614411575f614433565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b955093506106ad92505050565b7f8000000000000000000000000000000000000000000000000000000000000000811161446d575f61448f565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106144e7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310614513576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061453157662386f26fc10000830492506010015b6305f5e1008310614549576305f5e100830492506008015b612710831061455d57612710830492506004015b6064831061456f576064830492506002015b600a83106106845760010192915050565b5f808284106145b357507f34bd20690000000000000000000000000000000000000000000000000000000090505f6106ad565b835f036145ec576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b8782101580156146245750604d83105b1561466757815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a8590030201614614565b87821061478d5781515f1a84900360018111156146af57507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b600a84900a81028281018311156146f257507f0fdc26350000000000000000000000000000000000000000000000000000000096505f95506106ad945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b87821061478d5781515f1a6030811461476257507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091019061471e565b5f9890975095505050505050565b5f602082840312156147ab575f80fd5b5035919050565b5f80604083850312156147c3575f80fd5b50508035926020909101359150565b803560ff81168114613c63575f80fd5b5f80604083850312156147f3575f80fd5b82359150614803602084016147d2565b90509250929050565b5f806040838503121561481d575f80fd5b8235915060208301358015158114614833575f80fd5b809150509250929050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f602082840312156148ce575f80fd5b813567ffffffffffffffff808211156148e5575f80fd5b818401915084601f8301126148f8575f80fd5b81358181111561490a5761490a614891565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561495057614950614891565b81604052828152876020848701011115614968575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215614999575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181035f831280158383131683831282161715614a2957614a296149dd565b5092915050565b8082018281125f831280158216821582161715614a4f57614a4f6149dd565b505092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615614a8e57614a8e6149dd565b8181058314821517610684576106846149dd565b600181815b80851115614afb57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614ae157614ae16149dd565b80851615614aee57918102915b93841c9390800290614aa7565b509250929050565b5f82614b1157506001610684565b81614b1d57505f610684565b8160018114614b335760028114614b3d57614b59565b6001915050610684565b60ff841115614b4e57614b4e6149dd565b50506001821b610684565b5060208310610133831016604e8410600b8410161715614b7c575081810a610684565b614b868383614aa2565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614bb857614bb86149dd565b029392505050565b5f6106958383614b03565b5f82614bd957614bd96149b0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614c2d57614c2d6149dd565b500590565b5f82614c4057614c406149b0565b500790565b5f7f80000000000000000000000000000000000000000000000000000000000000008203613c5957613c596149dd565b5f82614c8357614c836149b0565b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614cb857614cb86149dd565b5060010190565b5f81518060208401855e5f93019283525090919050565b5f614ce18284614cbf565b7f300000000000000000000000000000000000000000000000000000000000000081526001019392505050565b7f2e0000000000000000000000000000000000000000000000000000000000000081525f614d48614d426001840186614cbf565b84614cbf565b949350505050565b7f650000000000000000000000000000000000000000000000000000000000000081525f6106956001830184614cbf565b5f610a29614d42614d9b614d95858a614cbf565b88614cbf565b86614cbf565b81810381811115610684576106846149dd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b80820180821115610684576106846149dd565b5f614d48614d428386614cbf565b8082028115828204841417610684576106846149dd56" + "object": "0x6080604052348015600e575f80fd5b5060156019565b60b8565b73c51a14251b0dcf0ae24a96b7153991378938f5f53f7f2573004ac3a9ee7fc8d73654d76386f1b6b99e34cdf86a689c4691e47143420f811460b557604051630912d0ff60e31b815273c51a14251b0dcf0ae24a96b7153991378938f5f560048201527f2573004ac3a9ee7fc8d73654d76386f1b6b99e34cdf86a689c4691e47143420f60248201526044810182905260640160405180910390fd5b50565b615112806100c55f395ff3fe608060405234801561000f575f80fd5b50600436106102b7575f3560e01c806381f7e2f511610171578063cde72ef3116100d2578063dd64691711610088578063e5526ecd1161006e578063e5526ecd1461065b578063e75f991f1461066e578063ffae15ba14610681575f80fd5b8063dd64691714610635578063e0db588814610648575f80fd5b8063d1de592a116100b8578063d1de592a146105e8578063d35273a7146105fb578063d3d6ffa814610622575f80fd5b8063cde72ef3146105af578063d102b4d3146105d5575f80fd5b8063a19684b711610127578063bc1b392d1161010d578063bc1b392d14610538578063bc62d8d81461053e578063cb09682b14610589575f80fd5b8063a19684b7146104ff578063a90d041a14610525575f80fd5b806396ce1ec71161015757806396ce1ec7146104b55780639b4afd99146104c8578063a100a3d9146104ec575f80fd5b806381f7e2f51461048f5780638dc29807146104a2575f80fd5b8063371493ce1161021b5780635ca0e7a4116101d1578063719cd99d116101b7578063719cd99d1461045657806373bfb2831461046957806381a822721461047c575f80fd5b80635ca0e7a41461041d578063602c35fc14610430575f80fd5b806341aa00801161020157806341aa0080146103e45780634eb7cd34146103f75780635b23771d1461040a575f80fd5b8063371493ce146103b15780633b3bd868146103d1575f80fd5b806325388350116102705780633004fa41116102565780633004fa4114610368578063302974001461037b5780633447c0301461038e575f80fd5b8063253883501461034257806328fa1f0114610355575f80fd5b80630b6429bc116102a05780630b6429bc146102f4578063146e82ad1461031c5780631ee62f111461032f575f80fd5b806304327dc5146102bb578063078b665b146102e1575b5f80fd5b6102ce6102c9366004614a65565b6106a7565b6040519081526020015b60405180910390f35b6102ce6102ef366004614a7c565b6106b7565b610307610302366004614aac565b6106c9565b604080519283529015156020830152016102d8565b6102ce61032a366004614a65565b6106e1565b6102ce61033d366004614a65565b610700565b6102ce610350366004614a65565b61071f565b6102ce610363366004614a65565b61073e565b6102ce610376366004614a7c565b610748565b6102ce610389366004614a7c565b610768565b6103a161039c366004614a7c565b610773565b60405190151581526020016102d8565b6103c46103bf366004614ad6565b61077e565b6040516102d89190614b08565b6102ce6103df366004614aac565b61078a565b6102ce6103f2366004614a7c565b610795565b6103a1610405366004614b5b565b6107a0565b6102ce610418366004614aac565b6107b6565b6102ce61042b366004614a65565b6107c1565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102ce565b6102ce610464366004614a65565b6107cb565b6103a1610477366004614a7c565b6107d5565b6102ce61048a366004614a65565b6107e0565b6103a161049d366004614a7c565b6107ea565b6103a16104b0366004614a7c565b6107f5565b6102ce6104c3366004614a7c565b610800565b6102ce7c090000000000000000000000000000000000000000000000000000000181565b6103c46104fa366004614a65565b61080b565b7f80000000000000000000000000000000000000000000000000000000000000016102ce565b6102ce610533366004614a7c565b610855565b5f6102ce565b61055161054c366004614bb7565b610860565b604080517fffffffff0000000000000000000000000000000000000000000000000000000090931683526020830191909152016102d8565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff6102ce565b7f7fffffff800000000000000000000000000000000000000000000000000000006102ce565b6103a16105e3366004614a7c565b610879565b6102ce6105f6366004614a7c565b610884565b6102ce7ffffffffc0000000000000000000000000000000000000000000000000000000181565b6102ce610630366004614a65565b61088f565b6103a1610643366004614a65565b610899565b6102ce610656366004614a65565b6108bf565b6103c4610669366004614c80565b6108c9565b61030761067c366004614aac565b610949565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc6102ce565b5f6106b182610955565b92915050565b5f6106c28383610997565b9392505050565b5f806106d584846109b3565b915091505b9250929050565b5f6106b18273c51a14251b0dcf0ae24a96b7153991378938f5f56109f4565b5f6106b18273c51a14251b0dcf0ae24a96b7153991378938f5f5610a20565b5f6106b18273c51a14251b0dcf0ae24a96b7153991378938f5f5610a6d565b5f6106b182610aa0565b5f6106c2838373c51a14251b0dcf0ae24a96b7153991378938f5f5610ae1565b5f6106c28383610d3b565b5f6106c28383610d9d565b60606106c28383610deb565b5f6106c28383610e7e565b5f6106c28383610e99565b5f6107ad85858585610ede565b95945050505050565b5f6106c28383610f24565b5f6106b182610f57565b5f6106b18261100d565b5f6106c283836110b9565b5f6106b1826110fc565b5f6106c28383611141565b5f6106c28383611184565b5f6106c283836111c7565b60606106b1827ffffffffc000000000000000000000000000000000000000000000000000000017c09000000000000000000000000000000000000000000000000000000016108c9565b5f6106c2838361120c565b5f805f8061086d85611217565b90969095509350505050565b5f6106c28383611305565b5f6106c28383611348565b5f6106b18261138d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216156106b1565b5f6106b1826113bf565b60606108d58383611305565b61091a576040517f3be5bf9400000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044015b60405180910390fd5b5f610924856110fc565b90506107ad856109348387611305565b8061094457506109448386611184565b610deb565b5f806106d58484611400565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d6109878282611440565b90925090505f6107ad838361148e565b5f6109a28383611184565b6109ac57816106c2565b5090919050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6109e78282876114f4565b9350935050509250929050565b5f6106c2837fffffffff0000000000000000000000000000000000000000000000000000000584610ae1565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a538483836116fe565b90925090505f610a63838361148e565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a5384838361186f565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82610ad38383611ba4565b9150505f610a63828461148e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516610b1e5750600191506106c29050565b5f8213610bb757815f03610b7b57610b36855f611305565b15610b70576040517f8be8297200000000000000000000000000000000000000000000000000000000815260048101869052602401610911565b505f91506106c29050565b6040517fcceba0f10000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610911565b610bc2856001610d9d565b8015610bd35750610bd3865f611184565b15610be25785925050506106c2565b610bec855f611305565b15610c1557610c0c610bfd87610955565b610c068761138d565b86610ae1565b925050506106c2565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80610c488484611ba4565b915091505f610c5883855f611c0c565b905060015f8080610c8f8f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510610cd65784600116600103610cb957610cb384848484611d23565b90945092505b600185901c9450610ccc82828484611d23565b9092509050610c94565b5f80610ce38f8e8e61186f565b91509150610cf382828a8d611d23565b9092509050610d038f83836116fe565b9092509050610d1482828888611d23565b90925090505f610d24838361148e565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d8086868686611e42565b915091505f610d8f838361148e565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de084848484612466565b979650505050505050565b60607bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d5f829003610e5b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250925050506106b1565b8315610e7457610e6b828261247d565b925050506106b1565b6107ad82826127ba565b5f805f610e8b8585612fe4565b915091506107ad8282613046565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d8086868686613098565b5f610ee985856130c2565b5f80610ef5858561318e565b915091505f80610f07898989896131e5565b91509150610f178484848461327f565b9998505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d6107ad82828661329b565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610f8e57509192915050565b5f80610f9a8484611ba4565b915091505f84128015610fac57508015155b1561100257610ffd82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613098565b935091505b5f610de0838561148e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82811261104457509192915050565b5f806110508484611ba4565b91509150805f03611065575093949350505050565b5f81131561100257610ffd82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb46132f7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de084848484613427565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82821215611136576109878282613443565b5f6107ad838361148e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de08484848461327f565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de0848484846134e6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d8086868686611d23565b5f6109a28383611305565b80515f908190602084810191850101828080806112348686613501565b929650909450925090507fffffffff0000000000000000000000000000000000000000000000000000000084165f036112f6578483036112c6575f8061127a84846139a0565b91509150806112b557507f32b8b8be000000000000000000000000000000000000000000000000000000009a5f9a5098505050505050505050565b505f9a909950975050505050505050565b507fad384e8700000000000000000000000000000000000000000000000000000000985f98509650505050505050565b5091975f975095505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de084848484613aa6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d80868686866132f7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d6109878282613443565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d826113f28383611ba4565b5090505f610a63828461148e565b5f805f805f61140f8787613ac1565b9250925092505f8061142185856139a0565b91509150818380156114305750815b9650965050505050509250929050565b5f806106d57f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686611e42565b5f805f61149b85856139a0565b91509150801580156114ab575081155b156114ec576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610911565b509392505050565b5f805f85121561153a576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610911565b845f0361154c57505f905060016116f6565b8460ff8416850185811215611597576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610911565b5f805f831215611601577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb38312156115d8575f8095509550505050506116f6565b825f03600a0a91508184816115ef576115ef614ca9565b04955050840290911491506116f69050565b5f8313156116eb57604d831315611657576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610911565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8161168c5761168c614ca9565b048411156116d9576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610911565b50919091029250600191506116f69050565b509193506001925050505b935093915050565b5f805f84121561173a576117128484613443565b90945092506117228585856116fe565b90945092506117318484611440565b915091506116f6565b5f806117468686611ba4565b9092509050845f80806117598585613b1d565b9194509250905061270d612710611771600182614d03565b8514611788576117828d8686613c0c565b90925090505b8315611813575f61179a866001614d29565b90505b8084858302816117af576117af614ca9565b05146117c657600a84059350600a8805975061179d565b6118076117d38588614d50565b896117de8785614d50565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc613cc5565b909d509b5061183a9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b50505050508661184b84835f611c0c565b611856886001614d29565b6118609190614d29565b94509450505050935093915050565b5f80838361187d8282613d62565b90965094505f86136118fe57855f036118c2576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610911565b5050837f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000000361193c5761193283604c614d29565b5f915091506116f6565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000008412158061198b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb56119ad565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412611b68575f805f805f856119c657604b6119c9565b604c5b6119d3908a614d29565b90505f8087611a00577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000611a21565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c81611a5357611a53614ca9565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050611a8c8c82613db8565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414611b18576123278114611af357611ace8c82600101613db8565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002611b15565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50611b48838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613cc5565b909a509850611b598a8a835f6132f7565b975097505050505050506116f6565b611b728585611440565b9095509350611b8286868661186f565b9095509350611b918585613443565b92509250506116f6565b50935093915050565b5f805f8312611bb757508290505f6106da565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4831215611be957505f9050826106da565b5f839003600a0a808581611bff57611bff614ca9565b0794859003959350505050565b5f818303611c1b5750826106c2565b82821315611c5e57828203604c811380611c3557505f8113155b15611c43575f9150506106c2565b80600a0a8581611c5557611c55614ca9565b059150506106c2565b818303604c811380611c7057505f8113155b15611cb8576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260448101849052606401610911565b600a81900a85810286828281611cd057611cd0614ca9565b0514611d19576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101869052606401610911565b92506106c2915050565b5f8085158415178015611d3b575f92505f9150611e38565b611d458487614d29565b91505f611d5188613e3f565b90505f611d5d87613e3f565b90505f611d6a8383613ea5565b5090505f6f0785ee10d5da46d900f436a000000000821115611d9f576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115611dc057670de0b6b3a7640000820491506012015b633b9aca00821115611dd957633b9aca00820491506009015b612710821115611dee57612710820491506004015b8115611e0257600a82049150600101611dee565b611e0c8187614d29565b9550611e2e8b8a611e288787611e2387600a614eb9565b613ee0565b89613fc5565b9097509550505050505b5094509492505050565b5f80835f03611e87576040517f7a97930f0000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610911565b855f03611e9857505f90508061245d565b5f805f80611ea68a8a6140cc565b919b5099509150611eb788886140cc565b919950975090505f611ec88b613e3f565b90505f611ed48a613e3f565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c818310156122f1578415611f3257507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b6122b0565b6f4b3b4ca85a86c47a098a22400000000083101561205e57678ac7230489e80000831015611fc2576402540be400831015611f9057620186a0831015611f805750620186a090506005612239565b506402540be4009050600a612239565b655af3107a4000831015611faf5750655af3107a40009050600e612239565b50678ac7230489e8000090506013612239565b6b204fce5e3e250261100000008310156120145769152d02c7e14af6800000831015611ffd575069152d02c7e14af680000090506017612239565b506b204fce5e3e250261100000009050601c612239565b6d314dc6448d9338c15b0a0000000083101561204357506d314dc6448d9338c15b0a0000000090506021612239565b506f4b3b4ca85a86c47a098a22400000000090506026612239565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156121565773af298d050e4395d69670b12b7f410000000000008310156120f1577172cb5bd86321e38cb6ce6682e800000000008310156120d257507172cb5bd86321e38cb6ce6682e800000000009050602b612239565b5073af298d050e4395d69670b12b7f4100000000000090506030612239565b76010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000831015612132575076010b46c6cdd6e3e0828f4db456ff0c8ea000000000000090506035612239565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a612239565b7c03b58e88c75313ec9d329eaaa18fb92f75215b171000000000000000008310156121ec577a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000008310156121c457507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f612239565b507c03b58e88c75313ec9d329eaaa18fb92f75215b1710000000000000000090506044612239565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca00000000000000000083101561223957507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b81831161226d57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01612239565b815f036122b0576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c9052604401610911565b856122f1576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e9052604401610911565b807f8000000000000000000000000000000000000000000000000000000000000000018d1261232457808d039c50612397565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f81131561239757807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b1361238457998a0199612397565b5f8099509950505050505050505061245d565b5f808e1280156123a657505f8c135b156123e3577f80000000000000000000000000000000000000000000000000000000000000008e01808d136123db575f6123df565b808d035b9150505b8b818f010397506124008f8e6123fa888789613ee0565b8b613fc5565b90995097505f81131561244a57604c81131561242a575f809a509a5050505050505050505061245d565b80600a0a898161243c5761243c614ca9565b059850885f0361244a575f97505b5096985094965061245d95505050505050565b94509492505050565b5f6124738585858561436d565b1495945050505050565b60608161248a8482613d62565b90945092505f806124bb7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000087614ec4565b156124eb57507f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000009050604c612512565b507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b5b5f61251d8388614ec4565b90505f61252a8489614f2b565b90505f808312156125445750600161254183614f3e565b92505b5f82121561255b5750600161255882614f3e565b91505b60408051602081019091525f81528215612664575f8061257c600a89614f6e565b90505b6125898186614ec4565b5f036125ae5761259a600a82614f6e565b9050816125a681614f81565b92505061257f565b60408051602081019091525f8082525b8381101561260f57816040516020016125d79190614fcf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905291506001016125be565b505b61261c600a87614f2b565b5f036126345761262d600a87614ec4565b9550612611565b8061263e87614441565b60405160200161264f929190615007565b60405160208183030381529060405293505050505b5f61266e85614441565b90505f61267b878c614d29565b9050637fffffff8113806126ae57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000081125b156126e8576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018a9052602401610911565b5f811561271c576126f882614441565b6040516020016127089190615049565b60405160208183030381529060405261272c565b60405180602001604052805f8152505b90505f856127485760405180602001604052805f81525061277f565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b905080848684604051602001612798949392919061507a565b6040516020818303038152906040529b50505050505050505050505092915050565b60606103e88213806127d557506127d26103e8614f3e565b82125b1561280f576040517fe44c72b000000000000000000000000000000000000000000000000000000000815260048101839052602401610911565b5f80841290811561282a5761282385614f3e565b905061282d565b50835b5f8413156128f0578360448110612873576040517fe44c72b000000000000000000000000000000000000000000000000000000000815260048101869052602401610911565b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5b828110156128af576128a5600a83614f6e565b9150600101612892565b50808311156128ed576040517fe44c72b000000000000000000000000000000000000000000000000000000000815260048101879052602401610911565b50505b5f6128fa826144cd565b80519091505f5b818110801561297d5750828161291860018561509a565b612922919061509a565b81518110612932576129326150ad565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f3000000000000000000000000000000000000000000000000000000000000000145b15612994578061298c81614f81565b915050612901565b5f61299f828461509a565b90505f6129ac838a614d29565b90505f876129c85760405180602001604052805f8152506129ff565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90505f8212612b7957815f612a1482866150da565b67ffffffffffffffff811115612a2c57612a2c614b8a565b6040519080825280601f01601f191660200182016040528015612a56576020820181803683370190505b5090505f5b85811015612ac857888181518110612a7557612a756150ad565b602001015160f81c60f81b828281518110612a9257612a926150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a5b565b505f5b82811015612b45577f300000000000000000000000000000000000000000000000000000000000000082612aff83896150da565b81518110612b0f57612b0f6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612acb565b508281604051602001612b599291906150ed565b6040516020818303038152906040529a50505050505050505050506106b1565b5f612b8383614f3e565b905080841115612d9a575f612b98828661509a565b90505f612ba68660016150da565b67ffffffffffffffff811115612bbe57612bbe614b8a565b6040519080825280601f01601f191660200182016040528015612be8576020820181803683370190505b5090505f5b82811015612c5a57898181518110612c0757612c076150ad565b602001015160f81c60f81b828281518110612c2457612c246150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612bed565b507f2e00000000000000000000000000000000000000000000000000000000000000818381518110612c8e57612c8e6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b83811015612d655789612cd182856150da565b81518110612ce157612ce16150ad565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612d158660016150da565b612d1f91906150da565b81518110612d2f57612d2f6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612cbe565b508381604051602001612d799291906150ed565b6040516020818303038152906040529b5050505050505050505050506106b1565b5f612da5858361509a565b90505f85612db48360026150da565b612dbe91906150da565b67ffffffffffffffff811115612dd657612dd6614b8a565b6040519080825280601f01601f191660200182016040528015612e00576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110612e3657612e366150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f2e0000000000000000000000000000000000000000000000000000000000000081600181518110612e9857612e986150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b82811015612f43577f300000000000000000000000000000000000000000000000000000000000000082612efd8360026150da565b81518110612f0d57612f0d6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612ec8565b505f5b86811015612d6557898181518110612f6057612f606150ad565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612f948660026150da565b612f9e91906150da565b81518110612fae57612fae6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612f46565b5f805f805f612ff38787613ac1565b9250925092508061303a576040517fc47179660000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610911565b50909590945092505050565b5f805f61305385856139a0565b91509150806114ec576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610911565b5f806130a48484613443565b90945092506130b5868686866132f7565b9150915094509492505050565b5f6130cd5f80613046565b90506130d98382611305565b806130e957506130e98282611305565b1561312a576040517fbd559d600000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610911565b6131348382611184565b15801561314857506131468282611184565b155b15613189576040517fe9b2d4420000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610911565b505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b90810b9160e087811d9291871690910b9086901d84806131d484848888613098565b909b909a5098505050505050505050565b5f805f805f806131f58888614589565b90925090507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8916601b0b60e08a901d61322d82828686611d23565b90965094505050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8916601b0b905060e089901d5f8061326c848488886145db565b909d909c509a5050505050505050505050565b5f805f61328e8787878761436d565b1215979650505050505050565b5f805f6132a98686866114f4565b91509150806132ee576040517f05e476780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610911565b50949350505050565b5f808515841517801561332357865f03613317578484925092505061245d565b8686925092505061245d565b61332d8787613d62565b909750955061333c8585613d62565b909550935085841315613350579395929492935b838603604c81111561336957878793509350505061245d565b80600a0a868161337b5761337b614ca9565b0595505086850180881860ff90811c151589881890911c1516801561341657877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036133fd576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a905260248101899052604401610911565b600a96879005969098058601976001979097019661341a565b8198505b5096979596505050505050565b5f805f6134368787878761436d565b1315979650505050505050565b5f807f800000000000000000000000000000000000000000000000000000000000000084036134dc577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83036134cf576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401610911565b600a840593508260010192505b50505f9190910391565b5f805f6134f58787878761436d565b12979650505050505050565b5f8281806135168386652000000000006145ff565b9250858314158361353081886703ff0000000000006145ff565b945080850361356a57507f34bd20690000000000000000000000000000000000000000000000000000000094505f92508291506139979050565b5f806135768a88614628565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156135b4575095505f9350839250613997915050565b86519095506540000000000060015f9290921a9190911b16151588871016915050801561384357506001909301925f846135f781896703ff0000000000006145ff565b955080860361363257507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f9350839250613997915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b6601000000000000161515166001036136a1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613634565b8181146136f8575f806136b48484614628565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156136f4575097505f95508594506139979350505050565b9350505b5f83121561373357507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f945084935061399792505050565b831561373f57825f0392505b80820394505f85131561377f57507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f945084935061399792505050565b855f0361378e57829550613840565b5f85900360438111156137cf57507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f95508594506139979350505050565b600a0a8681025f888383816137e6576137e6614ca9565b0514159050601b82900b82141581806137fc5750805b1561383857507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f98508897506139979650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b1615158786101680156139885760019095019485613883818a652000000000006145ff565b965086613899818b6703ff0000000000006145ff565b97508088036138d657507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f95508594506139979350505050565b505f806138e3838a614628565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613923575097505f95508594506139979350505050565b9250508482015f8313801561393757508581125b8061394b57505f8312801561394b57508581135b1561398457507fd556b1110000000000000000000000000000000000000000000000000000000097505f95508594506139979350505050565b9450505b845f03613993575f93505b5050505b92959194509250565b5f601b83900b8314838382613a04577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156139e457620186a0860595506005850194505b8586601b0b146139ff57600a860595508460010194506139e4565b613a1a565b855f03613a1a57505f9250600191506106da9050565b848560030b14613a76575f851215613a3a57505f92508291506106da9050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610911565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f613ab58787878761436d565b13979650505050505050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115613b0c57600a860460018201600a88065f1493509350935050613b16565b8593509150600190505b9250925092565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc03613b5557508391505f90506001613b16565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc841215613be3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0841215613bb457505f9150508215156001613b16565b5f846004015f03600a0a90505f818781613bd057613bd0614ca9565b0594505080840286141592509050613b16565b5f8412613bf857505f91508190506001613b16565b50505060048101600a0a82025f6001613b16565b5f80806064613c1e600a612328614f6e565b613c2b600a612328614f6e565b613c369060026150fb565b613c419060016150da565b613c4b91906150da565b613c5591906150da565b9050613c99565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b613ca4858288613c5c565b92508315611b9b57613cba600186018288613c5c565b915050935093915050565b5f80888803613cd8575083905081613d56565b5f805f80613ce88c8b8f8d613098565b915091505f80613cfa8a8a8d8c613098565b91509150613d0a84848484611d23565b8096508197505050505050505f80613d248b8b8f8d613098565b915091505f80613d3686868686611e42565b915091505f80613d4884848f8e6132f7565b909a50985050505050505050505b97509795505050505050565b5f805f805f613d7187876140cc565b9250925092508061303a576040517f05e51ecb0000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610911565b5f80613dc7600a612328614f6e565b613dd29060026150fb565b613ddd9060016150da565b90505f613ded600a612328614f6e565b90506002600a8504026001015f8052600281601e883c505f51617fff81169350618000811615613e1c57918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f80821215613e9c577f80000000000000000000000000000000000000000000000000000000000000008203613e9657507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b919050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f613eed8686613ea5565b91509150815f03613f1157838181613f0757613f07614ca9565b04925050506106c2565b838210613f5b576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610911565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f858718121561408f577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84111561407c576140247f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60016150da565b840361405457507f800000000000000000000000000000000000000000000000000000000000000090508161245d565b61405f600a85614f6e565b61406890614f3e565b614073846001614d29565b9150915061245d565b61408584614f3e565b839150915061245d565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8411156140c257614068600a85614f6e565b508290508161245d565b5f805f845f036140e457505f91508190506001613b16565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f036142f8576f4b3b4ca85a86c47a098a224000000000850515801561414d57507f80000000000000000000000000000000000000000000000000000000000000268412155b1561416e576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a0000000000000085051580156141b657507f80000000000000000000000000000000000000000000000000000000000000138412155b156141cf57678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000850515801561421b57507f800000000000000000000000000000000000000000000000000000000000000a8412155b15614231576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000850515801561428057507f80000000000000000000000000000000000000000000000000000000000000028412155b1561429657606485029450600284039350614231565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085051580156142e657507f80000000000000000000000000000000000000000000000000000000000000018412155b156142f857600a850294506001840393505b600a8086029081058614801561432e57507f80000000000000000000000000000000000000000000000000000000000000018512155b1561433d578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f8085158415178187128286121817858414178015614392578685925092505061245d565b505f858413156143a6575092949193919260015b8386035f8112604c82131780156143d95782156143cb575f899450945050505061245d565b885f9450945050505061245d565b600a82900a8981028a8282816143f1576143f1614ca9565b051461441d57841561440d575f8b96509650505050505061245d565b8a5f96509650505050505061245d565b841561443257889650945061245d9350505050565b955087945061245d9350505050565b60605f821261445e5760405180602001604052805f815250614495565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b6144a660ff84901d808501186144cd565b6040516020016144b79291906150ed565b6040516020818303038152906040529050919050565b60605f6144d983614752565b60010190505f8167ffffffffffffffff8111156144f8576144f8614b8a565b6040519080825280601f01601f191660200182016040528015614522576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461452c57509392505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b90810b9160e087811d9291871690910b9086901d84806131d46145cf87614833565b866145d987614833565b865b5f806145e98686868661327f565b6145f45785856130b5565b509194909350915050565b5f5b5f82600186515f1a1b1611838510161561462057600184019350614601565b509192915050565b81515f90819065200000000000600191831a9190911b16151583851016808501908280614655848861484a565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615614690575093505f92506106da915050565b825f036146f3577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81116146c4575f6146e6565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b955093506106da92505050565b7f80000000000000000000000000000000000000000000000000000000000000008111614720575f614742565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061479a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106147c6576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106147e457662386f26fc10000830492506010015b6305f5e10083106147fc576305f5e100830492506008015b612710831061481057612710830492506004015b60648310614822576064830492506002015b600a83106106b15760010192915050565b5f80821261484157816106b1565b6106b182614f3e565b5f8082841061487d57507f34bd20690000000000000000000000000000000000000000000000000000000090505f6106da565b835f036148b6576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b8782101580156148ee5750604d83105b1561493157815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a85900302016148de565b878210614a575781515f1a849003600181111561497957507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106da9350505050565b600a84900a81028281018311156149bc57507f0fdc26350000000000000000000000000000000000000000000000000000000096505f95506106da945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b878210614a575781515f1a60308114614a2c57507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106da9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101906149e8565b5f9890975095505050505050565b5f60208284031215614a75575f80fd5b5035919050565b5f8060408385031215614a8d575f80fd5b50508035926020909101359150565b803560ff81168114613ea0575f80fd5b5f8060408385031215614abd575f80fd5b82359150614acd60208401614a9c565b90509250929050565b5f8060408385031215614ae7575f80fd5b8235915060208301358015158114614afd575f80fd5b809150509250929050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f805f8060808587031215614b6e575f80fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215614bc7575f80fd5b813567ffffffffffffffff80821115614bde575f80fd5b818401915084601f830112614bf1575f80fd5b813581811115614c0357614c03614b8a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715614c4957614c49614b8a565b81604052828152876020848701011115614c61575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215614c92575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181035f831280158383131683831282161715614d2257614d22614cd6565b5092915050565b8082018281125f831280158216821582161715614d4857614d48614cd6565b505092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615614d8757614d87614cd6565b81810583148215176106b1576106b1614cd6565b600181815b80851115614df457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614dda57614dda614cd6565b80851615614de757918102915b93841c9390800290614da0565b509250929050565b5f82614e0a575060016106b1565b81614e1657505f6106b1565b8160018114614e2c5760028114614e3657614e52565b60019150506106b1565b60ff841115614e4757614e47614cd6565b50506001821b6106b1565b5060208310610133831016604e8410600b8410161715614e75575081810a6106b1565b614e7f8383614d9b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614eb157614eb1614cd6565b029392505050565b5f6106c28383614dfc565b5f82614ed257614ed2614ca9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614f2657614f26614cd6565b500590565b5f82614f3957614f39614ca9565b500790565b5f7f80000000000000000000000000000000000000000000000000000000000000008203613e9657613e96614cd6565b5f82614f7c57614f7c614ca9565b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614fb157614fb1614cd6565b5060010190565b5f81518060208401855e5f93019283525090919050565b5f614fda8284614fb8565b7f300000000000000000000000000000000000000000000000000000000000000081526001019392505050565b7f2e0000000000000000000000000000000000000000000000000000000000000081525f61504161503b6001840186614fb8565b84614fb8565b949350505050565b7f650000000000000000000000000000000000000000000000000000000000000081525f6106c26001830184614fb8565b5f610a6361503b61509461508e858a614fb8565b88614fb8565b86614fb8565b818103818111156106b1576106b1614cd6565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b808201808211156106b1576106b1614cd6565b5f61504161503b8386614fb8565b80820281158282048414176106b1576106b1614cd656" }, "deployedBytecode": { - "object": "0x608060405234801561000f575f80fd5b506004361061029d575f3560e01c806381f7e2f511610171578063cde72ef3116100d2578063dd64691711610088578063e5526ecd1161006e578063e5526ecd1461062e578063e75f991f14610641578063ffae15ba14610654575f80fd5b8063dd64691714610608578063e0db58881461061b575f80fd5b8063d1de592a116100b8578063d1de592a146105bb578063d35273a7146105ce578063d3d6ffa8146105f5575f80fd5b8063cde72ef314610582578063d102b4d3146105a8575f80fd5b8063a19684b711610127578063bc1b392d1161010d578063bc1b392d1461050b578063bc62d8d814610511578063cb09682b1461055c575f80fd5b8063a19684b7146104d2578063a90d041a146104f8575f80fd5b806396ce1ec71161015757806396ce1ec7146104885780639b4afd991461049b578063a100a3d9146104bf575f80fd5b806381f7e2f5146104625780638dc2980714610475575f80fd5b80633447c0301161021b5780635ca0e7a4116101d1578063719cd99d116101b7578063719cd99d1461042957806373bfb2831461043c57806381a822721461044f575f80fd5b80635ca0e7a4146103f0578063602c35fc14610403575f80fd5b80633b3bd868116102015780633b3bd868146103b757806341aa0080146103ca5780635b23771d146103dd575f80fd5b80633447c03014610374578063371493ce14610397575f80fd5b80631ee62f111161027057806328fa1f011161025657806328fa1f011461033b5780633004fa411461034e5780633029740014610361575f80fd5b80631ee62f11146103155780632538835014610328575f80fd5b806304327dc5146102a1578063078b665b146102c75780630b6429bc146102da578063146e82ad14610302575b5f80fd5b6102b46102af36600461479b565b61067a565b6040519081526020015b60405180910390f35b6102b46102d53660046147b2565b61068a565b6102ed6102e83660046147e2565b61069c565b604080519283529015156020830152016102be565b6102b461031036600461479b565b6106b4565b6102b461032336600461479b565b6106d3565b6102b461033636600461479b565b6106f2565b6102b461034936600461479b565b610711565b6102b461035c3660046147b2565b61071b565b6102b461036f3660046147b2565b61073b565b6103876103823660046147b2565b610746565b60405190151581526020016102be565b6103aa6103a536600461480c565b610751565b6040516102be919061483e565b6102b46103c53660046147e2565b61075d565b6102b46103d83660046147b2565b610768565b6102b46103eb3660046147e2565b610773565b6102b46103fe36600461479b565b61077e565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b6102b461043736600461479b565b610788565b61038761044a3660046147b2565b610792565b6102b461045d36600461479b565b61079d565b6103876104703660046147b2565b6107a7565b6103876104833660046147b2565b6107b2565b6102b46104963660046147b2565b6107bd565b6102b47c090000000000000000000000000000000000000000000000000000000181565b6103aa6104cd36600461479b565b6107c8565b7f80000000000000000000000000000000000000000000000000000000000000016102b4565b6102b46105063660046147b2565b610812565b5f6102b4565b61052461051f3660046148be565b61081d565b604080517fffffffff0000000000000000000000000000000000000000000000000000000090931683526020830191909152016102be565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b7f7fffffff800000000000000000000000000000000000000000000000000000006102b4565b6103876105b63660046147b2565b610836565b6102b46105c93660046147b2565b610841565b6102b47ffffffffc0000000000000000000000000000000000000000000000000000000181565b6102b461060336600461479b565b61084c565b61038761061636600461479b565b610856565b6102b461062936600461479b565b61087c565b6103aa61063c366004614987565b610886565b6102ed61064f3660046147e2565b61090f565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc6102b4565b5f6106848261091b565b92915050565b5f610695838361095d565b9392505050565b5f806106a88484610979565b915091505b9250929050565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109ba565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109e6565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f5610a33565b5f61068482610a66565b5f610695838373c51a14251b0dcf0ae24a96b7153991378938f5f5610aa7565b5f6106958383610d01565b5f6106958383610d63565b60606106958383610db1565b5f6106958383610e44565b5f6106958383610e5f565b5f6106958383610ea4565b5f61068482610ed7565b5f61068482610f8d565b5f6106958383611039565b5f6106848261107c565b5f61069583836110c1565b5f6106958383611104565b5f6106958383611147565b6060610684827ffffffffc000000000000000000000000000000000000000000000000000000017c0900000000000000000000000000000000000000000000000000000001610886565b5f610695838361118c565b5f805f8061082a85611197565b90969095509350505050565b5f6106958383611285565b5f61069583836112c8565b5f6106848261130d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821615610684565b5f6106848261133f565b60606108928383611285565b6108d7576040517f3be5bf9400000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044015b60405180910390fd5b5f6108e18561107c565b9050610906856108f18387611285565b8061090157506109018386611104565b610db1565b95945050505050565b5f806106a88484611380565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826113c0565b90925090505f610906838361140e565b5f6109688383611104565b6109725781610695565b5090919050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6109ad828287611474565b9350935050509250929050565b5f610695837fffffffff0000000000000000000000000000000000000000000000000000000584610aa7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a1984838361167e565b90925090505f610a29838361140e565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a198483836117ef565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82610a998383611b24565b9150505f610a29828461140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516610ae45750600191506106959050565b5f8213610b7d57815f03610b4157610afc855f611285565b15610b36576040517f8be82972000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b505f91506106959050565b6040517fcceba0f100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b610b88856001610d63565b8015610b995750610b99865f611104565b15610ba8578592505050610695565b610bb2855f611285565b15610bdb57610bd2610bc38761091b565b610bcc8761130d565b86610aa7565b92505050610695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80610c0e8484611b24565b915091505f610c1e83855f611b8c565b905060015f8080610c558f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510610c9c5784600116600103610c7f57610c7984848484611ca3565b90945092505b600185901c9450610c9282828484611ca3565b9092509050610c5a565b5f80610ca98f8e8e6117ef565b91509150610cb982828a8d611ca3565b9092509050610cc98f838361167e565b9092509050610cda82828888611ca3565b90925090505f610cea838361140e565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611dc2565b915091505f610d55838361140e565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846123e6565b979650505050505050565b60607bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d5f829003610e21576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525092505050610684565b8315610e3a57610e3182826123fd565b92505050610684565b610906828261273a565b5f805f610e518585612f64565b915091506109068282612fc6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686613018565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610906828286613042565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610f0e57509192915050565b5f80610f1a8484611b24565b915091505f84128015610f2c57508015155b15610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613018565b935091505b5f610da6838561140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610fc457509192915050565b5f80610fd08484611b24565b91509150805f03610fe5575093949350505050565b5f811315610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb461309e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846131ce565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828212156110b65761094d82826131ea565b5f610906838361140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da68484848461328d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846132a9565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611ca3565b5f6109688383611285565b80515f908190602084810191850101828080806111b486866132c4565b929650909450925090507fffffffff0000000000000000000000000000000000000000000000000000000084165f0361127657848303611246575f806111fa8484613763565b915091508061123557507f32b8b8be000000000000000000000000000000000000000000000000000000009a5f9a5098505050505050505050565b505f9a909950975050505050505050565b507fad384e8700000000000000000000000000000000000000000000000000000000985f98509650505050505050565b5091975f975095505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da684848484613869565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d468686868661309e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826131ea565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d826113728383611b24565b5090505f610a29828461140e565b5f805f805f61138f8787613884565b9250925092505f806113a18585613763565b91509150818380156113b05750815b9650965050505050509250929050565b5f806106a87f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686611dc2565b5f805f61141b8585613763565b915091508015801561142b575081155b1561146c576040517f8eba4d0700000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b509392505050565b5f805f8512156114ba576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b845f036114cc57505f90506001611676565b8460ff8416850185811215611517576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f805f831215611581577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3831215611558575f809550955050505050611676565b825f03600a0a915081848161156f5761156f6149b0565b04955050840290911491506116769050565b5f83131561166b57604d8313156115d7576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8161160c5761160c6149b0565b04841115611659576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b50919091029250600191506116769050565b509193506001925050505b935093915050565b5f805f8412156116ba5761169284846131ea565b90945092506116a285858561167e565b90945092506116b184846113c0565b91509150611676565b5f806116c68686611b24565b9092509050845f80806116d985856138e0565b9194509250905061270d6127106116f1600182614a0a565b8514611708576117028d86866139cf565b90925090505b8315611793575f61171a866001614a30565b90505b80848583028161172f5761172f6149b0565b051461174657600a84059350600a8805975061171d565b6117876117538588614a57565b8961175e8785614a57565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc613a88565b909d509b506117ba9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866117cb84835f611b8c565b6117d6886001614a30565b6117e09190614a30565b94509450505050935093915050565b5f8083836117fd8282613b25565b90965094505f861361187e57855f03611842576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b5050837f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000036118bc576118b283604c614a30565b5f91509150611676565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000008412158061190b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb561192d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412611ae8575f805f805f8561194657604b611949565b604c5b611953908a614a30565b90505f8087611980577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000006119a1565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c816119d3576119d36149b0565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050611a0c8c82613b7b565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414611a98576123278114611a7357611a4e8c82600101613b7b565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002611a95565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50611ac8838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613a88565b909a509850611ad98a8a835f61309e565b97509750505050505050611676565b611af285856113c0565b9095509350611b028686866117ef565b9095509350611b1185856131ea565b9250925050611676565b50935093915050565b5f805f8312611b3757508290505f6106ad565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4831215611b6957505f9050826106ad565b5f839003600a0a808581611b7f57611b7f6149b0565b0794859003959350505050565b5f818303611b9b575082610695565b82821315611bde57828203604c811380611bb557505f8113155b15611bc3575f915050610695565b80600a0a8581611bd557611bd56149b0565b05915050610695565b818303604c811380611bf057505f8113155b15611c38576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604481018490526064016108ce565b600a81900a85810286828281611c5057611c506149b0565b0514611c99576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604481018690526064016108ce565b9250610695915050565b5f8085158415178015611cbb575f92505f9150611db8565b611cc58487614a30565b91505f611cd188613c02565b90505f611cdd87613c02565b90505f611cea8383613c68565b5090505f6f0785ee10d5da46d900f436a000000000821115611d1f576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115611d4057670de0b6b3a7640000820491506012015b633b9aca00821115611d5957633b9aca00820491506009015b612710821115611d6e57612710820491506004015b8115611d8257600a82049150600101611d6e565b611d8c8187614a30565b9550611dae8b8a611da88787611da387600a614bc0565b613ca3565b89613d88565b9097509550505050505b5094509492505050565b5f80835f03611e07576040517f7a97930f00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b855f03611e1857505f9050806123dd565b5f805f80611e268a8a613e8f565b919b5099509150611e378888613e8f565b919950975090505f611e488b613c02565b90505f611e548a613c02565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c81831015612271578415611eb257507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b612230565b6f4b3b4ca85a86c47a098a224000000000831015611fde57678ac7230489e80000831015611f42576402540be400831015611f1057620186a0831015611f005750620186a0905060056121b9565b506402540be4009050600a6121b9565b655af3107a4000831015611f2f5750655af3107a40009050600e6121b9565b50678ac7230489e80000905060136121b9565b6b204fce5e3e25026110000000831015611f945769152d02c7e14af6800000831015611f7d575069152d02c7e14af6800000905060176121b9565b506b204fce5e3e250261100000009050601c6121b9565b6d314dc6448d9338c15b0a00000000831015611fc357506d314dc6448d9338c15b0a00000000905060216121b9565b506f4b3b4ca85a86c47a098a224000000000905060266121b9565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156120d65773af298d050e4395d69670b12b7f41000000000000831015612071577172cb5bd86321e38cb6ce6682e8000000000083101561205257507172cb5bd86321e38cb6ce6682e800000000009050602b6121b9565b5073af298d050e4395d69670b12b7f41000000000000905060306121b9565b76010b46c6cdd6e3e0828f4db456ff0c8ea00000000000008310156120b2575076010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000905060356121b9565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a6121b9565b7c03b58e88c75313ec9d329eaaa18fb92f75215b1710000000000000000083101561216c577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561214457507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f6121b9565b507c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000905060446121b9565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000008310156121b957507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b8183116121ed57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016121b9565b815f03612230576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c90526044016108ce565b85612271576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e90526044016108ce565b807f8000000000000000000000000000000000000000000000000000000000000000018d126122a457808d039c50612317565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f81131561231757807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b1361230457998a0199612317565b5f809950995050505050505050506123dd565b5f808e12801561232657505f8c135b15612363577f80000000000000000000000000000000000000000000000000000000000000008e01808d1361235b575f61235f565b808d035b9150505b8b818f010397506123808f8e61237a888789613ca3565b8b613d88565b90995097505f8113156123ca57604c8113156123aa575f809a509a505050505050505050506123dd565b80600a0a89816123bc576123bc6149b0565b059850885f036123ca575f97505b509698509496506123dd95505050505050565b94509492505050565b5f6123f385858585614130565b1495945050505050565b60608161240a8482613b25565b90945092505f8061243b7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000087614bcb565b1561246b57507f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000009050604c612492565b507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b5b5f61249d8388614bcb565b90505f6124aa8489614c32565b90505f808312156124c4575060016124c183614c45565b92505b5f8212156124db575060016124d882614c45565b91505b60408051602081019091525f815282156125e4575f806124fc600a89614c75565b90505b6125098186614bcb565b5f0361252e5761251a600a82614c75565b90508161252681614c88565b9250506124ff565b60408051602081019091525f8082525b8381101561258f57816040516020016125579190614cd6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052915060010161253e565b505b61259c600a87614c32565b5f036125b4576125ad600a87614bcb565b9550612591565b806125be87614204565b6040516020016125cf929190614d0e565b60405160208183030381529060405293505050505b5f6125ee85614204565b90505f6125fb878c614a30565b9050637fffffff81138061262e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000081125b15612668576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018a90526024016108ce565b5f811561269c5761267882614204565b6040516020016126889190614d50565b6040516020818303038152906040526126ac565b60405180602001604052805f8152505b90505f856126c85760405180602001604052805f8152506126ff565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b9050808486846040516020016127189493929190614d81565b6040516020818303038152906040529b50505050505050505050505092915050565b60606103e882138061275557506127526103e8614c45565b82125b1561278f576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018390526024016108ce565b5f8084129081156127aa576127a385614c45565b90506127ad565b50835b5f8413156128705783604481106127f3576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5b8281101561282f57612825600a83614c75565b9150600101612812565b508083111561286d576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018790526024016108ce565b50505b5f61287a82614290565b80519091505f5b81811080156128fd57508281612898600185614da1565b6128a29190614da1565b815181106128b2576128b2614db4565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f3000000000000000000000000000000000000000000000000000000000000000145b15612914578061290c81614c88565b915050612881565b5f61291f8284614da1565b90505f61292c838a614a30565b90505f876129485760405180602001604052805f81525061297f565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90505f8212612af957815f6129948286614de1565b67ffffffffffffffff8111156129ac576129ac614891565b6040519080825280601f01601f1916602001820160405280156129d6576020820181803683370190505b5090505f5b85811015612a48578881815181106129f5576129f5614db4565b602001015160f81c60f81b828281518110612a1257612a12614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506001016129db565b505f5b82811015612ac5577f300000000000000000000000000000000000000000000000000000000000000082612a7f8389614de1565b81518110612a8f57612a8f614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a4b565b508281604051602001612ad9929190614df4565b6040516020818303038152906040529a5050505050505050505050610684565b5f612b0383614c45565b905080841115612d1a575f612b188286614da1565b90505f612b26866001614de1565b67ffffffffffffffff811115612b3e57612b3e614891565b6040519080825280601f01601f191660200182016040528015612b68576020820181803683370190505b5090505f5b82811015612bda57898181518110612b8757612b87614db4565b602001015160f81c60f81b828281518110612ba457612ba4614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612b6d565b507f2e00000000000000000000000000000000000000000000000000000000000000818381518110612c0e57612c0e614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b83811015612ce55789612c518285614de1565b81518110612c6157612c61614db4565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612c95866001614de1565b612c9f9190614de1565b81518110612caf57612caf614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612c3e565b508381604051602001612cf9929190614df4565b6040516020818303038152906040529b505050505050505050505050610684565b5f612d258583614da1565b90505f85612d34836002614de1565b612d3e9190614de1565b67ffffffffffffffff811115612d5657612d56614891565b6040519080825280601f01601f191660200182016040528015612d80576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110612db657612db6614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f2e0000000000000000000000000000000000000000000000000000000000000081600181518110612e1857612e18614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b82811015612ec3577f300000000000000000000000000000000000000000000000000000000000000082612e7d836002614de1565b81518110612e8d57612e8d614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612e48565b505f5b86811015612ce557898181518110612ee057612ee0614db4565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612f14866002614de1565b612f1e9190614de1565b81518110612f2e57612f2e614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612ec6565b5f805f805f612f738787613884565b92509250925080612fba576040517fc471796600000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016108ce565b50909590945092505050565b5f805f612fd38585613763565b915091508061146c576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b5f8061302484846131ea565b90945092506130358686868661309e565b9150915094509492505050565b5f805f613050868686611474565b9150915080613095576040517f05e4767800000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b50949350505050565b5f80851584151780156130ca57865f036130be57848492509250506123dd565b868692509250506123dd565b6130d48787613b25565b90975095506130e38585613b25565b9095509350858413156130f7579395929492935b838603604c8111156131105787879350935050506123dd565b80600a0a8681613122576131226149b0565b0595505086850180881860ff90811c151589881890911c151680156131bd57877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036131a4576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a9052602481018990526044016108ce565b600a9687900596909805860197600197909701966131c1565b8198505b5096979596505050505050565b5f805f6131dd87878787614130565b1315979650505050505050565b5f807f80000000000000000000000000000000000000000000000000000000000000008403613283577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303613276576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101859052602481018490526044016108ce565b600a840593508260010192505b50505f9190910391565b5f805f61329c87878787614130565b1215979650505050505050565b5f805f6132b887878787614130565b12979650505050505050565b5f8281806132d983866520000000000061434c565b925085831415836132f381886703ff00000000000061434c565b945080850361332d57507f34bd20690000000000000000000000000000000000000000000000000000000094505f925082915061375a9050565b5f806133398a88614375565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613377575095505f935083925061375a915050565b86519095506540000000000060015f9290921a9190911b16151588871016915050801561360657506001909301925f846133ba81896703ff00000000000061434c565b95508086036133f557507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f935083925061375a915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613464577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016133f7565b8181146134bb575f806134778484614375565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156134b7575097505f955085945061375a9350505050565b9350505b5f8312156134f657507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f945084935061375a92505050565b831561350257825f0392505b80820394505f85131561354257507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f945084935061375a92505050565b855f0361355157829550613603565b5f859003604381111561359257507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b600a0a8681025f888383816135a9576135a96149b0565b0514159050601b82900b82141581806135bf5750805b156135fb57507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f985088975061375a9650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b16151587861016801561374b5760019095019485613646818a6520000000000061434c565b96508661365c818b6703ff00000000000061434c565b975080880361369957507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b505f806136a6838a614375565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156136e6575097505f955085945061375a9350505050565b9250508482015f831380156136fa57508581125b8061370e57505f8312801561370e57508581135b1561374757507fd556b1110000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b9450505b845f03613756575f93505b5050505b92959194509250565b5f601b83900b83148383826137c7577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156137a757620186a0860595506005850194505b8586601b0b146137c257600a860595508460010194506137a7565b6137dd565b855f036137dd57505f9250600191506106ad9050565b848560030b14613839575f8512156137fd57505f92508291506106ad9050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f61387887878787614130565b13979650505050505050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156138cf57600a860460018201600a88065f14935093509350506138d9565b8593509150600190505b9250925092565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0361391857508391505f905060016138d9565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8412156139a6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb084121561397757505f91505082151560016138d9565b5f846004015f03600a0a90505f818781613993576139936149b0565b05945050808402861415925090506138d9565b5f84126139bb57505f915081905060016138d9565b50505060048101600a0a82025f60016138d9565b5f808060646139e1600a612328614c75565b6139ee600a612328614c75565b6139f9906002614e02565b613a04906001614de1565b613a0e9190614de1565b613a189190614de1565b9050613a5c565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b613a67858288613a1f565b92508315611b1b57613a7d600186018288613a1f565b915050935093915050565b5f80888803613a9b575083905081613b19565b5f805f80613aab8c8b8f8d613018565b915091505f80613abd8a8a8d8c613018565b91509150613acd84848484611ca3565b8096508197505050505050505f80613ae78b8b8f8d613018565b915091505f80613af986868686611dc2565b915091505f80613b0b84848f8e61309e565b909a50985050505050505050505b97509795505050505050565b5f805f805f613b348787613e8f565b92509250925080612fba576040517f05e51ecb00000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f80613b8a600a612328614c75565b613b95906002614e02565b613ba0906001614de1565b90505f613bb0600a612328614c75565b90506002600a8504026001015f8052600281601e883c505f51617fff81169350618000811615613bdf57918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f80821215613c5f577f80000000000000000000000000000000000000000000000000000000000000008203613c5957507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b919050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f613cb08686613c68565b91509150815f03613cd457838181613cca57613cca6149b0565b0492505050610695565b838210613d1e576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016108ce565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215613e52577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613e3f57613de77f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001614de1565b8403613e1757507f80000000000000000000000000000000000000000000000000000000000000009050816123dd565b613e22600a85614c75565b613e2b90614c45565b613e36846001614a30565b915091506123dd565b613e4884614c45565b83915091506123dd565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613e8557613e2b600a85614c75565b50829050816123dd565b5f805f845f03613ea757505f915081905060016138d9565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f036140bb576f4b3b4ca85a86c47a098a2240000000008505158015613f1057507f80000000000000000000000000000000000000000000000000000000000000268412155b15613f31576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a000000000000008505158015613f7957507f80000000000000000000000000000000000000000000000000000000000000138412155b15613f9257678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008505158015613fde57507f800000000000000000000000000000000000000000000000000000000000000a8412155b15613ff4576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000850515801561404357507f80000000000000000000000000000000000000000000000000000000000000028412155b1561405957606485029450600284039350613ff4565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085051580156140a957507f80000000000000000000000000000000000000000000000000000000000000018412155b156140bb57600a850294506001840393505b600a808602908105861480156140f157507f80000000000000000000000000000000000000000000000000000000000000018512155b15614100578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f808515841517818712828612181785841417801561415557868592509250506123dd565b505f85841315614169575092949193919260015b8386035f8112604c821317801561419c57821561418e575f89945094505050506123dd565b885f945094505050506123dd565b600a82900a8981028a8282816141b4576141b46149b0565b05146141e05784156141d0575f8b9650965050505050506123dd565b8a5f9650965050505050506123dd565b84156141f55788965094506123dd9350505050565b95508794506123dd9350505050565b60605f82126142215760405180602001604052805f815250614258565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b61426960ff84901d80850118614290565b60405160200161427a929190614df4565b6040516020818303038152906040529050919050565b60605f61429c8361449f565b60010190505f8167ffffffffffffffff8111156142bb576142bb614891565b6040519080825280601f01601f1916602001820160405280156142e5576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846142ef57509392505050565b5f5b5f82600186515f1a1b1611838510161561436d5760018401935061434e565b509192915050565b81515f90819065200000000000600191831a9190911b161515838510168085019082806143a28488614580565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156143dd575093505f92506106ad915050565b825f03614440577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111614411575f614433565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b955093506106ad92505050565b7f8000000000000000000000000000000000000000000000000000000000000000811161446d575f61448f565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106144e7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310614513576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061453157662386f26fc10000830492506010015b6305f5e1008310614549576305f5e100830492506008015b612710831061455d57612710830492506004015b6064831061456f576064830492506002015b600a83106106845760010192915050565b5f808284106145b357507f34bd20690000000000000000000000000000000000000000000000000000000090505f6106ad565b835f036145ec576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b8782101580156146245750604d83105b1561466757815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a8590030201614614565b87821061478d5781515f1a84900360018111156146af57507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b600a84900a81028281018311156146f257507f0fdc26350000000000000000000000000000000000000000000000000000000096505f95506106ad945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b87821061478d5781515f1a6030811461476257507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091019061471e565b5f9890975095505050505050565b5f602082840312156147ab575f80fd5b5035919050565b5f80604083850312156147c3575f80fd5b50508035926020909101359150565b803560ff81168114613c63575f80fd5b5f80604083850312156147f3575f80fd5b82359150614803602084016147d2565b90509250929050565b5f806040838503121561481d575f80fd5b8235915060208301358015158114614833575f80fd5b809150509250929050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f602082840312156148ce575f80fd5b813567ffffffffffffffff808211156148e5575f80fd5b818401915084601f8301126148f8575f80fd5b81358181111561490a5761490a614891565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561495057614950614891565b81604052828152876020848701011115614968575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215614999575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181035f831280158383131683831282161715614a2957614a296149dd565b5092915050565b8082018281125f831280158216821582161715614a4f57614a4f6149dd565b505092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615614a8e57614a8e6149dd565b8181058314821517610684576106846149dd565b600181815b80851115614afb57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614ae157614ae16149dd565b80851615614aee57918102915b93841c9390800290614aa7565b509250929050565b5f82614b1157506001610684565b81614b1d57505f610684565b8160018114614b335760028114614b3d57614b59565b6001915050610684565b60ff841115614b4e57614b4e6149dd565b50506001821b610684565b5060208310610133831016604e8410600b8410161715614b7c575081810a610684565b614b868383614aa2565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614bb857614bb86149dd565b029392505050565b5f6106958383614b03565b5f82614bd957614bd96149b0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614c2d57614c2d6149dd565b500590565b5f82614c4057614c406149b0565b500790565b5f7f80000000000000000000000000000000000000000000000000000000000000008203613c5957613c596149dd565b5f82614c8357614c836149b0565b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614cb857614cb86149dd565b5060010190565b5f81518060208401855e5f93019283525090919050565b5f614ce18284614cbf565b7f300000000000000000000000000000000000000000000000000000000000000081526001019392505050565b7f2e0000000000000000000000000000000000000000000000000000000000000081525f614d48614d426001840186614cbf565b84614cbf565b949350505050565b7f650000000000000000000000000000000000000000000000000000000000000081525f6106956001830184614cbf565b5f610a29614d42614d9b614d95858a614cbf565b88614cbf565b86614cbf565b81810381811115610684576106846149dd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b80820180821115610684576106846149dd565b5f614d48614d428386614cbf565b8082028115828204841417610684576106846149dd56" + "object": "0x608060405234801561000f575f80fd5b50600436106102b7575f3560e01c806381f7e2f511610171578063cde72ef3116100d2578063dd64691711610088578063e5526ecd1161006e578063e5526ecd1461065b578063e75f991f1461066e578063ffae15ba14610681575f80fd5b8063dd64691714610635578063e0db588814610648575f80fd5b8063d1de592a116100b8578063d1de592a146105e8578063d35273a7146105fb578063d3d6ffa814610622575f80fd5b8063cde72ef3146105af578063d102b4d3146105d5575f80fd5b8063a19684b711610127578063bc1b392d1161010d578063bc1b392d14610538578063bc62d8d81461053e578063cb09682b14610589575f80fd5b8063a19684b7146104ff578063a90d041a14610525575f80fd5b806396ce1ec71161015757806396ce1ec7146104b55780639b4afd99146104c8578063a100a3d9146104ec575f80fd5b806381f7e2f51461048f5780638dc29807146104a2575f80fd5b8063371493ce1161021b5780635ca0e7a4116101d1578063719cd99d116101b7578063719cd99d1461045657806373bfb2831461046957806381a822721461047c575f80fd5b80635ca0e7a41461041d578063602c35fc14610430575f80fd5b806341aa00801161020157806341aa0080146103e45780634eb7cd34146103f75780635b23771d1461040a575f80fd5b8063371493ce146103b15780633b3bd868146103d1575f80fd5b806325388350116102705780633004fa41116102565780633004fa4114610368578063302974001461037b5780633447c0301461038e575f80fd5b8063253883501461034257806328fa1f0114610355575f80fd5b80630b6429bc116102a05780630b6429bc146102f4578063146e82ad1461031c5780631ee62f111461032f575f80fd5b806304327dc5146102bb578063078b665b146102e1575b5f80fd5b6102ce6102c9366004614a65565b6106a7565b6040519081526020015b60405180910390f35b6102ce6102ef366004614a7c565b6106b7565b610307610302366004614aac565b6106c9565b604080519283529015156020830152016102d8565b6102ce61032a366004614a65565b6106e1565b6102ce61033d366004614a65565b610700565b6102ce610350366004614a65565b61071f565b6102ce610363366004614a65565b61073e565b6102ce610376366004614a7c565b610748565b6102ce610389366004614a7c565b610768565b6103a161039c366004614a7c565b610773565b60405190151581526020016102d8565b6103c46103bf366004614ad6565b61077e565b6040516102d89190614b08565b6102ce6103df366004614aac565b61078a565b6102ce6103f2366004614a7c565b610795565b6103a1610405366004614b5b565b6107a0565b6102ce610418366004614aac565b6107b6565b6102ce61042b366004614a65565b6107c1565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102ce565b6102ce610464366004614a65565b6107cb565b6103a1610477366004614a7c565b6107d5565b6102ce61048a366004614a65565b6107e0565b6103a161049d366004614a7c565b6107ea565b6103a16104b0366004614a7c565b6107f5565b6102ce6104c3366004614a7c565b610800565b6102ce7c090000000000000000000000000000000000000000000000000000000181565b6103c46104fa366004614a65565b61080b565b7f80000000000000000000000000000000000000000000000000000000000000016102ce565b6102ce610533366004614a7c565b610855565b5f6102ce565b61055161054c366004614bb7565b610860565b604080517fffffffff0000000000000000000000000000000000000000000000000000000090931683526020830191909152016102d8565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff6102ce565b7f7fffffff800000000000000000000000000000000000000000000000000000006102ce565b6103a16105e3366004614a7c565b610879565b6102ce6105f6366004614a7c565b610884565b6102ce7ffffffffc0000000000000000000000000000000000000000000000000000000181565b6102ce610630366004614a65565b61088f565b6103a1610643366004614a65565b610899565b6102ce610656366004614a65565b6108bf565b6103c4610669366004614c80565b6108c9565b61030761067c366004614aac565b610949565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc6102ce565b5f6106b182610955565b92915050565b5f6106c28383610997565b9392505050565b5f806106d584846109b3565b915091505b9250929050565b5f6106b18273c51a14251b0dcf0ae24a96b7153991378938f5f56109f4565b5f6106b18273c51a14251b0dcf0ae24a96b7153991378938f5f5610a20565b5f6106b18273c51a14251b0dcf0ae24a96b7153991378938f5f5610a6d565b5f6106b182610aa0565b5f6106c2838373c51a14251b0dcf0ae24a96b7153991378938f5f5610ae1565b5f6106c28383610d3b565b5f6106c28383610d9d565b60606106c28383610deb565b5f6106c28383610e7e565b5f6106c28383610e99565b5f6107ad85858585610ede565b95945050505050565b5f6106c28383610f24565b5f6106b182610f57565b5f6106b18261100d565b5f6106c283836110b9565b5f6106b1826110fc565b5f6106c28383611141565b5f6106c28383611184565b5f6106c283836111c7565b60606106b1827ffffffffc000000000000000000000000000000000000000000000000000000017c09000000000000000000000000000000000000000000000000000000016108c9565b5f6106c2838361120c565b5f805f8061086d85611217565b90969095509350505050565b5f6106c28383611305565b5f6106c28383611348565b5f6106b18261138d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216156106b1565b5f6106b1826113bf565b60606108d58383611305565b61091a576040517f3be5bf9400000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044015b60405180910390fd5b5f610924856110fc565b90506107ad856109348387611305565b8061094457506109448386611184565b610deb565b5f806106d58484611400565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d6109878282611440565b90925090505f6107ad838361148e565b5f6109a28383611184565b6109ac57816106c2565b5090919050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6109e78282876114f4565b9350935050509250929050565b5f6106c2837fffffffff0000000000000000000000000000000000000000000000000000000584610ae1565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a538483836116fe565b90925090505f610a63838361148e565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a5384838361186f565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82610ad38383611ba4565b9150505f610a63828461148e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516610b1e5750600191506106c29050565b5f8213610bb757815f03610b7b57610b36855f611305565b15610b70576040517f8be8297200000000000000000000000000000000000000000000000000000000815260048101869052602401610911565b505f91506106c29050565b6040517fcceba0f10000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610911565b610bc2856001610d9d565b8015610bd35750610bd3865f611184565b15610be25785925050506106c2565b610bec855f611305565b15610c1557610c0c610bfd87610955565b610c068761138d565b86610ae1565b925050506106c2565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80610c488484611ba4565b915091505f610c5883855f611c0c565b905060015f8080610c8f8f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510610cd65784600116600103610cb957610cb384848484611d23565b90945092505b600185901c9450610ccc82828484611d23565b9092509050610c94565b5f80610ce38f8e8e61186f565b91509150610cf382828a8d611d23565b9092509050610d038f83836116fe565b9092509050610d1482828888611d23565b90925090505f610d24838361148e565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d8086868686611e42565b915091505f610d8f838361148e565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de084848484612466565b979650505050505050565b60607bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d5f829003610e5b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250925050506106b1565b8315610e7457610e6b828261247d565b925050506106b1565b6107ad82826127ba565b5f805f610e8b8585612fe4565b915091506107ad8282613046565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d8086868686613098565b5f610ee985856130c2565b5f80610ef5858561318e565b915091505f80610f07898989896131e5565b91509150610f178484848461327f565b9998505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d6107ad82828661329b565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610f8e57509192915050565b5f80610f9a8484611ba4565b915091505f84128015610fac57508015155b1561100257610ffd82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613098565b935091505b5f610de0838561148e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82811261104457509192915050565b5f806110508484611ba4565b91509150805f03611065575093949350505050565b5f81131561100257610ffd82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb46132f7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de084848484613427565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82821215611136576109878282613443565b5f6107ad838361148e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de08484848461327f565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de0848484846134e6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d8086868686611d23565b5f6109a28383611305565b80515f908190602084810191850101828080806112348686613501565b929650909450925090507fffffffff0000000000000000000000000000000000000000000000000000000084165f036112f6578483036112c6575f8061127a84846139a0565b91509150806112b557507f32b8b8be000000000000000000000000000000000000000000000000000000009a5f9a5098505050505050505050565b505f9a909950975050505050505050565b507fad384e8700000000000000000000000000000000000000000000000000000000985f98509650505050505050565b5091975f975095505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de084848484613aa6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d80868686866132f7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d6109878282613443565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d826113f28383611ba4565b5090505f610a63828461148e565b5f805f805f61140f8787613ac1565b9250925092505f8061142185856139a0565b91509150818380156114305750815b9650965050505050509250929050565b5f806106d57f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686611e42565b5f805f61149b85856139a0565b91509150801580156114ab575081155b156114ec576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610911565b509392505050565b5f805f85121561153a576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610911565b845f0361154c57505f905060016116f6565b8460ff8416850185811215611597576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610911565b5f805f831215611601577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb38312156115d8575f8095509550505050506116f6565b825f03600a0a91508184816115ef576115ef614ca9565b04955050840290911491506116f69050565b5f8313156116eb57604d831315611657576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610911565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8161168c5761168c614ca9565b048411156116d9576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610911565b50919091029250600191506116f69050565b509193506001925050505b935093915050565b5f805f84121561173a576117128484613443565b90945092506117228585856116fe565b90945092506117318484611440565b915091506116f6565b5f806117468686611ba4565b9092509050845f80806117598585613b1d565b9194509250905061270d612710611771600182614d03565b8514611788576117828d8686613c0c565b90925090505b8315611813575f61179a866001614d29565b90505b8084858302816117af576117af614ca9565b05146117c657600a84059350600a8805975061179d565b6118076117d38588614d50565b896117de8785614d50565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc613cc5565b909d509b5061183a9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b50505050508661184b84835f611c0c565b611856886001614d29565b6118609190614d29565b94509450505050935093915050565b5f80838361187d8282613d62565b90965094505f86136118fe57855f036118c2576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610911565b5050837f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000000361193c5761193283604c614d29565b5f915091506116f6565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000008412158061198b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb56119ad565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412611b68575f805f805f856119c657604b6119c9565b604c5b6119d3908a614d29565b90505f8087611a00577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000611a21565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c81611a5357611a53614ca9565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050611a8c8c82613db8565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414611b18576123278114611af357611ace8c82600101613db8565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002611b15565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50611b48838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613cc5565b909a509850611b598a8a835f6132f7565b975097505050505050506116f6565b611b728585611440565b9095509350611b8286868661186f565b9095509350611b918585613443565b92509250506116f6565b50935093915050565b5f805f8312611bb757508290505f6106da565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4831215611be957505f9050826106da565b5f839003600a0a808581611bff57611bff614ca9565b0794859003959350505050565b5f818303611c1b5750826106c2565b82821315611c5e57828203604c811380611c3557505f8113155b15611c43575f9150506106c2565b80600a0a8581611c5557611c55614ca9565b059150506106c2565b818303604c811380611c7057505f8113155b15611cb8576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260448101849052606401610911565b600a81900a85810286828281611cd057611cd0614ca9565b0514611d19576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101869052606401610911565b92506106c2915050565b5f8085158415178015611d3b575f92505f9150611e38565b611d458487614d29565b91505f611d5188613e3f565b90505f611d5d87613e3f565b90505f611d6a8383613ea5565b5090505f6f0785ee10d5da46d900f436a000000000821115611d9f576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115611dc057670de0b6b3a7640000820491506012015b633b9aca00821115611dd957633b9aca00820491506009015b612710821115611dee57612710820491506004015b8115611e0257600a82049150600101611dee565b611e0c8187614d29565b9550611e2e8b8a611e288787611e2387600a614eb9565b613ee0565b89613fc5565b9097509550505050505b5094509492505050565b5f80835f03611e87576040517f7a97930f0000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610911565b855f03611e9857505f90508061245d565b5f805f80611ea68a8a6140cc565b919b5099509150611eb788886140cc565b919950975090505f611ec88b613e3f565b90505f611ed48a613e3f565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c818310156122f1578415611f3257507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b6122b0565b6f4b3b4ca85a86c47a098a22400000000083101561205e57678ac7230489e80000831015611fc2576402540be400831015611f9057620186a0831015611f805750620186a090506005612239565b506402540be4009050600a612239565b655af3107a4000831015611faf5750655af3107a40009050600e612239565b50678ac7230489e8000090506013612239565b6b204fce5e3e250261100000008310156120145769152d02c7e14af6800000831015611ffd575069152d02c7e14af680000090506017612239565b506b204fce5e3e250261100000009050601c612239565b6d314dc6448d9338c15b0a0000000083101561204357506d314dc6448d9338c15b0a0000000090506021612239565b506f4b3b4ca85a86c47a098a22400000000090506026612239565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156121565773af298d050e4395d69670b12b7f410000000000008310156120f1577172cb5bd86321e38cb6ce6682e800000000008310156120d257507172cb5bd86321e38cb6ce6682e800000000009050602b612239565b5073af298d050e4395d69670b12b7f4100000000000090506030612239565b76010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000831015612132575076010b46c6cdd6e3e0828f4db456ff0c8ea000000000000090506035612239565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a612239565b7c03b58e88c75313ec9d329eaaa18fb92f75215b171000000000000000008310156121ec577a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000008310156121c457507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f612239565b507c03b58e88c75313ec9d329eaaa18fb92f75215b1710000000000000000090506044612239565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca00000000000000000083101561223957507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b81831161226d57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01612239565b815f036122b0576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c9052604401610911565b856122f1576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e9052604401610911565b807f8000000000000000000000000000000000000000000000000000000000000000018d1261232457808d039c50612397565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f81131561239757807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b1361238457998a0199612397565b5f8099509950505050505050505061245d565b5f808e1280156123a657505f8c135b156123e3577f80000000000000000000000000000000000000000000000000000000000000008e01808d136123db575f6123df565b808d035b9150505b8b818f010397506124008f8e6123fa888789613ee0565b8b613fc5565b90995097505f81131561244a57604c81131561242a575f809a509a5050505050505050505061245d565b80600a0a898161243c5761243c614ca9565b059850885f0361244a575f97505b5096985094965061245d95505050505050565b94509492505050565b5f6124738585858561436d565b1495945050505050565b60608161248a8482613d62565b90945092505f806124bb7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000087614ec4565b156124eb57507f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000009050604c612512565b507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b5b5f61251d8388614ec4565b90505f61252a8489614f2b565b90505f808312156125445750600161254183614f3e565b92505b5f82121561255b5750600161255882614f3e565b91505b60408051602081019091525f81528215612664575f8061257c600a89614f6e565b90505b6125898186614ec4565b5f036125ae5761259a600a82614f6e565b9050816125a681614f81565b92505061257f565b60408051602081019091525f8082525b8381101561260f57816040516020016125d79190614fcf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905291506001016125be565b505b61261c600a87614f2b565b5f036126345761262d600a87614ec4565b9550612611565b8061263e87614441565b60405160200161264f929190615007565b60405160208183030381529060405293505050505b5f61266e85614441565b90505f61267b878c614d29565b9050637fffffff8113806126ae57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000081125b156126e8576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018a9052602401610911565b5f811561271c576126f882614441565b6040516020016127089190615049565b60405160208183030381529060405261272c565b60405180602001604052805f8152505b90505f856127485760405180602001604052805f81525061277f565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b905080848684604051602001612798949392919061507a565b6040516020818303038152906040529b50505050505050505050505092915050565b60606103e88213806127d557506127d26103e8614f3e565b82125b1561280f576040517fe44c72b000000000000000000000000000000000000000000000000000000000815260048101839052602401610911565b5f80841290811561282a5761282385614f3e565b905061282d565b50835b5f8413156128f0578360448110612873576040517fe44c72b000000000000000000000000000000000000000000000000000000000815260048101869052602401610911565b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5b828110156128af576128a5600a83614f6e565b9150600101612892565b50808311156128ed576040517fe44c72b000000000000000000000000000000000000000000000000000000000815260048101879052602401610911565b50505b5f6128fa826144cd565b80519091505f5b818110801561297d5750828161291860018561509a565b612922919061509a565b81518110612932576129326150ad565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f3000000000000000000000000000000000000000000000000000000000000000145b15612994578061298c81614f81565b915050612901565b5f61299f828461509a565b90505f6129ac838a614d29565b90505f876129c85760405180602001604052805f8152506129ff565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90505f8212612b7957815f612a1482866150da565b67ffffffffffffffff811115612a2c57612a2c614b8a565b6040519080825280601f01601f191660200182016040528015612a56576020820181803683370190505b5090505f5b85811015612ac857888181518110612a7557612a756150ad565b602001015160f81c60f81b828281518110612a9257612a926150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a5b565b505f5b82811015612b45577f300000000000000000000000000000000000000000000000000000000000000082612aff83896150da565b81518110612b0f57612b0f6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612acb565b508281604051602001612b599291906150ed565b6040516020818303038152906040529a50505050505050505050506106b1565b5f612b8383614f3e565b905080841115612d9a575f612b98828661509a565b90505f612ba68660016150da565b67ffffffffffffffff811115612bbe57612bbe614b8a565b6040519080825280601f01601f191660200182016040528015612be8576020820181803683370190505b5090505f5b82811015612c5a57898181518110612c0757612c076150ad565b602001015160f81c60f81b828281518110612c2457612c246150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612bed565b507f2e00000000000000000000000000000000000000000000000000000000000000818381518110612c8e57612c8e6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b83811015612d655789612cd182856150da565b81518110612ce157612ce16150ad565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612d158660016150da565b612d1f91906150da565b81518110612d2f57612d2f6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612cbe565b508381604051602001612d799291906150ed565b6040516020818303038152906040529b5050505050505050505050506106b1565b5f612da5858361509a565b90505f85612db48360026150da565b612dbe91906150da565b67ffffffffffffffff811115612dd657612dd6614b8a565b6040519080825280601f01601f191660200182016040528015612e00576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110612e3657612e366150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f2e0000000000000000000000000000000000000000000000000000000000000081600181518110612e9857612e986150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b82811015612f43577f300000000000000000000000000000000000000000000000000000000000000082612efd8360026150da565b81518110612f0d57612f0d6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612ec8565b505f5b86811015612d6557898181518110612f6057612f606150ad565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612f948660026150da565b612f9e91906150da565b81518110612fae57612fae6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612f46565b5f805f805f612ff38787613ac1565b9250925092508061303a576040517fc47179660000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610911565b50909590945092505050565b5f805f61305385856139a0565b91509150806114ec576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610911565b5f806130a48484613443565b90945092506130b5868686866132f7565b9150915094509492505050565b5f6130cd5f80613046565b90506130d98382611305565b806130e957506130e98282611305565b1561312a576040517fbd559d600000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610911565b6131348382611184565b15801561314857506131468282611184565b155b15613189576040517fe9b2d4420000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610911565b505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b90810b9160e087811d9291871690910b9086901d84806131d484848888613098565b909b909a5098505050505050505050565b5f805f805f806131f58888614589565b90925090507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8916601b0b60e08a901d61322d82828686611d23565b90965094505050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8916601b0b905060e089901d5f8061326c848488886145db565b909d909c509a5050505050505050505050565b5f805f61328e8787878761436d565b1215979650505050505050565b5f805f6132a98686866114f4565b91509150806132ee576040517f05e476780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610911565b50949350505050565b5f808515841517801561332357865f03613317578484925092505061245d565b8686925092505061245d565b61332d8787613d62565b909750955061333c8585613d62565b909550935085841315613350579395929492935b838603604c81111561336957878793509350505061245d565b80600a0a868161337b5761337b614ca9565b0595505086850180881860ff90811c151589881890911c1516801561341657877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036133fd576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a905260248101899052604401610911565b600a96879005969098058601976001979097019661341a565b8198505b5096979596505050505050565b5f805f6134368787878761436d565b1315979650505050505050565b5f807f800000000000000000000000000000000000000000000000000000000000000084036134dc577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83036134cf576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401610911565b600a840593508260010192505b50505f9190910391565b5f805f6134f58787878761436d565b12979650505050505050565b5f8281806135168386652000000000006145ff565b9250858314158361353081886703ff0000000000006145ff565b945080850361356a57507f34bd20690000000000000000000000000000000000000000000000000000000094505f92508291506139979050565b5f806135768a88614628565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156135b4575095505f9350839250613997915050565b86519095506540000000000060015f9290921a9190911b16151588871016915050801561384357506001909301925f846135f781896703ff0000000000006145ff565b955080860361363257507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f9350839250613997915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b6601000000000000161515166001036136a1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613634565b8181146136f8575f806136b48484614628565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156136f4575097505f95508594506139979350505050565b9350505b5f83121561373357507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f945084935061399792505050565b831561373f57825f0392505b80820394505f85131561377f57507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f945084935061399792505050565b855f0361378e57829550613840565b5f85900360438111156137cf57507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f95508594506139979350505050565b600a0a8681025f888383816137e6576137e6614ca9565b0514159050601b82900b82141581806137fc5750805b1561383857507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f98508897506139979650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b1615158786101680156139885760019095019485613883818a652000000000006145ff565b965086613899818b6703ff0000000000006145ff565b97508088036138d657507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f95508594506139979350505050565b505f806138e3838a614628565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613923575097505f95508594506139979350505050565b9250508482015f8313801561393757508581125b8061394b57505f8312801561394b57508581135b1561398457507fd556b1110000000000000000000000000000000000000000000000000000000097505f95508594506139979350505050565b9450505b845f03613993575f93505b5050505b92959194509250565b5f601b83900b8314838382613a04577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156139e457620186a0860595506005850194505b8586601b0b146139ff57600a860595508460010194506139e4565b613a1a565b855f03613a1a57505f9250600191506106da9050565b848560030b14613a76575f851215613a3a57505f92508291506106da9050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610911565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f613ab58787878761436d565b13979650505050505050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115613b0c57600a860460018201600a88065f1493509350935050613b16565b8593509150600190505b9250925092565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc03613b5557508391505f90506001613b16565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc841215613be3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0841215613bb457505f9150508215156001613b16565b5f846004015f03600a0a90505f818781613bd057613bd0614ca9565b0594505080840286141592509050613b16565b5f8412613bf857505f91508190506001613b16565b50505060048101600a0a82025f6001613b16565b5f80806064613c1e600a612328614f6e565b613c2b600a612328614f6e565b613c369060026150fb565b613c419060016150da565b613c4b91906150da565b613c5591906150da565b9050613c99565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b613ca4858288613c5c565b92508315611b9b57613cba600186018288613c5c565b915050935093915050565b5f80888803613cd8575083905081613d56565b5f805f80613ce88c8b8f8d613098565b915091505f80613cfa8a8a8d8c613098565b91509150613d0a84848484611d23565b8096508197505050505050505f80613d248b8b8f8d613098565b915091505f80613d3686868686611e42565b915091505f80613d4884848f8e6132f7565b909a50985050505050505050505b97509795505050505050565b5f805f805f613d7187876140cc565b9250925092508061303a576040517f05e51ecb0000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610911565b5f80613dc7600a612328614f6e565b613dd29060026150fb565b613ddd9060016150da565b90505f613ded600a612328614f6e565b90506002600a8504026001015f8052600281601e883c505f51617fff81169350618000811615613e1c57918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f80821215613e9c577f80000000000000000000000000000000000000000000000000000000000000008203613e9657507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b919050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f613eed8686613ea5565b91509150815f03613f1157838181613f0757613f07614ca9565b04925050506106c2565b838210613f5b576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610911565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f858718121561408f577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84111561407c576140247f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60016150da565b840361405457507f800000000000000000000000000000000000000000000000000000000000000090508161245d565b61405f600a85614f6e565b61406890614f3e565b614073846001614d29565b9150915061245d565b61408584614f3e565b839150915061245d565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8411156140c257614068600a85614f6e565b508290508161245d565b5f805f845f036140e457505f91508190506001613b16565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f036142f8576f4b3b4ca85a86c47a098a224000000000850515801561414d57507f80000000000000000000000000000000000000000000000000000000000000268412155b1561416e576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a0000000000000085051580156141b657507f80000000000000000000000000000000000000000000000000000000000000138412155b156141cf57678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000850515801561421b57507f800000000000000000000000000000000000000000000000000000000000000a8412155b15614231576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000850515801561428057507f80000000000000000000000000000000000000000000000000000000000000028412155b1561429657606485029450600284039350614231565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085051580156142e657507f80000000000000000000000000000000000000000000000000000000000000018412155b156142f857600a850294506001840393505b600a8086029081058614801561432e57507f80000000000000000000000000000000000000000000000000000000000000018512155b1561433d578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f8085158415178187128286121817858414178015614392578685925092505061245d565b505f858413156143a6575092949193919260015b8386035f8112604c82131780156143d95782156143cb575f899450945050505061245d565b885f9450945050505061245d565b600a82900a8981028a8282816143f1576143f1614ca9565b051461441d57841561440d575f8b96509650505050505061245d565b8a5f96509650505050505061245d565b841561443257889650945061245d9350505050565b955087945061245d9350505050565b60605f821261445e5760405180602001604052805f815250614495565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b6144a660ff84901d808501186144cd565b6040516020016144b79291906150ed565b6040516020818303038152906040529050919050565b60605f6144d983614752565b60010190505f8167ffffffffffffffff8111156144f8576144f8614b8a565b6040519080825280601f01601f191660200182016040528015614522576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461452c57509392505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b90810b9160e087811d9291871690910b9086901d84806131d46145cf87614833565b866145d987614833565b865b5f806145e98686868661327f565b6145f45785856130b5565b509194909350915050565b5f5b5f82600186515f1a1b1611838510161561462057600184019350614601565b509192915050565b81515f90819065200000000000600191831a9190911b16151583851016808501908280614655848861484a565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615614690575093505f92506106da915050565b825f036146f3577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81116146c4575f6146e6565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b955093506106da92505050565b7f80000000000000000000000000000000000000000000000000000000000000008111614720575f614742565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061479a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106147c6576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106147e457662386f26fc10000830492506010015b6305f5e10083106147fc576305f5e100830492506008015b612710831061481057612710830492506004015b60648310614822576064830492506002015b600a83106106b15760010192915050565b5f80821261484157816106b1565b6106b182614f3e565b5f8082841061487d57507f34bd20690000000000000000000000000000000000000000000000000000000090505f6106da565b835f036148b6576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b8782101580156148ee5750604d83105b1561493157815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a85900302016148de565b878210614a575781515f1a849003600181111561497957507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106da9350505050565b600a84900a81028281018311156149bc57507f0fdc26350000000000000000000000000000000000000000000000000000000096505f95506106da945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b878210614a575781515f1a60308114614a2c57507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106da9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101906149e8565b5f9890975095505050505050565b5f60208284031215614a75575f80fd5b5035919050565b5f8060408385031215614a8d575f80fd5b50508035926020909101359150565b803560ff81168114613ea0575f80fd5b5f8060408385031215614abd575f80fd5b82359150614acd60208401614a9c565b90509250929050565b5f8060408385031215614ae7575f80fd5b8235915060208301358015158114614afd575f80fd5b809150509250929050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f805f8060808587031215614b6e575f80fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215614bc7575f80fd5b813567ffffffffffffffff80821115614bde575f80fd5b818401915084601f830112614bf1575f80fd5b813581811115614c0357614c03614b8a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715614c4957614c49614b8a565b81604052828152876020848701011115614c61575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215614c92575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181035f831280158383131683831282161715614d2257614d22614cd6565b5092915050565b8082018281125f831280158216821582161715614d4857614d48614cd6565b505092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615614d8757614d87614cd6565b81810583148215176106b1576106b1614cd6565b600181815b80851115614df457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614dda57614dda614cd6565b80851615614de757918102915b93841c9390800290614da0565b509250929050565b5f82614e0a575060016106b1565b81614e1657505f6106b1565b8160018114614e2c5760028114614e3657614e52565b60019150506106b1565b60ff841115614e4757614e47614cd6565b50506001821b6106b1565b5060208310610133831016604e8410600b8410161715614e75575081810a6106b1565b614e7f8383614d9b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614eb157614eb1614cd6565b029392505050565b5f6106c28383614dfc565b5f82614ed257614ed2614ca9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614f2657614f26614cd6565b500590565b5f82614f3957614f39614ca9565b500790565b5f7f80000000000000000000000000000000000000000000000000000000000000008203613e9657613e96614cd6565b5f82614f7c57614f7c614ca9565b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614fb157614fb1614cd6565b5060010190565b5f81518060208401855e5f93019283525090919050565b5f614fda8284614fb8565b7f300000000000000000000000000000000000000000000000000000000000000081526001019392505050565b7f2e0000000000000000000000000000000000000000000000000000000000000081525f61504161503b6001840186614fb8565b84614fb8565b949350505050565b7f650000000000000000000000000000000000000000000000000000000000000081525f6106c26001830184614fb8565b5f610a6361503b61509461508e858a614fb8565b88614fb8565b86614fb8565b818103818111156106b1576106b1614cd6565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b808201808211156106b1576106b1614cd6565b5f61504161503b8386614fb8565b80820281158282048414176106b1576106b1614cd656" } } \ No newline at end of file diff --git a/src/concrete/DecimalFloat.sol b/src/concrete/DecimalFloat.sol index a3014ad..083e4fb 100644 --- a/src/concrete/DecimalFloat.sol +++ b/src/concrete/DecimalFloat.sol @@ -275,6 +275,22 @@ contract DecimalFloat { return a.max(b); } + /// Exposes `LibDecimalFloat.agree` for offchain use. + /// + /// Reverts `AgreeToleranceNegative` if either tolerance is negative and + /// `AgreeNoPositiveTolerance` if neither is positive, so an offchain caller + /// sees the same rejections as an onchain one rather than a silent answer on + /// a tolerance that cannot mean anything. + /// @param absolute The absolute tolerance, in the same units as the values. + /// @param proportional The proportional tolerance, as a fraction. + /// @param lowest The lowest value in the set. + /// @param highest The highest value in the set. + /// @return True if the spread between the extremes is within the larger of + /// the two tolerance terms. + function agree(Float absolute, Float proportional, Float lowest, Float highest) external pure returns (bool) { + return LibDecimalFloat.agree(absolute, proportional, lowest, highest); + } + /// Exposes `LibDecimalFloat.isZero` for offchain use. /// @param a The float to check. /// @return True if the float is zero, false otherwise. diff --git a/src/generated/candidate/DecimalFloat.sol b/src/generated/candidate/DecimalFloat.sol index 4d1830c..c60cdea 100644 --- a/src/generated/candidate/DecimalFloat.sol +++ b/src/generated/candidate/DecimalFloat.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x12b70b2f9324ec3572c5a0c4d83305d43af5b6b7c82597730320f7ee20cda082); +bytes32 constant BYTECODE_HASH = bytes32(0x0d43af491e8fcc452389f2dbb79d9dcb81968eb6d53909742028405338a1902c); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x16cf47be475864dAb406E7A65A5A4D939Cc85608); +address constant DEPLOYED_ADDRESS = address(0xEc632ea4D04A6D72F87E60FEb4C6B6813cda59bd); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060156019565b60b8565b73c51a14251b0dcf0ae24a96b7153991378938f5f53f7f2573004ac3a9ee7fc8d73654d76386f1b6b99e34cdf86a689c4691e47143420f811460b557604051630912d0ff60e31b815273c51a14251b0dcf0ae24a96b7153991378938f5f560048201527f2573004ac3a9ee7fc8d73654d76386f1b6b99e34cdf86a689c4691e47143420f60248201526044810182905260640160405180910390fd5b50565b614e19806100c55f395ff3fe608060405234801561000f575f80fd5b506004361061029d575f3560e01c806381f7e2f511610171578063cde72ef3116100d2578063dd64691711610088578063e5526ecd1161006e578063e5526ecd1461062e578063e75f991f14610641578063ffae15ba14610654575f80fd5b8063dd64691714610608578063e0db58881461061b575f80fd5b8063d1de592a116100b8578063d1de592a146105bb578063d35273a7146105ce578063d3d6ffa8146105f5575f80fd5b8063cde72ef314610582578063d102b4d3146105a8575f80fd5b8063a19684b711610127578063bc1b392d1161010d578063bc1b392d1461050b578063bc62d8d814610511578063cb09682b1461055c575f80fd5b8063a19684b7146104d2578063a90d041a146104f8575f80fd5b806396ce1ec71161015757806396ce1ec7146104885780639b4afd991461049b578063a100a3d9146104bf575f80fd5b806381f7e2f5146104625780638dc2980714610475575f80fd5b80633447c0301161021b5780635ca0e7a4116101d1578063719cd99d116101b7578063719cd99d1461042957806373bfb2831461043c57806381a822721461044f575f80fd5b80635ca0e7a4146103f0578063602c35fc14610403575f80fd5b80633b3bd868116102015780633b3bd868146103b757806341aa0080146103ca5780635b23771d146103dd575f80fd5b80633447c03014610374578063371493ce14610397575f80fd5b80631ee62f111161027057806328fa1f011161025657806328fa1f011461033b5780633004fa411461034e5780633029740014610361575f80fd5b80631ee62f11146103155780632538835014610328575f80fd5b806304327dc5146102a1578063078b665b146102c75780630b6429bc146102da578063146e82ad14610302575b5f80fd5b6102b46102af36600461479b565b61067a565b6040519081526020015b60405180910390f35b6102b46102d53660046147b2565b61068a565b6102ed6102e83660046147e2565b61069c565b604080519283529015156020830152016102be565b6102b461031036600461479b565b6106b4565b6102b461032336600461479b565b6106d3565b6102b461033636600461479b565b6106f2565b6102b461034936600461479b565b610711565b6102b461035c3660046147b2565b61071b565b6102b461036f3660046147b2565b61073b565b6103876103823660046147b2565b610746565b60405190151581526020016102be565b6103aa6103a536600461480c565b610751565b6040516102be919061483e565b6102b46103c53660046147e2565b61075d565b6102b46103d83660046147b2565b610768565b6102b46103eb3660046147e2565b610773565b6102b46103fe36600461479b565b61077e565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b6102b461043736600461479b565b610788565b61038761044a3660046147b2565b610792565b6102b461045d36600461479b565b61079d565b6103876104703660046147b2565b6107a7565b6103876104833660046147b2565b6107b2565b6102b46104963660046147b2565b6107bd565b6102b47c090000000000000000000000000000000000000000000000000000000181565b6103aa6104cd36600461479b565b6107c8565b7f80000000000000000000000000000000000000000000000000000000000000016102b4565b6102b46105063660046147b2565b610812565b5f6102b4565b61052461051f3660046148be565b61081d565b604080517fffffffff0000000000000000000000000000000000000000000000000000000090931683526020830191909152016102be565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b7f7fffffff800000000000000000000000000000000000000000000000000000006102b4565b6103876105b63660046147b2565b610836565b6102b46105c93660046147b2565b610841565b6102b47ffffffffc0000000000000000000000000000000000000000000000000000000181565b6102b461060336600461479b565b61084c565b61038761061636600461479b565b610856565b6102b461062936600461479b565b61087c565b6103aa61063c366004614987565b610886565b6102ed61064f3660046147e2565b61090f565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc6102b4565b5f6106848261091b565b92915050565b5f610695838361095d565b9392505050565b5f806106a88484610979565b915091505b9250929050565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109ba565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109e6565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f5610a33565b5f61068482610a66565b5f610695838373c51a14251b0dcf0ae24a96b7153991378938f5f5610aa7565b5f6106958383610d01565b5f6106958383610d63565b60606106958383610db1565b5f6106958383610e44565b5f6106958383610e5f565b5f6106958383610ea4565b5f61068482610ed7565b5f61068482610f8d565b5f6106958383611039565b5f6106848261107c565b5f61069583836110c1565b5f6106958383611104565b5f6106958383611147565b6060610684827ffffffffc000000000000000000000000000000000000000000000000000000017c0900000000000000000000000000000000000000000000000000000001610886565b5f610695838361118c565b5f805f8061082a85611197565b90969095509350505050565b5f6106958383611285565b5f61069583836112c8565b5f6106848261130d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821615610684565b5f6106848261133f565b60606108928383611285565b6108d7576040517f3be5bf9400000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044015b60405180910390fd5b5f6108e18561107c565b9050610906856108f18387611285565b8061090157506109018386611104565b610db1565b95945050505050565b5f806106a88484611380565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826113c0565b90925090505f610906838361140e565b5f6109688383611104565b6109725781610695565b5090919050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6109ad828287611474565b9350935050509250929050565b5f610695837fffffffff0000000000000000000000000000000000000000000000000000000584610aa7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a1984838361167e565b90925090505f610a29838361140e565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a198483836117ef565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82610a998383611b24565b9150505f610a29828461140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516610ae45750600191506106959050565b5f8213610b7d57815f03610b4157610afc855f611285565b15610b36576040517f8be82972000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b505f91506106959050565b6040517fcceba0f100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b610b88856001610d63565b8015610b995750610b99865f611104565b15610ba8578592505050610695565b610bb2855f611285565b15610bdb57610bd2610bc38761091b565b610bcc8761130d565b86610aa7565b92505050610695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80610c0e8484611b24565b915091505f610c1e83855f611b8c565b905060015f8080610c558f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510610c9c5784600116600103610c7f57610c7984848484611ca3565b90945092505b600185901c9450610c9282828484611ca3565b9092509050610c5a565b5f80610ca98f8e8e6117ef565b91509150610cb982828a8d611ca3565b9092509050610cc98f838361167e565b9092509050610cda82828888611ca3565b90925090505f610cea838361140e565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611dc2565b915091505f610d55838361140e565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846123e6565b979650505050505050565b60607bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d5f829003610e21576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525092505050610684565b8315610e3a57610e3182826123fd565b92505050610684565b610906828261273a565b5f805f610e518585612f64565b915091506109068282612fc6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686613018565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610906828286613042565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610f0e57509192915050565b5f80610f1a8484611b24565b915091505f84128015610f2c57508015155b15610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613018565b935091505b5f610da6838561140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610fc457509192915050565b5f80610fd08484611b24565b91509150805f03610fe5575093949350505050565b5f811315610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb461309e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846131ce565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828212156110b65761094d82826131ea565b5f610906838361140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da68484848461328d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846132a9565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611ca3565b5f6109688383611285565b80515f908190602084810191850101828080806111b486866132c4565b929650909450925090507fffffffff0000000000000000000000000000000000000000000000000000000084165f0361127657848303611246575f806111fa8484613763565b915091508061123557507f32b8b8be000000000000000000000000000000000000000000000000000000009a5f9a5098505050505050505050565b505f9a909950975050505050505050565b507fad384e8700000000000000000000000000000000000000000000000000000000985f98509650505050505050565b5091975f975095505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da684848484613869565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d468686868661309e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826131ea565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d826113728383611b24565b5090505f610a29828461140e565b5f805f805f61138f8787613884565b9250925092505f806113a18585613763565b91509150818380156113b05750815b9650965050505050509250929050565b5f806106a87f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686611dc2565b5f805f61141b8585613763565b915091508015801561142b575081155b1561146c576040517f8eba4d0700000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b509392505050565b5f805f8512156114ba576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b845f036114cc57505f90506001611676565b8460ff8416850185811215611517576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f805f831215611581577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3831215611558575f809550955050505050611676565b825f03600a0a915081848161156f5761156f6149b0565b04955050840290911491506116769050565b5f83131561166b57604d8313156115d7576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8161160c5761160c6149b0565b04841115611659576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b50919091029250600191506116769050565b509193506001925050505b935093915050565b5f805f8412156116ba5761169284846131ea565b90945092506116a285858561167e565b90945092506116b184846113c0565b91509150611676565b5f806116c68686611b24565b9092509050845f80806116d985856138e0565b9194509250905061270d6127106116f1600182614a0a565b8514611708576117028d86866139cf565b90925090505b8315611793575f61171a866001614a30565b90505b80848583028161172f5761172f6149b0565b051461174657600a84059350600a8805975061171d565b6117876117538588614a57565b8961175e8785614a57565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc613a88565b909d509b506117ba9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866117cb84835f611b8c565b6117d6886001614a30565b6117e09190614a30565b94509450505050935093915050565b5f8083836117fd8282613b25565b90965094505f861361187e57855f03611842576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b5050837f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000036118bc576118b283604c614a30565b5f91509150611676565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000008412158061190b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb561192d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412611ae8575f805f805f8561194657604b611949565b604c5b611953908a614a30565b90505f8087611980577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000006119a1565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c816119d3576119d36149b0565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050611a0c8c82613b7b565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414611a98576123278114611a7357611a4e8c82600101613b7b565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002611a95565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50611ac8838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613a88565b909a509850611ad98a8a835f61309e565b97509750505050505050611676565b611af285856113c0565b9095509350611b028686866117ef565b9095509350611b1185856131ea565b9250925050611676565b50935093915050565b5f805f8312611b3757508290505f6106ad565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4831215611b6957505f9050826106ad565b5f839003600a0a808581611b7f57611b7f6149b0565b0794859003959350505050565b5f818303611b9b575082610695565b82821315611bde57828203604c811380611bb557505f8113155b15611bc3575f915050610695565b80600a0a8581611bd557611bd56149b0565b05915050610695565b818303604c811380611bf057505f8113155b15611c38576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604481018490526064016108ce565b600a81900a85810286828281611c5057611c506149b0565b0514611c99576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604481018690526064016108ce565b9250610695915050565b5f8085158415178015611cbb575f92505f9150611db8565b611cc58487614a30565b91505f611cd188613c02565b90505f611cdd87613c02565b90505f611cea8383613c68565b5090505f6f0785ee10d5da46d900f436a000000000821115611d1f576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115611d4057670de0b6b3a7640000820491506012015b633b9aca00821115611d5957633b9aca00820491506009015b612710821115611d6e57612710820491506004015b8115611d8257600a82049150600101611d6e565b611d8c8187614a30565b9550611dae8b8a611da88787611da387600a614bc0565b613ca3565b89613d88565b9097509550505050505b5094509492505050565b5f80835f03611e07576040517f7a97930f00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b855f03611e1857505f9050806123dd565b5f805f80611e268a8a613e8f565b919b5099509150611e378888613e8f565b919950975090505f611e488b613c02565b90505f611e548a613c02565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c81831015612271578415611eb257507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b612230565b6f4b3b4ca85a86c47a098a224000000000831015611fde57678ac7230489e80000831015611f42576402540be400831015611f1057620186a0831015611f005750620186a0905060056121b9565b506402540be4009050600a6121b9565b655af3107a4000831015611f2f5750655af3107a40009050600e6121b9565b50678ac7230489e80000905060136121b9565b6b204fce5e3e25026110000000831015611f945769152d02c7e14af6800000831015611f7d575069152d02c7e14af6800000905060176121b9565b506b204fce5e3e250261100000009050601c6121b9565b6d314dc6448d9338c15b0a00000000831015611fc357506d314dc6448d9338c15b0a00000000905060216121b9565b506f4b3b4ca85a86c47a098a224000000000905060266121b9565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156120d65773af298d050e4395d69670b12b7f41000000000000831015612071577172cb5bd86321e38cb6ce6682e8000000000083101561205257507172cb5bd86321e38cb6ce6682e800000000009050602b6121b9565b5073af298d050e4395d69670b12b7f41000000000000905060306121b9565b76010b46c6cdd6e3e0828f4db456ff0c8ea00000000000008310156120b2575076010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000905060356121b9565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a6121b9565b7c03b58e88c75313ec9d329eaaa18fb92f75215b1710000000000000000083101561216c577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561214457507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f6121b9565b507c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000905060446121b9565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000008310156121b957507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b8183116121ed57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016121b9565b815f03612230576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c90526044016108ce565b85612271576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e90526044016108ce565b807f8000000000000000000000000000000000000000000000000000000000000000018d126122a457808d039c50612317565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f81131561231757807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b1361230457998a0199612317565b5f809950995050505050505050506123dd565b5f808e12801561232657505f8c135b15612363577f80000000000000000000000000000000000000000000000000000000000000008e01808d1361235b575f61235f565b808d035b9150505b8b818f010397506123808f8e61237a888789613ca3565b8b613d88565b90995097505f8113156123ca57604c8113156123aa575f809a509a505050505050505050506123dd565b80600a0a89816123bc576123bc6149b0565b059850885f036123ca575f97505b509698509496506123dd95505050505050565b94509492505050565b5f6123f385858585614130565b1495945050505050565b60608161240a8482613b25565b90945092505f8061243b7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000087614bcb565b1561246b57507f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000009050604c612492565b507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b5b5f61249d8388614bcb565b90505f6124aa8489614c32565b90505f808312156124c4575060016124c183614c45565b92505b5f8212156124db575060016124d882614c45565b91505b60408051602081019091525f815282156125e4575f806124fc600a89614c75565b90505b6125098186614bcb565b5f0361252e5761251a600a82614c75565b90508161252681614c88565b9250506124ff565b60408051602081019091525f8082525b8381101561258f57816040516020016125579190614cd6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052915060010161253e565b505b61259c600a87614c32565b5f036125b4576125ad600a87614bcb565b9550612591565b806125be87614204565b6040516020016125cf929190614d0e565b60405160208183030381529060405293505050505b5f6125ee85614204565b90505f6125fb878c614a30565b9050637fffffff81138061262e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000081125b15612668576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018a90526024016108ce565b5f811561269c5761267882614204565b6040516020016126889190614d50565b6040516020818303038152906040526126ac565b60405180602001604052805f8152505b90505f856126c85760405180602001604052805f8152506126ff565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b9050808486846040516020016127189493929190614d81565b6040516020818303038152906040529b50505050505050505050505092915050565b60606103e882138061275557506127526103e8614c45565b82125b1561278f576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018390526024016108ce565b5f8084129081156127aa576127a385614c45565b90506127ad565b50835b5f8413156128705783604481106127f3576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5b8281101561282f57612825600a83614c75565b9150600101612812565b508083111561286d576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018790526024016108ce565b50505b5f61287a82614290565b80519091505f5b81811080156128fd57508281612898600185614da1565b6128a29190614da1565b815181106128b2576128b2614db4565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f3000000000000000000000000000000000000000000000000000000000000000145b15612914578061290c81614c88565b915050612881565b5f61291f8284614da1565b90505f61292c838a614a30565b90505f876129485760405180602001604052805f81525061297f565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90505f8212612af957815f6129948286614de1565b67ffffffffffffffff8111156129ac576129ac614891565b6040519080825280601f01601f1916602001820160405280156129d6576020820181803683370190505b5090505f5b85811015612a48578881815181106129f5576129f5614db4565b602001015160f81c60f81b828281518110612a1257612a12614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506001016129db565b505f5b82811015612ac5577f300000000000000000000000000000000000000000000000000000000000000082612a7f8389614de1565b81518110612a8f57612a8f614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a4b565b508281604051602001612ad9929190614df4565b6040516020818303038152906040529a5050505050505050505050610684565b5f612b0383614c45565b905080841115612d1a575f612b188286614da1565b90505f612b26866001614de1565b67ffffffffffffffff811115612b3e57612b3e614891565b6040519080825280601f01601f191660200182016040528015612b68576020820181803683370190505b5090505f5b82811015612bda57898181518110612b8757612b87614db4565b602001015160f81c60f81b828281518110612ba457612ba4614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612b6d565b507f2e00000000000000000000000000000000000000000000000000000000000000818381518110612c0e57612c0e614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b83811015612ce55789612c518285614de1565b81518110612c6157612c61614db4565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612c95866001614de1565b612c9f9190614de1565b81518110612caf57612caf614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612c3e565b508381604051602001612cf9929190614df4565b6040516020818303038152906040529b505050505050505050505050610684565b5f612d258583614da1565b90505f85612d34836002614de1565b612d3e9190614de1565b67ffffffffffffffff811115612d5657612d56614891565b6040519080825280601f01601f191660200182016040528015612d80576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110612db657612db6614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f2e0000000000000000000000000000000000000000000000000000000000000081600181518110612e1857612e18614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b82811015612ec3577f300000000000000000000000000000000000000000000000000000000000000082612e7d836002614de1565b81518110612e8d57612e8d614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612e48565b505f5b86811015612ce557898181518110612ee057612ee0614db4565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612f14866002614de1565b612f1e9190614de1565b81518110612f2e57612f2e614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612ec6565b5f805f805f612f738787613884565b92509250925080612fba576040517fc471796600000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016108ce565b50909590945092505050565b5f805f612fd38585613763565b915091508061146c576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b5f8061302484846131ea565b90945092506130358686868661309e565b9150915094509492505050565b5f805f613050868686611474565b9150915080613095576040517f05e4767800000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b50949350505050565b5f80851584151780156130ca57865f036130be57848492509250506123dd565b868692509250506123dd565b6130d48787613b25565b90975095506130e38585613b25565b9095509350858413156130f7579395929492935b838603604c8111156131105787879350935050506123dd565b80600a0a8681613122576131226149b0565b0595505086850180881860ff90811c151589881890911c151680156131bd57877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036131a4576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a9052602481018990526044016108ce565b600a9687900596909805860197600197909701966131c1565b8198505b5096979596505050505050565b5f805f6131dd87878787614130565b1315979650505050505050565b5f807f80000000000000000000000000000000000000000000000000000000000000008403613283577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303613276576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101859052602481018490526044016108ce565b600a840593508260010192505b50505f9190910391565b5f805f61329c87878787614130565b1215979650505050505050565b5f805f6132b887878787614130565b12979650505050505050565b5f8281806132d983866520000000000061434c565b925085831415836132f381886703ff00000000000061434c565b945080850361332d57507f34bd20690000000000000000000000000000000000000000000000000000000094505f925082915061375a9050565b5f806133398a88614375565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613377575095505f935083925061375a915050565b86519095506540000000000060015f9290921a9190911b16151588871016915050801561360657506001909301925f846133ba81896703ff00000000000061434c565b95508086036133f557507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f935083925061375a915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613464577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016133f7565b8181146134bb575f806134778484614375565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156134b7575097505f955085945061375a9350505050565b9350505b5f8312156134f657507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f945084935061375a92505050565b831561350257825f0392505b80820394505f85131561354257507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f945084935061375a92505050565b855f0361355157829550613603565b5f859003604381111561359257507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b600a0a8681025f888383816135a9576135a96149b0565b0514159050601b82900b82141581806135bf5750805b156135fb57507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f985088975061375a9650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b16151587861016801561374b5760019095019485613646818a6520000000000061434c565b96508661365c818b6703ff00000000000061434c565b975080880361369957507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b505f806136a6838a614375565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156136e6575097505f955085945061375a9350505050565b9250508482015f831380156136fa57508581125b8061370e57505f8312801561370e57508581135b1561374757507fd556b1110000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b9450505b845f03613756575f93505b5050505b92959194509250565b5f601b83900b83148383826137c7577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156137a757620186a0860595506005850194505b8586601b0b146137c257600a860595508460010194506137a7565b6137dd565b855f036137dd57505f9250600191506106ad9050565b848560030b14613839575f8512156137fd57505f92508291506106ad9050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f61387887878787614130565b13979650505050505050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156138cf57600a860460018201600a88065f14935093509350506138d9565b8593509150600190505b9250925092565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0361391857508391505f905060016138d9565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8412156139a6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb084121561397757505f91505082151560016138d9565b5f846004015f03600a0a90505f818781613993576139936149b0565b05945050808402861415925090506138d9565b5f84126139bb57505f915081905060016138d9565b50505060048101600a0a82025f60016138d9565b5f808060646139e1600a612328614c75565b6139ee600a612328614c75565b6139f9906002614e02565b613a04906001614de1565b613a0e9190614de1565b613a189190614de1565b9050613a5c565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b613a67858288613a1f565b92508315611b1b57613a7d600186018288613a1f565b915050935093915050565b5f80888803613a9b575083905081613b19565b5f805f80613aab8c8b8f8d613018565b915091505f80613abd8a8a8d8c613018565b91509150613acd84848484611ca3565b8096508197505050505050505f80613ae78b8b8f8d613018565b915091505f80613af986868686611dc2565b915091505f80613b0b84848f8e61309e565b909a50985050505050505050505b97509795505050505050565b5f805f805f613b348787613e8f565b92509250925080612fba576040517f05e51ecb00000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f80613b8a600a612328614c75565b613b95906002614e02565b613ba0906001614de1565b90505f613bb0600a612328614c75565b90506002600a8504026001015f8052600281601e883c505f51617fff81169350618000811615613bdf57918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f80821215613c5f577f80000000000000000000000000000000000000000000000000000000000000008203613c5957507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b919050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f613cb08686613c68565b91509150815f03613cd457838181613cca57613cca6149b0565b0492505050610695565b838210613d1e576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016108ce565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215613e52577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613e3f57613de77f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001614de1565b8403613e1757507f80000000000000000000000000000000000000000000000000000000000000009050816123dd565b613e22600a85614c75565b613e2b90614c45565b613e36846001614a30565b915091506123dd565b613e4884614c45565b83915091506123dd565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613e8557613e2b600a85614c75565b50829050816123dd565b5f805f845f03613ea757505f915081905060016138d9565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f036140bb576f4b3b4ca85a86c47a098a2240000000008505158015613f1057507f80000000000000000000000000000000000000000000000000000000000000268412155b15613f31576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a000000000000008505158015613f7957507f80000000000000000000000000000000000000000000000000000000000000138412155b15613f9257678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008505158015613fde57507f800000000000000000000000000000000000000000000000000000000000000a8412155b15613ff4576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000850515801561404357507f80000000000000000000000000000000000000000000000000000000000000028412155b1561405957606485029450600284039350613ff4565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085051580156140a957507f80000000000000000000000000000000000000000000000000000000000000018412155b156140bb57600a850294506001840393505b600a808602908105861480156140f157507f80000000000000000000000000000000000000000000000000000000000000018512155b15614100578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f808515841517818712828612181785841417801561415557868592509250506123dd565b505f85841315614169575092949193919260015b8386035f8112604c821317801561419c57821561418e575f89945094505050506123dd565b885f945094505050506123dd565b600a82900a8981028a8282816141b4576141b46149b0565b05146141e05784156141d0575f8b9650965050505050506123dd565b8a5f9650965050505050506123dd565b84156141f55788965094506123dd9350505050565b95508794506123dd9350505050565b60605f82126142215760405180602001604052805f815250614258565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b61426960ff84901d80850118614290565b60405160200161427a929190614df4565b6040516020818303038152906040529050919050565b60605f61429c8361449f565b60010190505f8167ffffffffffffffff8111156142bb576142bb614891565b6040519080825280601f01601f1916602001820160405280156142e5576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846142ef57509392505050565b5f5b5f82600186515f1a1b1611838510161561436d5760018401935061434e565b509192915050565b81515f90819065200000000000600191831a9190911b161515838510168085019082806143a28488614580565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156143dd575093505f92506106ad915050565b825f03614440577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111614411575f614433565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b955093506106ad92505050565b7f8000000000000000000000000000000000000000000000000000000000000000811161446d575f61448f565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106144e7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310614513576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061453157662386f26fc10000830492506010015b6305f5e1008310614549576305f5e100830492506008015b612710831061455d57612710830492506004015b6064831061456f576064830492506002015b600a83106106845760010192915050565b5f808284106145b357507f34bd20690000000000000000000000000000000000000000000000000000000090505f6106ad565b835f036145ec576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b8782101580156146245750604d83105b1561466757815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a8590030201614614565b87821061478d5781515f1a84900360018111156146af57507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b600a84900a81028281018311156146f257507f0fdc26350000000000000000000000000000000000000000000000000000000096505f95506106ad945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b87821061478d5781515f1a6030811461476257507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091019061471e565b5f9890975095505050505050565b5f602082840312156147ab575f80fd5b5035919050565b5f80604083850312156147c3575f80fd5b50508035926020909101359150565b803560ff81168114613c63575f80fd5b5f80604083850312156147f3575f80fd5b82359150614803602084016147d2565b90509250929050565b5f806040838503121561481d575f80fd5b8235915060208301358015158114614833575f80fd5b809150509250929050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f602082840312156148ce575f80fd5b813567ffffffffffffffff808211156148e5575f80fd5b818401915084601f8301126148f8575f80fd5b81358181111561490a5761490a614891565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561495057614950614891565b81604052828152876020848701011115614968575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215614999575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181035f831280158383131683831282161715614a2957614a296149dd565b5092915050565b8082018281125f831280158216821582161715614a4f57614a4f6149dd565b505092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615614a8e57614a8e6149dd565b8181058314821517610684576106846149dd565b600181815b80851115614afb57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614ae157614ae16149dd565b80851615614aee57918102915b93841c9390800290614aa7565b509250929050565b5f82614b1157506001610684565b81614b1d57505f610684565b8160018114614b335760028114614b3d57614b59565b6001915050610684565b60ff841115614b4e57614b4e6149dd565b50506001821b610684565b5060208310610133831016604e8410600b8410161715614b7c575081810a610684565b614b868383614aa2565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614bb857614bb86149dd565b029392505050565b5f6106958383614b03565b5f82614bd957614bd96149b0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614c2d57614c2d6149dd565b500590565b5f82614c4057614c406149b0565b500790565b5f7f80000000000000000000000000000000000000000000000000000000000000008203613c5957613c596149dd565b5f82614c8357614c836149b0565b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614cb857614cb86149dd565b5060010190565b5f81518060208401855e5f93019283525090919050565b5f614ce18284614cbf565b7f300000000000000000000000000000000000000000000000000000000000000081526001019392505050565b7f2e0000000000000000000000000000000000000000000000000000000000000081525f614d48614d426001840186614cbf565b84614cbf565b949350505050565b7f650000000000000000000000000000000000000000000000000000000000000081525f6106956001830184614cbf565b5f610a29614d42614d9b614d95858a614cbf565b88614cbf565b86614cbf565b81810381811115610684576106846149dd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b80820180821115610684576106846149dd565b5f614d48614d428386614cbf565b8082028115828204841417610684576106846149dd56"; + hex"6080604052348015600e575f80fd5b5060156019565b60b8565b73c51a14251b0dcf0ae24a96b7153991378938f5f53f7f2573004ac3a9ee7fc8d73654d76386f1b6b99e34cdf86a689c4691e47143420f811460b557604051630912d0ff60e31b815273c51a14251b0dcf0ae24a96b7153991378938f5f560048201527f2573004ac3a9ee7fc8d73654d76386f1b6b99e34cdf86a689c4691e47143420f60248201526044810182905260640160405180910390fd5b50565b615112806100c55f395ff3fe608060405234801561000f575f80fd5b50600436106102b7575f3560e01c806381f7e2f511610171578063cde72ef3116100d2578063dd64691711610088578063e5526ecd1161006e578063e5526ecd1461065b578063e75f991f1461066e578063ffae15ba14610681575f80fd5b8063dd64691714610635578063e0db588814610648575f80fd5b8063d1de592a116100b8578063d1de592a146105e8578063d35273a7146105fb578063d3d6ffa814610622575f80fd5b8063cde72ef3146105af578063d102b4d3146105d5575f80fd5b8063a19684b711610127578063bc1b392d1161010d578063bc1b392d14610538578063bc62d8d81461053e578063cb09682b14610589575f80fd5b8063a19684b7146104ff578063a90d041a14610525575f80fd5b806396ce1ec71161015757806396ce1ec7146104b55780639b4afd99146104c8578063a100a3d9146104ec575f80fd5b806381f7e2f51461048f5780638dc29807146104a2575f80fd5b8063371493ce1161021b5780635ca0e7a4116101d1578063719cd99d116101b7578063719cd99d1461045657806373bfb2831461046957806381a822721461047c575f80fd5b80635ca0e7a41461041d578063602c35fc14610430575f80fd5b806341aa00801161020157806341aa0080146103e45780634eb7cd34146103f75780635b23771d1461040a575f80fd5b8063371493ce146103b15780633b3bd868146103d1575f80fd5b806325388350116102705780633004fa41116102565780633004fa4114610368578063302974001461037b5780633447c0301461038e575f80fd5b8063253883501461034257806328fa1f0114610355575f80fd5b80630b6429bc116102a05780630b6429bc146102f4578063146e82ad1461031c5780631ee62f111461032f575f80fd5b806304327dc5146102bb578063078b665b146102e1575b5f80fd5b6102ce6102c9366004614a65565b6106a7565b6040519081526020015b60405180910390f35b6102ce6102ef366004614a7c565b6106b7565b610307610302366004614aac565b6106c9565b604080519283529015156020830152016102d8565b6102ce61032a366004614a65565b6106e1565b6102ce61033d366004614a65565b610700565b6102ce610350366004614a65565b61071f565b6102ce610363366004614a65565b61073e565b6102ce610376366004614a7c565b610748565b6102ce610389366004614a7c565b610768565b6103a161039c366004614a7c565b610773565b60405190151581526020016102d8565b6103c46103bf366004614ad6565b61077e565b6040516102d89190614b08565b6102ce6103df366004614aac565b61078a565b6102ce6103f2366004614a7c565b610795565b6103a1610405366004614b5b565b6107a0565b6102ce610418366004614aac565b6107b6565b6102ce61042b366004614a65565b6107c1565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102ce565b6102ce610464366004614a65565b6107cb565b6103a1610477366004614a7c565b6107d5565b6102ce61048a366004614a65565b6107e0565b6103a161049d366004614a7c565b6107ea565b6103a16104b0366004614a7c565b6107f5565b6102ce6104c3366004614a7c565b610800565b6102ce7c090000000000000000000000000000000000000000000000000000000181565b6103c46104fa366004614a65565b61080b565b7f80000000000000000000000000000000000000000000000000000000000000016102ce565b6102ce610533366004614a7c565b610855565b5f6102ce565b61055161054c366004614bb7565b610860565b604080517fffffffff0000000000000000000000000000000000000000000000000000000090931683526020830191909152016102d8565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff6102ce565b7f7fffffff800000000000000000000000000000000000000000000000000000006102ce565b6103a16105e3366004614a7c565b610879565b6102ce6105f6366004614a7c565b610884565b6102ce7ffffffffc0000000000000000000000000000000000000000000000000000000181565b6102ce610630366004614a65565b61088f565b6103a1610643366004614a65565b610899565b6102ce610656366004614a65565b6108bf565b6103c4610669366004614c80565b6108c9565b61030761067c366004614aac565b610949565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc6102ce565b5f6106b182610955565b92915050565b5f6106c28383610997565b9392505050565b5f806106d584846109b3565b915091505b9250929050565b5f6106b18273c51a14251b0dcf0ae24a96b7153991378938f5f56109f4565b5f6106b18273c51a14251b0dcf0ae24a96b7153991378938f5f5610a20565b5f6106b18273c51a14251b0dcf0ae24a96b7153991378938f5f5610a6d565b5f6106b182610aa0565b5f6106c2838373c51a14251b0dcf0ae24a96b7153991378938f5f5610ae1565b5f6106c28383610d3b565b5f6106c28383610d9d565b60606106c28383610deb565b5f6106c28383610e7e565b5f6106c28383610e99565b5f6107ad85858585610ede565b95945050505050565b5f6106c28383610f24565b5f6106b182610f57565b5f6106b18261100d565b5f6106c283836110b9565b5f6106b1826110fc565b5f6106c28383611141565b5f6106c28383611184565b5f6106c283836111c7565b60606106b1827ffffffffc000000000000000000000000000000000000000000000000000000017c09000000000000000000000000000000000000000000000000000000016108c9565b5f6106c2838361120c565b5f805f8061086d85611217565b90969095509350505050565b5f6106c28383611305565b5f6106c28383611348565b5f6106b18261138d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216156106b1565b5f6106b1826113bf565b60606108d58383611305565b61091a576040517f3be5bf9400000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044015b60405180910390fd5b5f610924856110fc565b90506107ad856109348387611305565b8061094457506109448386611184565b610deb565b5f806106d58484611400565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d6109878282611440565b90925090505f6107ad838361148e565b5f6109a28383611184565b6109ac57816106c2565b5090919050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6109e78282876114f4565b9350935050509250929050565b5f6106c2837fffffffff0000000000000000000000000000000000000000000000000000000584610ae1565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a538483836116fe565b90925090505f610a63838361148e565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a5384838361186f565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82610ad38383611ba4565b9150505f610a63828461148e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516610b1e5750600191506106c29050565b5f8213610bb757815f03610b7b57610b36855f611305565b15610b70576040517f8be8297200000000000000000000000000000000000000000000000000000000815260048101869052602401610911565b505f91506106c29050565b6040517fcceba0f10000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610911565b610bc2856001610d9d565b8015610bd35750610bd3865f611184565b15610be25785925050506106c2565b610bec855f611305565b15610c1557610c0c610bfd87610955565b610c068761138d565b86610ae1565b925050506106c2565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80610c488484611ba4565b915091505f610c5883855f611c0c565b905060015f8080610c8f8f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510610cd65784600116600103610cb957610cb384848484611d23565b90945092505b600185901c9450610ccc82828484611d23565b9092509050610c94565b5f80610ce38f8e8e61186f565b91509150610cf382828a8d611d23565b9092509050610d038f83836116fe565b9092509050610d1482828888611d23565b90925090505f610d24838361148e565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d8086868686611e42565b915091505f610d8f838361148e565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de084848484612466565b979650505050505050565b60607bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d5f829003610e5b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250925050506106b1565b8315610e7457610e6b828261247d565b925050506106b1565b6107ad82826127ba565b5f805f610e8b8585612fe4565b915091506107ad8282613046565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d8086868686613098565b5f610ee985856130c2565b5f80610ef5858561318e565b915091505f80610f07898989896131e5565b91509150610f178484848461327f565b9998505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d6107ad82828661329b565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610f8e57509192915050565b5f80610f9a8484611ba4565b915091505f84128015610fac57508015155b1561100257610ffd82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613098565b935091505b5f610de0838561148e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82811261104457509192915050565b5f806110508484611ba4565b91509150805f03611065575093949350505050565b5f81131561100257610ffd82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb46132f7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de084848484613427565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82821215611136576109878282613443565b5f6107ad838361148e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de08484848461327f565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de0848484846134e6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d8086868686611d23565b5f6109a28383611305565b80515f908190602084810191850101828080806112348686613501565b929650909450925090507fffffffff0000000000000000000000000000000000000000000000000000000084165f036112f6578483036112c6575f8061127a84846139a0565b91509150806112b557507f32b8b8be000000000000000000000000000000000000000000000000000000009a5f9a5098505050505050505050565b505f9a909950975050505050505050565b507fad384e8700000000000000000000000000000000000000000000000000000000985f98509650505050505050565b5091975f975095505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de084848484613aa6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d80868686866132f7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d6109878282613443565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d826113f28383611ba4565b5090505f610a63828461148e565b5f805f805f61140f8787613ac1565b9250925092505f8061142185856139a0565b91509150818380156114305750815b9650965050505050509250929050565b5f806106d57f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686611e42565b5f805f61149b85856139a0565b91509150801580156114ab575081155b156114ec576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610911565b509392505050565b5f805f85121561153a576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610911565b845f0361154c57505f905060016116f6565b8460ff8416850185811215611597576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610911565b5f805f831215611601577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb38312156115d8575f8095509550505050506116f6565b825f03600a0a91508184816115ef576115ef614ca9565b04955050840290911491506116f69050565b5f8313156116eb57604d831315611657576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610911565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8161168c5761168c614ca9565b048411156116d9576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610911565b50919091029250600191506116f69050565b509193506001925050505b935093915050565b5f805f84121561173a576117128484613443565b90945092506117228585856116fe565b90945092506117318484611440565b915091506116f6565b5f806117468686611ba4565b9092509050845f80806117598585613b1d565b9194509250905061270d612710611771600182614d03565b8514611788576117828d8686613c0c565b90925090505b8315611813575f61179a866001614d29565b90505b8084858302816117af576117af614ca9565b05146117c657600a84059350600a8805975061179d565b6118076117d38588614d50565b896117de8785614d50565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc613cc5565b909d509b5061183a9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b50505050508661184b84835f611c0c565b611856886001614d29565b6118609190614d29565b94509450505050935093915050565b5f80838361187d8282613d62565b90965094505f86136118fe57855f036118c2576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610911565b5050837f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000000361193c5761193283604c614d29565b5f915091506116f6565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000008412158061198b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb56119ad565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412611b68575f805f805f856119c657604b6119c9565b604c5b6119d3908a614d29565b90505f8087611a00577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000611a21565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c81611a5357611a53614ca9565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050611a8c8c82613db8565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414611b18576123278114611af357611ace8c82600101613db8565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002611b15565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50611b48838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613cc5565b909a509850611b598a8a835f6132f7565b975097505050505050506116f6565b611b728585611440565b9095509350611b8286868661186f565b9095509350611b918585613443565b92509250506116f6565b50935093915050565b5f805f8312611bb757508290505f6106da565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4831215611be957505f9050826106da565b5f839003600a0a808581611bff57611bff614ca9565b0794859003959350505050565b5f818303611c1b5750826106c2565b82821315611c5e57828203604c811380611c3557505f8113155b15611c43575f9150506106c2565b80600a0a8581611c5557611c55614ca9565b059150506106c2565b818303604c811380611c7057505f8113155b15611cb8576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260448101849052606401610911565b600a81900a85810286828281611cd057611cd0614ca9565b0514611d19576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101869052606401610911565b92506106c2915050565b5f8085158415178015611d3b575f92505f9150611e38565b611d458487614d29565b91505f611d5188613e3f565b90505f611d5d87613e3f565b90505f611d6a8383613ea5565b5090505f6f0785ee10d5da46d900f436a000000000821115611d9f576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115611dc057670de0b6b3a7640000820491506012015b633b9aca00821115611dd957633b9aca00820491506009015b612710821115611dee57612710820491506004015b8115611e0257600a82049150600101611dee565b611e0c8187614d29565b9550611e2e8b8a611e288787611e2387600a614eb9565b613ee0565b89613fc5565b9097509550505050505b5094509492505050565b5f80835f03611e87576040517f7a97930f0000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610911565b855f03611e9857505f90508061245d565b5f805f80611ea68a8a6140cc565b919b5099509150611eb788886140cc565b919950975090505f611ec88b613e3f565b90505f611ed48a613e3f565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c818310156122f1578415611f3257507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b6122b0565b6f4b3b4ca85a86c47a098a22400000000083101561205e57678ac7230489e80000831015611fc2576402540be400831015611f9057620186a0831015611f805750620186a090506005612239565b506402540be4009050600a612239565b655af3107a4000831015611faf5750655af3107a40009050600e612239565b50678ac7230489e8000090506013612239565b6b204fce5e3e250261100000008310156120145769152d02c7e14af6800000831015611ffd575069152d02c7e14af680000090506017612239565b506b204fce5e3e250261100000009050601c612239565b6d314dc6448d9338c15b0a0000000083101561204357506d314dc6448d9338c15b0a0000000090506021612239565b506f4b3b4ca85a86c47a098a22400000000090506026612239565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156121565773af298d050e4395d69670b12b7f410000000000008310156120f1577172cb5bd86321e38cb6ce6682e800000000008310156120d257507172cb5bd86321e38cb6ce6682e800000000009050602b612239565b5073af298d050e4395d69670b12b7f4100000000000090506030612239565b76010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000831015612132575076010b46c6cdd6e3e0828f4db456ff0c8ea000000000000090506035612239565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a612239565b7c03b58e88c75313ec9d329eaaa18fb92f75215b171000000000000000008310156121ec577a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000008310156121c457507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f612239565b507c03b58e88c75313ec9d329eaaa18fb92f75215b1710000000000000000090506044612239565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca00000000000000000083101561223957507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b81831161226d57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01612239565b815f036122b0576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c9052604401610911565b856122f1576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e9052604401610911565b807f8000000000000000000000000000000000000000000000000000000000000000018d1261232457808d039c50612397565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f81131561239757807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b1361238457998a0199612397565b5f8099509950505050505050505061245d565b5f808e1280156123a657505f8c135b156123e3577f80000000000000000000000000000000000000000000000000000000000000008e01808d136123db575f6123df565b808d035b9150505b8b818f010397506124008f8e6123fa888789613ee0565b8b613fc5565b90995097505f81131561244a57604c81131561242a575f809a509a5050505050505050505061245d565b80600a0a898161243c5761243c614ca9565b059850885f0361244a575f97505b5096985094965061245d95505050505050565b94509492505050565b5f6124738585858561436d565b1495945050505050565b60608161248a8482613d62565b90945092505f806124bb7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000087614ec4565b156124eb57507f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000009050604c612512565b507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b5b5f61251d8388614ec4565b90505f61252a8489614f2b565b90505f808312156125445750600161254183614f3e565b92505b5f82121561255b5750600161255882614f3e565b91505b60408051602081019091525f81528215612664575f8061257c600a89614f6e565b90505b6125898186614ec4565b5f036125ae5761259a600a82614f6e565b9050816125a681614f81565b92505061257f565b60408051602081019091525f8082525b8381101561260f57816040516020016125d79190614fcf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905291506001016125be565b505b61261c600a87614f2b565b5f036126345761262d600a87614ec4565b9550612611565b8061263e87614441565b60405160200161264f929190615007565b60405160208183030381529060405293505050505b5f61266e85614441565b90505f61267b878c614d29565b9050637fffffff8113806126ae57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000081125b156126e8576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018a9052602401610911565b5f811561271c576126f882614441565b6040516020016127089190615049565b60405160208183030381529060405261272c565b60405180602001604052805f8152505b90505f856127485760405180602001604052805f81525061277f565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b905080848684604051602001612798949392919061507a565b6040516020818303038152906040529b50505050505050505050505092915050565b60606103e88213806127d557506127d26103e8614f3e565b82125b1561280f576040517fe44c72b000000000000000000000000000000000000000000000000000000000815260048101839052602401610911565b5f80841290811561282a5761282385614f3e565b905061282d565b50835b5f8413156128f0578360448110612873576040517fe44c72b000000000000000000000000000000000000000000000000000000000815260048101869052602401610911565b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5b828110156128af576128a5600a83614f6e565b9150600101612892565b50808311156128ed576040517fe44c72b000000000000000000000000000000000000000000000000000000000815260048101879052602401610911565b50505b5f6128fa826144cd565b80519091505f5b818110801561297d5750828161291860018561509a565b612922919061509a565b81518110612932576129326150ad565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f3000000000000000000000000000000000000000000000000000000000000000145b15612994578061298c81614f81565b915050612901565b5f61299f828461509a565b90505f6129ac838a614d29565b90505f876129c85760405180602001604052805f8152506129ff565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90505f8212612b7957815f612a1482866150da565b67ffffffffffffffff811115612a2c57612a2c614b8a565b6040519080825280601f01601f191660200182016040528015612a56576020820181803683370190505b5090505f5b85811015612ac857888181518110612a7557612a756150ad565b602001015160f81c60f81b828281518110612a9257612a926150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a5b565b505f5b82811015612b45577f300000000000000000000000000000000000000000000000000000000000000082612aff83896150da565b81518110612b0f57612b0f6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612acb565b508281604051602001612b599291906150ed565b6040516020818303038152906040529a50505050505050505050506106b1565b5f612b8383614f3e565b905080841115612d9a575f612b98828661509a565b90505f612ba68660016150da565b67ffffffffffffffff811115612bbe57612bbe614b8a565b6040519080825280601f01601f191660200182016040528015612be8576020820181803683370190505b5090505f5b82811015612c5a57898181518110612c0757612c076150ad565b602001015160f81c60f81b828281518110612c2457612c246150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612bed565b507f2e00000000000000000000000000000000000000000000000000000000000000818381518110612c8e57612c8e6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b83811015612d655789612cd182856150da565b81518110612ce157612ce16150ad565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612d158660016150da565b612d1f91906150da565b81518110612d2f57612d2f6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612cbe565b508381604051602001612d799291906150ed565b6040516020818303038152906040529b5050505050505050505050506106b1565b5f612da5858361509a565b90505f85612db48360026150da565b612dbe91906150da565b67ffffffffffffffff811115612dd657612dd6614b8a565b6040519080825280601f01601f191660200182016040528015612e00576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110612e3657612e366150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f2e0000000000000000000000000000000000000000000000000000000000000081600181518110612e9857612e986150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b82811015612f43577f300000000000000000000000000000000000000000000000000000000000000082612efd8360026150da565b81518110612f0d57612f0d6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612ec8565b505f5b86811015612d6557898181518110612f6057612f606150ad565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612f948660026150da565b612f9e91906150da565b81518110612fae57612fae6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612f46565b5f805f805f612ff38787613ac1565b9250925092508061303a576040517fc47179660000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610911565b50909590945092505050565b5f805f61305385856139a0565b91509150806114ec576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610911565b5f806130a48484613443565b90945092506130b5868686866132f7565b9150915094509492505050565b5f6130cd5f80613046565b90506130d98382611305565b806130e957506130e98282611305565b1561312a576040517fbd559d600000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610911565b6131348382611184565b15801561314857506131468282611184565b155b15613189576040517fe9b2d4420000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610911565b505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b90810b9160e087811d9291871690910b9086901d84806131d484848888613098565b909b909a5098505050505050505050565b5f805f805f806131f58888614589565b90925090507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8916601b0b60e08a901d61322d82828686611d23565b90965094505050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8916601b0b905060e089901d5f8061326c848488886145db565b909d909c509a5050505050505050505050565b5f805f61328e8787878761436d565b1215979650505050505050565b5f805f6132a98686866114f4565b91509150806132ee576040517f05e476780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610911565b50949350505050565b5f808515841517801561332357865f03613317578484925092505061245d565b8686925092505061245d565b61332d8787613d62565b909750955061333c8585613d62565b909550935085841315613350579395929492935b838603604c81111561336957878793509350505061245d565b80600a0a868161337b5761337b614ca9565b0595505086850180881860ff90811c151589881890911c1516801561341657877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036133fd576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a905260248101899052604401610911565b600a96879005969098058601976001979097019661341a565b8198505b5096979596505050505050565b5f805f6134368787878761436d565b1315979650505050505050565b5f807f800000000000000000000000000000000000000000000000000000000000000084036134dc577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83036134cf576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401610911565b600a840593508260010192505b50505f9190910391565b5f805f6134f58787878761436d565b12979650505050505050565b5f8281806135168386652000000000006145ff565b9250858314158361353081886703ff0000000000006145ff565b945080850361356a57507f34bd20690000000000000000000000000000000000000000000000000000000094505f92508291506139979050565b5f806135768a88614628565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156135b4575095505f9350839250613997915050565b86519095506540000000000060015f9290921a9190911b16151588871016915050801561384357506001909301925f846135f781896703ff0000000000006145ff565b955080860361363257507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f9350839250613997915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b6601000000000000161515166001036136a1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613634565b8181146136f8575f806136b48484614628565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156136f4575097505f95508594506139979350505050565b9350505b5f83121561373357507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f945084935061399792505050565b831561373f57825f0392505b80820394505f85131561377f57507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f945084935061399792505050565b855f0361378e57829550613840565b5f85900360438111156137cf57507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f95508594506139979350505050565b600a0a8681025f888383816137e6576137e6614ca9565b0514159050601b82900b82141581806137fc5750805b1561383857507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f98508897506139979650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b1615158786101680156139885760019095019485613883818a652000000000006145ff565b965086613899818b6703ff0000000000006145ff565b97508088036138d657507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f95508594506139979350505050565b505f806138e3838a614628565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613923575097505f95508594506139979350505050565b9250508482015f8313801561393757508581125b8061394b57505f8312801561394b57508581135b1561398457507fd556b1110000000000000000000000000000000000000000000000000000000097505f95508594506139979350505050565b9450505b845f03613993575f93505b5050505b92959194509250565b5f601b83900b8314838382613a04577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156139e457620186a0860595506005850194505b8586601b0b146139ff57600a860595508460010194506139e4565b613a1a565b855f03613a1a57505f9250600191506106da9050565b848560030b14613a76575f851215613a3a57505f92508291506106da9050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610911565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f613ab58787878761436d565b13979650505050505050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115613b0c57600a860460018201600a88065f1493509350935050613b16565b8593509150600190505b9250925092565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc03613b5557508391505f90506001613b16565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc841215613be3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0841215613bb457505f9150508215156001613b16565b5f846004015f03600a0a90505f818781613bd057613bd0614ca9565b0594505080840286141592509050613b16565b5f8412613bf857505f91508190506001613b16565b50505060048101600a0a82025f6001613b16565b5f80806064613c1e600a612328614f6e565b613c2b600a612328614f6e565b613c369060026150fb565b613c419060016150da565b613c4b91906150da565b613c5591906150da565b9050613c99565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b613ca4858288613c5c565b92508315611b9b57613cba600186018288613c5c565b915050935093915050565b5f80888803613cd8575083905081613d56565b5f805f80613ce88c8b8f8d613098565b915091505f80613cfa8a8a8d8c613098565b91509150613d0a84848484611d23565b8096508197505050505050505f80613d248b8b8f8d613098565b915091505f80613d3686868686611e42565b915091505f80613d4884848f8e6132f7565b909a50985050505050505050505b97509795505050505050565b5f805f805f613d7187876140cc565b9250925092508061303a576040517f05e51ecb0000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610911565b5f80613dc7600a612328614f6e565b613dd29060026150fb565b613ddd9060016150da565b90505f613ded600a612328614f6e565b90506002600a8504026001015f8052600281601e883c505f51617fff81169350618000811615613e1c57918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f80821215613e9c577f80000000000000000000000000000000000000000000000000000000000000008203613e9657507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b919050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f613eed8686613ea5565b91509150815f03613f1157838181613f0757613f07614ca9565b04925050506106c2565b838210613f5b576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610911565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f858718121561408f577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84111561407c576140247f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60016150da565b840361405457507f800000000000000000000000000000000000000000000000000000000000000090508161245d565b61405f600a85614f6e565b61406890614f3e565b614073846001614d29565b9150915061245d565b61408584614f3e565b839150915061245d565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8411156140c257614068600a85614f6e565b508290508161245d565b5f805f845f036140e457505f91508190506001613b16565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f036142f8576f4b3b4ca85a86c47a098a224000000000850515801561414d57507f80000000000000000000000000000000000000000000000000000000000000268412155b1561416e576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a0000000000000085051580156141b657507f80000000000000000000000000000000000000000000000000000000000000138412155b156141cf57678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000850515801561421b57507f800000000000000000000000000000000000000000000000000000000000000a8412155b15614231576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000850515801561428057507f80000000000000000000000000000000000000000000000000000000000000028412155b1561429657606485029450600284039350614231565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085051580156142e657507f80000000000000000000000000000000000000000000000000000000000000018412155b156142f857600a850294506001840393505b600a8086029081058614801561432e57507f80000000000000000000000000000000000000000000000000000000000000018512155b1561433d578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f8085158415178187128286121817858414178015614392578685925092505061245d565b505f858413156143a6575092949193919260015b8386035f8112604c82131780156143d95782156143cb575f899450945050505061245d565b885f9450945050505061245d565b600a82900a8981028a8282816143f1576143f1614ca9565b051461441d57841561440d575f8b96509650505050505061245d565b8a5f96509650505050505061245d565b841561443257889650945061245d9350505050565b955087945061245d9350505050565b60605f821261445e5760405180602001604052805f815250614495565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b6144a660ff84901d808501186144cd565b6040516020016144b79291906150ed565b6040516020818303038152906040529050919050565b60605f6144d983614752565b60010190505f8167ffffffffffffffff8111156144f8576144f8614b8a565b6040519080825280601f01601f191660200182016040528015614522576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461452c57509392505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b90810b9160e087811d9291871690910b9086901d84806131d46145cf87614833565b866145d987614833565b865b5f806145e98686868661327f565b6145f45785856130b5565b509194909350915050565b5f5b5f82600186515f1a1b1611838510161561462057600184019350614601565b509192915050565b81515f90819065200000000000600191831a9190911b16151583851016808501908280614655848861484a565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615614690575093505f92506106da915050565b825f036146f3577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81116146c4575f6146e6565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b955093506106da92505050565b7f80000000000000000000000000000000000000000000000000000000000000008111614720575f614742565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061479a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106147c6576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106147e457662386f26fc10000830492506010015b6305f5e10083106147fc576305f5e100830492506008015b612710831061481057612710830492506004015b60648310614822576064830492506002015b600a83106106b15760010192915050565b5f80821261484157816106b1565b6106b182614f3e565b5f8082841061487d57507f34bd20690000000000000000000000000000000000000000000000000000000090505f6106da565b835f036148b6576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b8782101580156148ee5750604d83105b1561493157815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a85900302016148de565b878210614a575781515f1a849003600181111561497957507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106da9350505050565b600a84900a81028281018311156149bc57507f0fdc26350000000000000000000000000000000000000000000000000000000096505f95506106da945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b878210614a575781515f1a60308114614a2c57507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106da9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101906149e8565b5f9890975095505050505050565b5f60208284031215614a75575f80fd5b5035919050565b5f8060408385031215614a8d575f80fd5b50508035926020909101359150565b803560ff81168114613ea0575f80fd5b5f8060408385031215614abd575f80fd5b82359150614acd60208401614a9c565b90509250929050565b5f8060408385031215614ae7575f80fd5b8235915060208301358015158114614afd575f80fd5b809150509250929050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f805f8060808587031215614b6e575f80fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215614bc7575f80fd5b813567ffffffffffffffff80821115614bde575f80fd5b818401915084601f830112614bf1575f80fd5b813581811115614c0357614c03614b8a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715614c4957614c49614b8a565b81604052828152876020848701011115614c61575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215614c92575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181035f831280158383131683831282161715614d2257614d22614cd6565b5092915050565b8082018281125f831280158216821582161715614d4857614d48614cd6565b505092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615614d8757614d87614cd6565b81810583148215176106b1576106b1614cd6565b600181815b80851115614df457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614dda57614dda614cd6565b80851615614de757918102915b93841c9390800290614da0565b509250929050565b5f82614e0a575060016106b1565b81614e1657505f6106b1565b8160018114614e2c5760028114614e3657614e52565b60019150506106b1565b60ff841115614e4757614e47614cd6565b50506001821b6106b1565b5060208310610133831016604e8410600b8410161715614e75575081810a6106b1565b614e7f8383614d9b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614eb157614eb1614cd6565b029392505050565b5f6106c28383614dfc565b5f82614ed257614ed2614ca9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614f2657614f26614cd6565b500590565b5f82614f3957614f39614ca9565b500790565b5f7f80000000000000000000000000000000000000000000000000000000000000008203613e9657613e96614cd6565b5f82614f7c57614f7c614ca9565b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614fb157614fb1614cd6565b5060010190565b5f81518060208401855e5f93019283525090919050565b5f614fda8284614fb8565b7f300000000000000000000000000000000000000000000000000000000000000081526001019392505050565b7f2e0000000000000000000000000000000000000000000000000000000000000081525f61504161503b6001840186614fb8565b84614fb8565b949350505050565b7f650000000000000000000000000000000000000000000000000000000000000081525f6106c26001830184614fb8565b5f610a6361503b61509461508e858a614fb8565b88614fb8565b86614fb8565b818103818111156106b1576106b1614cd6565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b808201808211156106b1576106b1614cd6565b5f61504161503b8386614fb8565b80820281158282048414176106b1576106b1614cd656"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b506004361061029d575f3560e01c806381f7e2f511610171578063cde72ef3116100d2578063dd64691711610088578063e5526ecd1161006e578063e5526ecd1461062e578063e75f991f14610641578063ffae15ba14610654575f80fd5b8063dd64691714610608578063e0db58881461061b575f80fd5b8063d1de592a116100b8578063d1de592a146105bb578063d35273a7146105ce578063d3d6ffa8146105f5575f80fd5b8063cde72ef314610582578063d102b4d3146105a8575f80fd5b8063a19684b711610127578063bc1b392d1161010d578063bc1b392d1461050b578063bc62d8d814610511578063cb09682b1461055c575f80fd5b8063a19684b7146104d2578063a90d041a146104f8575f80fd5b806396ce1ec71161015757806396ce1ec7146104885780639b4afd991461049b578063a100a3d9146104bf575f80fd5b806381f7e2f5146104625780638dc2980714610475575f80fd5b80633447c0301161021b5780635ca0e7a4116101d1578063719cd99d116101b7578063719cd99d1461042957806373bfb2831461043c57806381a822721461044f575f80fd5b80635ca0e7a4146103f0578063602c35fc14610403575f80fd5b80633b3bd868116102015780633b3bd868146103b757806341aa0080146103ca5780635b23771d146103dd575f80fd5b80633447c03014610374578063371493ce14610397575f80fd5b80631ee62f111161027057806328fa1f011161025657806328fa1f011461033b5780633004fa411461034e5780633029740014610361575f80fd5b80631ee62f11146103155780632538835014610328575f80fd5b806304327dc5146102a1578063078b665b146102c75780630b6429bc146102da578063146e82ad14610302575b5f80fd5b6102b46102af36600461479b565b61067a565b6040519081526020015b60405180910390f35b6102b46102d53660046147b2565b61068a565b6102ed6102e83660046147e2565b61069c565b604080519283529015156020830152016102be565b6102b461031036600461479b565b6106b4565b6102b461032336600461479b565b6106d3565b6102b461033636600461479b565b6106f2565b6102b461034936600461479b565b610711565b6102b461035c3660046147b2565b61071b565b6102b461036f3660046147b2565b61073b565b6103876103823660046147b2565b610746565b60405190151581526020016102be565b6103aa6103a536600461480c565b610751565b6040516102be919061483e565b6102b46103c53660046147e2565b61075d565b6102b46103d83660046147b2565b610768565b6102b46103eb3660046147e2565b610773565b6102b46103fe36600461479b565b61077e565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b6102b461043736600461479b565b610788565b61038761044a3660046147b2565b610792565b6102b461045d36600461479b565b61079d565b6103876104703660046147b2565b6107a7565b6103876104833660046147b2565b6107b2565b6102b46104963660046147b2565b6107bd565b6102b47c090000000000000000000000000000000000000000000000000000000181565b6103aa6104cd36600461479b565b6107c8565b7f80000000000000000000000000000000000000000000000000000000000000016102b4565b6102b46105063660046147b2565b610812565b5f6102b4565b61052461051f3660046148be565b61081d565b604080517fffffffff0000000000000000000000000000000000000000000000000000000090931683526020830191909152016102be565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff6102b4565b7f7fffffff800000000000000000000000000000000000000000000000000000006102b4565b6103876105b63660046147b2565b610836565b6102b46105c93660046147b2565b610841565b6102b47ffffffffc0000000000000000000000000000000000000000000000000000000181565b6102b461060336600461479b565b61084c565b61038761061636600461479b565b610856565b6102b461062936600461479b565b61087c565b6103aa61063c366004614987565b610886565b6102ed61064f3660046147e2565b61090f565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc6102b4565b5f6106848261091b565b92915050565b5f610695838361095d565b9392505050565b5f806106a88484610979565b915091505b9250929050565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109ba565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f56109e6565b5f6106848273c51a14251b0dcf0ae24a96b7153991378938f5f5610a33565b5f61068482610a66565b5f610695838373c51a14251b0dcf0ae24a96b7153991378938f5f5610aa7565b5f6106958383610d01565b5f6106958383610d63565b60606106958383610db1565b5f6106958383610e44565b5f6106958383610e5f565b5f6106958383610ea4565b5f61068482610ed7565b5f61068482610f8d565b5f6106958383611039565b5f6106848261107c565b5f61069583836110c1565b5f6106958383611104565b5f6106958383611147565b6060610684827ffffffffc000000000000000000000000000000000000000000000000000000017c0900000000000000000000000000000000000000000000000000000001610886565b5f610695838361118c565b5f805f8061082a85611197565b90969095509350505050565b5f6106958383611285565b5f61069583836112c8565b5f6106848261130d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821615610684565b5f6106848261133f565b60606108928383611285565b6108d7576040517f3be5bf9400000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044015b60405180910390fd5b5f6108e18561107c565b9050610906856108f18387611285565b8061090157506109018386611104565b610db1565b95945050505050565b5f806106a88484611380565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826113c0565b90925090505f610906838361140e565b5f6109688383611104565b6109725781610695565b5090919050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6109ad828287611474565b9350935050509250929050565b5f610695837fffffffff0000000000000000000000000000000000000000000000000000000584610aa7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a1984838361167e565b90925090505f610a29838361140e565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a198483836117ef565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82610a998383611b24565b9150505f610a29828461140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516610ae45750600191506106959050565b5f8213610b7d57815f03610b4157610afc855f611285565b15610b36576040517f8be82972000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b505f91506106959050565b6040517fcceba0f100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b610b88856001610d63565b8015610b995750610b99865f611104565b15610ba8578592505050610695565b610bb2855f611285565b15610bdb57610bd2610bc38761091b565b610bcc8761130d565b86610aa7565b92505050610695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80610c0e8484611b24565b915091505f610c1e83855f611b8c565b905060015f8080610c558f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510610c9c5784600116600103610c7f57610c7984848484611ca3565b90945092505b600185901c9450610c9282828484611ca3565b9092509050610c5a565b5f80610ca98f8e8e6117ef565b91509150610cb982828a8d611ca3565b9092509050610cc98f838361167e565b9092509050610cda82828888611ca3565b90925090505f610cea838361140e565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611dc2565b915091505f610d55838361140e565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846123e6565b979650505050505050565b60607bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d5f829003610e21576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525092505050610684565b8315610e3a57610e3182826123fd565b92505050610684565b610906828261273a565b5f805f610e518585612f64565b915091506109068282612fc6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686613018565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610906828286613042565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610f0e57509192915050565b5f80610f1a8484611b24565b915091505f84128015610f2c57508015155b15610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613018565b935091505b5f610da6838561140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610fc457509192915050565b5f80610fd08484611b24565b91509150805f03610fe5575093949350505050565b5f811315610f8257610f7d82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb461309e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846131ce565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828212156110b65761094d82826131ea565b5f610906838361140e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da68484848461328d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da6848484846132a9565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d4686868686611ca3565b5f6109688383611285565b80515f908190602084810191850101828080806111b486866132c4565b929650909450925090507fffffffff0000000000000000000000000000000000000000000000000000000084165f0361127657848303611246575f806111fa8484613763565b915091508061123557507f32b8b8be000000000000000000000000000000000000000000000000000000009a5f9a5098505050505050505050565b505f9a909950975050505050505050565b507fad384e8700000000000000000000000000000000000000000000000000000000985f98509650505050505050565b5091975f975095505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610da684848484613869565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d468686868661309e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d61094d82826131ea565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d826113728383611b24565b5090505f610a29828461140e565b5f805f805f61138f8787613884565b9250925092505f806113a18585613763565b91509150818380156113b05750815b9650965050505050509250929050565b5f806106a87f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686611dc2565b5f805f61141b8585613763565b915091508015801561142b575081155b1561146c576040517f8eba4d0700000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b509392505050565b5f805f8512156114ba576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b845f036114cc57505f90506001611676565b8460ff8416850185811215611517576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f805f831215611581577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3831215611558575f809550955050505050611676565b825f03600a0a915081848161156f5761156f6149b0565b04955050840290911491506116769050565b5f83131561166b57604d8313156115d7576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8161160c5761160c6149b0565b04841115611659576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016108ce565b50919091029250600191506116769050565b509193506001925050505b935093915050565b5f805f8412156116ba5761169284846131ea565b90945092506116a285858561167e565b90945092506116b184846113c0565b91509150611676565b5f806116c68686611b24565b9092509050845f80806116d985856138e0565b9194509250905061270d6127106116f1600182614a0a565b8514611708576117028d86866139cf565b90925090505b8315611793575f61171a866001614a30565b90505b80848583028161172f5761172f6149b0565b051461174657600a84059350600a8805975061171d565b6117876117538588614a57565b8961175e8785614a57565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc613a88565b909d509b506117ba9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b5050505050866117cb84835f611b8c565b6117d6886001614a30565b6117e09190614a30565b94509450505050935093915050565b5f8083836117fd8282613b25565b90965094505f861361187e57855f03611842576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b5050837f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000036118bc576118b283604c614a30565b5f91509150611676565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000008412158061190b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb561192d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412611ae8575f805f805f8561194657604b611949565b604c5b611953908a614a30565b90505f8087611980577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000006119a1565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c816119d3576119d36149b0565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050611a0c8c82613b7b565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414611a98576123278114611a7357611a4e8c82600101613b7b565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002611a95565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50611ac8838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613a88565b909a509850611ad98a8a835f61309e565b97509750505050505050611676565b611af285856113c0565b9095509350611b028686866117ef565b9095509350611b1185856131ea565b9250925050611676565b50935093915050565b5f805f8312611b3757508290505f6106ad565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4831215611b6957505f9050826106ad565b5f839003600a0a808581611b7f57611b7f6149b0565b0794859003959350505050565b5f818303611b9b575082610695565b82821315611bde57828203604c811380611bb557505f8113155b15611bc3575f915050610695565b80600a0a8581611bd557611bd56149b0565b05915050610695565b818303604c811380611bf057505f8113155b15611c38576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604481018490526064016108ce565b600a81900a85810286828281611c5057611c506149b0565b0514611c99576040517f1d5d6d100000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604481018690526064016108ce565b9250610695915050565b5f8085158415178015611cbb575f92505f9150611db8565b611cc58487614a30565b91505f611cd188613c02565b90505f611cdd87613c02565b90505f611cea8383613c68565b5090505f6f0785ee10d5da46d900f436a000000000821115611d1f576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115611d4057670de0b6b3a7640000820491506012015b633b9aca00821115611d5957633b9aca00820491506009015b612710821115611d6e57612710820491506004015b8115611d8257600a82049150600101611d6e565b611d8c8187614a30565b9550611dae8b8a611da88787611da387600a614bc0565b613ca3565b89613d88565b9097509550505050505b5094509492505050565b5f80835f03611e07576040517f7a97930f00000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b855f03611e1857505f9050806123dd565b5f805f80611e268a8a613e8f565b919b5099509150611e378888613e8f565b919950975090505f611e488b613c02565b90505f611e548a613c02565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c81831015612271578415611eb257507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b612230565b6f4b3b4ca85a86c47a098a224000000000831015611fde57678ac7230489e80000831015611f42576402540be400831015611f1057620186a0831015611f005750620186a0905060056121b9565b506402540be4009050600a6121b9565b655af3107a4000831015611f2f5750655af3107a40009050600e6121b9565b50678ac7230489e80000905060136121b9565b6b204fce5e3e25026110000000831015611f945769152d02c7e14af6800000831015611f7d575069152d02c7e14af6800000905060176121b9565b506b204fce5e3e250261100000009050601c6121b9565b6d314dc6448d9338c15b0a00000000831015611fc357506d314dc6448d9338c15b0a00000000905060216121b9565b506f4b3b4ca85a86c47a098a224000000000905060266121b9565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156120d65773af298d050e4395d69670b12b7f41000000000000831015612071577172cb5bd86321e38cb6ce6682e8000000000083101561205257507172cb5bd86321e38cb6ce6682e800000000009050602b6121b9565b5073af298d050e4395d69670b12b7f41000000000000905060306121b9565b76010b46c6cdd6e3e0828f4db456ff0c8ea00000000000008310156120b2575076010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000905060356121b9565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a6121b9565b7c03b58e88c75313ec9d329eaaa18fb92f75215b1710000000000000000083101561216c577a026e4d30eccc3215dd8f3157d27e23acbdcfe6800000000000000083101561214457507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f6121b9565b507c03b58e88c75313ec9d329eaaa18fb92f75215b17100000000000000000905060446121b9565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000008310156121b957507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b8183116121ed57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016121b9565b815f03612230576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c90526044016108ce565b85612271576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e90526044016108ce565b807f8000000000000000000000000000000000000000000000000000000000000000018d126122a457808d039c50612317565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f81131561231757807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b1361230457998a0199612317565b5f809950995050505050505050506123dd565b5f808e12801561232657505f8c135b15612363577f80000000000000000000000000000000000000000000000000000000000000008e01808d1361235b575f61235f565b808d035b9150505b8b818f010397506123808f8e61237a888789613ca3565b8b613d88565b90995097505f8113156123ca57604c8113156123aa575f809a509a505050505050505050506123dd565b80600a0a89816123bc576123bc6149b0565b059850885f036123ca575f97505b509698509496506123dd95505050505050565b94509492505050565b5f6123f385858585614130565b1495945050505050565b60608161240a8482613b25565b90945092505f8061243b7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000087614bcb565b1561246b57507f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000009050604c612492565b507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b5b5f61249d8388614bcb565b90505f6124aa8489614c32565b90505f808312156124c4575060016124c183614c45565b92505b5f8212156124db575060016124d882614c45565b91505b60408051602081019091525f815282156125e4575f806124fc600a89614c75565b90505b6125098186614bcb565b5f0361252e5761251a600a82614c75565b90508161252681614c88565b9250506124ff565b60408051602081019091525f8082525b8381101561258f57816040516020016125579190614cd6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052915060010161253e565b505b61259c600a87614c32565b5f036125b4576125ad600a87614bcb565b9550612591565b806125be87614204565b6040516020016125cf929190614d0e565b60405160208183030381529060405293505050505b5f6125ee85614204565b90505f6125fb878c614a30565b9050637fffffff81138061262e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000081125b15612668576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018a90526024016108ce565b5f811561269c5761267882614204565b6040516020016126889190614d50565b6040516020818303038152906040526126ac565b60405180602001604052805f8152505b90505f856126c85760405180602001604052805f8152506126ff565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b9050808486846040516020016127189493929190614d81565b6040516020818303038152906040529b50505050505050505050505092915050565b60606103e882138061275557506127526103e8614c45565b82125b1561278f576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018390526024016108ce565b5f8084129081156127aa576127a385614c45565b90506127ad565b50835b5f8413156128705783604481106127f3576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018690526024016108ce565b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5b8281101561282f57612825600a83614c75565b9150600101612812565b508083111561286d576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018790526024016108ce565b50505b5f61287a82614290565b80519091505f5b81811080156128fd57508281612898600185614da1565b6128a29190614da1565b815181106128b2576128b2614db4565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f3000000000000000000000000000000000000000000000000000000000000000145b15612914578061290c81614c88565b915050612881565b5f61291f8284614da1565b90505f61292c838a614a30565b90505f876129485760405180602001604052805f81525061297f565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90505f8212612af957815f6129948286614de1565b67ffffffffffffffff8111156129ac576129ac614891565b6040519080825280601f01601f1916602001820160405280156129d6576020820181803683370190505b5090505f5b85811015612a48578881815181106129f5576129f5614db4565b602001015160f81c60f81b828281518110612a1257612a12614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506001016129db565b505f5b82811015612ac5577f300000000000000000000000000000000000000000000000000000000000000082612a7f8389614de1565b81518110612a8f57612a8f614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a4b565b508281604051602001612ad9929190614df4565b6040516020818303038152906040529a5050505050505050505050610684565b5f612b0383614c45565b905080841115612d1a575f612b188286614da1565b90505f612b26866001614de1565b67ffffffffffffffff811115612b3e57612b3e614891565b6040519080825280601f01601f191660200182016040528015612b68576020820181803683370190505b5090505f5b82811015612bda57898181518110612b8757612b87614db4565b602001015160f81c60f81b828281518110612ba457612ba4614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612b6d565b507f2e00000000000000000000000000000000000000000000000000000000000000818381518110612c0e57612c0e614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b83811015612ce55789612c518285614de1565b81518110612c6157612c61614db4565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612c95866001614de1565b612c9f9190614de1565b81518110612caf57612caf614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612c3e565b508381604051602001612cf9929190614df4565b6040516020818303038152906040529b505050505050505050505050610684565b5f612d258583614da1565b90505f85612d34836002614de1565b612d3e9190614de1565b67ffffffffffffffff811115612d5657612d56614891565b6040519080825280601f01601f191660200182016040528015612d80576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110612db657612db6614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f2e0000000000000000000000000000000000000000000000000000000000000081600181518110612e1857612e18614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b82811015612ec3577f300000000000000000000000000000000000000000000000000000000000000082612e7d836002614de1565b81518110612e8d57612e8d614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612e48565b505f5b86811015612ce557898181518110612ee057612ee0614db4565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612f14866002614de1565b612f1e9190614de1565b81518110612f2e57612f2e614db4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612ec6565b5f805f805f612f738787613884565b92509250925080612fba576040517fc471796600000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044016108ce565b50909590945092505050565b5f805f612fd38585613763565b915091508061146c576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016108ce565b5f8061302484846131ea565b90945092506130358686868661309e565b9150915094509492505050565b5f805f613050868686611474565b9150915080613095576040517f05e4767800000000000000000000000000000000000000000000000000000000815260048101879052602481018690526044016108ce565b50949350505050565b5f80851584151780156130ca57865f036130be57848492509250506123dd565b868692509250506123dd565b6130d48787613b25565b90975095506130e38585613b25565b9095509350858413156130f7579395929492935b838603604c8111156131105787879350935050506123dd565b80600a0a8681613122576131226149b0565b0595505086850180881860ff90811c151589881890911c151680156131bd57877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036131a4576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a9052602481018990526044016108ce565b600a9687900596909805860197600197909701966131c1565b8198505b5096979596505050505050565b5f805f6131dd87878787614130565b1315979650505050505050565b5f807f80000000000000000000000000000000000000000000000000000000000000008403613283577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8303613276576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101859052602481018490526044016108ce565b600a840593508260010192505b50505f9190910391565b5f805f61329c87878787614130565b1215979650505050505050565b5f805f6132b887878787614130565b12979650505050505050565b5f8281806132d983866520000000000061434c565b925085831415836132f381886703ff00000000000061434c565b945080850361332d57507f34bd20690000000000000000000000000000000000000000000000000000000094505f925082915061375a9050565b5f806133398a88614375565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613377575095505f935083925061375a915050565b86519095506540000000000060015f9290921a9190911b16151588871016915050801561360657506001909301925f846133ba81896703ff00000000000061434c565b95508086036133f557507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f935083925061375a915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b660100000000000016151516600103613464577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016133f7565b8181146134bb575f806134778484614375565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156134b7575097505f955085945061375a9350505050565b9350505b5f8312156134f657507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f945084935061375a92505050565b831561350257825f0392505b80820394505f85131561354257507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f945084935061375a92505050565b855f0361355157829550613603565b5f859003604381111561359257507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b600a0a8681025f888383816135a9576135a96149b0565b0514159050601b82900b82141581806135bf5750805b156135fb57507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f985088975061375a9650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b16151587861016801561374b5760019095019485613646818a6520000000000061434c565b96508661365c818b6703ff00000000000061434c565b975080880361369957507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b505f806136a6838a614375565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156136e6575097505f955085945061375a9350505050565b9250508482015f831380156136fa57508581125b8061370e57505f8312801561370e57508581135b1561374757507fd556b1110000000000000000000000000000000000000000000000000000000097505f955085945061375a9350505050565b9450505b845f03613756575f93505b5050505b92959194509250565b5f601b83900b83148383826137c7577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156137a757620186a0860595506005850194505b8586601b0b146137c257600a860595508460010194506137a7565b6137dd565b855f036137dd57505f9250600191506106ad9050565b848560030b14613839575f8512156137fd57505f92508291506106ad9050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016108ce565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f61387887878787614130565b13979650505050505050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156138cf57600a860460018201600a88065f14935093509350506138d9565b8593509150600190505b9250925092565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0361391857508391505f905060016138d9565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8412156139a6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb084121561397757505f91505082151560016138d9565b5f846004015f03600a0a90505f818781613993576139936149b0565b05945050808402861415925090506138d9565b5f84126139bb57505f915081905060016138d9565b50505060048101600a0a82025f60016138d9565b5f808060646139e1600a612328614c75565b6139ee600a612328614c75565b6139f9906002614e02565b613a04906001614de1565b613a0e9190614de1565b613a189190614de1565b9050613a5c565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b613a67858288613a1f565b92508315611b1b57613a7d600186018288613a1f565b915050935093915050565b5f80888803613a9b575083905081613b19565b5f805f80613aab8c8b8f8d613018565b915091505f80613abd8a8a8d8c613018565b91509150613acd84848484611ca3565b8096508197505050505050505f80613ae78b8b8f8d613018565b915091505f80613af986868686611dc2565b915091505f80613b0b84848f8e61309e565b909a50985050505050505050505b97509795505050505050565b5f805f805f613b348787613e8f565b92509250925080612fba576040517f05e51ecb00000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016108ce565b5f80613b8a600a612328614c75565b613b95906002614e02565b613ba0906001614de1565b90505f613bb0600a612328614c75565b90506002600a8504026001015f8052600281601e883c505f51617fff81169350618000811615613bdf57918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f80821215613c5f577f80000000000000000000000000000000000000000000000000000000000000008203613c5957507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b919050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f613cb08686613c68565b91509150815f03613cd457838181613cca57613cca6149b0565b0492505050610695565b838210613d1e576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016108ce565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215613e52577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613e3f57613de77f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001614de1565b8403613e1757507f80000000000000000000000000000000000000000000000000000000000000009050816123dd565b613e22600a85614c75565b613e2b90614c45565b613e36846001614a30565b915091506123dd565b613e4884614c45565b83915091506123dd565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115613e8557613e2b600a85614c75565b50829050816123dd565b5f805f845f03613ea757505f915081905060016138d9565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f036140bb576f4b3b4ca85a86c47a098a2240000000008505158015613f1057507f80000000000000000000000000000000000000000000000000000000000000268412155b15613f31576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a000000000000008505158015613f7957507f80000000000000000000000000000000000000000000000000000000000000138412155b15613f9257678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c6400000000000000008505158015613fde57507f800000000000000000000000000000000000000000000000000000000000000a8412155b15613ff4576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000850515801561404357507f80000000000000000000000000000000000000000000000000000000000000028412155b1561405957606485029450600284039350613ff4565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085051580156140a957507f80000000000000000000000000000000000000000000000000000000000000018412155b156140bb57600a850294506001840393505b600a808602908105861480156140f157507f80000000000000000000000000000000000000000000000000000000000000018512155b15614100578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f808515841517818712828612181785841417801561415557868592509250506123dd565b505f85841315614169575092949193919260015b8386035f8112604c821317801561419c57821561418e575f89945094505050506123dd565b885f945094505050506123dd565b600a82900a8981028a8282816141b4576141b46149b0565b05146141e05784156141d0575f8b9650965050505050506123dd565b8a5f9650965050505050506123dd565b84156141f55788965094506123dd9350505050565b95508794506123dd9350505050565b60605f82126142215760405180602001604052805f815250614258565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b61426960ff84901d80850118614290565b60405160200161427a929190614df4565b6040516020818303038152906040529050919050565b60605f61429c8361449f565b60010190505f8167ffffffffffffffff8111156142bb576142bb614891565b6040519080825280601f01601f1916602001820160405280156142e5576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846142ef57509392505050565b5f5b5f82600186515f1a1b1611838510161561436d5760018401935061434e565b509192915050565b81515f90819065200000000000600191831a9190911b161515838510168085019082806143a28488614580565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156143dd575093505f92506106ad915050565b825f03614440577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8111614411575f614433565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b955093506106ad92505050565b7f8000000000000000000000000000000000000000000000000000000000000000811161446d575f61448f565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106144e7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310614513576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061453157662386f26fc10000830492506010015b6305f5e1008310614549576305f5e100830492506008015b612710831061455d57612710830492506004015b6064831061456f576064830492506002015b600a83106106845760010192915050565b5f808284106145b357507f34bd20690000000000000000000000000000000000000000000000000000000090505f6106ad565b835f036145ec576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b8782101580156146245750604d83105b1561466757815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a8590030201614614565b87821061478d5781515f1a84900360018111156146af57507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b600a84900a81028281018311156146f257507f0fdc26350000000000000000000000000000000000000000000000000000000096505f95506106ad945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b87821061478d5781515f1a6030811461476257507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106ad9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091019061471e565b5f9890975095505050505050565b5f602082840312156147ab575f80fd5b5035919050565b5f80604083850312156147c3575f80fd5b50508035926020909101359150565b803560ff81168114613c63575f80fd5b5f80604083850312156147f3575f80fd5b82359150614803602084016147d2565b90509250929050565b5f806040838503121561481d575f80fd5b8235915060208301358015158114614833575f80fd5b809150509250929050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f602082840312156148ce575f80fd5b813567ffffffffffffffff808211156148e5575f80fd5b818401915084601f8301126148f8575f80fd5b81358181111561490a5761490a614891565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561495057614950614891565b81604052828152876020848701011115614968575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215614999575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181035f831280158383131683831282161715614a2957614a296149dd565b5092915050565b8082018281125f831280158216821582161715614a4f57614a4f6149dd565b505092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615614a8e57614a8e6149dd565b8181058314821517610684576106846149dd565b600181815b80851115614afb57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614ae157614ae16149dd565b80851615614aee57918102915b93841c9390800290614aa7565b509250929050565b5f82614b1157506001610684565b81614b1d57505f610684565b8160018114614b335760028114614b3d57614b59565b6001915050610684565b60ff841115614b4e57614b4e6149dd565b50506001821b610684565b5060208310610133831016604e8410600b8410161715614b7c575081810a610684565b614b868383614aa2565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614bb857614bb86149dd565b029392505050565b5f6106958383614b03565b5f82614bd957614bd96149b0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614c2d57614c2d6149dd565b500590565b5f82614c4057614c406149b0565b500790565b5f7f80000000000000000000000000000000000000000000000000000000000000008203613c5957613c596149dd565b5f82614c8357614c836149b0565b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614cb857614cb86149dd565b5060010190565b5f81518060208401855e5f93019283525090919050565b5f614ce18284614cbf565b7f300000000000000000000000000000000000000000000000000000000000000081526001019392505050565b7f2e0000000000000000000000000000000000000000000000000000000000000081525f614d48614d426001840186614cbf565b84614cbf565b949350505050565b7f650000000000000000000000000000000000000000000000000000000000000081525f6106956001830184614cbf565b5f610a29614d42614d9b614d95858a614cbf565b88614cbf565b86614cbf565b81810381811115610684576106846149dd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b80820180821115610684576106846149dd565b5f614d48614d428386614cbf565b8082028115828204841417610684576106846149dd56"; + hex"608060405234801561000f575f80fd5b50600436106102b7575f3560e01c806381f7e2f511610171578063cde72ef3116100d2578063dd64691711610088578063e5526ecd1161006e578063e5526ecd1461065b578063e75f991f1461066e578063ffae15ba14610681575f80fd5b8063dd64691714610635578063e0db588814610648575f80fd5b8063d1de592a116100b8578063d1de592a146105e8578063d35273a7146105fb578063d3d6ffa814610622575f80fd5b8063cde72ef3146105af578063d102b4d3146105d5575f80fd5b8063a19684b711610127578063bc1b392d1161010d578063bc1b392d14610538578063bc62d8d81461053e578063cb09682b14610589575f80fd5b8063a19684b7146104ff578063a90d041a14610525575f80fd5b806396ce1ec71161015757806396ce1ec7146104b55780639b4afd99146104c8578063a100a3d9146104ec575f80fd5b806381f7e2f51461048f5780638dc29807146104a2575f80fd5b8063371493ce1161021b5780635ca0e7a4116101d1578063719cd99d116101b7578063719cd99d1461045657806373bfb2831461046957806381a822721461047c575f80fd5b80635ca0e7a41461041d578063602c35fc14610430575f80fd5b806341aa00801161020157806341aa0080146103e45780634eb7cd34146103f75780635b23771d1461040a575f80fd5b8063371493ce146103b15780633b3bd868146103d1575f80fd5b806325388350116102705780633004fa41116102565780633004fa4114610368578063302974001461037b5780633447c0301461038e575f80fd5b8063253883501461034257806328fa1f0114610355575f80fd5b80630b6429bc116102a05780630b6429bc146102f4578063146e82ad1461031c5780631ee62f111461032f575f80fd5b806304327dc5146102bb578063078b665b146102e1575b5f80fd5b6102ce6102c9366004614a65565b6106a7565b6040519081526020015b60405180910390f35b6102ce6102ef366004614a7c565b6106b7565b610307610302366004614aac565b6106c9565b604080519283529015156020830152016102d8565b6102ce61032a366004614a65565b6106e1565b6102ce61033d366004614a65565b610700565b6102ce610350366004614a65565b61071f565b6102ce610363366004614a65565b61073e565b6102ce610376366004614a7c565b610748565b6102ce610389366004614a7c565b610768565b6103a161039c366004614a7c565b610773565b60405190151581526020016102d8565b6103c46103bf366004614ad6565b61077e565b6040516102d89190614b08565b6102ce6103df366004614aac565b61078a565b6102ce6103f2366004614a7c565b610795565b6103a1610405366004614b5b565b6107a0565b6102ce610418366004614aac565b6107b6565b6102ce61042b366004614a65565b6107c1565b7f80000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102ce565b6102ce610464366004614a65565b6107cb565b6103a1610477366004614a7c565b6107d5565b6102ce61048a366004614a65565b6107e0565b6103a161049d366004614a7c565b6107ea565b6103a16104b0366004614a7c565b6107f5565b6102ce6104c3366004614a7c565b610800565b6102ce7c090000000000000000000000000000000000000000000000000000000181565b6103c46104fa366004614a65565b61080b565b7f80000000000000000000000000000000000000000000000000000000000000016102ce565b6102ce610533366004614a7c565b610855565b5f6102ce565b61055161054c366004614bb7565b610860565b604080517fffffffff0000000000000000000000000000000000000000000000000000000090931683526020830191909152016102d8565b7f7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffff6102ce565b7f7fffffff800000000000000000000000000000000000000000000000000000006102ce565b6103a16105e3366004614a7c565b610879565b6102ce6105f6366004614a7c565b610884565b6102ce7ffffffffc0000000000000000000000000000000000000000000000000000000181565b6102ce610630366004614a65565b61088f565b6103a1610643366004614a65565b610899565b6102ce610656366004614a65565b6108bf565b6103c4610669366004614c80565b6108c9565b61030761067c366004614aac565b610949565b7fffffffbe19cfc6ef4f44cf88f14500d013df534fcaad48fca1d5ca47bea26fcc6102ce565b5f6106b182610955565b92915050565b5f6106c28383610997565b9392505050565b5f806106d584846109b3565b915091505b9250929050565b5f6106b18273c51a14251b0dcf0ae24a96b7153991378938f5f56109f4565b5f6106b18273c51a14251b0dcf0ae24a96b7153991378938f5f5610a20565b5f6106b18273c51a14251b0dcf0ae24a96b7153991378938f5f5610a6d565b5f6106b182610aa0565b5f6106c2838373c51a14251b0dcf0ae24a96b7153991378938f5f5610ae1565b5f6106c28383610d3b565b5f6106c28383610d9d565b60606106c28383610deb565b5f6106c28383610e7e565b5f6106c28383610e99565b5f6107ad85858585610ede565b95945050505050565b5f6106c28383610f24565b5f6106b182610f57565b5f6106b18261100d565b5f6106c283836110b9565b5f6106b1826110fc565b5f6106c28383611141565b5f6106c28383611184565b5f6106c283836111c7565b60606106b1827ffffffffc000000000000000000000000000000000000000000000000000000017c09000000000000000000000000000000000000000000000000000000016108c9565b5f6106c2838361120c565b5f805f8061086d85611217565b90969095509350505050565b5f6106c28383611305565b5f6106c28383611348565b5f6106b18261138d565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216156106b1565b5f6106b1826113bf565b60606108d58383611305565b61091a576040517f3be5bf9400000000000000000000000000000000000000000000000000000000815260048101849052602481018390526044015b60405180910390fd5b5f610924856110fc565b90506107ad856109348387611305565b8061094457506109448386611184565b610deb565b5f806106d58484611400565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d6109878282611440565b90925090505f6107ad838361148e565b5f6109a28383611184565b6109ac57816106c2565b5090919050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6109e78282876114f4565b9350935050509250929050565b5f6106c2837fffffffff0000000000000000000000000000000000000000000000000000000584610ae1565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a538483836116fe565b90925090505f610a63838361148e565b9695505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d610a5384838361186f565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82610ad38383611ba4565b9150505f610a63828461148e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b0b9060e086901d908516610b1e5750600191506106c29050565b5f8213610bb757815f03610b7b57610b36855f611305565b15610b70576040517f8be8297200000000000000000000000000000000000000000000000000000000815260048101869052602401610911565b505f91506106c29050565b6040517fcceba0f10000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610911565b610bc2856001610d9d565b8015610bd35750610bd3865f611184565b15610be25785925050506106c2565b610bec855f611305565b15610c1557610c0c610bfd87610955565b610c068761138d565b86610ae1565b925050506106c2565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8516601b0b60e086901d5f80610c488484611ba4565b915091505f610c5883855f611c0c565b905060015f8080610c8f8f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116601b0b9160e09190911d90565b915091505b60018510610cd65784600116600103610cb957610cb384848484611d23565b90945092505b600185901c9450610ccc82828484611d23565b9092509050610c94565b5f80610ce38f8e8e61186f565b91509150610cf382828a8d611d23565b9092509050610d038f83836116fe565b9092509050610d1482828888611d23565b90925090505f610d24838361148e565b9e5050505050505050505050505050509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d8086868686611e42565b915091505f610d8f838361148e565b9a9950505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de084848484612466565b979650505050505050565b60607bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d5f829003610e5b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250925050506106b1565b8315610e7457610e6b828261247d565b925050506106b1565b6107ad82826127ba565b5f805f610e8b8585612fe4565b915091506107ad8282613046565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d8086868686613098565b5f610ee985856130c2565b5f80610ef5858561318e565b915091505f80610f07898989896131e5565b91509150610f178484848461327f565b9998505050505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316601b0b60e084901d6107ad82828661329b565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d828112610f8e57509192915050565b5f80610f9a8484611ba4565b915091505f84128015610fac57508015155b1561100257610ffd82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613098565b935091505b5f610de0838561148e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82811261104457509192915050565b5f806110508484611ba4565b91509150805f03611065575093949350505050565b5f81131561100257610ffd82847f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb46132f7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de084848484613427565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d82821215611136576109878282613443565b5f6107ad838361148e565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de08484848461327f565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de0848484846134e6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d8086868686611d23565b5f6109a28383611305565b80515f908190602084810191850101828080806112348686613501565b929650909450925090507fffffffff0000000000000000000000000000000000000000000000000000000084165f036112f6578483036112c6575f8061127a84846139a0565b91509150806112b557507f32b8b8be000000000000000000000000000000000000000000000000000000009a5f9a5098505050505050505050565b505f9a909950975050505050505050565b507fad384e8700000000000000000000000000000000000000000000000000000000985f98509650505050505050565b5091975f975095505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d610de084848484613aa6565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480610d80868686866132f7565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d6109878282613443565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216601b0b60e083901d826113f28383611ba4565b5090505f610a63828461148e565b5f805f805f61140f8787613ac1565b9250925092505f8061142185856139a0565b91509150818380156114305750815b9650965050505050509250929050565b5f806106d57f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb48686611e42565b5f805f61149b85856139a0565b91509150801580156114ab575081155b156114ec576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610911565b509392505050565b5f805f85121561153a576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610911565b845f0361154c57505f905060016116f6565b8460ff8416850185811215611597576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610911565b5f805f831215611601577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb38312156115d8575f8095509550505050506116f6565b825f03600a0a91508184816115ef576115ef614ca9565b04955050840290911491506116f69050565b5f8313156116eb57604d831315611657576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610911565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8161168c5761168c614ca9565b048411156116d9576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610911565b50919091029250600191506116f69050565b509193506001925050505b935093915050565b5f805f84121561173a576117128484613443565b90945092506117228585856116fe565b90945092506117318484611440565b915091506116f6565b5f806117468686611ba4565b9092509050845f80806117598585613b1d565b9194509250905061270d612710611771600182614d03565b8514611788576117828d8686613c0c565b90925090505b8315611813575f61179a866001614d29565b90505b8084858302816117af576117af614ca9565b05146117c657600a84059350600a8805975061179d565b6118076117d38588614d50565b896117de8785614d50565b8f87877ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc613cc5565b909d509b5061183a9050565b819b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a505b50505050508661184b84835f611c0c565b611856886001614d29565b6118609190614d29565b94509450505050935093915050565b5f80838361187d8282613d62565b90965094505f86136118fe57855f036118c2576040517f561fc7b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5d3fd4db0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610911565b5050837f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000000361193c5761193283604c614d29565b5f915091506116f6565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000008412158061198b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb56119ad565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb45b5f0b8412611b68575f805f805f856119c657604b6119c9565b604c5b6119d3908a614d29565b90505f8087611a00577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000611a21565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca0000000000000000005b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff169050808c81611a5357611a53614ca9565b05818102955090850193507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18019050611a8c8c82613db8565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000295508594508a8414611b18576123278114611af357611ace8c82600101613db8565b7d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000002611b15565b7f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000005b94505b50611b48838b848c89897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4613cc5565b909a509850611b598a8a835f6132f7565b975097505050505050506116f6565b611b728585611440565b9095509350611b8286868661186f565b9095509350611b918585613443565b92509250506116f6565b50935093915050565b5f805f8312611bb757508290505f6106da565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4831215611be957505f9050826106da565b5f839003600a0a808581611bff57611bff614ca9565b0794859003959350505050565b5f818303611c1b5750826106c2565b82821315611c5e57828203604c811380611c3557505f8113155b15611c43575f9150506106c2565b80600a0a8581611c5557611c55614ca9565b059150506106c2565b818303604c811380611c7057505f8113155b15611cb8576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260448101849052606401610911565b600a81900a85810286828281611cd057611cd0614ca9565b0514611d19576040517f1d5d6d10000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101869052606401610911565b92506106c2915050565b5f8085158415178015611d3b575f92505f9150611e38565b611d458487614d29565b91505f611d5188613e3f565b90505f611d5d87613e3f565b90505f611d6a8383613ea5565b5090505f6f0785ee10d5da46d900f436a000000000821115611d9f576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a7640000821115611dc057670de0b6b3a7640000820491506012015b633b9aca00821115611dd957633b9aca00820491506009015b612710821115611dee57612710820491506004015b8115611e0257600a82049150600101611dee565b611e0c8187614d29565b9550611e2e8b8a611e288787611e2387600a614eb9565b613ee0565b89613fc5565b9097509550505050505b5094509492505050565b5f80835f03611e87576040517f7a97930f0000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610911565b855f03611e9857505f90508061245d565b5f805f80611ea68a8a6140cc565b919b5099509150611eb788886140cc565b919950975090505f611ec88b613e3f565b90505f611ed48a613e3f565b90507f161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000604c818310156122f1578415611f3257507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b6122b0565b6f4b3b4ca85a86c47a098a22400000000083101561205e57678ac7230489e80000831015611fc2576402540be400831015611f9057620186a0831015611f805750620186a090506005612239565b506402540be4009050600a612239565b655af3107a4000831015611faf5750655af3107a40009050600e612239565b50678ac7230489e8000090506013612239565b6b204fce5e3e250261100000008310156120145769152d02c7e14af6800000831015611ffd575069152d02c7e14af680000090506017612239565b506b204fce5e3e250261100000009050601c612239565b6d314dc6448d9338c15b0a0000000083101561204357506d314dc6448d9338c15b0a0000000090506021612239565b506f4b3b4ca85a86c47a098a22400000000090506026612239565b780197d4df19d605767337e9f14d3eec8920e4000000000000008310156121565773af298d050e4395d69670b12b7f410000000000008310156120f1577172cb5bd86321e38cb6ce6682e800000000008310156120d257507172cb5bd86321e38cb6ce6682e800000000009050602b612239565b5073af298d050e4395d69670b12b7f4100000000000090506030612239565b76010b46c6cdd6e3e0828f4db456ff0c8ea0000000000000831015612132575076010b46c6cdd6e3e0828f4db456ff0c8ea000000000000090506035612239565b50780197d4df19d605767337e9f14d3eec8920e4000000000000009050603a612239565b7c03b58e88c75313ec9d329eaaa18fb92f75215b171000000000000000008310156121ec577a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000008310156121c457507a026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000009050603f612239565b507c03b58e88c75313ec9d329eaaa18fb92f75215b1710000000000000000090506044612239565b7e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca00000000000000000083101561223957507e05a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000905060495b81831161226d57600a820491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01612239565b815f036122b0576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c9052604401610911565b856122f1576040517f05e51ecb000000000000000000000000000000000000000000000000000000008152600481018f9052602481018e9052604401610911565b807f8000000000000000000000000000000000000000000000000000000000000000018d1261232457808d039c50612397565b7f80000000000000000000000000000000000000000000000000000000000000009c90038c015f81131561239757807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038b1361238457998a0199612397565b5f8099509950505050505050505061245d565b5f808e1280156123a657505f8c135b156123e3577f80000000000000000000000000000000000000000000000000000000000000008e01808d136123db575f6123df565b808d035b9150505b8b818f010397506124008f8e6123fa888789613ee0565b8b613fc5565b90995097505f81131561244a57604c81131561242a575f809a509a5050505050505050505061245d565b80600a0a898161243c5761243c614ca9565b059850885f0361244a575f97505b5096985094965061245d95505050505050565b94509492505050565b5f6124738585858561436d565b1495945050505050565b60608161248a8482613d62565b90945092505f806124bb7f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000087614ec4565b156124eb57507f161bcca7119915b50764b4abe86529797775a5f17195100000000000000000009050604c612512565b507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009050604b5b5f61251d8388614ec4565b90505f61252a8489614f2b565b90505f808312156125445750600161254183614f3e565b92505b5f82121561255b5750600161255882614f3e565b91505b60408051602081019091525f81528215612664575f8061257c600a89614f6e565b90505b6125898186614ec4565b5f036125ae5761259a600a82614f6e565b9050816125a681614f81565b92505061257f565b60408051602081019091525f8082525b8381101561260f57816040516020016125d79190614fcf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905291506001016125be565b505b61261c600a87614f2b565b5f036126345761262d600a87614ec4565b9550612611565b8061263e87614441565b60405160200161264f929190615007565b60405160208183030381529060405293505050505b5f61266e85614441565b90505f61267b878c614d29565b9050637fffffff8113806126ae57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000081125b156126e8576040517fe44c72b0000000000000000000000000000000000000000000000000000000008152600481018a9052602401610911565b5f811561271c576126f882614441565b6040516020016127089190615049565b60405160208183030381529060405261272c565b60405180602001604052805f8152505b90505f856127485760405180602001604052805f81525061277f565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b905080848684604051602001612798949392919061507a565b6040516020818303038152906040529b50505050505050505050505092915050565b60606103e88213806127d557506127d26103e8614f3e565b82125b1561280f576040517fe44c72b000000000000000000000000000000000000000000000000000000000815260048101839052602401610911565b5f80841290811561282a5761282385614f3e565b905061282d565b50835b5f8413156128f0578360448110612873576040517fe44c72b000000000000000000000000000000000000000000000000000000000815260048101869052602401610911565b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5b828110156128af576128a5600a83614f6e565b9150600101612892565b50808311156128ed576040517fe44c72b000000000000000000000000000000000000000000000000000000000815260048101879052602401610911565b50505b5f6128fa826144cd565b80519091505f5b818110801561297d5750828161291860018561509a565b612922919061509a565b81518110612932576129326150ad565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f3000000000000000000000000000000000000000000000000000000000000000145b15612994578061298c81614f81565b915050612901565b5f61299f828461509a565b90505f6129ac838a614d29565b90505f876129c85760405180602001604052805f8152506129ff565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b90505f8212612b7957815f612a1482866150da565b67ffffffffffffffff811115612a2c57612a2c614b8a565b6040519080825280601f01601f191660200182016040528015612a56576020820181803683370190505b5090505f5b85811015612ac857888181518110612a7557612a756150ad565b602001015160f81c60f81b828281518110612a9257612a926150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612a5b565b505f5b82811015612b45577f300000000000000000000000000000000000000000000000000000000000000082612aff83896150da565b81518110612b0f57612b0f6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612acb565b508281604051602001612b599291906150ed565b6040516020818303038152906040529a50505050505050505050506106b1565b5f612b8383614f3e565b905080841115612d9a575f612b98828661509a565b90505f612ba68660016150da565b67ffffffffffffffff811115612bbe57612bbe614b8a565b6040519080825280601f01601f191660200182016040528015612be8576020820181803683370190505b5090505f5b82811015612c5a57898181518110612c0757612c076150ad565b602001015160f81c60f81b828281518110612c2457612c246150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612bed565b507f2e00000000000000000000000000000000000000000000000000000000000000818381518110612c8e57612c8e6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b83811015612d655789612cd182856150da565b81518110612ce157612ce16150ad565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612d158660016150da565b612d1f91906150da565b81518110612d2f57612d2f6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612cbe565b508381604051602001612d799291906150ed565b6040516020818303038152906040529b5050505050505050505050506106b1565b5f612da5858361509a565b90505f85612db48360026150da565b612dbe91906150da565b67ffffffffffffffff811115612dd657612dd6614b8a565b6040519080825280601f01601f191660200182016040528015612e00576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110612e3657612e366150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f2e0000000000000000000000000000000000000000000000000000000000000081600181518110612e9857612e986150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f5b82811015612f43577f300000000000000000000000000000000000000000000000000000000000000082612efd8360026150da565b81518110612f0d57612f0d6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612ec8565b505f5b86811015612d6557898181518110612f6057612f606150ad565b01602001517fff00000000000000000000000000000000000000000000000000000000000000168282612f948660026150da565b612f9e91906150da565b81518110612fae57612fae6150ad565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600101612f46565b5f805f805f612ff38787613ac1565b9250925092508061303a576040517fc47179660000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610911565b50909590945092505050565b5f805f61305385856139a0565b91509150806114ec576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610911565b5f806130a48484613443565b90945092506130b5868686866132f7565b9150915094509492505050565b5f6130cd5f80613046565b90506130d98382611305565b806130e957506130e98282611305565b1561312a576040517fbd559d600000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610911565b6131348382611184565b15801561314857506131468282611184565b155b15613189576040517fe9b2d4420000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610911565b505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b90810b9160e087811d9291871690910b9086901d84806131d484848888613098565b909b909a5098505050505050505050565b5f805f805f806131f58888614589565b90925090507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8916601b0b60e08a901d61322d82828686611d23565b90965094505050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8916601b0b905060e089901d5f8061326c848488886145db565b909d909c509a5050505050505050505050565b5f805f61328e8787878761436d565b1215979650505050505050565b5f805f6132a98686866114f4565b91509150806132ee576040517f05e476780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610911565b50949350505050565b5f808515841517801561332357865f03613317578484925092505061245d565b8686925092505061245d565b61332d8787613d62565b909750955061333c8585613d62565b909550935085841315613350579395929492935b838603604c81111561336957878793509350505061245d565b80600a0a868161337b5761337b614ca9565b0595505086850180881860ff90811c151589881890911c1516801561341657877f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036133fd576040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018a905260248101899052604401610911565b600a96879005969098058601976001979097019661341a565b8198505b5096979596505050505050565b5f805f6134368787878761436d565b1315979650505050505050565b5f807f800000000000000000000000000000000000000000000000000000000000000084036134dc577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83036134cf576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810185905260248101849052604401610911565b600a840593508260010192505b50505f9190910391565b5f805f6134f58787878761436d565b12979650505050505050565b5f8281806135168386652000000000006145ff565b9250858314158361353081886703ff0000000000006145ff565b945080850361356a57507f34bd20690000000000000000000000000000000000000000000000000000000094505f92508291506139979050565b5f806135768a88614628565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156135b4575095505f9350839250613997915050565b86519095506540000000000060015f9290921a9190911b16151588871016915050801561384357506001909301925f846135f781896703ff0000000000006145ff565b955080860361363257507f7bfa48af0000000000000000000000000000000000000000000000000000000095505f9350839250613997915050565b855b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018051908a1160015f9290921a9190911b6601000000000000161515166001036136a1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613634565b8181146136f8575f806136b48484614628565b90925090507fffffffff000000000000000000000000000000000000000000000000000000008216156136f4575097505f95508594506139979350505050565b9350505b5f83121561373357507f7bfa48af0000000000000000000000000000000000000000000000000000000096505f945084935061399792505050565b831561373f57825f0392505b80820394505f85131561377f57507f013b2aaa0000000000000000000000000000000000000000000000000000000096505f945084935061399792505050565b855f0361378e57829550613840565b5f85900360438111156137cf57507f32b8b8be0000000000000000000000000000000000000000000000000000000097505f95508594506139979350505050565b600a0a8681025f888383816137e6576137e6614ca9565b0514159050601b82900b82141581806137fc5750805b1561383857507f32b8b8be000000000000000000000000000000000000000000000000000000009a505f98508897506139979650505050505050565b505084019650505b50505b84516c2000000020000000000000000060015f9290921a9190911b1615158786101680156139885760019095019485613883818a652000000000006145ff565b965086613899818b6703ff0000000000006145ff565b97508088036138d657507f013b2aaa0000000000000000000000000000000000000000000000000000000097505f95508594506139979350505050565b505f806138e3838a614628565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615613923575097505f95508594506139979350505050565b9250508482015f8313801561393757508581125b8061394b57505f8312801561394b57508581135b1561398457507fd556b1110000000000000000000000000000000000000000000000000000000097505f95508594506139979350505050565b9450505b845f03613993575f93505b5050505b92959194509250565b5f601b83900b8314838382613a04577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156139e457620186a0860595506005850194505b8586601b0b146139ff57600a860595508460010194506139e4565b613a1a565b855f03613a1a57505f9250600191506106da9050565b848560030b14613a76575f851215613a3a57505f92508291506106da9050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610911565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f805f613ab58787878761436d565b13979650505050505050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115613b0c57600a860460018201600a88065f1493509350935050613b16565b8593509150600190505b9250925092565b5f805f837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc03613b5557508391505f90506001613b16565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc841215613be3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0841215613bb457505f9150508215156001613b16565b5f846004015f03600a0a90505f818781613bd057613bd0614ca9565b0594505080840286141592509050613b16565b5f8412613bf857505f91508190506001613b16565b50505060048101600a0a82025f6001613b16565b5f80806064613c1e600a612328614f6e565b613c2b600a612328614f6e565b613c369060026150fb565b613c419060016150da565b613c4b91906150da565b613c5591906150da565b9050613c99565b5f8052600280600a8504028301601e833c5f80516107d0840193505f80526001600a8606600a6064880402018501601f853c5f5101949350505050565b613ca4858288613c5c565b92508315611b9b57613cba600186018288613c5c565b915050935093915050565b5f80888803613cd8575083905081613d56565b5f805f80613ce88c8b8f8d613098565b915091505f80613cfa8a8a8d8c613098565b91509150613d0a84848484611d23565b8096508197505050505050505f80613d248b8b8f8d613098565b915091505f80613d3686868686611e42565b915091505f80613d4884848f8e6132f7565b909a50985050505050505050505b97509795505050505050565b5f805f805f613d7187876140cc565b9250925092508061303a576040517f05e51ecb0000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610911565b5f80613dc7600a612328614f6e565b613dd29060026150fb565b613ddd9060016150da565b90505f613ded600a612328614f6e565b90506002600a8504026001015f8052600281601e883c505f51617fff81169350618000811615613e1c57918101915b505f80526001600a8506600a6064870402018301601f873c50505f510192915050565b5f80821215613e9c577f80000000000000000000000000000000000000000000000000000000000000008203613e9657507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b919050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f613eed8686613ea5565b91509150815f03613f1157838181613f0757613f07614ca9565b04925050506106c2565b838210613f5b576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610911565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f858718121561408f577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84111561407c576140247f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60016150da565b840361405457507f800000000000000000000000000000000000000000000000000000000000000090508161245d565b61405f600a85614f6e565b61406890614f3e565b614073846001614d29565b9150915061245d565b61408584614f3e565b839150915061245d565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8411156140c257614068600a85614f6e565b508290508161245d565b5f805f845f036140e457505f91508190506001613b16565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085055f036142f8576f4b3b4ca85a86c47a098a224000000000850515801561414d57507f80000000000000000000000000000000000000000000000000000000000000268412155b1561416e576f4b3b4ca85a86c47a098a224000000000850294506026840393505b7728c87cb5c89a2571ebfdcb54864ada834a0000000000000085051580156141b657507f80000000000000000000000000000000000000000000000000000000000000138412155b156141cf57678ac7230489e80000850294506013840393505b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000850515801561421b57507f800000000000000000000000000000000000000000000000000000000000000a8412155b15614231576402540be40085029450600a840393505b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000850515801561428057507f80000000000000000000000000000000000000000000000000000000000000028412155b1561429657606485029450600284039350614231565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000085051580156142e657507f80000000000000000000000000000000000000000000000000000000000000018412155b156142f857600a850294506001840393505b600a8086029081058614801561432e57507f80000000000000000000000000000000000000000000000000000000000000018512155b1561433d578095506001850394505b50939492935050507f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000008305151590565b5f8085158415178187128286121817858414178015614392578685925092505061245d565b505f858413156143a6575092949193919260015b8386035f8112604c82131780156143d95782156143cb575f899450945050505061245d565b885f9450945050505061245d565b600a82900a8981028a8282816143f1576143f1614ca9565b051461441d57841561440d575f8b96509650505050505061245d565b8a5f96509650505050505061245d565b841561443257889650945061245d9350505050565b955087945061245d9350505050565b60605f821261445e5760405180602001604052805f815250614495565b6040518060400160405280600181526020017f2d000000000000000000000000000000000000000000000000000000000000008152505b6144a660ff84901d808501186144cd565b6040516020016144b79291906150ed565b6040516020818303038152906040529050919050565b60605f6144d983614752565b60010190505f8167ffffffffffffffff8111156144f8576144f8614b8a565b6040519080825280601f01601f191660200182016040528015614522576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461452c57509392505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff848116601b90810b9160e087811d9291871690910b9086901d84806131d46145cf87614833565b866145d987614833565b865b5f806145e98686868661327f565b6145f45785856130b5565b509194909350915050565b5f5b5f82600186515f1a1b1611838510161561462057600184019350614601565b509192915050565b81515f90819065200000000000600191831a9190911b16151583851016808501908280614655848861484a565b90925090507fffffffff00000000000000000000000000000000000000000000000000000000821615614690575093505f92506106da915050565b825f036146f3577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81116146c4575f6146e6565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b955093506106da92505050565b7f80000000000000000000000000000000000000000000000000000000000000008111614720575f614742565b7f0fdc2635000000000000000000000000000000000000000000000000000000005b95505f0393505050509250929050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061479a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106147c6576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106147e457662386f26fc10000830492506010015b6305f5e10083106147fc576305f5e100830492506008015b612710831061481057612710830492506004015b60648310614822576064830492506002015b600a83106106b15760010192915050565b5f80821261484157816106b1565b6106b182614f3e565b5f8082841061487d57507f34bd20690000000000000000000000000000000000000000000000000000000090505f6106da565b835f036148b6576040517fda6966d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60305f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8501815b8782101580156148ee5750604d83105b1561493157815160018401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192600a0a5f9190911a85900302016148de565b878210614a575781515f1a849003600181111561497957507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106da9350505050565b600a84900a81028281018311156149bc57507f0fdc26350000000000000000000000000000000000000000000000000000000096505f95506106da945050505050565b9190910190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b878210614a575781515f1a60308114614a2c57507f0fdc26350000000000000000000000000000000000000000000000000000000095505f94506106da9350505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101906149e8565b5f9890975095505050505050565b5f60208284031215614a75575f80fd5b5035919050565b5f8060408385031215614a8d575f80fd5b50508035926020909101359150565b803560ff81168114613ea0575f80fd5b5f8060408385031215614abd575f80fd5b82359150614acd60208401614a9c565b90509250929050565b5f8060408385031215614ae7575f80fd5b8235915060208301358015158114614afd575f80fd5b809150509250929050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f805f8060808587031215614b6e575f80fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215614bc7575f80fd5b813567ffffffffffffffff80821115614bde575f80fd5b818401915084601f830112614bf1575f80fd5b813581811115614c0357614c03614b8a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715614c4957614c49614b8a565b81604052828152876020848701011115614c61575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215614c92575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181035f831280158383131683831282161715614d2257614d22614cd6565b5092915050565b8082018281125f831280158216821582161715614d4857614d48614cd6565b505092915050565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615614d8757614d87614cd6565b81810583148215176106b1576106b1614cd6565b600181815b80851115614df457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614dda57614dda614cd6565b80851615614de757918102915b93841c9390800290614da0565b509250929050565b5f82614e0a575060016106b1565b81614e1657505f6106b1565b8160018114614e2c5760028114614e3657614e52565b60019150506106b1565b60ff841115614e4757614e47614cd6565b50506001821b6106b1565b5060208310610133831016604e8410600b8410161715614e75575081810a6106b1565b614e7f8383614d9b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614eb157614eb1614cd6565b029392505050565b5f6106c28383614dfc565b5f82614ed257614ed2614ca9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614f2657614f26614cd6565b500590565b5f82614f3957614f39614ca9565b500790565b5f7f80000000000000000000000000000000000000000000000000000000000000008203613e9657613e96614cd6565b5f82614f7c57614f7c614ca9565b500490565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614fb157614fb1614cd6565b5060010190565b5f81518060208401855e5f93019283525090919050565b5f614fda8284614fb8565b7f300000000000000000000000000000000000000000000000000000000000000081526001019392505050565b7f2e0000000000000000000000000000000000000000000000000000000000000081525f61504161503b6001840186614fb8565b84614fb8565b949350505050565b7f650000000000000000000000000000000000000000000000000000000000000081525f6106c26001830184614fb8565b5f610a6361503b61509461508e858a614fb8565b88614fb8565b86614fb8565b818103818111156106b1576106b1614cd6565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b808201808211156106b1576106b1614cd6565b5f61504161503b8386614fb8565b80820281158282048414176106b1576106b1614cd656"; /// @dev The addresses that MUST already have code on a network before /// this release can be broadcast there, `abi.encode`d as an `address[]` diff --git a/test/src/concrete/DecimalFloat.agree.t.sol b/test/src/concrete/DecimalFloat.agree.t.sol new file mode 100644 index 0000000..df3db15 --- /dev/null +++ b/test/src/concrete/DecimalFloat.agree.t.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {LibDecimalFloat, Float} from "rain-math-float-0.2.4/src/lib/LibDecimalFloat.sol"; +import {AgreeToleranceNegative, AgreeNoPositiveTolerance} from "rain-math-float-0.2.4/src/error/ErrDecimalFloat.sol"; +import {LogTest} from "test/abstract/LogTest.sol"; +import {DecimalFloat} from "src/concrete/DecimalFloat.sol"; + +contract DecimalFloatAgreeTest is LogTest { + using LibDecimalFloat for Float; + + function f(int256 signedCoefficient, int256 exponent) internal pure returns (Float) { + return LibDecimalFloat.packLossless(signedCoefficient, exponent); + } + + function agreeExternal(Float absolute, Float proportional, Float lowest, Float highest) + external + pure + returns (bool) + { + return LibDecimalFloat.agree(absolute, proportional, lowest, highest); + } + + /// The deployed concrete answers what the library answers, or reverts with + /// the same data. Fuzzed over arbitrary packed words in all four operands, + /// so the tolerance guard's rejections are exercised alongside the ordinary + /// answers rather than only the happy path. + function testAgreeDeployed(Float absolute, Float proportional, Float lowest, Float highest) external { + DecimalFloat deployed = new DecimalFloat(); + + try this.agreeExternal(absolute, proportional, lowest, highest) returns (bool c) { + bool deployedC = deployed.agree(absolute, proportional, lowest, highest); + + assertEq(c, deployedC); + } catch (bytes memory err) { + vm.expectRevert(err); + deployed.agree(absolute, proportional, lowest, highest); + } + } + + /// The guard reaches an offchain caller as a revert, not a silent answer. + /// The fuzz above would pass if both sides returned the same wrong thing, so + /// these pin the specific errors with their tolerances. + function testAgreeDeployedRejectsBadTolerances() external { + DecimalFloat deployed = new DecimalFloat(); + + vm.expectRevert(abi.encodeWithSelector(AgreeToleranceNegative.selector, f(-1, 0), f(1, -2))); + deployed.agree(f(-1, 0), f(1, -2), f(99, 0), f(100, 0)); + + vm.expectRevert(abi.encodeWithSelector(AgreeNoPositiveTolerance.selector, f(0, 0), f(0, 0))); + deployed.agree(f(0, 0), f(0, 0), f(100, 0), f(100, 0)); + } + + /// A concrete answer either side of the limit, so the exposed function is + /// pinned to the formula and not merely to whatever the library returns. + /// 100 - 99 == 1 == 0.01 * 100, so the boundary is met and accepted. + function testAgreeDeployedBoundary() external { + DecimalFloat deployed = new DecimalFloat(); + + assertTrue(deployed.agree(f(0, 0), f(1, -2), f(99, 0), f(100, 0))); + assertFalse(deployed.agree(f(0, 0), f(1, -2), f(98999, -3), f(100, 0))); + } +}