diff --git a/InkRollup.md b/InkRollup.md new file mode 100644 index 0000000..cd7650a --- /dev/null +++ b/InkRollup.md @@ -0,0 +1,112 @@ +# Deploy a Phat-ink! Oracle with Offchain Rollup + +This repo has implemented a Phat Contract serving as a data source of an Ink! smart-contract oracle. It can: + +- Fetch price data from CoinGecko. +- Push-mode oracle: Create and config a price feed on the Ink! smart-contract side, and receive price quotes + constantly streamed from the Phat Contract. +- Pull-mode oracle: Send individual requests from the Ink! smart-contract side, and receive responses from the Phat + Contract. + +## Architecture + +(WIP) + +- Phat Contracts +- Offchain Rollup clients +- Ink! smart-contracts + +## Deploy + +### Ink! contracts + +The precompiled contract can be found at: +``` +./ink/artifacts/test_oracle/test_oracle.contract +``` + +> If you want to build a fresh contract instead, you can compile it. + +The source can be found at `ink/contracts/test_oracle` folder in this repo. +```bash +cd ink/contracts/test_oracle +``` + +Compile the Ink! smart contract +```bash +cargo contract build +``` + +You can choose to deploy the contract on a local node. +In this case you can install : + - [Swanky node](https://github.com/AstarNetwork/swanky-node). The easiest method of installation is by downloading and executing a precompiled binary from the [Release Page](https://github.com/AstarNetwork/swanky-node/releases) + - [Substrate node](https://github.com/paritytech/substrate-contracts-node.git) with pallet-contracts. + +Or alternatively, you can deploy it to a public blockchain (e.g. Shibuya/Shiden/Astar) depending on +the network you have configured. + + +### Phat Contract + +If you just want to run a unit test, now you can refer to the [InkPriceFeed unit test docs](./phat/contracts/ink_price_feed/README.md). +Otherwise, follow the instructions below if you would like to deploy a real Phat Contract on a live +chain. Here let's assume the deployment target is the Phala PoC-5 live testnet. + +> PoC-5 Network parmeters: +> +> - Phat Contract UI: +> - Substrate RPC: `wss://poc5.phala.network/ws` +> - PRuntime endpoint: `https://poc5.phala.network/tee-api-1` + +You will need to deploy `InkPriceFeed` contract on the testnet. Enter [Phat UI](https://phat.phala.network). +Get some test coin by `Get Test-PHA` if you don't have. Then you can click `+ Upload` to deploy a +contract. + +The precompiled contract can be found at: + +``` +./phat/artifacts/ink_price_feed/ink_price_feed.contract +``` + +> If you want to build a fresh contract instead: + +The phat contract is at `phat/contracts/ink_price_feed` folder in this repo. +```bash +cd phat/contracts/ink_price_feed +``` + +Compile the Phat contract +```bash +cargo contract build +``` + + +After a successful deployment, the Phat UI should bring you to the contract page. Now you need to configure +the contract by sending a `config()` transaction with the arguments below: + +- `rpc`: The Substrate RPC for Phat Contract to send transaction. It must be a http endpoint. +- `pallet_id`: The pallet id for Phat Contract to send transaction. 70 for Shibuya, 7 for swanky node. +- `call_id`: The call id for Phat Contract to send transaction. 6 in many cases. +- `contract id`: The anchor Ink! contract you deployed on substrate node, with "0x". +- `sender_key`: The sr25519 private key you used to pay the transaction fees, with "0x". + +>Next you will have to authorise the phat contract to send the messages to ink! smart contract + +Call the method `get_attest_address` and `get_ecdsa_public_key` to get the public keys used by the phat contract. + +In the Ink! smart contract side, use the Contracts-UI or Polkadot.js to grant the phat contract as attestor +- Use the method `registerAttestor` to set the attest_address and the ecdsa_public_key +- Use the method `accessControl::grantRole` to set only the attest_address +- Use the method `metaTransaction::registerEcdsaPublicKey` to set only the ecdsa_public_key + +Once configured, you can call the following query methods in ink! smart contract: +- `createTradingPair`: Create a trading to get the price between two tokens +- `requestPrice`: Send a message to receive the latest price from the Phat Contract +- `getTradingPair`: Display the trading pair with the latest price received + +You can call the following query methods in phat contract: + +- `feed_price_from_coingecko()`: Fetch the latest price of your token0/token1 trading pair, and submit it to the + Ink! smart contract contracts. You will get `FeedReceived` message on Ink smart contract side. +- `anser_price()`: Read one request from the Ink smart contract side, and answer it with the price quote. + You will get `FeedReceived` message on Ink smart contract side. diff --git a/README.md b/README.md index 9b9ed13..6f02e81 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ The `features` attribute allows you to control the rollup target chain activatio - `evm`: enables the client to connect to the EVM rollup anchor contracts. - `substrate`: allows the client to connect to the Substrate rollup anchor pallet. -- `ink`: (currently a work in progress). +- `ink`: enables the client to connect to the Ink! rollup anchor contracts. Additionally, the `logging` feature can be utilized to display internal logs, including internet access, to the logger. This can be helpful for debugging purposes. @@ -178,12 +178,20 @@ Note that the error handling in the sample code above is simplified. In real-wor Finally, the consumer contract can be configured to receive responses as shown below. +Solidity side: ```solidity function _onMessageReceived(bytes calldata message) internal override { emit MsgReceived(message); } ``` +Ink! side +```rust +fn _on_message_received(&mut self, action: Vec) -> Result<(), RollupAnchorError> { + // do you business logic +} +``` + ## Integration To build an end-to-end project with offchain rollup, follow these steps to deploy the **Offchain Rollup Anchor** contract or pallet to the target blockchain and integrate it with the **Consumer Contract**. The rollup anchor is provided in this repository, while the consumer contract refers to the dApp that communicates with the Phat Contract. @@ -204,14 +212,30 @@ To deploy the EVM rollup anchor, follow these steps: Find a reference script [here](./evm/scripts/deploy-test.ts). -The Substrate pallet and ink! anchor deployment docs are currently under development (TODO). +To deploy the Ink rollup anchor, follow these steps: + +1. Deploy the Phat Contract + - Sample code: [InkPriceFeed](./phat/contracts/ink_price_feed/lib.rs) + - During the instantiation, a sr2519 key pair is generated (called attestor key). This key is used to sign the messages sent to Ink! smart contract +2. Deploy the Ink! smart contract: + - Sample code: [TestOracle](./ink/contracts/test_oracle/lib.rs) + - register the phat contract as `attestor` +3. Configure the Phat Contract by sending a `config()` transaction with the arguments below: + - `rpc`: The Substrate RPC for Phat Contract to send transaction. It must be a http endpoint. + - `pallet_id`: The pallet id for Phat Contract to send transaction. + - `call_id`: The call id for Phat Contract to send transaction. 6 in many cases. + - `contract id`: The anchor Ink! contract you deployed on substrate node, with "0x". + - `sender_key`: The sr25519 private key you used to pay the transaction fees, with "0x". +Find a more detailed documentation [here](./InkRollup.md). + +The Substrate pallet anchor deployment docs are currently under development (TODO). ### Integrate with Your Contract Detailed instructions for consumer contract integration are coming soon (TODO). In the meantime, please refer to provided examples: - For EVM: Sample consumer contract [TestOracle](./evm/contracts/TestOracle.sol) -- For ink! (WIP) +- For Ink!: Sample consumer contract [TestOracle](./ink/contracts/test_oracle/lib.rs) - For Substrate: Sample consumer pallet [phat-oracle-pallet](https://github.com/Phala-Network/phala-blockchain/blob/master/pallets/offchain-rollup/src/oracle.rs) ### Integration Resources @@ -219,7 +243,7 @@ Detailed instructions for consumer contract integration are coming soon (TODO). - EVM - [Phat-EVM Oracle Sample](./phat/contracts/evm_price_feed/README.md) - [pink-web3](https://docs.rs/pink-web3): A web3 client for calling EVM chain JSON-RPC and handling EVM ABI codec -- ink! (WIP) +- Ink! [Phat-Ink! Oracle Sample](./phat/contracts/ink_price_feed/README.md) - Substrate - [Phat-Substrate Oracle Sample](./phat/contracts/sub_price_feed) - [pink-subrpc](https://docs.rs/pink-subrpc/): A Substrate JSON-RPC client similar to Subxt, supporting HTTP(s)-only @@ -235,7 +259,7 @@ For an in-depth explanation of the project's technical aspects, please refer to Explore various examples and use cases of Phat Offchain Rollup in action: - [Phat-EVM Oracle on Offchain Rollup](./EvmRollup.md) -- Phat-ink Oracle on Offchain Rollup (WIP) +- [Phat-Ink Oracle on Offchain Rollup](./InkRollup.md) - Phat-Substrate Oracle on Offchain Rollup (Documentation WIP) ## API Reference @@ -245,6 +269,8 @@ Find API documentation for key components of the Phat Offchain Rollup SDK below: - Phat Offchain Rollup API (WIP) - [Pink-KV-Session](https://docs.rs/pink-kv-session/) - EVM [PhatRollupAnchor](./evm/contracts/PhatRollupAnchor.sol) +- Ink! [PhatRollupAnchor](./ink/crates/phat_rollup_anchor_ink/README.md) +- Example of [Ink! contract](./ink/contracts/test_oracle/README.md) implementing Ink! [PhatRollupAnchor](./ink/crates/phat_rollup_anchor_ink/README.md) - ink! Anchor Contract (WIP) - Substrate [Offchain Rollup Anchor Pallet](https://github.com/Phala-Network/phala-blockchain/blob/master/pallets/offchain-rollup/src/anchor.rs) diff --git a/ink/Cargo.toml b/ink/Cargo.toml new file mode 100644 index 0000000..028d123 --- /dev/null +++ b/ink/Cargo.toml @@ -0,0 +1,6 @@ +[workspace] +resolver = "2" +members = [ + "crates/phat_rollup_anchor_ink", + "contracts/test_oracle", +] \ No newline at end of file diff --git a/ink/artifacts/test_oracle/test_oracle.contract b/ink/artifacts/test_oracle/test_oracle.contract new file mode 100644 index 0000000..d8b17fb --- /dev/null +++ b/ink/artifacts/test_oracle/test_oracle.contract @@ -0,0 +1 @@ +{"source":{"hash":"0xbae13b865f18c709002f3828a8c7a285039afdeb4499cf035c2c8e76bcde37b2","language":"ink! 4.3.0","compiler":"rustc 1.72.0","wasm":"0x0061736d0100000001460c60027f7f0060037f7f7f017f60027f7f017f60037f7f7f0060017f0060047f7f7f7f0060057f7f7f7f7f0060047f7f7f7f017f60000060017f017f60037e7e7f006000017f02a8020f057365616c310b6765745f73746f726167650007057365616c301176616c75655f7472616e736665727265640000057365616c30036e6f770000057365616c3005696e7075740000057365616c300663616c6c65720000057365616c3007616464726573730000057365616c300d64656275675f6d6573736167650002057365616c300d65636473615f7265636f7665720001057365616c300f686173685f626c616b65325f3235360003057365616c300d6465706f7369745f6576656e740005057365616c320b7365745f73746f726167650007057365616c310d636c6561725f73746f726167650002057365616c3110636f6e7461696e735f73746f726167650002057365616c300b7365616c5f72657475726e000303656e76066d656d6f7279020102100385018301030001000001000601060304000300000400000000020000030604000300030000000009000408000a09040003030107030004000202000000000406040b020202020204090306040203000300000502030003000000000408080003080209000800020101020205050302020400020206070507000502020301010302020202020503040501700113130608017f01418080040b0711020463616c6c006a066465706c6f79006e091f010041010b12238501840156788d01798b018c01518e0151727374518a017b0ae3e80183012c01017f037f2002200346047f200005200020036a200120036a2d00003a0000200341016a21030c010b0b1a0b2601017f037f2001200246047f200005200020026a41003a0000200241016a21020c010b0b1a0b3f01027f0340200245044041000f0b200241016b210220012d0000210320002d00002104200041016a2100200141016a210120032004460d000b200420036b0b9e0201037f230041206b22022400200241086a2001101241012103024020022d00084101710d000240024002400240024020022d0009220441037141016b0e03020301000b200441fc01714102762101410021030c040b20044104490d020c030b200220043a0015200241013a001420022001360210200241003b011c200241106a2002411c6a410210130d0220022f011c220441ff014d0d0220044102762101410021030c020b200220043a0015200241013a0014200220013602102002410036021c200241106a2002411c6a410410130d01200228021c220341027621012003418080044921030c010b20022001101420022802000d00200228020422014180808080044921030b2000200136020420002003360200200241206a24000b3f01027f230041106b22022400200241003a000f200020012002410f6a410110162201047f41000520022d000f0b3a0001200020013a0000200241106a24000b6e01027f230041106b2203240020002d00042104200041003a0004027f200404402001200041056a2d00003a000020002802002100200341086a20012002410141ec8004101520002003280208200328020c10160c010b20002802002001200210160b2100200341106a240020000b4801027f230041106b220224002002410036020c024020012002410c6a41041016450440200228020c21010c010b410121030b2000200136020420002003360200200241106a24000b2700200220034904402003200220041053000b2000200220036b3602042000200120036a3602000b3d01027f2000280204220320024922044504402001200220002802002201200241c4ab0410272000200320026b3602042000200120026a3602000b20040b2200200120034d044020002001360204200020023602000f0b2001200320041018000b0f0020002001200241c89b04108f010bc00301067f230041f0006b220124002001410036023820014280800137024420014184ae043602404193f2c4fb06200141406b2205101a20012001290340370330200141086a200141306a2001280248101b200128020c21032001280208210420012802302102200120012802342206360240200420032002200510002103200120012802402002200641fc88041017027f024002400240024020030e0400020201020b200128020021022001200128020436026c20012002360268200141406b200141e8006a101c20012d004022024102470440200141186a200141ca006a290100370300200141206a200141d2006a290100370300200141276a200141d9006a2900003700002001200129014237031020012d00410c040b410321020c020b410221020c010b200141cc006a420037020020014101360244200141d48a04360240200141dca604360248200141406b41dc8a04101d000b41000b2104410021032000200241fe0171410247047f20002001290310370002200020043a0001200041196a200141276a290000370000200041126a200141206a2903003700002000410a6a200141186a29030037000020020541000b3a0000200141f0006a24000b2601017f230041106b220224002002200036020c20012002410c6a4104102c200241106a24000b4501017f2002200128020422034b044041fca604412341f0a804102a000b2001200320026b36020420012001280200220120026a36020020002002360204200020013602000b980101027f230041306b2202240020022001101241022103024020022d00004101710d000240024020022d000122030e020200010b200241086a2001102d20022d00080d0020002002290009370001200041196a200241216a290000370000200041116a200241196a290000370000200041096a200241116a290000370000410121030c010b410221030b200020033a0000200241306a24000b3c01017f230041206b220224002002200036021420024188950436020c200241dca604360208200241013a001820022001360210200241086a107a000baa0102057f017e230041306b220124002001410036021820014280800137022420014184ae043602204193f2c4fb06200141206a2202101a20012001290320370310200141086a200141106a22032001280228101b200128020c21042001280208210520012903102106200141003602282001200637032020002002101f20012001290320370310200120032001280228101b2005200420012802002001280204100a1a200141306a24000b210020002d00004504402001410010290f0b200141011029200041016a2001102b0bb10402067f047e230041e0006b220224002002410036023820024280800137024c20024184ae0436024841b4dca5b47e200241c8006a2207101a20012007101a20022002290348370330200241286a200241306a2002280250101b200228022c21032002280228210420022802302101200220022802342205360248200420032001200710002103200241206a20022802482001200541fc88041017024002400240024020030e0400010103010b200228022021012002200228022436024420022001360240200241c8006a200241406b102120022802482201450d0120022802502103200228024c2104200241c8006a200241406b102120022802482206450d01200229024c2108200241086a200241406b102220022802080d01200241186a29030021092002290310210a200241003b0148200241406b200241c8006a410210160d0120022f0148210520024200370348200241406b200241c8006a410810160d012002290348210b0c020b200241d4006a42003702002002410136024c200241d48a04360248200241dca604360250200241c8006a41dc8a04101d000b200241003a0040200241d4006a42013702002002410136024c2002419c8104360248200241013602342002200241306a3602502002200241406b360230200241c8006a418c8204101d000b2000200a370300200020053b01302000200837032820002006360224200020033602202000200436021c200020013602182000200b37031020002009370308200241e0006a24000bfd0402087f017e230041106b22062400200620011032024020062802002202044002402006290204220a422088a72204450d00200441076b22014100200120044d1b2108200241036a417c7120026b2109410021010340024002400240024002400240024002400240200120026a2d000022054118744118752207410048044020054198a1046a2d000041026b0e03030102080b200920016b4103714504400240200120084f0d000340200120026a220541046a280200200528020072418081828478710d01200141086a22012008490d000b0b200120044f0d090340200120026a2c00004100480d0a2004200141016a2201470d000b0c0b0b200141016a21010c080b200141016a220320044f0d06200220036a2c000021030240200541e001470440200541ed01460d012007411f6a41ff0171410c490d042007417e71416e470d0820034140480d050c080b200341607141a07f460d040c070b2003419f7f4a0d060c030b200141016a220320044f0d05200220036a2c000021030240024002400240200541f0016b0e050100000002000b2007410f6a41ff017141024b0d0820034140480d020c080b200341f0006a41ff01714130490d010c070b2003418f7f4a0d060b200141026a220520044f0d05200220056a2c000041bf7f4a0d05200141036a220120044f0d05200120026a2c000041bf7f4a0d050c040b200141016a22012004490d020c040b200341404e0d030b200141026a220120044f0d02200120026a2c000041bf7f4c0d010c020b200120026a2c000041bf7f4a0d010b200141016a21010c010b200041003602000c040b20012004490d000b0b2000200a370204200020023602000c010b200041003602000b200641106a24000b5f02017f037e230041106b2202240020024200370308200242003703000240200120024110101645044020022903082104200229030021050c010b420121030b2000200537030820002003370300200041106a2004370300200241106a24000bdf0401047f230041106b220224000240024002400240024002400240024002400240024002400240024020002d000041016b0e0c0102030405060708090a0b0c000b41012100200128021422034180a9044106200141186a280200220528020c22041101000d0c024020012d001c410471450440200341969604410120041101000d0e2003418cac0441052004110100450d010c0e0b200341979604410220041101000d0d2002200536020420022003360200200241013a000f20022002410f6a3602082002418cac0441051088010d0d20024194960441021088010d0d0b200341ec94044101200411010021000c0c0b20012802144186a904410d200141186a28020028020c11010021000c0b0b20012802144193a904410e200141186a28020028020c11010021000c0a0b200128021441a1a904410b200141186a28020028020c11010021000c090b200128021441aca904411a200141186a28020028020c11010021000c080b200128021441c6a904410e200141186a28020028020c11010021000c070b200128021441d4a9044110200141186a28020028020c11010021000c060b200128021441e4a904410c200141186a28020028020c11010021000c050b200128021441f0a904410b200141186a28020028020c11010021000c040b200128021441fba9044107200141186a28020028020c11010021000c030b20012802144182aa04410f200141186a28020028020c11010021000c020b20012802144191aa044111200141186a28020028020c11010021000c010b200128021441a2aa044113200141186a28020028020c11010021000b200241106a240020000bb00102047f017e230041306b220224002002410036021820024280800137022420024184ae0436022041b4dca5b47e200241206a2203101a20002003101a20022002290320370310200241086a200241106a22042002280228101b200228020c21002002280208210520022903102106200241003602282002200637032020012003102520022002290320370310200220042002280228101b2005200020022802002002280204100a1a200241306a24000b6b01017f230041106b22022400200041186a280200200041206a2802002001103b200041246a2802002000412c6a2802002001103b2000290300200041086a2903002001103620002f013020011035200220002903103703082001200241086a4108102c200241106a24000b8f0201077f230041d0006b22032400200341286a22044200370300200341206a22054200370300200341186a22064200370300200342003703100240200241214f0440200341c8006a22074200370300200341406b22084200370300200341386a220942003703002003420037033020012002200341306a1008200420072903003703002005200829030037030020062009290300370300200320032903303703100c010b200341086a2002200341106a41204188830410172003280208200328020c200120024198830410270b20002003290310370000200041186a200341286a290300370000200041106a200341206a290300370000200041086a200341186a290300370000200341d0006a24000b7a0020012003460440200020022001100e0f0b230041306b220024002000200336020420002001360200200041146a42023702002000412c6a41053602002000410336020c2000419c9d04360208200041053602242000200041206a360210200020003602282000200041046a360220200041086a2004101d000b6e01037f230041206b22012400200141086a200028020020002802042000280208220241ec8a0410152001410036021820012001290308370310200141106a410410292002200220012802186a22034b044041e08404411c41fc8a04102a000b20002003360208200141206a24000b970101027f20002802082202200028020422034904402000200241016a360208200028020020026a20013a00000f0b230041306b220024002000200336020420002002360200200041146a42023702002000412c6a41053602002000410236020c200041ec9504360208200041053602242000200041206a360210200020003602282000200041046a360220200041086a41d0a804101d000b4601017f230041206b220324002003410c6a420037020020034101360204200341dca6043602082003200136021c200320003602182003200341186a36020020032002101d000b0a00200120004120102c0b5c01037f02402000280208220420026a220320044f04402003200028020422054b0d01200028020020046a200320046b2001200241c0a8041027200020033602080f0b41e0a604411c41a0a804102a000b2003200541b0a8041018000b8a0101047f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a22054200370300200242003703002000027f200120024120101645044020002002290300370001200041196a2003290300370000200041116a2004290300370000200041096a200529030037000041000c010b41010b3a0000200241206a24000b6801027f230041306b220224002002200110140240200228020045044020022802042103200241086a2001101c20022d00084102470440200041046a200241086a4121100e200020033602000c020b200041023a00040c010b200041023a00040b200241306a24000bd508020f7f027e230041e0016b22022400200241c8006a20011030024020022802480440200241406b200241d0006a28020036020020022002290348370338200241e8006a200110300240024020022802680440200241e0006a200241f0006a28020036020020022002290368370358200241186a200110110240024020022802180d000240200128020441246e2204200228021c220720042007491b2205450440410421040c010b200541e3f1b81c4b0d05200541246c220310312204450d040b4100210320024100360280012002200536027c2002200436027820070440200241c8016a2108200241b8016a410172210b0340200241106a2001101220022d00104101710d02024002400240024020022d0011220c0e0400010202060b200241b8016a2001103220022802b8012209450d0520022902bc0121110c020b200241086a2001101420022802080d04200228020c21090c010b200241b8016a2001102d20022d00b8010d032002419e016a200b41026a2d00003a000020024190016a200841086a29000037030020024198016a200841106a2d00003a00002002200b2f00003b019c01200220082900003703880120022802bc01210920022903c00121110b200241b6016a220d2002419e016a2d00003a0000200241a8016a220e20024190016a290300370300200241b0016a220f20024198016a280200360200200220022f019c013b01b40120022002290388013703a001200228027c2003460440200241f8006a2105230041206b2204240002400240027f4100200341016a2203450d001a200528020422064100480d0141042006410174220a20032003200a491b2203200341044d1b220341246c210a200341e4f1b81c494102742110024020060440200441043602142004200641246c360218200420052802003602100c010b200441003602140b20042010200a200441106a105c20042802004504402004280204210620052003360204200520063602004181808080780c010b200441086a280200210320042802040b2003105b200441206a24000c010b41808504412141f48f04102a000b2002280280012103200228027821040b2004200341246c6a2203200c3a00002003201137020820032009360204200341036a200d2d00003a0000200320022f01b4013b0001200341106a20022903a001370200200341186a200e290300370200200341206a200f28020036020020022802800141016a2203450d032002200336028001200741016b22070d000b200228027821040b2004450d00200229027c2111200241286a2201200241406b280200360200200241346a200241e0006a2802003602002002200229033822123703202002200229035837022c200041106a200241306a290300370200200041086a2001290300370200200020123702002000201137021c200020043602180c060b200041003602000c050b41e08404411c41809404102a000b200041003602000c030b20031033000b1034000b200041003602000b200241e0016a24000bf704020a7f027e230041406a22022400200241086a2001101102402002280208450440024002400240200128020441186e2204200228020c220720042007491b2205450440410421040c010b200541d5aad52a4b0d02200541186c220310312204450d010b410021032002410036021820022005360214200220043602100240200704400340200241206a200110320240024002402002280220220a450d002002290224210c20022001101220022d00004101710d00410021090240024020022d00010e020100020b200241306a2001103220022802302209450d012002290234210d0b20032002280214460d010c020b200041003602000c080b200241106a2105230041206b2204240002400240027f4100200341016a2203450d001a200528020422064100480d01410420064101742208200320032008491b2203200341044d1b220341186c2108200341d6aad52a49410274210b024020060440200441043602142004200641186c360218200420052802003602100c010b200441003602140b2004200b2008200441106a105c20042802004504402004280204210620052003360204200520063602004181808080780c010b200441086a280200210320042802040b2003105b200441206a24000c010b41808504412141f48f04102a000b20022802102104200228021821030b2004200341186c6a2203200d3702102003200936020c2003200c3702042003200a360200200228021841016a2203450d0220022003360218200741016b22070d000b0b20002002290310370200200041086a200241186a2802003602000c040b41e08404411c41809404102a000b20031033000b1034000b200041003602000b200241406b24000b10004186ae052d00001a41042000105d0b810101037f230041106b22022400200241086a20011011024020022802084504400240200228020c220320012802044b0d00200220034101105e20022802042104200120022802002201200310160d002000200136020020002004ad2003ad422086843702040c020b200041003602000c010b200041003602000b200241106a24000b860101017f230041306b220124002001200036020c2001411c6a420137020020014102360214200141c091043602102001410536022c2001200141286a36021820012001410c6a360228230041206b220024002000200141106a36021420004188950436020c200041dca604360208200041003a0018200041d09104360210200041086a107a000b3c01017f230041206b22002400200041146a42003702002000410136020c200041989004360208200041dca604360210200041086a41a09004101d000b2601017f230041106b22022400200220003b010e20012002410e6a4102102c200241106a24000b2a01017f230041106b220324002003200137030820032000370300200220034110102c200341106a24000bdc0201067f230041406a220124002001410036022020014280800137022c20014184ae0436022841ace9b3f901200141286a2204101a20002004101a20012001290328370318200141106a200141186a2001280230101b2001280214210220012802102105200128021821002001200128021c2206360228200520022000200410002102200141086a20012802282000200641fc88041017024002400240024020020e0401000002000b200141346a42003702002001410136022c200141d48a04360228200141dca604360230200141286a41dc8a04101d000b200128020821002001200128020c36022c200120003602282001200141286a101420012802000d01200128020421030b200141406b240020030f0b200141003a0027200141346a42013702002001410136022c200141cc83043602282001410136021c2001200141186a3602302001200141276a360218200141286a41c48404101d000b800101037f230041306b22012400200141086a41e086041039200141186a20012802082001280210103a024002402001280218220304402001200128022036022c200120033602282001200141286a101420012802000d01200128020421020b200041003a0000200020023602040c010b200041810a3b01000b200141306a24000bb40101067f230041206b22022400024003402003200120064103746a2802046a22072003490d01410121062005210420072103410121052004450d000b41002103200241086a20074100105e20024100360218200220022903083703100340200241106a200120036a2204280200200441046a2802001059200341086a22034110470d000b20002002290310370200200041086a200241186a280200360200200241206a24000f0b41a0ad04411c418cad04102a000bf00202057f017e230041406a220324002003410036021820034280800137022c20034184ae0436022841d8b5f4e97d200341286a2205101a200120022005103b20032003290328370310200341086a200341106a2003280230101b200328020c21022003280208210620032802102101200320032802142207360228200620022001200510002102200320032802282001200741fc88041017024002400240024020020e0400010103010b200328020021012003200328020436022420032001360220200341286a200341206a103220032802282204450d01200329022c21080c020b200341346a42003702002003410136022c200341d48a04360228200341dca604360230200341286a41dc8a04101d000b200341003a0020200341346a42013702002003410136022c200341cc8304360228200341013602142003200341106a3602302003200341206a360210200341286a41c48404101d000b2000200837020420002004360200200341406b24000b5e0002402001413f4d04402002200141027410290c010b200141ffff004d04402001410274410172200210350c010b200141ffffffff034d044020014102744102722002101a0c010b20024103102920012002101a0b200220002001102c0bc80b02067f047e230041d0016b220324000240024020002802082204450d0020002802002200200441186c6a2105034020002802002206450d0120002802142107200028020c210420034188016a2006200041086a280200103a02400240200328028801220604402004450d02200620032802900120042007103d0d010c020b20040d010b200041186a22002005470d010c020b0b410421010c010b024020012802082204450d0020012802002200200441186c6a210520034194016a210620034188016a410472220141106a2107200141086a2108034020002802002204450d012007200041146a28020036020020082000410c6a2902003702002001200029020437020020032004360288012004200328029001200641002003280294011b103e200041186a22002005470d000b0b024020022802082200450d0020022802002205200041246c6a210720034198016a210420034188016a4101722106034020052d000022084104460d01200541106a21002005290008210920052800042102200541016a210102400240024002400240024002400240200841016b0e03010203000b2003200236028801200320094220883e028c01200341406b20034188016a101220032d00404101710d0520032d00412100200341386a20034188016a101420032802380d05200328023c2102200341206a20034188016a103f200329032022094202510d05200341306a290300210a2003290328210b200341086a20034188016a103f2003290308220c4202510d052000410a6b41024f04402000450d04410621010c0a0b20034188016a20021020027f20032802ac014504402003420037037820034280808080103703702003420137036841000c010b200341d0006a20034188016a4138100e20032f0180010b21012003200a42002009a722001b22093703582003200b420020001b220a370350200141ffff037141016a220041ffff03712000460440200320003b0180012003420037038801200341083602c00120034188016a2200200341c0016a100220032003290388013703602002200341d0006a1024200420093703002003200a37039001200320023602a0012003410036028801200010400c070b41e08404411c41fc8d04102a000b20034188016a103820032d0088010d0341032101200328028c012002490d08200341d0006a41c88604103920034188016a20032802502003280258103a02402003280288012200450440410021000c010b20032003280290013602c401200320003602c001200341c8006a200341c0016a101420032802480d05200328024c220020024b0d090b20002002460d050340200341d0006a200010412003410236028c01200341c285043602880120032003280258360294012003200328025036029001200341c0016a20034188016a103920032802c00120032802c8014100103e2002200041016a2200470d000b200341d0006a41c88604103920034188016a220020021041200328025020032802582000103e20034103360288012003200236028c01200010400c050b200620012f00003b000020042000290000370000200641026a200141026a2d00003a0000200441086a200041086a290000370000200441106a200041106a2d00003a000020032009370390012003200236028c01200341013a0088014185b99ed07a20034188016a1042220141ff01714103460d040c070b200620012f00003b000020042000290000370000200641026a200141026a2d00003a0000200441086a200041086a290000370000200441106a200041106a2d00003a000020032009370390012003200236028c01200341013a0088014185b99ed07a20034188016a1043220141ff01714103460d030c060b200329031021092004200341186a2903004200200ca722001b370300200320023602a001200341013602880120032009420020001b3703900120034188016a10400c020b20032d00890121010c040b410521010c030b200541246a22052007470d000b0b410721010b200341d0016a240020010b1801017f2001200346047f20002002200110100541010b450ba30202037f017e230041406a22032400024020024504402003410036022820034280800137023420034184ae0436023041d8b5f4e97d200341306a2202101a200020012002103b20032003290330370320200341086a200341206a2003280238101b2003280208200328020c100b1a0c010b2003410036022820034280800137023420034184ae0436023041d8b5f4e97d200341306a2204101a200020012004103b20032003290330370320200341186a200341206a22052003280238101b200328021c2100200328021821012003290320210620034100360238200320063703302002280200200241086a2802002004103b20032003290330370320200341106a20052003280238101b2001200020032802102003280214100a1a0b200341406b24000b7d02017f037e230041206b22022400200241186a200110120240024020022d00184101710d00024020022d00190e020200010b2002200110224202420120022802001b2103200241106a2903002104200229030821050c010b420221030b2000200537030820002003370300200041106a2004370300200241206a24000bb10802047f037e230041a0016b22012400200041106a29030021052000290308210720002802182102200028020421032000280200210020014184ae043602302001428080013702340240024002400240024002400240200041016b0e0402030005010b200141306a1028200141d8006a2200200141386a28020036020020012001290330370350200141e0006a2202200141d0006a105f20012903602105200141003602782001200537037041dca6044100200141f0006a2204103b200441848c04411e102c20012001290370370360200141106a20022001280278101b2004200128021020012802141026200141086a200128025020012802542000280200220041ec8a04101520014100360298012001200129030837039001200420014190016a102b200020002001280298016a22004d0d0341e08404411c41fc8a04102a000b200141306a1028200141f8006a200141386a2802003602002001200129033037037020014190016a2200200141f0006a220341a88b041060200141186a2000106120014198016a200141206a28020036020020012001290318220637039001200141286a280200210020012802242104200141003602782001200637037020034100102920022003101a20072005200310360c040b200141306a1028200141f8006a200141386a2802003602002001200129033037037020014190016a2200200141f0006a220341d08b041060200141186a2000106120014198016a200141206a28020036020020012001290318220637039001200141286a280200210020012802242104200141003602782001200637037020034101102920022003101a20072005200310360c030b200141306a1028200141f8006a200141386a2802003602002001200129033037037020014190016a2200200141f0006a220241f88b041060200141186a2000106120014198016a200141206a28020036020020012001290318220637039001200141286a28020021002001280224210420014100360278200120063703702002410210292005a72002101a20032007422088a72002103b0c020b200141c8006a200036020020012001290350370340200141186a200141406b106120014198016a200141206a28020036020020012001290318220537039001200141286a2802002100200128022421042001410036027820012005370370200141f0006a22024103102920032002101a0c010b200141306a1028200141f8006a200141386a2802003602002001200129033037037020014190016a2200200141f0006a220241bc8c041060200141186a2000106120014198016a200141206a28020036020020012001290318220537039001200141286a28020021002001280224210420014100360278200120053703702002410410290b2001200129037037039001200120014190016a2001280278101b20042000200128020020012802041009200141a0016a24000b5501027f230041206b22022400200241086a41044100105e200241186a22034100360200200220022903083703102001200241106a105a200041086a200328020036020020002002290310370200200241206a24000b6001037f230041306b22032400200010372102200341086a2204410172104a200341013a0008024020022004106b220241ff01714103470d00410221022000200110500d0020002001106f200341086a104a410321020b200341306a240020020b5e01037f230041306b22032400200010372102200341086a2204410172104a200341013a0008024020022004106b220241ff01714103470d0020002001106b220241ff01714103470d0020002001106d410321020b200341306a240020020b5201027f024002400240024002404104200041036b41ff01712203200341044f1b41016b0e0400010203040b410121020c030b410221020c020b410321020c010b200141041029200021020b2001200210290bff0202057f027e230041d0006b220224002002410036023020024280800137023c20024184ae04360238419ade91f679200241386a2204101a20012004102b20022002290338370328200241206a200241286a2002280240101b2002280224210320022802202105200228022821012002200228022c2206360238200520032001200410002103200241186a20022802382001200641fc88041017027e024002400240024020030e0400010103010b200228021821012002200228021c36023c200220013602382002200241386a10222002290300a70d0120022903082107200241106a2903000c030b200241c4006a42003702002002410136023c200241d48a04360238200241dca604360240200241386a41dc8a04101d000b200241003a0037200241c4006a42013702002002410136023c200241cc83043602382002410136022c2002200241286a3602402002200241376a360228200241386a41c48404101d000b42000b21082000200737030020002008370308200241d0006a24000b390020002001102b200041206a2001102b2000290340200041c8006a29030020011036200041d0006a280200200041d8006a2802002001103b0b6301017f0240024002400240024002404105200041076b41ff01712202200241054f1b41016b0e050102030405000b2001410010290f0b2001410110290f0b2001410210290f0b2001410310290f0b2001410410290f0b2001410510292000200110440bb50101027f230041e0006b220124002001418080013602304184ae04200141306a2202100520014180800136025c20014184ae043602582002200141d8006a102d2001027f20012d0030450440200141216a200141c9006a290000370000200141196a200141c1006a290000370000200141116a200141396a2900003700002001200129003137000941000c010b200141003a000941010b3a00082000200141086a418c8904413741c489041049200141e0006a24000b7401017f230041106b2205240020012d000045044020002001290001370000200041186a200141196a290000370000200041106a200141116a290000370000200041086a200141096a290000370000200541106a24000f0b200520012d00013a000f200220032005410f6a4180880420041054000bb60101027f230041e0006b220124002001418080013602304184ae04200141306a2202100420014180800136025c20014184ae043602582002200141d8006a102d2001027f20012d0030450440200141216a200141c9006a290000370000200141196a200141c1006a290000370000200141116a200141396a2900003700002001200129003137000941000c010b200141003a000941010b3a00082000200141086a41d4890441c10041988a041049200141e0006a24000b4d02017f027e230041206b2200240020004200370308200042003703002000411036021c20002000411c6a10012000290308210120002903002102200041206a2400410541042001200284501b0b0b0020002001104d4101730b2f01037f20002d0000220220012d000022037245210420024520034572047f200405200041016a200141016a104f0b0b0b0020002001104f4101730b0b002000200141201010450b7601027f230041306b220224002002410036021820024280800137022420024184ae0436022041d8eac38a78200241206a2203101a20002003101a20012003101f20022002290320370310200241086a200241106a2002280228101b2002280208200228020c100c2100200241306a24002000417f470b0300010b1b002000418180014f044020004180800141a88a041018000b20000b0f0020002001200241a89b04108f010b7c01017f230041406a220524002005200136020c200520003602082005200336021420052002360210200541246a42023702002005413c6a41023602002005410236021c200541809604360218200541033602342005200541306a3602202005200541106a3602382005200541086a360230200541186a2004101d000b4801017f230041206b220124002001410c6a420137020020014101360204200141bca4043602002001410436021c200120003602182001200141186a360208200141988d04101d000b930101017f230041306b22022400200241146a42013702002002410136020c200241bca40436020820024103360224200220002d0000410274220041bcad046a28020036022c2002200041d0ad046a280200360228200141146a2802002100200141186a28020021012002200241206a3602102002200241286a36022020002001200241086a1087012100200241306a240020000b7c01017f230041106b2203240002402001413f4d04402002200141027410580c010b200141ffff004d0440200320014102744101723b010e20022003410e6a410210590c010b200141ffffffff034d044020014102744102722002105a0c010b20024103105820012002105a0b2002200020011059200341106a24000b2601017f230041106b22022400200220013a000f20002002410f6a41011059200241106a24000b7601027f230041106b2204240020022000280204200028020822036b4b0440200441086a20002003200210752004280208200428020c105b200028020821030b200028020020036a20012002100e2003200220036a22014b044041908e04411c41909404102a000b20002001360208200441106a24000b2601017f230041106b220224002002200036020c20012002410c6a41041059200241106a24000b1f00024020004181808080784704402000450d0120011033000b0f0b1034000be90101037f230041106b220424002000027f024002402001044020024100480d01027f20032802040440200341086a2802002205450440200441086a200120024100107620042802082103200428020c0c020b20032802002106024020012002105d2203450440410021030c010b200320062005100e0b20020c010b20042001200210772004280200210320042802040b21052003044020002003360204200041086a200536020041000c040b20002001360204200041086a20023602000c020b20004100360204200041086a20023602000c010b200041003602040b41010b360200200441106a24000bac0101027f02402001200020016a41016b410020006b7122004d0440024041fcad04280200220120006a22032001490d004180ae042802002003490440200041ffff036a22022000490d0320024110764000220141ffff034b0d032001411074220120024180807c716a22032001490d03410021024180ae042003360200200020016a22032001490d010b41fcad042003360200200121020b20020f0b41c0a604411c41b0a604102a000b41000b7901027f230041106b220324000240024002402001450440410121020c010b200141004e2204450d01027f2002450440200341086a20042001107720032802080c010b2003200420014101107620032802000b2202450d020b2000200136020420002002360200200341106a24000f0b1034000b20011033000b3f01027f20012802042203200128020822024904402002200341e0a8041053000b200041003602082000200320026b3602042000200128020020026a3602000bef0102037f017e230041d0006b22032400200341106a22052001105f20032903102106200341003602282003200637032020022802002002280204200341206a2204103b200420022802084119102c20032003290320370310200341086a20052003280228101b20042003280208200328020c10262003200128020020012802042001280208220241ec8a04101520034100360248200320032903003703402004200341406b102b2002200220032802486a22044b044041e08404411c41fc8a04102a000b200141086a22022004360200200041086a200228020036020020002001290200370200200341d0006a24000b6502027f017e230041206b22022400200241186a2203410036020020022001290200370310200241086a200241106a200141086a280200101b20022903082104200041086a2003280200360200200020022903103702002000200437020c200241206a24000b7401027f230041106b2202240020024280800137020420024184ae04360200024020012d000045044020024100102920012d0001220341044604402002410010290c020b2002410110292003200141026a2d0000200210690c010b2002410110292002410110290b2000200228020810521068000b0b002000200141031090010b0b002000200141021090010b3701017f230041106b2201240020014280800137020420014184ae0436020020014100102920002001101a4100200128020810521068000b3701017f230041106b2200240020004280800137020420004184ae043602002000410110292000410110294101200028020810521068000b7a01047f230041306b220024002000410036021820004280800137022420004184ae043602204100200041206a101a20002000290320370310200041086a200041106a22012000280228101b200028020c210220002802082103200020014100101b2003200220002802002000280204100a1a200041306a24000b0d0020004184ae042001100d000b4a000240024002400240200041ff017141016b0e03010203000b2002410010292002200110290f0b2002410110292001200210440f0b2002410210292001200210470f0b2002410310290bdf3b02147f057e230041c0056b2200240002400240104b41ff017141054604402000418080013602f8014184ae04200041f8016a2202100320004190016a20002802f8014184ae044180800141fc8804101720002000290390013703f004200041003602f801200041f0046a2002410410160d0120002d00fb01210220002d00fa01210320002d00f901210402400240024002400240024002400240024002400240024002400240024020002d00f801220a418e016b0e080601100310101005000b02400240200a41ff006b0e05011111110e000b200a4111460d0a200a4128470440200a413e460d08200a41ca00460d0f200a41cf00460d09200a41de00460d0a200a41ee00460d0d200a41f600460d03200a41b501470440200a41c101460d0d200a41df01460d06200a41ea0147200441f101477220034124472002418a014772720d12200041f8016a200041f0046a102e20002d00fc0122054102460d1220002f00fd0120002d00ff0141107472210120002f00f90120002d00fb0141107472210c200035029c022115200028029802210d200028029402210b200028029002210720002903880221142000280284022108200028028002210620002d00f8012109410e21030c130b200441e10147200341d3004772200241ec0147720d11200041d8006a200041f0046a101420002802580d11200028025c210820004198016a200041f0046a10212000280298012209450d1120002802a0012106200028029c012105200041f8016a200041f0046a102120002802f801450d112009410876210c20054108762101200028028002210720002903f8012114410021030c120b20044108472003413a4772200241bd0147720d10200041e0006a200041f0046a101420002802600d1020002802642209410876210c410121030c110b200441b50147200341b7014772200241e70047720d0f200041e8006a200041f0046a101420002802680d0f200028026c2209410876210c410221030c100b2004413a4720034195014772200241f40147720d0e200041f8016a200041f0046a102d20002d00f8010d0e20002802fc012209410876210c20004181026a2f000020004183026a2d000041107472210120004198026a2d0000210b20004194026a28020021072000418c026a290200211420004188026a280200210820004184026a280200210620004180026a2d0000210520002d00fb01210e20002d00fa01210f20002d00f9012110410321030c0f0b2004410a472003412647722002412547720d0d410421030c0e0b2002200441aa0147200341354772720d0c410521030c0d0b200441ec0147200341f3004772200241ed0047720d0b200041f8016a200041f0046a103220002802f8012209450d0b2009410876210c20002f00fd0120002d00ff01411074722101200028028002210620002d00fc012105410621030c0c0b20044123472003413d4772200241f40047720d0a200041f8016a200041f0046a102f20002802f8012209450d0a2009410876210c20002f00fd0120002d00ff01411074722101200028029802210d200028029402210b200028029002210720002903880221142000280284022108200028028002210620002d00fc012105410721030c0b0b200441b70147200341f00047722002412447720d09200041f8016a200041f0046a102d20002d00f8010d0920002d00fc01210220002f01fa01210120004195026a280000210d20004191026a2203280000210b2000418d026a280000210720004185026a290000211420004181026a2204280000210820002800fd01210620002d00f9012105200041f8016a200041f0046a102d20002d00f8010d09200041a0016a20004189026a290000370300200041a8016a2003290000370300200020042900003703980120002900f9012115200041f0006a200041f0046a102220002802700d0920004180016a290300211720002903782116200041f8016a200041f0046a103220002802f8012212450d0941082103200041e8036a2204200041a0016a290300370300200041f0036a220a200041a8016a29030037030020002000290398013703e00320002902fc012118200041f8016a221141c100100f200041f0046a201141c10010160d092001200241107472210120004190046a200041f8016a41c100100e20004198056a2004290300370300200041a0056a200a290300370300200020002903e003370390050c0a0b200441cc0147200341264772200241fe0047720d08200041f8016a200041f0046a102d20002d00f8010d0820004198016a200041f0046a1032200028029801220d450d0820002f01fa0120002d00fc0141107472210c20002f01fe0120004180026a2d000041107472210120004195026a280000210b20004191026a280000210720004189026a290000211420004185026a28000021084109210320004181026a280000210620002d00fd01210520002d00f9012109200029029c0121150c090b200441a401472003413c47722002418c0147720d07410a21030c080b200441224720034187014772200241d30047720d06410b21030c070b200441f401472003413e4772200241fd0147720d05200041f8016a200041f0046a101c20002d00f80122104102460d0520002800fb012209410876210c20002f01800220004182026a2d000041107472210120002f009702210b2000280093022107200029008b0221142000280087022108200028008302210620002d00ff01210520002d00fa01210e20002d00f901210f410c21030c060b200441d90147200341ac0147722002411847720d04200041f8016a200041f0046a102e20002d00fc0122054102460d0420002f00fd0120002d00ff0141107472210120002f00f90120002d00fb0141107472210c200035029c022115200028029802210d200028029402210b200028029002210720002903880221142000280284022108200028028002210620002d00f8012109410d21030c050b200441cf0047200341094772200241910147720d03200041f8016a200041f0046a102e20002d00fc0122054102460d0320002f00fd0120002d00ff0141107472210120002f00f90120002d00fb0141107472210c200035029c022115200028029802210d200028029402210b200028029002210720002903880221142000280284022108200028028002210620002d00f8012109410f21030c040b200441da01472003413b4772200241b20147720d0220004188016a200041f0046a10142000280288010d02200028028c012209410876210c411021030c030b200441c00147200341e2004772200241fd0147720d01200041f8016a200041f0046a102e20002d00fc0122054102460d0120002f00fd0120002d00ff0141107472210120002f00f90120002d00fb0141107472210c200035029c022115200028029802210d200028029402210b200028029002210720002903880221142000280284022108200028028002210620002d00f8012109411121030c020b200041043a00f801200041f8016a1055000b1066000b200041f0016a200041a0056a290300370300200041e8016a20004198056a29030037030020002000290390053703e00120004198016a20004190046a220241c100100e20004100360298042000428080013702fc0120004184ae043602f8014100200041f8016a2204101a200020002903f80137039004200041d0006a2002200028028002101b2000280254210a200028025021112000280290042102200020002802940422133602f8012011200a2002200410002104200041c8006a20002802f8012002201341fc8804101702400240024002400240024002400240027f02400240024002400240024002400240027e02400240024002400240024002400240024002400240024002400240024020040e0400020201020b200941ff0171200c410874722104200341016b0e1102030f101104050607141508090a180b190c0b20004184026a4200370200200041013602fc01200041c08d043602f801200041dca60436028002200041f8016a41988d04101d000b20004184026a4200370200200041013602fc01200041d48a043602f801200041dca60436028002200041f8016a41dc8a04101d000b41012102200041f8016a2201410172104a200041013a00f801420121144200211542004183d5c5a87a2001106b220341ff01714103470d0b1a200041f8016a20041020428006200028029c022203450d0b1a20002802a40221062000280298022107200028029002210820004190046a103820002d009004450440200041e0036a200028029404220110412000419c046a220b20002802e8033602002000410236029404200041c2850436029004200020002802e00336029804200041f0046a20004190046a22051039410021022000417f417f2007106c220941046a220a2009200a4b1b22092006106c6a220a2009200a4b1b4100105e20004198046a22094100360200200020002903003703900420042005105a2008200720051057200320062005105720004198056a2206200928020036020020002000290390043703900520002802f00420002802f80420004190056a103e200141016a22030d0b41e08404411c41b08604102a000b20002d00910421034280020c0b0b20004180026a20041020200041003602f801230041106b2202240020024280800137020420024184ae043602000240200041f8016a22012802004504402002410010292001412c6a2802004504402002410010290c020b200241011029200141086a200210250c010b2002410110292002410110290b0c190b2000200636029804200020053a0094042000200436029004200020013b009504200020014110763a009704200041f8016a220241047220004190046a22012802002001280208103a200041003602f801230041106b2201240020014280800137020420014184ae0436020002402002280200450440200141001029200228020422034504402001410010290c020b20014101102920032002410c6a2802002001103b0c010b2001410110292001410110290b0c190b41012102200041f8016a2203410172104a200041013a00f8014185b99ed07a2003106b220341ff01714103470d16200020063602e803200020053a00e403200020043602e003200020013b00e503200020014110763a00e703200020143702940420002008360290042000200d360280022000200b3602fc01200020073602f801200041e0036a20004190046a200041f8016a103c220341ff01714107460d0c0c160b20004190046a20004198016a41c100100e200041c0026a2017370300200041a8026a200041e8016a290300370300200041b0026a200041f0016a290300370300200020163703b80220002015370398022000200d360294022000200b360290022000200736028c0220002014370284022000200836028002200020063602fc01200020053a00f801200020002903e0013703a002200020123602c802200020013b00f901200020014110763a00fb01200020183702cc02200041a0036a2202104841072101024020004198026a2002104e0d00200041206a200041f8016a10454108210120162000290320852017200041286a29030085844200520d00200041d8036a4200370300200041d0036a4200370300200041c8036a4200370300200042003703c00320004100360298052000428080013702e40320004184ae043602e003200041f8016a200041e0036a22021046200020002903e00337039005200041186a20004190056a20002802e803101b2000280218200028021c200041c0036a2203100820024121100f41092101410c20004190046a20032002100722022002410c4f1b0d00200041a8056a22024200370300200041a0056a2201420037030020004198056a220342003703002000420037039005200041e0036a412120004190056a100820004188056a200229030037030020004180056a2001290300370300200041f8046a200329030037030020002000290390053703f004410a2101200041f8016a200041f0046a104e0d0041012101201642017c2214201654220220172002ad7c2215201754201420165a1b4101460d1420004100360298052000428080013702e40320004184ae043602e003419ade91f679200041e0036a2202101a200041f8016a2002102b200020002903e00337039005200041106a20004190056a220320002802e803101b20002802142105200028021021062000290390052116200041003602e803200020163703e0032014201520021036200020002903e00337039005200041086a200320002802e803101b200620052000280208200028020c100a1a200041f9036a20004190026a290300370000200041f1036a20004188026a290300370000200041e9036a20004180026a290300370000200020002903f8013700e103200041013a00e0034185b99ed07a20021050450d00200020184220883e0294052000201236029005200041e0036a20004190056a102f20002802e0032202044020004188036a200041ed036a29000037030020004190036a200041f5036a29000037030020004197036a200041fc036a290000370000200020002900e5033703800320002d00e4032101200041043602e003200041e0036a22031040200041f8046a200028008303360000200020013a00f404200020023602f00420002000280280033600f50420004198056a2000418f036a280000360200200020002900870337039005200041e8036a2000419b036a28000036020020002000290093033703e003200041f0046a20004190056a2003103c220141ff017122034107460d0e410121022003410c460d0e0c160b410521010b410121020c140b200041eb036a200141107622023a0000200041e9036a20013b000020004188046a201537030020004184046a2203200d36020020004180046a200b360200200041fc036a2007360200200041f4036a2014370200200041f0036a2008360200200041ec036a2006360200200041e8036a20053a0000200020043602e4032000200041c0036a3602e003200041386a200041e0036a4104721045200041406b290300211520002903382116200041b0046a1048200041d8046a2015370300200041e8046a2000418c046a280200360200200020023a009704200020013b009504200020163703d0042000200b3602ac04200020073602a804200020143703a0042000200836029c042000200636029804200020053a0094042000200436029004200020032902003703e00420004188056a2201420037030020004180056a22034200370300200041f8046a22054200370300200042003703f00420004100360298052000428080013702fc0120004184ae043602f80120004190046a2206200041f8016a22021046200020002903f80137039005200041306a20004190056a2207200028028002101b20002802302000280234200041f0046a100820004180026a200641d000100e20004198056a200041ec046a280200360200200041a4056a2005290300370200200041ac056a2003290300370200200041b4056a2001290300370200200020002902e40437039005200020002903f00437029c0520002802e0042101200041d4026a2007412c100e200041d0026a2001360200200041003602f8012001452100230041106b2201240020014280800137020420014184ae0436020002402002280200450440200141001029200241086a2103200241d8006a2802000440200141001029200320011046200241e8006a2001102b0c020b20014101102920032d0000200110470c010b2001410110292001410110290b2000200128020810521068000b20004186026a20014110763a000020004184026a20013b01002000419b026a200b3b000020004197026a20073600002000418f026a20143700002000418b026a200836000020004187026a200636000020004183026a20053a0000200020043600ff012000200e3a00fe012000200f3a00fd01200020103a00fc012000200041c0036a3602f801200041e0036a220210194101210320004190046a2201410172104a200041013a009004410020022001104c0d0e1a20004190046a1019200041f8016a410472220241a18504104d450d0d41010c0e0b200020153e029c022000200d360298022000200b360294022000200736029002200020143703880220002008360284022000200636028002200020053a00fc01200020043602f801200020013b00fd01200020014110763a00ff01230041306b22022400200041f8016a22012802002103200241086a2200200141046a4121100e2003200010502103200241306a2400230041106b2202240020024280800137020420024184ae04360200230041106b22012400200241001029200120033a000f20022001410f6a4101102c200141106a24000c130b200020153c00b0042000200d3602ac042000200b3602a804200020073602a4042000201437029c0420002008360298042000200636029404200020053a009004200020013b009104200020014110763a00930441012102200041f8016a2201410172104a200041013a00f80141002103024020004190046a2001104c0d00200420004190046a106b220341ff01714103470d00200420004190046a106d106741002102410321030b200220031063000b200410371065000b200041f8016a2202410172104a200041013a00f80120004183d5c5a87a2002106b220241ff01714103472203047f410005200041a4026a200736020020004198026a200636020020004180026a420037030020004188026a420037030020004194026a200541ff0171200141087472360200200041003b01a8022000201437029c022000200436029002200042003703f8012008200041f8016a1024106741040b3a00f901200041003a00f801200020023a00fa012003200041f8016a1062000b200041e0036a41e08604103920004190046a22052003104120002802e00320002802e8032005103e200b2006280200360200200041a0046a200136020020002000290390053702940420004102360290042001ad42208621152005104010674200211442000b211620002016428006832003ad42ff0183421086201584842014843703f801230041106b2201240020014280800137020420014184ae043602000240200041f8016a22032d000022004102470440200141001029200045044020014100102920032802042001101a0c020b200141011029200341016a2d0000200341026a2d0000200110690c010b2001410110292001410110290b0c100b20004183026a20014110763a000020004181026a20013b000020004198026a200b3a000020004194026a20073602002000418c026a201437020020004188026a200836020020004184026a200636020020004180026a20053a0000200020043602fc012000200e3a00fb012000200f3a00fa01200020103a00f901200041013a00f80120004185b99ed07a200041f8016a1042220241ff01714103472201047f410005106741040b3a00f901200041003a00f801200020023a00fa012001200041f8016a1062000b4185b99ed07a1065000b4183d5c5a87a1065000b106741002102410721030c090b1067410c2101410021020c070b200041f8016a22024101721019200041003a00f801230041106b2201240020014280800137020420014184ae04360200024020022d0000450440200141001029200241016a2001101f0c010b2001410110292001410110290b0c090b20004190046a22021019200041f8016a2203410172104a200041013a00f8014100210120022003104c2202450440200041f8016a101941a18504101e1067410221010b200220011064000b2002101e10674100210341020b2102200320021064000b200020153c0098022000200d360294022000200b360290022000200736028c0220002014370284022000200836028002200020063602fc01200020053a00f801200020013b00f901200020014110763a00fb012004200041f8016a1043220241ff0171410347220145044010670b200120021063000b200020153c0098022000200d360294022000200b360290022000200736028c0220002014370284022000200836028002200020063602fc01200020053a00f801200020013b00f901200020014110763a00fb012004200041f8016a1042220241ff0171410347220145044010670b200120021063000b41e08404411c41e08704102a000b230041106b2203240020034280800137020420034184ae043602002003410010290240200141ff0171410c4604402003410010290c010b2003410110292001200310470b2002200328020810521068000b230041106b2201240020014280800137020420014184ae043602002001410010290240200341ff017141074604402001410010290c010b2001410110292003200110440b0c020b4100200228020810521068000b4100200128020810521068000b2002200128020810521068000b0d00410341012000200110501b0b2001017f2000200041046a22014b044041e0ab04411c41fcab04102a000b20010b7401027f230041406a220224002002410036023820024280800137021420024184ae0436021041d8eac38a78200241106a2203101a20002003101a20012003101f20022002290310370330200241086a200241306a2002280218101b2002280208200228020c100b1a2003104a200241406b24000be20301087f230041d0006b220024000240104b41ff0171220141054604402000418080013602284184ae04200041286a22011003200020002802284184ae044180800141fc88041017200020002903003703282000410036020802402001200041086a410410160d0020002d0008419b01470d0020002d000941ae01470d0020002d000a419d01470d0020002d000b41de00470d00200041086a104a200041c1006a2201200041206a2202290300370000200041396a2203200041186a2204290300370000200041316a2205200041106a220629030037000020002000290308370029200041013a0028200041286a2207101e20012002290300370000200320042903003700002005200629030037000020002000290308370029200041013a00284100200710504504404100200041286a106f0b20012002290300370000200320042903003700002005200629030037000020002000290308370029200041013a00284183d5c5a87a200041286a1042220141ff01714103470d021067230041106b2200240020004280800137020420004184ae043602002000410010292000410010294100200028020810521068000b1066000b200020013a0028200041286a1055000b200020013a002841c88d044122200041286a41f0870441ec8d041054000b8c0101027f230041306b220224002002410036021820024280800137022420024184ae0436022041d8eac38a78200241206a2203101a20002003101a20012003101f20022002290320370310200241086a200241106a22032002280228101b200228020c210020022802082101200220034100101b2001200020022802002002280204100a1a200241306a24000b5901017f230041206b2202240020022000360204200241186a200141106a290200370300200241106a200141086a29020037030020022001290200370308200241046a41ac8e04200241086a10712100200241206a240020000bfe0301057f230041406a22032400200341306a2001360200200341033a003820034120360228200341003602342003200036022c2003410036022020034100360218027f02400240200228021022014504402002410c6a28020022004103742105200041ffffffff017121072002280208210441002101034020012005460d02200228020020016a220041046a28020022060440200328022c20002802002006200328023028020c1101000d040b200141086a21012004280200210020042802042106200441086a21042000200341186a2006110200450d000b0c020b200241146a28020022074105742100200741ffffff3f71210703402000450d01200228020020046a220541046a28020022060440200328022c20052802002006200328023028020c1101000d030b20032001280210360228200320012d001c3a003820032001280218360234200341106a20022802082205200141086a10860120032003290310370318200341086a2005200110860120032003290308370320200441086a2104200041206b210020012802142106200141206a2101200520064103746a2205280200200341186a2005280204110200450d000b0c010b200228020420074b0440200328022c200228020020074103746a22002802002000280204200328023028020c1101000d010b41000c010b41010b2101200341406b240020010b0f00200028020020012002105941000bdd0201037f230041106b220224000240024002400240200028020022002002410c6a027f0240024020014180014f04402002410036020c2001418010490d012001418080044f0d0220022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d41030c030b200028020822032000280204460d030c040b20022001413f71418001723a000d2002200141067641c001723a000c41020c010b20022001413f71418001723a000f20022001410676413f71418001723a000e20022001410c76413f71418001723a000d2002200141127641077141f001723a000c41040b10590c020b230041106b22042400200441086a20002003410110752004280208200428020c105b200441106a2400200028020821030b200028020020036a20013a0000200341016a2201450d01200020013602080b200241106a240041000f0b41908e04411c41809404102a000b5201017f230041206b2202240020002802002100200241186a200141106a290200370300200241106a200141086a290200370300200220012902003703082000200241086a10702100200241206a240020000be10101027f230041206b220424000240027f4100200220036a22032002490d001a200128020422024100480d01410820024101742205200320032005491b2203200341084d1b2203417f73411f7621050240200204402004200236021820044101360214200420012802003602100c010b200441003602140b200420052003200441106a105c20042802004504402004280204210220012003360204200120023602004181808080780c010b200441086a280200210320042802040b21052000200336020420002005360200200441206a24000f0b41d08e04412141f48f04102a000b2b002002044020034504404186ae052d00001a0b20012002105d21010b20002002360204200020013602000b3901017f230041106b22032400200341086a2001200241001076200328020c21012000200328020836020020002001360204200341106a24000bf906020b7f027e230041406a2203240020002802002202ad210d02400240024002400240024002400240024020024190ce004f044041272100200d210e034020004104490d0a200341196a20006a220241046b200e200e4290ce0080220d4290ce007e7da7220441ffff037141e4006e2206410174418797046a2f00003b0000200241026b2004200641e4006c6b41ffff0371410174418797046a2f00003b0000200041046b2100200e42ffc1d72f562102200d210e20020d000b200da7220241e3004b0d010c040b41272100200241e3004b0d012002410a490d060c040b20004102490d070b200041026b2200200341196a6a200da72202200241ffff037141e4006e220241e4006c6b41ffff0371410174418797046a2f00003b00000c010b000b2002410a490d01200041024f0d000c040b200041026b2200200341196a6a2002410174418797046a2f00003b00000c020b2000450d020b200041016b2200200341196a6a200241306a3a00000c000b02400240200041274d0440412820006b412720006b2206200128021c220541017122071b2102410021042005410471044041dca6042104200241dca60441dca604107c20026a22024b0d020b412b418080c40020071b2107200341196a20006a2108200128020045044041012100200141146a2802002202200141186a280200220120072004107f0d03200220082006200128020c11010021000c030b2002200128020422094f044041012100200141146a2802002202200141186a280200220120072004107f0d03200220082006200128020c11010021000c030b200541087104402001280210210b2001413036021020012d0020210c41012100200141013a0020200141146a2802002205200141186a280200220a20072004107f0d03200341106a2001200920026b410110800120032802102202418080c400460d0320032802142104200520082006200a28020c1101000d03200220042005200a1081010d032001200c3a00202001200b360210410021000c030b41012100200341086a2001200920026b410110800120032802082205418080c400460d02200328020c2109200141146a2802002202200141186a280200220120072004107f0d02200220082006200128020c1101000d02200520092002200110810121000c020b0c020b41d09404411c41c09904102a000b200341406b240020000f0b41a09404412141aca404102a000b0e0020002802001a03400c000b000ba80201047f230041406a220124002001200036020c2001410636021420012001410c6a3602104100210002400240024002400240034020002000200341037441a4a7046a2802006a22004b0d014101210320022104410121022004450d000b200120004101744100200041104e1b4100105e2001410036022020012001290300370318200142013702342001410236022c200141a0a7043602282001200141106a360230200141186a200141286a10700d0120012802182100200128022021024184ae052d00004504404185ae052d00004101710d050b410c20002002100622002000410c4f1b4109470d020c030b41908e04411c418cad04102a000b41e091044133200141286a41f48e04418093041054000b4184ae0541013a00000b4185ae0541013a00000b000b2100200042a0d1e9d39db9bfe40d370308200042ebe8efb0c4d3dafccf003703000b8e04010a7f230041106b220224000240200120006b220141104f04402000200041036a417c71220620006b2200107d22042006200120006b2200417c716a2000410371107d6a220320044f0440200041027621050240024003402005450d0520022006200541c0012005200541c0014f1b41cc9c04107e200228020c21052002280208210620022002280200200228020422002000417c7141b49e04107e200228020c210820022802082107024020022802042200450440410021000c010b2002280200220420004102746a21094100210003402004220a41106a21044100210102400340200020002001200a6a280200220b417f73410776200b410676724181828408716a22004d0440200141046a22014110470d010c020b0b41d09404411c41f49e04102a000b20042009470d000b0b20032003200041087641ff81fc0771200041ff81fc07716a418180046c4110766a22034b0d012008450d000b200841027421014100210003402000200020072802002204417f734107762004410676724181828408716a22004b0d02200741046a2107200141046b22010d000b20032003200041087641ff81fc0771200041ff81fc07716a418180046c4110766a22034d0d0441d09404411c41d49e04102a000b41d09404411c41c49e04102a000b41d09404411c41e49e04102a000b41d09404411c41a49e04102a000b20002001107d21030b200241106a240020030b4601017f200145044041000f0b024003402002200220002c000041bf7f4a6a22024b0d01200041016a2100200141016b22010d000b20020f0b41d09404411c418cad04102a000b3e00200220034f044020002003360204200020013602002000410c6a200220036b3602002000200120034102746a3602080f0b41fca60441232004102a000b39000240027f2002418080c40047044041012000200220012802101102000d011a0b20030d0141000b0f0b200020034100200128020c1101000bb60101027f20022105024002400240024020012d0020220441016b0e03010200030b200341ff01710d00410021040c020b41002105200221040c010b200241016a2203044020034101762105200241017621040c010b41d09404411c41d09904102a000b200441016a2102200141186a2802002103200128021021042001280214210102400340200241016b2202450d01200120042003280210110200450d000b418080c40021040b20002005360204200020043602000b3201017f027f0340200120012004460d011a200441016a2104200220002003280210110200450d000b200441016b0b2001490b900201067f02402000027f418080c400200128020022022001280204460d001a2001200241016a2205360200024020022d0000220341187441187541004e0d002001200241026a220536020020022d0001413f7121042003411f712106200341df014d0440200641067420047221030c010b2001200241036a220536020020022d0002413f712004410674722107200341f00149044020072006410c747221030c010b2001200241046a2205360200418080c4002006411274418080f0007120022d0003413f71200741067472722203418080c400460d011a0b20012802082204200520026b6a22022004490d012001200236020820030b360204200020043602000f0b41d09404411c41f49f04102a000b2c00200120024d04402000200220016b3602042000200120036a3602000f0b41a0940441214188a104102a000bd20301067f230041306b22022400200028020421042000280200210302400240027f024020012802002205200128020822007204402000450d032001410c6a280200210020024100360228200220033602202002200320046a360224200041016a21000340200041016b22000440200241186a200241206a108201200228021c418080c400470d010c050b0b200241106a200241206a1082012002280214418080c400460d03024020022802102200450d00200020044f044020002004460d010c030b200020036a2c00004140480d020b200241086a410020002003108301200228020c210620022802080c020b200128021420032004200141186a28020028020c11010021000c030b41000b21002006200420001b21042000200320001b21030b2005450440200128021420032004200141186a28020028020c11010021000c010b200128020422002003200320046a107c22054b044020022001200020056b41001080014101210020022802002205418080c400460d0120022802042106200141146a280200220720032004200141186a280200220128020c1101000d01200520062007200110810121000c010b200128021420032004200141186a28020028020c11010021000b200241306a240020000b140020002802002001200028020428020c1102000b5501027f0240027f02400240200228020041016b0e020103000b200241046a0c010b200120022802044103746a22012802044107470d0120012802000b2802002104410121030b20002004360204200020033602000b4d01017f230041206b22032400200341186a200241106a290200370300200341106a200241086a2902003703002003200229020037030820002001200341086a10712100200341206a240020000ba306010c7f230041d0006b22032400200341003b014c200320023602482003410036024420034281808080a00137023c2003200236023820034100360234200320023602302003200136022c2003410a3602282000280204210a2000280200210b2000280208210c200341406b210e027f034002400240024002402007450440027f024020022005490d000340200120056a2104024002400240024002400240024002400240200220056b220741084f04402004200441036a417c712200460440200741086b210d410021000c030b200341206a2004200020046b220010890120032802204101470d01200328022421060c040b200341106a2004200710890120032802142106200328021021040c050b2000200741086b220d4b0d010b0340200020046a22092802002206417f732006418a94a8d0007341818284086b71200941046a2802002209417f732009418a94a8d0007341818284086b7172418081828478710d01200041086a2200200d4d0d000b0b200020074b0d01200341186a200020046a200720006b1089014100210420032802184101470d022000200328021c6a22062000490d030b410121040c010b41a09404412141d49a04102a000b024020044101460440200641016a2200450d032005200020056a22004d044020032000360234200041016b22052002490d020c050b41d09404411c419ca404102a000b20032002360234200221050c050b200120056a4101200e4101103d450d02200341086a200820002001108301200320003602444100210720032802082104200022082105200328020c0c050b41d09404411c41e49a04102a000b41d09404411c418ca404102a000b2000220520024d0d000b0b200341013a004d20022008490d0341002104410121072002200847047f20032008200220011083012003280200210420032802040520060b0b210620040d010b41000c050b200c2d0000450d01200b419096044104200a28020c110100450d010c020b41a0940441214184a004102a000b200c2006047f200420066a41016b2d0000410a460541000b3a0000200b20042006200a28020c110100450d010b0b41010b2100200341d0006a240020000b4f01027f024002402002450440410021020c010b410121040340200120036a2d0000410a460440200321020c030b2002200341016a2203470d000b0b410021040b20002002360204200020043602000b1b002001280214418cac044105200141186a28020028020c1101000b16002001280214200141186a280200200028020010710b0c00200028020020011084010b9e0301047f230041d0006b2202240020002802002103410121000240200141146a280200220441989504410c200141186a280200220128020c1101000d000240200328020c220504402002200536021c200241c4006a42013702002002410236023c200241a89504360238200241083602242002200241206a36024020022002411c6a36022020042001200241386a108701450d010c020b200241086a20032802002205200328020428020c110000200229030842c1f7f9e8cc93b2d14185200241106a29030042e4dec78590d085de7d858450450d002002200536021c200241c4006a42013702002002410236023c200241a89504360238200241093602242002200241206a36024020022002411c6a36022020042001200241386a1087010d010b200328020821002002412c6a4203370200200241cc006a4105360200200241c4006a410536020020024103360224200241f0940436022020022000410c6a3602482002200041086a3602402002410336023c200220003602382002200241386a36022820042001200241206a10870121000b200241d0006a240020000b3100200128021420002d0000410274220041f0ad046a280200200041e4ad046a280200200141186a28020028020c1101000b6901017f230041306b220424002004200136020420042000360200200441146a42023702002004412c6a41053602002004410236020c20042003360208200441053602242004200441206a3602102004200441046a36022820042004360220200441086a2002101d000b4c01017f230041106b2203240020034280800137020420034184ae043602002003410010292003200141ff0171200247047f20034101102920010541000b10292000200328020810521068000b0b902d0800418080040bd1042f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f7061726974792d7363616c652d636f6465632d332e362e352f7372632f636f6d706163742e7273000000000001006900000042000000260000004661696c656420746f206765742076616c756520696e204d617070696e673a207c000100200000002f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f696e6b5f73746f726167652d342e332e302f7372632f6c617a792f6d617070696e672e727300a4000100670000009c000000250000002f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f696e6b5f656e762d342e332e302f7372632f656e67696e652f6f6e5f636861696e2f696d706c732e72731c0101006c0000009d000000110000001c0101006c0000009d000000300000004661696c656420746f206765742076616c756520696e205261774d617070696e673a2000a8010100230000002f686f6d652f677569676f752f2e636172676f2f6769742f636865636b6f7574732f6f70656e62727573682d636f6e7472616374732d323762336130326139316638656261332f323063636432392f6c616e672f7372632f73746f726167652f7261775f6d617070696e672e72730000d40101006e00000030000000250041e084040b41617474656d707420746f206164642077697468206f766572666c6f7700000000617474656d707420746f206d756c7469706c792077697468206f766572666c6f770041c285040bff08712f2f686f6d652f677569676f752f70726f6772616d6d696e672f706861742d6f6666636861696e2d726f6c6c75702f696e6b2f6372617465732f706861745f726f6c6c75705f616e63686f725f696e6b2f7372632f7472616974732f726f6c6c75705f616e63686f722e727300c40201006b0000007b0000001d0000005f68656164000000c20201000200000040030100050000005f7461696c000000c20201000200000058030100050000002f686f6d652f677569676f752f70726f6772616d6d696e672f706861742d6f6666636861696e2d726f6c6c75702f696e6b2f6372617465732f706861745f726f6c6c75705f616e63686f725f696e6b2f7372632f7472616974732f6d6574615f7472616e73616374696f6e2e72730000700301006e0000006c000000150000000a00000001000000010000000b0000000a0000000100000001000000010000002f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f696e6b5f656e762d342e332e302f7372632f656e67696e652f6f6e5f636861696e2f6578742e72730000100401006a000000e4000000140000004120636f6e7472616374206265696e67206578656375746564206d757374206861766520612076616c6964206163636f756e742069642e001c0101006c0000007c0100000e00000054686520657865637574656420636f6e7472616374206d757374206861766520612063616c6c6572207769746820612076616c6964206163636f756e742069642e0000001c0101006c0000006b0100000e0000001c0101006c0000002401000023000000656e636f756e746572656420756e6578706563746564206572726f72380501001c0000001c0101006c000000ed00000017000000b01301006d000000c100000037000000b01301006d000000c400000009000000546573744f7261636c653a3a507269636552656365697665640000005c130100000000008c050100546573744f7261636c653a3a4572726f7252656365697665640000005c13010000000000b4050100546573744f7261636c653a3a4d6573736167655175657565640000005c13010000000000dc050100546573744f7261636c653a3a4d65737361676550726f636573736564546f546573744f7261636c653a3a4d65746154784465636f646564005c13010000000000220601002f686f6d652f677569676f752f70726f6772616d6d696e672f706861742d6f6666636861696e2d726f6c6c75702f696e6b2f636f6e7472616374732f746573745f6f7261636c652f6c69622e72730000480601004e000000730000000500000073746f7261676520656e7472792077617320656d70747900a80601001700000053686f756c64206772616e742074686520726f6c65204d414e414745525f524f4c450000480601004e0000008b00000012000000480601004e000000e10000001100000000000000617474656d707420746f206164642077697468206f766572666c6f770c00000004000000040000000d0000000e0000000f0041d08e040bf105617474656d707420746f206d756c7469706c792077697468206f766572666c6f77000000100000000000000001000000110000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f616c6c6f632f7372632f7261775f7665632e727300840701006f0000008e0100001c0000006361706163697479206f766572666c6f770000000408010011000000840701006f0000000c020000050000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f616c6c6f632f7372632f616c6c6f632e72736d656d6f727920616c6c6f636174696f6e206f6620206279746573206661696c6564009d08010015000000b20801000d000000300801006d000000a40100000d0000006120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f722f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f616c6c6f632f7372632f666d742e72730000130901006b00000062020000200000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f616c6c6f632f7372632f7665632f6d6f642e727300900901006f0000002a0700000d000000900901006f0000009807000009000000617474656d707420746f2073756274726163742077697468206f766572666c6f770041d094040bc80d617474656d707420746f206164642077697468206f766572666c6f77293a00005c130100000000006d0a0100010000006d0a0100010000001000000000000000010000001200000070616e69636b65642061742027272c20a40a010001000000a50a010003000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e646578206973200000b80a010020000000d80a0100120000003a2000005c13010000000000fc0a010002000000202020202c0a28280a2f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f666d742f6e756d2e727330303031303230333034303530363037303830393130313131323133313431353136313731383139323032313232323332343235323632373238323933303331333233333334333533363337333833393430343134323433343434353436343734383439353035313532353335343535353635373538353936303631363236333634363536363637363836393730373137323733373437353736373737383739383038313832383338343835383638373838383939303931393239333934393539363937393839392f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f666d742f6d6f642e72730000004f0c01006e000000eb0400000d0000004f0c01006e0000007d050000300000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f736c6963652f6d656d6368722e727300e00c010073000000760000004b000000e00c010073000000770000003400000072616e676520737461727420696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e67746820740d010012000000860d01002200000072616e676520656e6420696e64657820b80d010010000000860d0100220000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f736c6963652f697465722e7273000000d80d010071000000c205000025000000736f7572636520736c696365206c656e67746820282920646f6573206e6f74206d617463682064657374696e6174696f6e20736c696365206c656e67746820285c0e010015000000710e01002b0000006c0a0100010000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f7374722f636f756e742e7273b40e0100700000004700000015000000b40e0100700000004f00000032000000b40e0100700000005a00000009000000b40e010070000000660000000d000000b40e0100700000006400000011000000b40e01007000000054000000110000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f7374722f697465722e727300840f01006f0000009100000011000000840f01006f0000004f0200002d0000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f7374722f7472616974732e72730000001410010071000000d30000001300000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010041daa2040b33020202020202020202020202020202020202020202020202020202020202030303030303030303030303030303030404040404004198a3040bb9082f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f7374722f7061747465726e2e727300009811010072000000b4010000200000009811010072000000b401000011000000190b01006e000000d2010000050000005c13010000000000756e61626c6520746f206465636f64652073656c6563746f72656e636f756e746572656420756e6b6e6f776e2073656c6563746f72756e61626c6520746f206465636f646520696e707574636f756c64206e6f74207265616420696e7075747061696420616e20756e70617961626c65206d6573736167652f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f616c6c6f632f6c61796f75742e727300bc120100730000002e01000018000000617474656d707420746f206164642077697468206f766572666c6f7700000000617474656d707420746f206164642077697468206f766572666c6f77617373657274696f6e206661696c65643a206d6964203c3d2073656c662e6c656e28290a5c130100000000009f130100010000002f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f696e6b5f656e762d342e332e302f7372632f656e67696e652f6f6e5f636861696e2f6275666665722e7273000000b01301006d0000005a0000001c000000b01301006d0000005a00000009000000b01301006d0000005a00000031000000b01301006d0000006500000009000000b01301006d000000830000001a000000b01301006d0000008d000000210000004465636f646543616c6c65655472617070656443616c6c656552657665727465644b65794e6f74466f756e645f42656c6f7753756273697374656e63655468726573686f6c645472616e736665724661696c65645f456e646f776d656e74546f6f4c6f77436f64654e6f74466f756e644e6f7443616c6c61626c65556e6b6e6f776e4c6f6767696e6744697361626c656443616c6c52756e74696d654661696c656445636473615265636f766572794661696c6564496e76616c696443616c6c65724d697373696e67526f6c65526f6c65526564756e64616e742f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f7061726974792d7363616c652d636f6465632d332e362e352f7372632f636f6465632e72730000005a15010067000000770000000e0041e0ab040b9b02617474656d707420746f206164642077697468206f766572666c6f775a150100670000004b040000090000004572726f722f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f697465722f7472616974732f616363756d2e72730000001116010078000000950000000100000000000000617474656d707420746f206164642077697468206f766572666c6f77190000001c000000160000001400000019000000441201005d120100791201008f120100a31201000d0000000b0000000d00000035150100421501004d1501","build_info":{"build_mode":"Debug","cargo_contract_version":"3.2.0","rust_toolchain":"stable-x86_64-unknown-linux-gnu","wasm_opt_settings":{"keep_debug_symbols":false,"optimization_passes":"Z"}}},"contract":{"name":"test_oracle","version":"0.0.1","authors":["GuiGou"]},"spec":{"constructors":[{"args":[],"default":false,"docs":[],"label":"new","payable":false,"returnType":{"displayName":["ink_primitives","ConstructorResult"],"type":10},"selector":"0x9bae9d5e"}],"docs":[],"environment":{"accountId":{"displayName":["AccountId"],"type":0},"balance":{"displayName":["Balance"],"type":6},"blockNumber":{"displayName":["BlockNumber"],"type":3},"chainExtension":{"displayName":["ChainExtension"],"type":49},"hash":{"displayName":["Hash"],"type":36},"maxEventTopics":4,"timestamp":{"displayName":["Timestamp"],"type":9}},"events":[{"args":[{"docs":[],"indexed":false,"label":"trading_pair_id","type":{"displayName":["TradingPairId"],"type":3}},{"docs":[],"indexed":false,"label":"price","type":{"displayName":["u128"],"type":6}}],"docs":["Events emitted when a price is received"],"label":"PriceReceived"},{"args":[{"docs":[],"indexed":false,"label":"trading_pair_id","type":{"displayName":["TradingPairId"],"type":3}},{"docs":[],"indexed":false,"label":"err_no","type":{"displayName":["u128"],"type":6}}],"docs":["Events emitted when a error is received"],"label":"ErrorReceived"},{"args":[{"docs":[],"indexed":false,"label":"id","type":{"displayName":["u32"],"type":3}},{"docs":[],"indexed":false,"label":"data","type":{"displayName":["Vec"],"type":5}}],"docs":["Events emitted when a message is pushed in the queue"],"label":"MessageQueued"},{"args":[{"docs":[],"indexed":false,"label":"id","type":{"displayName":["u32"],"type":3}}],"docs":["Events emitted when a message is proceed"],"label":"MessageProcessedTo"},{"args":[],"docs":["Events emitted when a meta transaction is decoded"],"label":"MetaTxDecoded"}],"lang_error":{"displayName":["ink","LangError"],"type":11},"messages":[{"args":[{"label":"trading_pair_id","type":{"displayName":["TradingPairId"],"type":3}},{"label":"token0","type":{"displayName":["String"],"type":7}},{"label":"token1","type":{"displayName":["String"],"type":7}}],"default":false,"docs":[],"label":"create_trading_pair","mutates":true,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":12},"selector":"0xb5e153ec"},{"args":[{"label":"trading_pair_id","type":{"displayName":["TradingPairId"],"type":3}}],"default":false,"docs":[],"label":"request_price","mutates":true,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":18},"selector":"0x28083abd"},{"args":[{"label":"trading_pair_id","type":{"displayName":["TradingPairId"],"type":3}}],"default":false,"docs":[],"label":"get_trading_pair","mutates":false,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":20},"selector":"0x7fb5b767"},{"args":[{"label":"account_id","type":{"displayName":["AccountId"],"type":0}}],"default":false,"docs":[],"label":"register_attestor","mutates":true,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":12},"selector":"0x8f3a95f4"},{"args":[],"default":false,"docs":[],"label":"get_attestor_role","mutates":false,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":23},"selector":"0x760a2625"},{"args":[],"default":false,"docs":[],"label":"get_manager_role","mutates":false,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":23},"selector":"0x91aa3500"},{"args":[{"label":"conditions","type":{"displayName":["rollupanchor_external","RollupCondEqInput1"],"type":24}},{"label":"updates","type":{"displayName":["rollupanchor_external","RollupCondEqInput2"],"type":24}},{"label":"actions","type":{"displayName":["rollupanchor_external","RollupCondEqInput3"],"type":27}}],"default":false,"docs":[],"label":"RollupAnchor::rollup_cond_eq","mutates":true,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":29},"selector":"0x95233d74"},{"args":[{"label":"key","type":{"displayName":["rollupanchor_external","GetValueInput1"],"type":5}}],"default":false,"docs":[],"label":"RollupAnchor::get_value","mutates":false,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":31},"selector":"0xdfec736d"},{"args":[{"label":"from","type":{"displayName":["metatransaction_external","PrepareInput1"],"type":0}},{"label":"data","type":{"displayName":["metatransaction_external","PrepareInput2"],"type":5}}],"default":false,"docs":[],"label":"MetaTransaction::prepare","mutates":false,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":32},"selector":"0x3ecc267e"},{"args":[{"label":"request","type":{"displayName":["metatransaction_external","MetaTxRollupCondEqInput1"],"type":35}},{"label":"signature","type":{"displayName":["metatransaction_external","MetaTxRollupCondEqInput2"],"type":37}}],"default":false,"docs":[],"label":"MetaTransaction::meta_tx_rollup_cond_eq","mutates":true,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":38},"selector":"0x8eb77024"},{"args":[],"default":false,"docs":[],"label":"Ownable::owner","mutates":false,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":40},"selector":"0x4fa43c8c"},{"args":[],"default":false,"docs":[],"label":"Ownable::renounce_ownership","mutates":true,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":42},"selector":"0x5e228753"},{"args":[{"label":"new_owner","type":{"displayName":["ownable_external","TransferOwnershipInput1"],"type":41}}],"default":false,"docs":[],"label":"Ownable::transfer_ownership","mutates":true,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":42},"selector":"0x11f43efd"},{"args":[{"label":"role","type":{"displayName":["accesscontrol_external","HasRoleInput1"],"type":3}},{"label":"address","type":{"displayName":["accesscontrol_external","HasRoleInput2"],"type":41}}],"default":false,"docs":[],"label":"AccessControl::has_role","mutates":false,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":45},"selector":"0xc1d9ac18"},{"args":[{"label":"role","type":{"displayName":["accesscontrol_external","GetRoleAdminInput1"],"type":3}}],"default":false,"docs":[],"label":"AccessControl::get_role_admin","mutates":false,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":23},"selector":"0x83da3bb2"},{"args":[{"label":"role","type":{"displayName":["accesscontrol_external","RenounceRoleInput1"],"type":3}},{"label":"account","type":{"displayName":["accesscontrol_external","RenounceRoleInput2"],"type":41}}],"default":false,"docs":[],"label":"AccessControl::renounce_role","mutates":true,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":47},"selector":"0xeaf1248a"},{"args":[{"label":"role","type":{"displayName":["accesscontrol_external","RevokeRoleInput1"],"type":3}},{"label":"account","type":{"displayName":["accesscontrol_external","RevokeRoleInput2"],"type":41}}],"default":false,"docs":[],"label":"AccessControl::revoke_role","mutates":true,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":47},"selector":"0x6e4f0991"},{"args":[{"label":"role","type":{"displayName":["accesscontrol_external","GrantRoleInput1"],"type":3}},{"label":"account","type":{"displayName":["accesscontrol_external","GrantRoleInput2"],"type":41}}],"default":false,"docs":[],"label":"AccessControl::grant_role","mutates":true,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":47},"selector":"0x4ac062fd"}]},"storage":{"root":{"layout":{"struct":{"fields":[{"layout":{"struct":{"fields":[{"layout":{"root":{"layout":{"enum":{"dispatchKey":"0x6f713913","name":"Option","variants":{"0":{"fields":[],"name":"None"},"1":{"fields":[{"layout":{"leaf":{"key":"0x6f713913","ty":0}},"name":"0"}],"name":"Some"}}}},"root_key":"0x6f713913"}},"name":"owner"}],"name":"Data"}},"name":"ownable"},{"layout":{"struct":{"fields":[{"layout":{"root":{"layout":{"leaf":{"key":"0x1f2cf4ac","ty":3}},"root_key":"0x1f2cf4ac"}},"name":"admin_roles"},{"layout":{"root":{"layout":{"leaf":{"key":"0x8150f558","ty":4}},"root_key":"0x8150f558"}},"name":"members"}],"name":"Data"}},"name":"access"},{"layout":{"struct":{"fields":[{"layout":{"root":{"layout":{"leaf":{"key":"0xdd3d1ad8","ty":5}},"root_key":"0xdd3d1ad8"}},"name":"kv_store"}],"name":"Data"}},"name":"rollup_anchor"},{"layout":{"struct":{"fields":[{"layout":{"root":{"layout":{"leaf":{"key":"0x9ec46f1a","ty":6}},"root_key":"0x9ec46f1a"}},"name":"nonces"}],"name":"Data"}},"name":"meta_transaction"},{"layout":{"root":{"layout":{"struct":{"fields":[{"layout":{"leaf":{"key":"0xe6896e34","ty":7}},"name":"token0"},{"layout":{"leaf":{"key":"0xe6896e34","ty":7}},"name":"token1"},{"layout":{"leaf":{"key":"0xe6896e34","ty":6}},"name":"value"},{"layout":{"leaf":{"key":"0xe6896e34","ty":8}},"name":"nb_updates"},{"layout":{"leaf":{"key":"0xe6896e34","ty":9}},"name":"last_update"}],"name":"TradingPair"}},"root_key":"0xe6896e34"}},"name":"trading_pairs"}],"name":"TestOracle"}},"root_key":"0x00000000"}},"types":[{"id":0,"type":{"def":{"composite":{"fields":[{"type":1,"typeName":"[u8; 32]"}]}},"path":["ink_primitives","types","AccountId"]}},{"id":1,"type":{"def":{"array":{"len":32,"type":2}}}},{"id":2,"type":{"def":{"primitive":"u8"}}},{"id":3,"type":{"def":{"primitive":"u32"}}},{"id":4,"type":{"def":{"tuple":[]}}},{"id":5,"type":{"def":{"sequence":{"type":2}}}},{"id":6,"type":{"def":{"primitive":"u128"}}},{"id":7,"type":{"def":{"primitive":"str"}}},{"id":8,"type":{"def":{"primitive":"u16"}}},{"id":9,"type":{"def":{"primitive":"u64"}}},{"id":10,"type":{"def":{"variant":{"variants":[{"fields":[{"type":4}],"index":0,"name":"Ok"},{"fields":[{"type":11}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":4},{"name":"E","type":11}],"path":["Result"]}},{"id":11,"type":{"def":{"variant":{"variants":[{"index":1,"name":"CouldNotReadInput"}]}},"path":["ink_primitives","LangError"]}},{"id":12,"type":{"def":{"variant":{"variants":[{"fields":[{"type":13}],"index":0,"name":"Ok"},{"fields":[{"type":11}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":13},{"name":"E","type":11}],"path":["Result"]}},{"id":13,"type":{"def":{"variant":{"variants":[{"fields":[{"type":4}],"index":0,"name":"Ok"},{"fields":[{"type":14}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":4},{"name":"E","type":14}],"path":["Result"]}},{"id":14,"type":{"def":{"variant":{"variants":[{"fields":[{"type":15,"typeName":"AccessControlError"}],"index":0,"name":"AccessControlError"},{"fields":[{"type":16,"typeName":"RollupAnchorError"}],"index":1,"name":"RollupAnchorError"},{"fields":[{"type":17,"typeName":"MetaTransactionError"}],"index":2,"name":"MetaTransactionError"},{"index":3,"name":"MissingTradingPair"}]}},"path":["test_oracle","test_oracle","ContractError"]}},{"id":15,"type":{"def":{"variant":{"variants":[{"index":0,"name":"InvalidCaller"},{"index":1,"name":"MissingRole"},{"index":2,"name":"RoleRedundant"}]}},"path":["openbrush_contracts","traits","errors","access_control","AccessControlError"]}},{"id":16,"type":{"def":{"variant":{"variants":[{"index":0,"name":"InvalidPopTarget"},{"index":1,"name":"ConditionNotMet"},{"index":2,"name":"FailedToDecode"},{"index":3,"name":"UnsupportedAction"},{"fields":[{"type":15,"typeName":"AccessControlError"}],"index":4,"name":"AccessControlError"}]}},"path":["phat_rollup_anchor_ink","traits","rollup_anchor","RollupAnchorError"]}},{"id":17,"type":{"def":{"variant":{"variants":[{"index":0,"name":"InvalidDestination"},{"index":1,"name":"NonceTooLow"},{"index":2,"name":"IncorrectSignature"},{"index":3,"name":"PublicKeyNotMatch"},{"index":4,"name":"PublicKeyIncorrect"},{"fields":[{"type":16,"typeName":"RollupAnchorError"}],"index":5,"name":"RollupAnchorError"}]}},"path":["phat_rollup_anchor_ink","traits","meta_transaction","MetaTransactionError"]}},{"id":18,"type":{"def":{"variant":{"variants":[{"fields":[{"type":19}],"index":0,"name":"Ok"},{"fields":[{"type":11}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":19},{"name":"E","type":11}],"path":["Result"]}},{"id":19,"type":{"def":{"variant":{"variants":[{"fields":[{"type":3}],"index":0,"name":"Ok"},{"fields":[{"type":14}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":3},{"name":"E","type":14}],"path":["Result"]}},{"id":20,"type":{"def":{"variant":{"variants":[{"fields":[{"type":21}],"index":0,"name":"Ok"},{"fields":[{"type":11}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":21},{"name":"E","type":11}],"path":["Result"]}},{"id":21,"type":{"def":{"variant":{"variants":[{"index":0,"name":"None"},{"fields":[{"type":22}],"index":1,"name":"Some"}]}},"params":[{"name":"T","type":22}],"path":["Option"]}},{"id":22,"type":{"def":{"composite":{"fields":[{"name":"token0","type":7,"typeName":"String"},{"name":"token1","type":7,"typeName":"String"},{"name":"value","type":6,"typeName":"u128"},{"name":"nb_updates","type":8,"typeName":"u16"},{"name":"last_update","type":9,"typeName":"u64"}]}},"path":["test_oracle","test_oracle","TradingPair"]}},{"id":23,"type":{"def":{"variant":{"variants":[{"fields":[{"type":3}],"index":0,"name":"Ok"},{"fields":[{"type":11}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":3},{"name":"E","type":11}],"path":["Result"]}},{"id":24,"type":{"def":{"sequence":{"type":25}}}},{"id":25,"type":{"def":{"tuple":[5,26]}}},{"id":26,"type":{"def":{"variant":{"variants":[{"index":0,"name":"None"},{"fields":[{"type":5}],"index":1,"name":"Some"}]}},"params":[{"name":"T","type":5}],"path":["Option"]}},{"id":27,"type":{"def":{"sequence":{"type":28}}}},{"id":28,"type":{"def":{"variant":{"variants":[{"fields":[{"type":5,"typeName":"Vec"}],"index":0,"name":"Reply"},{"fields":[{"type":3,"typeName":"QueueIndex"}],"index":1,"name":"SetQueueHead"},{"fields":[{"type":0,"typeName":"AccountId"}],"index":2,"name":"GrantAttestor"},{"fields":[{"type":0,"typeName":"AccountId"}],"index":3,"name":"RevokeAttestor"}]}},"path":["phat_rollup_anchor_ink","traits","rollup_anchor","HandleActionInput"]}},{"id":29,"type":{"def":{"variant":{"variants":[{"fields":[{"type":30}],"index":0,"name":"Ok"},{"fields":[{"type":11}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":30},{"name":"E","type":11}],"path":["Result"]}},{"id":30,"type":{"def":{"variant":{"variants":[{"fields":[{"type":4}],"index":0,"name":"Ok"},{"fields":[{"type":16}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":4},{"name":"E","type":16}],"path":["Result"]}},{"id":31,"type":{"def":{"variant":{"variants":[{"fields":[{"type":26}],"index":0,"name":"Ok"},{"fields":[{"type":11}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":26},{"name":"E","type":11}],"path":["Result"]}},{"id":32,"type":{"def":{"variant":{"variants":[{"fields":[{"type":33}],"index":0,"name":"Ok"},{"fields":[{"type":11}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":33},{"name":"E","type":11}],"path":["Result"]}},{"id":33,"type":{"def":{"variant":{"variants":[{"fields":[{"type":34}],"index":0,"name":"Ok"},{"fields":[{"type":17}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":34},{"name":"E","type":17}],"path":["Result"]}},{"id":34,"type":{"def":{"tuple":[35,36]}}},{"id":35,"type":{"def":{"composite":{"fields":[{"name":"from","type":0,"typeName":"AccountId"},{"name":"to","type":0,"typeName":"AccountId"},{"name":"nonce","type":6,"typeName":"Nonce"},{"name":"data","type":5,"typeName":"Vec"}]}},"path":["phat_rollup_anchor_ink","traits","meta_transaction","ForwardRequest"]}},{"id":36,"type":{"def":{"composite":{"fields":[{"type":1,"typeName":"[u8; 32]"}]}},"path":["ink_primitives","types","Hash"]}},{"id":37,"type":{"def":{"array":{"len":65,"type":2}}}},{"id":38,"type":{"def":{"variant":{"variants":[{"fields":[{"type":39}],"index":0,"name":"Ok"},{"fields":[{"type":11}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":39},{"name":"E","type":11}],"path":["Result"]}},{"id":39,"type":{"def":{"variant":{"variants":[{"fields":[{"type":4}],"index":0,"name":"Ok"},{"fields":[{"type":17}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":4},{"name":"E","type":17}],"path":["Result"]}},{"id":40,"type":{"def":{"variant":{"variants":[{"fields":[{"type":41}],"index":0,"name":"Ok"},{"fields":[{"type":11}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":41},{"name":"E","type":11}],"path":["Result"]}},{"id":41,"type":{"def":{"variant":{"variants":[{"index":0,"name":"None"},{"fields":[{"type":0}],"index":1,"name":"Some"}]}},"params":[{"name":"T","type":0}],"path":["Option"]}},{"id":42,"type":{"def":{"variant":{"variants":[{"fields":[{"type":43}],"index":0,"name":"Ok"},{"fields":[{"type":11}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":43},{"name":"E","type":11}],"path":["Result"]}},{"id":43,"type":{"def":{"variant":{"variants":[{"fields":[{"type":4}],"index":0,"name":"Ok"},{"fields":[{"type":44}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":4},{"name":"E","type":44}],"path":["Result"]}},{"id":44,"type":{"def":{"variant":{"variants":[{"index":0,"name":"CallerIsNotOwner"},{"index":1,"name":"NewOwnerIsNotSet"}]}},"path":["openbrush_contracts","traits","errors","ownable","OwnableError"]}},{"id":45,"type":{"def":{"variant":{"variants":[{"fields":[{"type":46}],"index":0,"name":"Ok"},{"fields":[{"type":11}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":46},{"name":"E","type":11}],"path":["Result"]}},{"id":46,"type":{"def":{"primitive":"bool"}}},{"id":47,"type":{"def":{"variant":{"variants":[{"fields":[{"type":48}],"index":0,"name":"Ok"},{"fields":[{"type":11}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":48},{"name":"E","type":11}],"path":["Result"]}},{"id":48,"type":{"def":{"variant":{"variants":[{"fields":[{"type":4}],"index":0,"name":"Ok"},{"fields":[{"type":15}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":4},{"name":"E","type":15}],"path":["Result"]}},{"id":49,"type":{"def":{"variant":{}},"path":["ink_env","types","NoChainExtension"]}}],"version":"4"} \ No newline at end of file diff --git a/ink/artifacts/test_oracle/test_oracle.json b/ink/artifacts/test_oracle/test_oracle.json new file mode 100644 index 0000000..600da4c --- /dev/null +++ b/ink/artifacts/test_oracle/test_oracle.json @@ -0,0 +1,2430 @@ +{ + "source": { + "hash": "0xbae13b865f18c709002f3828a8c7a285039afdeb4499cf035c2c8e76bcde37b2", + "language": "ink! 4.3.0", + "compiler": "rustc 1.72.0", + "build_info": { + "build_mode": "Debug", + "cargo_contract_version": "3.2.0", + "rust_toolchain": "stable-x86_64-unknown-linux-gnu", + "wasm_opt_settings": { + "keep_debug_symbols": false, + "optimization_passes": "Z" + } + } + }, + "contract": { + "name": "test_oracle", + "version": "0.0.1", + "authors": [ + "GuiGou" + ] + }, + "spec": { + "constructors": [ + { + "args": [], + "default": false, + "docs": [], + "label": "new", + "payable": false, + "returnType": { + "displayName": [ + "ink_primitives", + "ConstructorResult" + ], + "type": 10 + }, + "selector": "0x9bae9d5e" + } + ], + "docs": [], + "environment": { + "accountId": { + "displayName": [ + "AccountId" + ], + "type": 0 + }, + "balance": { + "displayName": [ + "Balance" + ], + "type": 6 + }, + "blockNumber": { + "displayName": [ + "BlockNumber" + ], + "type": 3 + }, + "chainExtension": { + "displayName": [ + "ChainExtension" + ], + "type": 49 + }, + "hash": { + "displayName": [ + "Hash" + ], + "type": 36 + }, + "maxEventTopics": 4, + "timestamp": { + "displayName": [ + "Timestamp" + ], + "type": 9 + } + }, + "events": [ + { + "args": [ + { + "docs": [], + "indexed": false, + "label": "trading_pair_id", + "type": { + "displayName": [ + "TradingPairId" + ], + "type": 3 + } + }, + { + "docs": [], + "indexed": false, + "label": "price", + "type": { + "displayName": [ + "u128" + ], + "type": 6 + } + } + ], + "docs": [ + "Events emitted when a price is received" + ], + "label": "PriceReceived" + }, + { + "args": [ + { + "docs": [], + "indexed": false, + "label": "trading_pair_id", + "type": { + "displayName": [ + "TradingPairId" + ], + "type": 3 + } + }, + { + "docs": [], + "indexed": false, + "label": "err_no", + "type": { + "displayName": [ + "u128" + ], + "type": 6 + } + } + ], + "docs": [ + "Events emitted when a error is received" + ], + "label": "ErrorReceived" + }, + { + "args": [ + { + "docs": [], + "indexed": false, + "label": "id", + "type": { + "displayName": [ + "u32" + ], + "type": 3 + } + }, + { + "docs": [], + "indexed": false, + "label": "data", + "type": { + "displayName": [ + "Vec" + ], + "type": 5 + } + } + ], + "docs": [ + "Events emitted when a message is pushed in the queue" + ], + "label": "MessageQueued" + }, + { + "args": [ + { + "docs": [], + "indexed": false, + "label": "id", + "type": { + "displayName": [ + "u32" + ], + "type": 3 + } + } + ], + "docs": [ + "Events emitted when a message is proceed" + ], + "label": "MessageProcessedTo" + }, + { + "args": [], + "docs": [ + "Events emitted when a meta transaction is decoded" + ], + "label": "MetaTxDecoded" + } + ], + "lang_error": { + "displayName": [ + "ink", + "LangError" + ], + "type": 11 + }, + "messages": [ + { + "args": [ + { + "label": "trading_pair_id", + "type": { + "displayName": [ + "TradingPairId" + ], + "type": 3 + } + }, + { + "label": "token0", + "type": { + "displayName": [ + "String" + ], + "type": 7 + } + }, + { + "label": "token1", + "type": { + "displayName": [ + "String" + ], + "type": 7 + } + } + ], + "default": false, + "docs": [], + "label": "create_trading_pair", + "mutates": true, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 12 + }, + "selector": "0xb5e153ec" + }, + { + "args": [ + { + "label": "trading_pair_id", + "type": { + "displayName": [ + "TradingPairId" + ], + "type": 3 + } + } + ], + "default": false, + "docs": [], + "label": "request_price", + "mutates": true, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 18 + }, + "selector": "0x28083abd" + }, + { + "args": [ + { + "label": "trading_pair_id", + "type": { + "displayName": [ + "TradingPairId" + ], + "type": 3 + } + } + ], + "default": false, + "docs": [], + "label": "get_trading_pair", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 20 + }, + "selector": "0x7fb5b767" + }, + { + "args": [ + { + "label": "account_id", + "type": { + "displayName": [ + "AccountId" + ], + "type": 0 + } + } + ], + "default": false, + "docs": [], + "label": "register_attestor", + "mutates": true, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 12 + }, + "selector": "0x8f3a95f4" + }, + { + "args": [], + "default": false, + "docs": [], + "label": "get_attestor_role", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 23 + }, + "selector": "0x760a2625" + }, + { + "args": [], + "default": false, + "docs": [], + "label": "get_manager_role", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 23 + }, + "selector": "0x91aa3500" + }, + { + "args": [ + { + "label": "conditions", + "type": { + "displayName": [ + "rollupanchor_external", + "RollupCondEqInput1" + ], + "type": 24 + } + }, + { + "label": "updates", + "type": { + "displayName": [ + "rollupanchor_external", + "RollupCondEqInput2" + ], + "type": 24 + } + }, + { + "label": "actions", + "type": { + "displayName": [ + "rollupanchor_external", + "RollupCondEqInput3" + ], + "type": 27 + } + } + ], + "default": false, + "docs": [], + "label": "RollupAnchor::rollup_cond_eq", + "mutates": true, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 29 + }, + "selector": "0x95233d74" + }, + { + "args": [ + { + "label": "key", + "type": { + "displayName": [ + "rollupanchor_external", + "GetValueInput1" + ], + "type": 5 + } + } + ], + "default": false, + "docs": [], + "label": "RollupAnchor::get_value", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 31 + }, + "selector": "0xdfec736d" + }, + { + "args": [ + { + "label": "from", + "type": { + "displayName": [ + "metatransaction_external", + "PrepareInput1" + ], + "type": 0 + } + }, + { + "label": "data", + "type": { + "displayName": [ + "metatransaction_external", + "PrepareInput2" + ], + "type": 5 + } + } + ], + "default": false, + "docs": [], + "label": "MetaTransaction::prepare", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 32 + }, + "selector": "0x3ecc267e" + }, + { + "args": [ + { + "label": "request", + "type": { + "displayName": [ + "metatransaction_external", + "MetaTxRollupCondEqInput1" + ], + "type": 35 + } + }, + { + "label": "signature", + "type": { + "displayName": [ + "metatransaction_external", + "MetaTxRollupCondEqInput2" + ], + "type": 37 + } + } + ], + "default": false, + "docs": [], + "label": "MetaTransaction::meta_tx_rollup_cond_eq", + "mutates": true, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 38 + }, + "selector": "0x8eb77024" + }, + { + "args": [], + "default": false, + "docs": [], + "label": "Ownable::owner", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 40 + }, + "selector": "0x4fa43c8c" + }, + { + "args": [], + "default": false, + "docs": [], + "label": "Ownable::renounce_ownership", + "mutates": true, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 42 + }, + "selector": "0x5e228753" + }, + { + "args": [ + { + "label": "new_owner", + "type": { + "displayName": [ + "ownable_external", + "TransferOwnershipInput1" + ], + "type": 41 + } + } + ], + "default": false, + "docs": [], + "label": "Ownable::transfer_ownership", + "mutates": true, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 42 + }, + "selector": "0x11f43efd" + }, + { + "args": [ + { + "label": "role", + "type": { + "displayName": [ + "accesscontrol_external", + "HasRoleInput1" + ], + "type": 3 + } + }, + { + "label": "address", + "type": { + "displayName": [ + "accesscontrol_external", + "HasRoleInput2" + ], + "type": 41 + } + } + ], + "default": false, + "docs": [], + "label": "AccessControl::has_role", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 45 + }, + "selector": "0xc1d9ac18" + }, + { + "args": [ + { + "label": "role", + "type": { + "displayName": [ + "accesscontrol_external", + "GetRoleAdminInput1" + ], + "type": 3 + } + } + ], + "default": false, + "docs": [], + "label": "AccessControl::get_role_admin", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 23 + }, + "selector": "0x83da3bb2" + }, + { + "args": [ + { + "label": "role", + "type": { + "displayName": [ + "accesscontrol_external", + "RenounceRoleInput1" + ], + "type": 3 + } + }, + { + "label": "account", + "type": { + "displayName": [ + "accesscontrol_external", + "RenounceRoleInput2" + ], + "type": 41 + } + } + ], + "default": false, + "docs": [], + "label": "AccessControl::renounce_role", + "mutates": true, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 47 + }, + "selector": "0xeaf1248a" + }, + { + "args": [ + { + "label": "role", + "type": { + "displayName": [ + "accesscontrol_external", + "RevokeRoleInput1" + ], + "type": 3 + } + }, + { + "label": "account", + "type": { + "displayName": [ + "accesscontrol_external", + "RevokeRoleInput2" + ], + "type": 41 + } + } + ], + "default": false, + "docs": [], + "label": "AccessControl::revoke_role", + "mutates": true, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 47 + }, + "selector": "0x6e4f0991" + }, + { + "args": [ + { + "label": "role", + "type": { + "displayName": [ + "accesscontrol_external", + "GrantRoleInput1" + ], + "type": 3 + } + }, + { + "label": "account", + "type": { + "displayName": [ + "accesscontrol_external", + "GrantRoleInput2" + ], + "type": 41 + } + } + ], + "default": false, + "docs": [], + "label": "AccessControl::grant_role", + "mutates": true, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 47 + }, + "selector": "0x4ac062fd" + } + ] + }, + "storage": { + "root": { + "layout": { + "struct": { + "fields": [ + { + "layout": { + "struct": { + "fields": [ + { + "layout": { + "root": { + "layout": { + "enum": { + "dispatchKey": "0x6f713913", + "name": "Option", + "variants": { + "0": { + "fields": [], + "name": "None" + }, + "1": { + "fields": [ + { + "layout": { + "leaf": { + "key": "0x6f713913", + "ty": 0 + } + }, + "name": "0" + } + ], + "name": "Some" + } + } + } + }, + "root_key": "0x6f713913" + } + }, + "name": "owner" + } + ], + "name": "Data" + } + }, + "name": "ownable" + }, + { + "layout": { + "struct": { + "fields": [ + { + "layout": { + "root": { + "layout": { + "leaf": { + "key": "0x1f2cf4ac", + "ty": 3 + } + }, + "root_key": "0x1f2cf4ac" + } + }, + "name": "admin_roles" + }, + { + "layout": { + "root": { + "layout": { + "leaf": { + "key": "0x8150f558", + "ty": 4 + } + }, + "root_key": "0x8150f558" + } + }, + "name": "members" + } + ], + "name": "Data" + } + }, + "name": "access" + }, + { + "layout": { + "struct": { + "fields": [ + { + "layout": { + "root": { + "layout": { + "leaf": { + "key": "0xdd3d1ad8", + "ty": 5 + } + }, + "root_key": "0xdd3d1ad8" + } + }, + "name": "kv_store" + } + ], + "name": "Data" + } + }, + "name": "rollup_anchor" + }, + { + "layout": { + "struct": { + "fields": [ + { + "layout": { + "root": { + "layout": { + "leaf": { + "key": "0x9ec46f1a", + "ty": 6 + } + }, + "root_key": "0x9ec46f1a" + } + }, + "name": "nonces" + } + ], + "name": "Data" + } + }, + "name": "meta_transaction" + }, + { + "layout": { + "root": { + "layout": { + "struct": { + "fields": [ + { + "layout": { + "leaf": { + "key": "0xe6896e34", + "ty": 7 + } + }, + "name": "token0" + }, + { + "layout": { + "leaf": { + "key": "0xe6896e34", + "ty": 7 + } + }, + "name": "token1" + }, + { + "layout": { + "leaf": { + "key": "0xe6896e34", + "ty": 6 + } + }, + "name": "value" + }, + { + "layout": { + "leaf": { + "key": "0xe6896e34", + "ty": 8 + } + }, + "name": "nb_updates" + }, + { + "layout": { + "leaf": { + "key": "0xe6896e34", + "ty": 9 + } + }, + "name": "last_update" + } + ], + "name": "TradingPair" + } + }, + "root_key": "0xe6896e34" + } + }, + "name": "trading_pairs" + } + ], + "name": "TestOracle" + } + }, + "root_key": "0x00000000" + } + }, + "types": [ + { + "id": 0, + "type": { + "def": { + "composite": { + "fields": [ + { + "type": 1, + "typeName": "[u8; 32]" + } + ] + } + }, + "path": [ + "ink_primitives", + "types", + "AccountId" + ] + } + }, + { + "id": 1, + "type": { + "def": { + "array": { + "len": 32, + "type": 2 + } + } + } + }, + { + "id": 2, + "type": { + "def": { + "primitive": "u8" + } + } + }, + { + "id": 3, + "type": { + "def": { + "primitive": "u32" + } + } + }, + { + "id": 4, + "type": { + "def": { + "tuple": [] + } + } + }, + { + "id": 5, + "type": { + "def": { + "sequence": { + "type": 2 + } + } + } + }, + { + "id": 6, + "type": { + "def": { + "primitive": "u128" + } + } + }, + { + "id": 7, + "type": { + "def": { + "primitive": "str" + } + } + }, + { + "id": 8, + "type": { + "def": { + "primitive": "u16" + } + } + }, + { + "id": 9, + "type": { + "def": { + "primitive": "u64" + } + } + }, + { + "id": 10, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 4 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 11 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 4 + }, + { + "name": "E", + "type": 11 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 11, + "type": { + "def": { + "variant": { + "variants": [ + { + "index": 1, + "name": "CouldNotReadInput" + } + ] + } + }, + "path": [ + "ink_primitives", + "LangError" + ] + } + }, + { + "id": 12, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 13 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 11 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 13 + }, + { + "name": "E", + "type": 11 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 13, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 4 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 14 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 4 + }, + { + "name": "E", + "type": 14 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 14, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 15, + "typeName": "AccessControlError" + } + ], + "index": 0, + "name": "AccessControlError" + }, + { + "fields": [ + { + "type": 16, + "typeName": "RollupAnchorError" + } + ], + "index": 1, + "name": "RollupAnchorError" + }, + { + "fields": [ + { + "type": 17, + "typeName": "MetaTransactionError" + } + ], + "index": 2, + "name": "MetaTransactionError" + }, + { + "index": 3, + "name": "MissingTradingPair" + } + ] + } + }, + "path": [ + "test_oracle", + "test_oracle", + "ContractError" + ] + } + }, + { + "id": 15, + "type": { + "def": { + "variant": { + "variants": [ + { + "index": 0, + "name": "InvalidCaller" + }, + { + "index": 1, + "name": "MissingRole" + }, + { + "index": 2, + "name": "RoleRedundant" + } + ] + } + }, + "path": [ + "openbrush_contracts", + "traits", + "errors", + "access_control", + "AccessControlError" + ] + } + }, + { + "id": 16, + "type": { + "def": { + "variant": { + "variants": [ + { + "index": 0, + "name": "InvalidPopTarget" + }, + { + "index": 1, + "name": "ConditionNotMet" + }, + { + "index": 2, + "name": "FailedToDecode" + }, + { + "index": 3, + "name": "UnsupportedAction" + }, + { + "fields": [ + { + "type": 15, + "typeName": "AccessControlError" + } + ], + "index": 4, + "name": "AccessControlError" + } + ] + } + }, + "path": [ + "phat_rollup_anchor_ink", + "traits", + "rollup_anchor", + "RollupAnchorError" + ] + } + }, + { + "id": 17, + "type": { + "def": { + "variant": { + "variants": [ + { + "index": 0, + "name": "InvalidDestination" + }, + { + "index": 1, + "name": "NonceTooLow" + }, + { + "index": 2, + "name": "IncorrectSignature" + }, + { + "index": 3, + "name": "PublicKeyNotMatch" + }, + { + "index": 4, + "name": "PublicKeyIncorrect" + }, + { + "fields": [ + { + "type": 16, + "typeName": "RollupAnchorError" + } + ], + "index": 5, + "name": "RollupAnchorError" + } + ] + } + }, + "path": [ + "phat_rollup_anchor_ink", + "traits", + "meta_transaction", + "MetaTransactionError" + ] + } + }, + { + "id": 18, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 19 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 11 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 19 + }, + { + "name": "E", + "type": 11 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 19, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 3 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 14 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 3 + }, + { + "name": "E", + "type": 14 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 20, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 21 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 11 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 21 + }, + { + "name": "E", + "type": 11 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 21, + "type": { + "def": { + "variant": { + "variants": [ + { + "index": 0, + "name": "None" + }, + { + "fields": [ + { + "type": 22 + } + ], + "index": 1, + "name": "Some" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 22 + } + ], + "path": [ + "Option" + ] + } + }, + { + "id": 22, + "type": { + "def": { + "composite": { + "fields": [ + { + "name": "token0", + "type": 7, + "typeName": "String" + }, + { + "name": "token1", + "type": 7, + "typeName": "String" + }, + { + "name": "value", + "type": 6, + "typeName": "u128" + }, + { + "name": "nb_updates", + "type": 8, + "typeName": "u16" + }, + { + "name": "last_update", + "type": 9, + "typeName": "u64" + } + ] + } + }, + "path": [ + "test_oracle", + "test_oracle", + "TradingPair" + ] + } + }, + { + "id": 23, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 3 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 11 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 3 + }, + { + "name": "E", + "type": 11 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 24, + "type": { + "def": { + "sequence": { + "type": 25 + } + } + } + }, + { + "id": 25, + "type": { + "def": { + "tuple": [ + 5, + 26 + ] + } + } + }, + { + "id": 26, + "type": { + "def": { + "variant": { + "variants": [ + { + "index": 0, + "name": "None" + }, + { + "fields": [ + { + "type": 5 + } + ], + "index": 1, + "name": "Some" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 5 + } + ], + "path": [ + "Option" + ] + } + }, + { + "id": 27, + "type": { + "def": { + "sequence": { + "type": 28 + } + } + } + }, + { + "id": 28, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 5, + "typeName": "Vec" + } + ], + "index": 0, + "name": "Reply" + }, + { + "fields": [ + { + "type": 3, + "typeName": "QueueIndex" + } + ], + "index": 1, + "name": "SetQueueHead" + }, + { + "fields": [ + { + "type": 0, + "typeName": "AccountId" + } + ], + "index": 2, + "name": "GrantAttestor" + }, + { + "fields": [ + { + "type": 0, + "typeName": "AccountId" + } + ], + "index": 3, + "name": "RevokeAttestor" + } + ] + } + }, + "path": [ + "phat_rollup_anchor_ink", + "traits", + "rollup_anchor", + "HandleActionInput" + ] + } + }, + { + "id": 29, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 30 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 11 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 30 + }, + { + "name": "E", + "type": 11 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 30, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 4 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 16 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 4 + }, + { + "name": "E", + "type": 16 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 31, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 26 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 11 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 26 + }, + { + "name": "E", + "type": 11 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 32, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 33 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 11 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 33 + }, + { + "name": "E", + "type": 11 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 33, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 34 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 17 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 34 + }, + { + "name": "E", + "type": 17 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 34, + "type": { + "def": { + "tuple": [ + 35, + 36 + ] + } + } + }, + { + "id": 35, + "type": { + "def": { + "composite": { + "fields": [ + { + "name": "from", + "type": 0, + "typeName": "AccountId" + }, + { + "name": "to", + "type": 0, + "typeName": "AccountId" + }, + { + "name": "nonce", + "type": 6, + "typeName": "Nonce" + }, + { + "name": "data", + "type": 5, + "typeName": "Vec" + } + ] + } + }, + "path": [ + "phat_rollup_anchor_ink", + "traits", + "meta_transaction", + "ForwardRequest" + ] + } + }, + { + "id": 36, + "type": { + "def": { + "composite": { + "fields": [ + { + "type": 1, + "typeName": "[u8; 32]" + } + ] + } + }, + "path": [ + "ink_primitives", + "types", + "Hash" + ] + } + }, + { + "id": 37, + "type": { + "def": { + "array": { + "len": 65, + "type": 2 + } + } + } + }, + { + "id": 38, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 39 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 11 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 39 + }, + { + "name": "E", + "type": 11 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 39, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 4 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 17 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 4 + }, + { + "name": "E", + "type": 17 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 40, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 41 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 11 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 41 + }, + { + "name": "E", + "type": 11 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 41, + "type": { + "def": { + "variant": { + "variants": [ + { + "index": 0, + "name": "None" + }, + { + "fields": [ + { + "type": 0 + } + ], + "index": 1, + "name": "Some" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 0 + } + ], + "path": [ + "Option" + ] + } + }, + { + "id": 42, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 43 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 11 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 43 + }, + { + "name": "E", + "type": 11 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 43, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 4 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 44 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 4 + }, + { + "name": "E", + "type": 44 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 44, + "type": { + "def": { + "variant": { + "variants": [ + { + "index": 0, + "name": "CallerIsNotOwner" + }, + { + "index": 1, + "name": "NewOwnerIsNotSet" + } + ] + } + }, + "path": [ + "openbrush_contracts", + "traits", + "errors", + "ownable", + "OwnableError" + ] + } + }, + { + "id": 45, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 46 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 11 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 46 + }, + { + "name": "E", + "type": 11 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 46, + "type": { + "def": { + "primitive": "bool" + } + } + }, + { + "id": 47, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 48 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 11 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 48 + }, + { + "name": "E", + "type": 11 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 48, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 4 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 15 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 4 + }, + { + "name": "E", + "type": 15 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 49, + "type": { + "def": { + "variant": {} + }, + "path": [ + "ink_env", + "types", + "NoChainExtension" + ] + } + } + ], + "version": "4" +} \ No newline at end of file diff --git a/ink/artifacts/test_oracle/test_oracle.wasm b/ink/artifacts/test_oracle/test_oracle.wasm new file mode 100644 index 0000000..c924df7 Binary files /dev/null and b/ink/artifacts/test_oracle/test_oracle.wasm differ diff --git a/ink/contracts/test_oracle/Cargo.toml b/ink/contracts/test_oracle/Cargo.toml new file mode 100755 index 0000000..4005dc8 --- /dev/null +++ b/ink/contracts/test_oracle/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "test_oracle" +version = "0.0.1" +authors = ["GuiGou"] +edition = "2021" + +[dependencies] +ink = { version = "4.3.0", default-features = false } + +scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] } +scale-info = { version = "2", default-features = false, features = ["derive"], optional = true } + +openbrush = { git = "https://github.com/Brushfam/openbrush-contracts", version = "4.0.0-beta", features = ["ownable", "access_control"], default-features = false } + +phat_rollup_anchor_ink = { path = "../../crates/phat_rollup_anchor_ink", default-features = false} + +[dev-dependencies] +ink_e2e = { version = "4.3.0" } +hex-literal = { version = "0.4.1" } +subxt-signer = { version = "0.31.0" } + +[lib] +path = "lib.rs" + +[features] +default = ["std"] +std = [ + "ink/std", + "scale/std", + "scale-info/std", + "openbrush/std", + "phat_rollup_anchor_ink/std", +] +ink-as-dependency = [] +e2e-tests = [] diff --git a/ink/contracts/test_oracle/README.md b/ink/contracts/test_oracle/README.md new file mode 100644 index 0000000..b3c353f --- /dev/null +++ b/ink/contracts/test_oracle/README.md @@ -0,0 +1,38 @@ +# Test Oracle + +Implements a simple oracle to get/display the price of trading pairs. It uses the crate `phat_rollup_anchor_ink`. +It supports: + - create a trading pair with an id and the token names. The name must match with the API id from CoinGecko. By example: `polkadot`, `astar`, `pha`, `usd`. Only an address granted as `MANAGER` can do it. + - configure the attestor authorized to send the prices. Only an address granted as `MANAGER` can do it. + - send a request to get the price of a given trading pair. Only an address granted as `MANAGER` can do it. + - handle the messages to feed the trading pair. Only an address granted as `ATTESTOR` can do it. + - display the trading pair with this id. + - allow meta transactions to separate the attestor and the payer. + - managed the roles and grant an address as `ADMIN`, `MANAGER` or `ATTESTOR`. Only the admin can do it. + +By default, the contract owner is granted as `ADMIN` and `MANAGER` but it is not granted as `ATTESTOR`. + +## Build + +To build the contract: + +```bash +cargo contract build +``` + +## Run e2e tests + +Before you can run the test, you have to install a Substrate node with pallet-contracts. By default, `e2e tests` require that you install `substrate-contracts-node`. You do not need to run it in the background since the node is started for each test independently. To install the latest version: +```bash +cargo install contracts-node --git https://github.com/paritytech/substrate-contracts-node.git +``` + +If you want to run any other node with pallet-contracts you need to change `CONTRACTS_NODE` environment variable: +```bash +export CONTRACTS_NODE="YOUR_CONTRACTS_NODE_PATH" +``` + +And finally execute the following command to start e2e tests execution. +```bash +cargo test --features e2e-tests +``` diff --git a/ink/contracts/test_oracle/lib.rs b/ink/contracts/test_oracle/lib.rs new file mode 100755 index 0000000..0134155 --- /dev/null +++ b/ink/contracts/test_oracle/lib.rs @@ -0,0 +1,891 @@ +#![cfg_attr(not(feature = "std"), no_std, no_main)] + +#[openbrush::implementation(Ownable, AccessControl)] +#[openbrush::contract] +pub mod test_oracle { + use ink::codegen::{EmitEvent, Env}; + use ink::prelude::string::String; + use ink::prelude::vec::Vec; + use ink::storage::Mapping; + use openbrush::contracts::access_control::*; + use openbrush::contracts::ownable::*; + use openbrush::traits::Storage; + use scale::{Decode, Encode}; + + use phat_rollup_anchor_ink::traits::{ + meta_transaction, meta_transaction::*, rollup_anchor, rollup_anchor::*, + }; + + pub type TradingPairId = u32; + + pub const MANAGER_ROLE: RoleType = ink::selector_id!("MANAGER_ROLE"); + + /// Events emitted when a price is received + #[ink(event)] + pub struct PriceReceived { + trading_pair_id: TradingPairId, + price: u128, + } + + /// Events emitted when a error is received + #[ink(event)] + pub struct ErrorReceived { + trading_pair_id: TradingPairId, + err_no: u128, + } + + /// Errors occurred in the contract + #[derive(Encode, Decode, Debug)] + #[cfg_attr(feature = "std", derive(scale_info::TypeInfo))] + pub enum ContractError { + AccessControlError(AccessControlError), + RollupAnchorError(RollupAnchorError), + MetaTransactionError(MetaTransactionError), + MissingTradingPair, + } + /// convertor from MessageQueueError to ContractError + impl From for ContractError { + fn from(error: AccessControlError) -> Self { + ContractError::AccessControlError(error) + } + } + /// convertor from RollupAnchorError to ContractError + impl From for ContractError { + fn from(error: RollupAnchorError) -> Self { + ContractError::RollupAnchorError(error) + } + } + /// convertor from MetaTxError to ContractError + impl From for ContractError { + fn from(error: MetaTransactionError) -> Self { + ContractError::MetaTransactionError(error) + } + } + + /// Message to request the price of the trading pair + /// message pushed in the queue by this contract and read by the offchain rollup + #[derive(Encode, Decode)] + struct PriceRequestMessage { + /// id of the pair (use as key in the Mapping) + trading_pair_id: TradingPairId, + /// trading pair like 'polkdatot/usd' + /// Note: it will be better to not save this data in the storage + token0: String, + token1: String, + } + /// Message sent to provide the price of the trading pair + /// response pushed in the queue by the offchain rollup and read by this contract + #[derive(Encode, Decode)] + struct PriceResponseMessage { + /// Type of response + resp_type: u8, + /// id of the pair + trading_pair_id: TradingPairId, + /// price of the trading pair + price: Option, + /// error when the price is read + err_no: Option, + } + + /// Type of response when the offchain rollup communicates with this contract + const TYPE_ERROR: u8 = 0; + const TYPE_RESPONSE: u8 = 10; + const TYPE_FEED: u8 = 11; + + /// Data storage + #[derive(Encode, Decode, Default, Eq, PartialEq, Clone, Debug)] + #[cfg_attr( + feature = "std", + derive(scale_info::TypeInfo, ink::storage::traits::StorageLayout) + )] + pub struct TradingPair { + /// trading pair like 'polkdatot/usd' + /// Note: it will be better to not save this data outside of the storage + token0: String, + token1: String, + /// value of the trading pair + value: u128, + /// number of updates of the value + nb_updates: u16, + /// when the last value has been updated + last_update: u64, + } + + #[ink(storage)] + #[derive(Default, Storage)] + pub struct TestOracle { + #[storage_field] + ownable: ownable::Data, + #[storage_field] + access: access_control::Data, + #[storage_field] + rollup_anchor: rollup_anchor::Data, + #[storage_field] + meta_transaction: meta_transaction::Data, + trading_pairs: Mapping, + } + + impl TestOracle { + #[ink(constructor)] + pub fn new() -> Self { + let mut instance = Self::default(); + let caller = instance.env().caller(); + // set the owner of this contract + ownable::Internal::_init_with_owner(&mut instance, caller); + // set the admin of this contract + access_control::Internal::_init_with_admin(&mut instance, Some(caller)); + // grant the role manager + AccessControl::grant_role(&mut instance, MANAGER_ROLE, Some(caller)) + .expect("Should grant the role MANAGER_ROLE"); + instance + } + + #[ink(message)] + #[openbrush::modifiers(access_control::only_role(MANAGER_ROLE))] + pub fn create_trading_pair( + &mut self, + trading_pair_id: TradingPairId, + token0: String, + token1: String, + ) -> Result<(), ContractError> { + // we create a new trading pair or override an existing one + let trading_pair = TradingPair { + token0, + token1, + value: 0, + nb_updates: 0, + last_update: 0, + }; + self.trading_pairs.insert(trading_pair_id, &trading_pair); + Ok(()) + } + + #[ink(message)] + #[openbrush::modifiers(access_control::only_role(MANAGER_ROLE))] + pub fn request_price( + &mut self, + trading_pair_id: TradingPairId, + ) -> Result { + let index = match self.trading_pairs.get(trading_pair_id) { + Some(t) => { + // push the message in the queue + let message = PriceRequestMessage { + trading_pair_id, + token0: t.token0, + token1: t.token1, + }; + self.push_message(&message)? + } + _ => return Err(ContractError::MissingTradingPair), + }; + + Ok(index) + } + + #[ink(message)] + pub fn get_trading_pair(&self, trading_pair_id: TradingPairId) -> Option { + self.trading_pairs.get(trading_pair_id) + } + + #[ink(message)] + pub fn register_attestor(&mut self, account_id: AccountId) -> Result<(), ContractError> { + AccessControl::grant_role(self, ATTESTOR_ROLE, Some(account_id))?; + Ok(()) + } + + #[ink(message)] + pub fn get_attestor_role(&self) -> RoleType { + ATTESTOR_ROLE + } + + #[ink(message)] + pub fn get_manager_role(&self) -> RoleType { + MANAGER_ROLE + } + } + + impl RollupAnchor for TestOracle {} + impl MetaTransaction for TestOracle {} + + impl rollup_anchor::MessageHandler for TestOracle { + fn on_message_received(&mut self, action: Vec) -> Result<(), RollupAnchorError> { + // parse the response + let message: PriceResponseMessage = + Decode::decode(&mut &action[..]).or(Err(RollupAnchorError::FailedToDecode))?; + + // handle the response + if message.resp_type == TYPE_RESPONSE || message.resp_type == TYPE_FEED { + // we received the price + // register the info + let mut trading_pair = self + .trading_pairs + .get(message.trading_pair_id) + .unwrap_or_default(); + trading_pair.value = message.price.unwrap_or_default(); + trading_pair.nb_updates += 1; + trading_pair.last_update = self.env().block_timestamp(); + self.trading_pairs + .insert(message.trading_pair_id, &trading_pair); + + // emmit te event + self.env().emit_event(PriceReceived { + trading_pair_id: message.trading_pair_id, + price: message.price.unwrap_or_default(), + }); + } else if message.resp_type == TYPE_ERROR { + // we received an error + self.env().emit_event(ErrorReceived { + trading_pair_id: message.trading_pair_id, + err_no: message.err_no.unwrap_or_default(), + }); + } else { + // response type unknown + return Err(RollupAnchorError::UnsupportedAction); + } + + Ok(()) + } + } + + /// Events emitted when a message is pushed in the queue + #[ink(event)] + pub struct MessageQueued { + pub id: u32, + pub data: Vec, + } + + /// Events emitted when a message is proceed + #[ink(event)] + pub struct MessageProcessedTo { + pub id: u32, + } + + impl rollup_anchor::EventBroadcaster for TestOracle { + fn emit_event_message_queued(&self, id: u32, data: Vec) { + self.env().emit_event(MessageQueued { id, data }); + } + + fn emit_event_message_processed_to(&self, id: u32) { + self.env().emit_event(MessageProcessedTo { id }); + } + } + + impl meta_transaction::EventBroadcaster for TestOracle { + fn emit_event_meta_tx_decoded(&self) { + self.env().emit_event(MetaTxDecoded {}); + } + } + + /// Events emitted when a meta transaction is decoded + #[ink(event)] + pub struct MetaTxDecoded {} + + #[cfg(all(test, feature = "e2e-tests"))] + mod e2e_tests { + use super::*; + use openbrush::contracts::access_control::accesscontrol_external::AccessControl; + + use ink_e2e::subxt::tx::Signer; + use ink_e2e::{build_message, PolkadotConfig}; + + use phat_rollup_anchor_ink::traits::{ + meta_transaction::metatransaction_external::MetaTransaction, + rollup_anchor::rollupanchor_external::RollupAnchor, + }; + + type E2EResult = std::result::Result>; + + #[ink_e2e::test] + async fn test_create_trading_pair(mut client: ink_e2e::Client) -> E2EResult<()> { + // given + let constructor = TestOracleRef::new(); + let contract_acc_id = client + .instantiate("test_oracle", &ink_e2e::alice(), constructor, 0, None) + .await + .expect("instantiate failed") + .account_id; + + let trading_pair_id = 10; + + // read the trading pair and check it doesn't exist yet + let get_trading_pair = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.get_trading_pair(trading_pair_id)); + let get_res = client + .call_dry_run(&ink_e2e::bob(), &get_trading_pair, 0, None) + .await; + assert_eq!(None, get_res.return_value()); + + // bob is not granted as manager => it should not be able to create the trading pair + let create_trading_pair = + build_message::(contract_acc_id.clone()).call(|oracle| { + oracle.create_trading_pair( + trading_pair_id, + String::from("polkadot"), + String::from("usd"), + ) + }); + let result = client + .call(&ink_e2e::bob(), create_trading_pair, 0, None) + .await; + assert!( + result.is_err(), + "only manager should not be able to create trading pair" + ); + + // bob is granted as manager + let bob_address = ink::primitives::AccountId::from( + Signer::::account_id(&ink_e2e::bob()).0, + ); + let grant_role = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.grant_role(MANAGER_ROLE, Some(bob_address))); + client + .call(&ink_e2e::alice(), grant_role, 0, None) + .await + .expect("grant bob as attestor failed"); + + // create the trading pair + let create_trading_pair = + build_message::(contract_acc_id.clone()).call(|oracle| { + oracle.create_trading_pair( + trading_pair_id, + String::from("polkadot"), + String::from("usd"), + ) + }); + client + .call(&ink_e2e::bob(), create_trading_pair, 0, None) + .await + .expect("create trading pair failed"); + + // then check if the trading pair exists + let get_trading_pair = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.get_trading_pair(trading_pair_id)); + let get_res = client + .call_dry_run(&ink_e2e::bob(), &get_trading_pair, 0, None) + .await; + let expected_trading_pair = TradingPair { + token0: String::from("polkadot"), + token1: String::from("usd"), + value: 0, + nb_updates: 0, + last_update: 0, + }; + assert_eq!(Some(expected_trading_pair), get_res.return_value()); + + Ok(()) + } + + #[ink_e2e::test] + async fn test_feed_price(mut client: ink_e2e::Client) -> E2EResult<()> { + // given + let constructor = TestOracleRef::new(); + let contract_acc_id = client + .instantiate("test_oracle", &ink_e2e::alice(), constructor, 0, None) + .await + .expect("instantiate failed") + .account_id; + + let trading_pair_id = 10; + + // create the trading pair + let create_trading_pair = + build_message::(contract_acc_id.clone()).call(|oracle| { + oracle.create_trading_pair( + trading_pair_id, + String::from("polkadot"), + String::from("usd"), + ) + }); + client + .call(&ink_e2e::alice(), create_trading_pair, 0, None) + .await + .expect("create trading pair failed"); + + // bob is granted as attestor + let bob_address = ink::primitives::AccountId::from( + Signer::::account_id(&ink_e2e::bob()).0, + ); + let grant_role = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.grant_role(ATTESTOR_ROLE, Some(bob_address))); + client + .call(&ink_e2e::alice(), grant_role, 0, None) + .await + .expect("grant bob as attestor failed"); + + // then bob feeds the price + let value: u128 = 150_000_000_000_000_000_000; + let payload = PriceResponseMessage { + resp_type: TYPE_FEED, + trading_pair_id, + price: Some(value), + err_no: None, + }; + let actions = vec![HandleActionInput::Reply(payload.encode())]; + let rollup_cond_eq = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.rollup_cond_eq(vec![], vec![], actions.clone())); + let result = client + .call(&ink_e2e::bob(), rollup_cond_eq, 0, None) + .await + .expect("rollup cond eq failed"); + // events PriceReceived + assert!(result.contains_event("Contracts", "ContractEmitted")); + + // and check if the price is filled + let get_trading_pair = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.get_trading_pair(trading_pair_id)); + let get_res = client + .call_dry_run(&ink_e2e::bob(), &get_trading_pair, 0, None) + .await; + let trading_pair = get_res.return_value().expect("Trading pair not found"); + + assert_eq!(value, trading_pair.value); + assert_eq!(1, trading_pair.nb_updates); + assert_ne!(0, trading_pair.last_update); + + Ok(()) + } + + #[ink_e2e::test] + async fn test_receive_reply(mut client: ink_e2e::Client) -> E2EResult<()> { + // given + let constructor = TestOracleRef::new(); + let contract_acc_id = client + .instantiate("test_oracle", &ink_e2e::alice(), constructor, 0, None) + .await + .expect("instantiate failed") + .account_id; + + let trading_pair_id = 10; + + // create the trading pair + let create_trading_pair = + build_message::(contract_acc_id.clone()).call(|oracle| { + oracle.create_trading_pair( + trading_pair_id, + String::from("polkadot"), + String::from("usd"), + ) + }); + client + .call(&ink_e2e::alice(), create_trading_pair, 0, None) + .await + .expect("create trading pair failed"); + + // bob is granted as attestor + let bob_address = ink::primitives::AccountId::from( + Signer::::account_id(&ink_e2e::bob()).0, + ); + let grant_role = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.grant_role(ATTESTOR_ROLE, Some(bob_address))); + client + .call(&ink_e2e::alice(), grant_role, 0, None) + .await + .expect("grant bob as attestor failed"); + + // a price request is sent + let request_price = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.request_price(trading_pair_id)); + let result = client + .call(&ink_e2e::alice(), request_price, 0, None) + .await + .expect("Request price should be sent"); + // event MessageQueued + assert!(result.contains_event("Contracts", "ContractEmitted")); + + let request_id = result.return_value().expect("Request id not found"); + + // then a response is received + let value: u128 = 150_000_000_000_000_000_000; + let payload = PriceResponseMessage { + resp_type: TYPE_RESPONSE, + trading_pair_id, + price: Some(value), + err_no: None, + }; + let actions = vec![ + HandleActionInput::Reply(payload.encode()), + HandleActionInput::SetQueueHead(request_id + 1), + ]; + let rollup_cond_eq = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.rollup_cond_eq(vec![], vec![], actions.clone())); + let result = client + .call(&ink_e2e::bob(), rollup_cond_eq, 0, None) + .await + .expect("rollup cond eq should be ok"); + // two events : MessageProcessedTo and PricesRecieved + assert!(result.contains_event("Contracts", "ContractEmitted")); + + // and check if the price is filled + let get_trading_pair = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.get_trading_pair(trading_pair_id)); + let get_res = client + .call_dry_run(&ink_e2e::bob(), &get_trading_pair, 0, None) + .await; + let trading_pair = get_res.return_value().expect("Trading pair not found"); + + assert_eq!(value, trading_pair.value); + assert_eq!(1, trading_pair.nb_updates); + assert_ne!(0, trading_pair.last_update); + + // reply in the future should fail + let actions = vec![ + HandleActionInput::Reply(payload.encode()), + HandleActionInput::SetQueueHead(request_id + 2), + ]; + let rollup_cond_eq = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.rollup_cond_eq(vec![], vec![], actions.clone())); + let result = client.call(&ink_e2e::bob(), rollup_cond_eq, 0, None).await; + assert!( + result.is_err(), + "Rollup should fail because we try to pop in the future" + ); + + // reply in the past should fail + let actions = vec![ + HandleActionInput::Reply(payload.encode()), + HandleActionInput::SetQueueHead(request_id), + ]; + let rollup_cond_eq = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.rollup_cond_eq(vec![], vec![], actions.clone())); + let result = client.call(&ink_e2e::bob(), rollup_cond_eq, 0, None).await; + assert!( + result.is_err(), + "Rollup should fail because we try to pop in the past" + ); + + Ok(()) + } + + #[ink_e2e::test] + async fn test_receive_error(mut client: ink_e2e::Client) -> E2EResult<()> { + // given + let constructor = TestOracleRef::new(); + let contract_acc_id = client + .instantiate("test_oracle", &ink_e2e::alice(), constructor, 0, None) + .await + .expect("instantiate failed") + .account_id; + + let trading_pair_id = 10; + + // create the trading pair + let create_trading_pair = + build_message::(contract_acc_id.clone()).call(|oracle| { + oracle.create_trading_pair( + trading_pair_id, + String::from("polkadot"), + String::from("usd"), + ) + }); + client + .call(&ink_e2e::alice(), create_trading_pair, 0, None) + .await + .expect("create trading pair failed"); + + // bob is granted as attestor + let bob_address = ink::primitives::AccountId::from( + Signer::::account_id(&ink_e2e::bob()).0, + ); + let grant_role = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.grant_role(ATTESTOR_ROLE, Some(bob_address))); + client + .call(&ink_e2e::alice(), grant_role, 0, None) + .await + .expect("grant bob as attestor failed"); + + // a price request is sent + let request_price = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.request_price(trading_pair_id)); + let result = client + .call(&ink_e2e::alice(), request_price, 0, None) + .await + .expect("Request price should be sent"); + // event : MessageQueued + assert!(result.contains_event("Contracts", "ContractEmitted")); + + let request_id = result.return_value().expect("Request id not found"); + + // then a response is received + let payload = PriceResponseMessage { + resp_type: TYPE_ERROR, + trading_pair_id, + price: None, + err_no: Some(12356), + }; + let actions = vec![ + HandleActionInput::Reply(payload.encode()), + HandleActionInput::SetQueueHead(request_id + 1), + ]; + let rollup_cond_eq = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.rollup_cond_eq(vec![], vec![], actions.clone())); + let result = client + .call(&ink_e2e::bob(), rollup_cond_eq, 0, None) + .await + .expect("we should proceed error message"); + // two events : MessageProcessedTo and PricesReceived + assert!(result.contains_event("Contracts", "ContractEmitted")); + + Ok(()) + } + + #[ink_e2e::test] + async fn test_bad_attestor(mut client: ink_e2e::Client) -> E2EResult<()> { + // given + let constructor = TestOracleRef::new(); + let contract_acc_id = client + .instantiate("test_oracle", &ink_e2e::alice(), constructor, 0, None) + .await + .expect("instantiate failed") + .account_id; + + // bob is not granted as attestor => it should not be able to send a message + let rollup_cond_eq = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.rollup_cond_eq(vec![], vec![], vec![])); + let result = client.call(&ink_e2e::bob(), rollup_cond_eq, 0, None).await; + assert!( + result.is_err(), + "only attestor should be able to send messages" + ); + + // bob is granted as attestor + let bob_address = ink::primitives::AccountId::from( + Signer::::account_id(&ink_e2e::bob()).0, + ); + let grant_role = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.grant_role(ATTESTOR_ROLE, Some(bob_address))); + client + .call(&ink_e2e::alice(), grant_role, 0, None) + .await + .expect("grant bob as attestor failed"); + + // then bob is abel to send a message + let rollup_cond_eq = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.rollup_cond_eq(vec![], vec![], vec![])); + let result = client + .call(&ink_e2e::bob(), rollup_cond_eq, 0, None) + .await + .expect("rollup cond eq failed"); + // no event + assert!(!result.contains_event("Contracts", "ContractEmitted")); + + Ok(()) + } + + #[ink_e2e::test] + async fn test_bad_messages(mut client: ink_e2e::Client) -> E2EResult<()> { + // given + let constructor = TestOracleRef::new(); + let contract_acc_id = client + .instantiate("test_oracle", &ink_e2e::alice(), constructor, 0, None) + .await + .expect("instantiate failed") + .account_id; + + let trading_pair_id = 10; + + // create the trading pair + let create_trading_pair = + build_message::(contract_acc_id.clone()).call(|oracle| { + oracle.create_trading_pair( + trading_pair_id, + String::from("polkadot"), + String::from("usd"), + ) + }); + client + .call(&ink_e2e::alice(), create_trading_pair, 0, None) + .await + .expect("create trading pair failed"); + + // bob is granted as attestor + let bob_address = ink::primitives::AccountId::from( + Signer::::account_id(&ink_e2e::bob()).0, + ); + let grant_role = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.grant_role(ATTESTOR_ROLE, Some(bob_address))); + client + .call(&ink_e2e::alice(), grant_role, 0, None) + .await + .expect("grant bob as attestor failed"); + + let actions = vec![HandleActionInput::Reply(58u128.encode())]; + let rollup_cond_eq = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.rollup_cond_eq(vec![], vec![], actions.clone())); + let result = client.call(&ink_e2e::bob(), rollup_cond_eq, 0, None).await; + assert!( + result.is_err(), + "we should not be able to proceed bad messages" + ); + + Ok(()) + } + + #[ink_e2e::test] + async fn test_optimistic_locking(mut client: ink_e2e::Client) -> E2EResult<()> { + // given + let constructor = TestOracleRef::new(); + let contract_acc_id = client + .instantiate("test_oracle", &ink_e2e::alice(), constructor, 0, None) + .await + .expect("instantiate failed") + .account_id; + + // bob is granted as attestor + let bob_address = ink::primitives::AccountId::from( + Signer::::account_id(&ink_e2e::bob()).0, + ); + let grant_role = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.grant_role(ATTESTOR_ROLE, Some(bob_address))); + client + .call(&ink_e2e::alice(), grant_role, 0, None) + .await + .expect("grant bob as attestor failed"); + + // then bob sends a message + // from v0 to v1 => it's ok + let conditions = vec![(123u8.encode(), None)]; + let updates = vec![(123u8.encode(), Some(1u128.encode()))]; + let rollup_cond_eq = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.rollup_cond_eq(conditions.clone(), updates.clone(), vec![])); + let result = client.call(&ink_e2e::bob(), rollup_cond_eq, 0, None).await; + result.expect("This message should be proceed because the condition is met"); + + // test idempotency it should fail because the conditions are not met + let rollup_cond_eq = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.rollup_cond_eq(conditions.clone(), updates.clone(), vec![])); + let result = client.call(&ink_e2e::bob(), rollup_cond_eq, 0, None).await; + assert!( + result.is_err(), + "This message should not be proceed because the condition is not met" + ); + + // from v1 to v2 => it's ok + let conditions = vec![(123u8.encode(), Some(1u128.encode()))]; + let updates = vec![(123u8.encode(), Some(2u128.encode()))]; + let rollup_cond_eq = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.rollup_cond_eq(conditions.clone(), updates.clone(), vec![])); + let result = client.call(&ink_e2e::bob(), rollup_cond_eq, 0, None).await; + result.expect("This message should be proceed because the condition is met"); + + // test idempotency it should fail because the conditions are not met + let rollup_cond_eq = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.rollup_cond_eq(conditions.clone(), updates.clone(), vec![])); + let result = client.call(&ink_e2e::bob(), rollup_cond_eq, 0, None).await; + assert!( + result.is_err(), + "This message should not be proceed because the condition is not met" + ); + + Ok(()) + } + + #[ink_e2e::test] + async fn test_prepare_meta_tx(mut client: ink_e2e::Client) -> E2EResult<()> { + let constructor = TestOracleRef::new(); + let contract_acc_id = client + .instantiate("test_oracle", &ink_e2e::bob(), constructor, 0, None) + .await + .expect("instantiate failed") + .account_id; + + // Alice is the attestor + // use the ecsda account because we are not able to verify the sr25519 signature + let from = ink::primitives::AccountId::from( + Signer::::account_id(&subxt_signer::ecdsa::dev::alice()).0, + ); + + // prepare the meta transaction + let data = u8::encode(&5); + let prepare_meta_tx = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.prepare(from, data.clone())); + let result = client + .call(&ink_e2e::bob(), prepare_meta_tx, 0, None) + .await + .expect("We should be able to prepare the meta tx"); + + let (request, _hash) = result + .return_value() + .expect("Expected value when preparing meta tx"); + + assert_eq!(0, request.nonce); + assert_eq!(from, request.from); + assert_eq!(contract_acc_id, request.to); + assert_eq!(&data, &request.data); + + Ok(()) + } + + /// + /// Test the meta transactions + /// Charlie is the owner + /// Alice is the attestor + /// Bob is the sender (ie the payer) + /// + #[ink_e2e::test] + async fn test_meta_tx_rollup_cond_eq(mut client: ink_e2e::Client) -> E2EResult<()> { + let constructor = TestOracleRef::new(); + let contract_acc_id = client + .instantiate("test_oracle", &ink_e2e::charlie(), constructor, 0, None) + .await + .expect("instantiate failed") + .account_id; + + // Alice is the attestor + // use the ecsda account because we are not able to verify the sr25519 signature + let from = ink::primitives::AccountId::from( + Signer::::account_id(&subxt_signer::ecdsa::dev::alice()).0, + ); + + // add the role => it should be succeed + let grant_role = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.grant_role(ATTESTOR_ROLE, Some(from))); + client + .call(&ink_e2e::charlie(), grant_role, 0, None) + .await + .expect("grant the attestor failed"); + + // prepare the meta transaction + let data = RollupCondEqMethodParams::encode(&(vec![], vec![], vec![])); + let prepare_meta_tx = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.prepare(from, data.clone())); + let result = client + .call(&ink_e2e::bob(), prepare_meta_tx, 0, None) + .await + .expect("We should be able to prepare the meta tx"); + + let (request, _hash) = result + .return_value() + .expect("Expected value when preparing meta tx"); + + assert_eq!(0, request.nonce); + assert_eq!(from, request.from); + assert_eq!(contract_acc_id, request.to); + assert_eq!(&data, &request.data); + + // Alice signs the message + let keypair = subxt_signer::ecdsa::dev::alice(); + let signature = keypair.sign(&scale::Encode::encode(&request)).0; + + // do the meta tx + let meta_tx_rollup_cond_eq = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.meta_tx_rollup_cond_eq(request.clone(), signature)); + client + .call(&ink_e2e::bob(), meta_tx_rollup_cond_eq, 0, None) + .await + .expect("meta tx rollup cond eq should not failed"); + + // do it again => it must failed + let meta_tx_rollup_cond_eq = build_message::(contract_acc_id.clone()) + .call(|oracle| oracle.meta_tx_rollup_cond_eq(request.clone(), signature)); + let result = client + .call(&ink_e2e::bob(), meta_tx_rollup_cond_eq, 0, None) + .await; + assert!( + result.is_err(), + "This message should not be proceed because the nonce is obsolete" + ); + + Ok(()) + } + } +} diff --git a/ink/crates/phat_rollup_anchor_ink/Cargo.toml b/ink/crates/phat_rollup_anchor_ink/Cargo.toml new file mode 100644 index 0000000..78a7665 --- /dev/null +++ b/ink/crates/phat_rollup_anchor_ink/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "phat_rollup_anchor_ink" +version = "0.0.1" +authors = ["GuiGou"] +edition = "2021" + +[dependencies] +ink = { version = "4.3.0", default-features = false } + +scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] } +scale-info = { version = "2.6", default-features = false, features = ["derive"], optional = true } +kv-session = { package = "pink-kv-session", version = "0.2" } + +openbrush = { git = "https://github.com/Brushfam/openbrush-contracts", version = "4.0.0-beta", features = ["ownable", "access_control"], default-features = false } + +[dev-dependencies] +hex-literal = "0.4.1" +ink_e2e = { version = "4.3.0" } +subxt-signer = { version = "0.31.0" } + +[lib] +path = "src/lib.rs" + +[features] +default = ["std"] +std = [ + "ink/std", + "scale/std", + "scale-info/std", + "openbrush/std", +] \ No newline at end of file diff --git a/ink/crates/phat_rollup_anchor_ink/README.md b/ink/crates/phat_rollup_anchor_ink/README.md new file mode 100644 index 0000000..1708d17 --- /dev/null +++ b/ink/crates/phat_rollup_anchor_ink/README.md @@ -0,0 +1,514 @@ +# Phat Rollup Anchor for Ink smart contract + +Library for Ink! smart contract to help you build [Phat Rollup Anchor ](https://github.com/Phala-Network/phat-offchain-rollup/ +)deployed on the Substrate pallet Contracts. +This library uses the [OpenBrush](https://learn.brushfam.io/docs/OpenBrush) library with the features `ownable` and `access_control` +It provides the following features for: + - `KvStore`: key-value store that allows offchain Phat Contracts to perform read/write operations. + - `MessageQueue`: Message Queue, enabling a request-response programming model for the smart-contract while ensuring that each request received exactly one response. It uses the KV Store to save the messages. + - `RollupAnchor`: Use the kv-store and the message queue to allow offchain's rollup transactions. + - `MetaTransaction`: Allow the offchain Phat Contract to do transactions without paying the gas fee. The fee will be paid by a third party (the relayer). + + +## Build the crate + +To build the crate: + +```bash +cargo build +``` +## Run the integration tests + +To run the integration tests: + +```bash +cargo test +``` + +## Use this crate in your library + +### Add the dependencies + +The default toml of your project + +```toml +[dependencies] +ink = { version = "4.2.0", default-features = false } + +scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] } +scale-info = { version = "2", default-features = false, features = ["derive"], optional = true } + +# OpenBrush dependency +openbrush = { git = "https://github.com/727-Ventures/openbrush-contracts", version = "4.0.0-beta", features = ["ownable", "access_control"], default-features = false } + +# Phat Rollup Anchor dependency +phat_rollup_anchor_ink = { path = "phat-rollup-anchor-ink", default-features = false} + +[features] +default = ["std"] +std = [ + "ink/std", + "scale/std", + "scale-info/std", + "openbrush/std", + "phat_rollup_anchor_ink/std", +] +``` + +### Add imports + +Use `openbrush::contract` macro instead of `ink::contract`. +Import everything from `openbrush::contracts::access_control`, `openbrush::contracts::ownable`, `phat_rollup_anchor_ink::traits::meta_transaction`, `phat_rollup_anchor_ink::traits::rollup_anchor`. + +```rust +#![cfg_attr(not(feature = "std"), no_std, no_main)] + +#[openbrush::implementation(Ownable, AccessControl)] +#[openbrush::contract] +pub mod test_oracle { + + use openbrush::contracts::access_control::*; + use openbrush::contracts::ownable::*; + use openbrush::traits::Storage; + use scale::{Decode, Encode}; + + use phat_rollup_anchor_ink::traits::{ + meta_transaction, meta_transaction::*, + rollup_anchor, rollup_anchor::* + }; +... +``` + +### Define storage + +Declare storage struct and declare the fields related to the modules. + +```rust +#[ink(storage)] +#[derive(Default, Storage)] +pub struct TestOracle { + #[storage_field] + ownable: ownable::Data, + #[storage_field] + access: access_control::Data, + #[storage_field] + rollup_anchor: rollup_anchor::Data, + #[storage_field] + meta_transaction: meta_transaction::Data, + ... +} +``` + +### Inherit logic +Inherit implementation of the traits. You can customize (override) methods in this `impl` block. + +```rust +impl RollupAnchor for TestOracle {} +impl MetaTransaction for TestOracle {} +``` + +### Define constructor +```rust +impl TestOracle { + #[ink(constructor)] + pub fn new() -> Self { + let mut instance = Self::default(); + let caller = instance.env().caller(); + // set the owner of this contract + ownable::Internal::_init_with_owner(&mut instance, caller); + // set the admin of this contract + access_control::Internal::_init_with_admin(&mut instance, Some(caller)); + instance + } +} +``` + +### Traits to implement + +### Trait for the rollup anchor +Implement the `rollup_anchor::EventBroadcaster` trait to emit the events when a message is pushed in the queue and when a message is proceeded. +If you don't want to emit the events, you can put an empty block in the methods `emit_event_message_queued` and `emit_event_message_processed_to`. + +```rust +/// Events emitted when a message is pushed in the queue +#[ink(event)] +pub struct MessageQueued { + pub id: u32, + pub data: Vec, +} + +/// Events emitted when a message is proceed +#[ink(event)] +pub struct MessageProcessedTo { + pub id: u32, +} + +impl rollup_anchor::EventBroadcaster for TestOracle { + + fn emit_event_message_queued(&self, id: u32, data: Vec){ + self.env().emit_event(MessageQueued { id, data }); + } + + fn emit_event_message_processed_to(&self, id: u32){ + self.env().emit_event(MessageProcessedTo { id }); + } + +} +``` + +Implement the `rollup_anchor::MessageHandler` trait to put your business logic when a message is received. +Here an example when the Oracle receives a message with the price feed. + +```rust +impl rollup_anchor::MessageHandler for TestOracle { + fn on_message_received(&mut self, action: Vec) -> Result<(), RollupAnchorError> { + + // parse the response + let message: PriceResponseMessage = Decode::decode(&mut &action[..]) + .or(Err(RollupAnchorError::FailedToDecode))?; + + // handle the response + if message.resp_type == TYPE_RESPONSE || message.resp_type == TYPE_FEED { // we received the price + // register the info + let mut trading_pair = self.trading_pairs.get(&message.trading_pair_id).unwrap_or_default(); + trading_pair.value = message.price.unwrap_or_default(); + trading_pair.nb_updates += 1; + trading_pair.last_update = self.env().block_timestamp(); + self.trading_pairs.insert(&message.trading_pair_id, &trading_pair); + + // emmit te event + self.env().emit_event( + PriceReceived { + trading_pair_id: message.trading_pair_id, + price: message.price.unwrap_or_default(), + } + ); + + } else if message.resp_type == TYPE_ERROR { // we received an error + self.env().emit_event( + ErrorReceived { + trading_pair_id: message.trading_pair_id, + err_no: message.err_no.unwrap_or_default() + } + ); + } else { + // response type unknown + return Err(RollupAnchorError::UnsupportedAction); + } + + Ok(()) + } +} +``` +### Trait for the meta transaction +Implement the `meta_transaction::EventBroadcaster` trait to emit the events when a meta transaction is decoded. +If you don't want to emit the event, you can put an empty block in the methods `emit_event_meta_tx_decoded`. + +```rust + impl meta_transaction::EventBroadcaster for TestOracle { + fn emit_event_meta_tx_decoded(&self) { + self.env().emit_event(MetaTxDecoded {}); + } + } + + /// Events emitted when a meta transaction is decoded + #[ink(event)] + pub struct MetaTxDecoded {} +``` + +### Final code +Here the final code of the Feed Price Oracle. + +```rust +#![cfg_attr(not(feature = "std"), no_std, no_main)] + +#[openbrush::implementation(Ownable, AccessControl)] +#[openbrush::contract] +pub mod test_oracle { + use ink::codegen::{EmitEvent, Env}; + use ink::prelude::string::String; + use ink::prelude::vec::Vec; + use ink::storage::Mapping; + use openbrush::contracts::access_control::*; + use openbrush::contracts::ownable::*; + use openbrush::traits::Storage; + use scale::{Decode, Encode}; + + use phat_rollup_anchor_ink::traits::{ + meta_transaction, meta_transaction::*, rollup_anchor, rollup_anchor::*, + }; + + pub type TradingPairId = u32; + + /// Events emitted when a price is received + #[ink(event)] + pub struct PriceReceived { + trading_pair_id: TradingPairId, + price: u128, + } + + /// Events emitted when a error is received + #[ink(event)] + pub struct ErrorReceived { + trading_pair_id: TradingPairId, + err_no: u128, + } + + /// Errors occurred in the contract + #[derive(Encode, Decode, Debug)] + #[cfg_attr(feature = "std", derive(scale_info::TypeInfo))] + pub enum ContractError { + AccessControlError(AccessControlError), + RollupAnchorError(RollupAnchorError), + MetaTransactionError(MetaTransactionError), + MissingTradingPair, + } + + /// convertor from MessageQueueError to ContractError + impl From for ContractError { + fn from(error: AccessControlError) -> Self { + ContractError::AccessControlError(error) + } + } + + /// convertor from RollupAnchorError to ContractError + impl From for ContractError { + fn from(error: RollupAnchorError) -> Self { + ContractError::RollupAnchorError(error) + } + } + + /// convertor from MetaTxError to ContractError + impl From for ContractError { + fn from(error: MetaTransactionError) -> Self { + ContractError::MetaTransactionError(error) + } + } + + /// Message to request the price of the trading pair + /// message pushed in the queue by this contract and read by the offchain rollup + #[derive(Encode, Decode)] + struct PriceRequestMessage { + /// id of the pair (use as key in the Mapping) + trading_pair_id: TradingPairId, + /// trading pair like 'polkdatot/usd' + /// Note: it will be better to not save this data in the storage + token0: String, + token1: String, + } + + /// Message sent to provide the price of the trading pair + /// response pushed in the queue by the offchain rollup and read by this contract + #[derive(Encode, Decode)] + struct PriceResponseMessage { + /// Type of response + resp_type: u8, + /// id of the pair + trading_pair_id: TradingPairId, + /// price of the trading pair + price: Option, + /// error when the price is read + err_no: Option, + } + + /// Type of response when the offchain rollup communicates with this contract + const TYPE_ERROR: u8 = 0; + const TYPE_RESPONSE: u8 = 10; + const TYPE_FEED: u8 = 11; + + /// Data storage + #[derive(Encode, Decode, Default, Eq, PartialEq, Clone, Debug)] + #[cfg_attr( + feature = "std", + derive(scale_info::TypeInfo, ink::storage::traits::StorageLayout) + )] + pub struct TradingPair { + /// trading pair like 'polkdatot/usd' + /// Note: it will be better to not save this data outside of the storage + token0: String, + token1: String, + /// value of the trading pair + value: u128, + /// number of updates of the value + nb_updates: u16, + /// when the last value has been updated + last_update: u64, + } + + #[ink(storage)] + #[derive(Default, Storage)] + pub struct TestOracle { + #[storage_field] + ownable: ownable::Data, + #[storage_field] + access: access_control::Data, + #[storage_field] + rollup_anchor: rollup_anchor::Data, + #[storage_field] + meta_transaction: meta_transaction::Data, + trading_pairs: Mapping, + } + + impl TestOracle { + #[ink(constructor)] + pub fn new() -> Self { + let mut instance = Self::default(); + let caller = instance.env().caller(); + // set the owner of this contract + ownable::Internal::_init_with_owner(&mut instance, caller); + // set the admin of this contract + access_control::Internal::_init_with_admin(&mut instance, Some(caller)); + // grant the role manager + AccessControl::grant_role(&mut instance, MANAGER_ROLE, Some(caller)) + .expect("Should grant the role MANAGER_ROLE"); + instance + } + + #[ink(message)] + #[openbrush::modifiers(access_control::only_role(MANAGER_ROLE))] + pub fn create_trading_pair( + &mut self, + trading_pair_id: TradingPairId, + token0: String, + token1: String, + ) -> Result<(), ContractError> { + // we create a new trading pair or override an existing one + let trading_pair = TradingPair { + token0, + token1, + value: 0, + nb_updates: 0, + last_update: 0, + }; + self.trading_pairs.insert(trading_pair_id, &trading_pair); + Ok(()) + } + + #[ink(message)] + #[openbrush::modifiers(access_control::only_role(MANAGER_ROLE))] + pub fn request_price( + &mut self, + trading_pair_id: TradingPairId, + ) -> Result { + let index = match self.trading_pairs.get(trading_pair_id) { + Some(t) => { + // push the message in the queue + let message = PriceRequestMessage { + trading_pair_id, + token0: t.token0, + token1: t.token1, + }; + self.push_message(&message)? + } + _ => return Err(ContractError::MissingTradingPair), + }; + + Ok(index) + } + + #[ink(message)] + pub fn get_trading_pair(&self, trading_pair_id: TradingPairId) -> Option { + self.trading_pairs.get(trading_pair_id) + } + + #[ink(message)] + pub fn register_attestor( + &mut self, + account_id: AccountId, + ecdsa_public_key: [u8; 33], + ) -> Result<(), ContractError> { + AccessControl::grant_role(self, ATTESTOR_ROLE, Some(account_id))?; + self.register_ecdsa_public_key(account_id, ecdsa_public_key)?; + Ok(()) + } + + #[ink(message)] + pub fn get_attestor_role(&self) -> RoleType { + ATTESTOR_ROLE + } + + #[ink(message)] + pub fn get_manager_role(&self) -> RoleType { + MANAGER_ROLE + } + } + + impl RollupAnchor for TestOracle {} + + impl MetaTransaction for TestOracle {} + + impl rollup_anchor::MessageHandler for TestOracle { + fn on_message_received(&mut self, action: Vec) -> Result<(), RollupAnchorError> { + // parse the response + let message: PriceResponseMessage = + Decode::decode(&mut &action[..]).or(Err(RollupAnchorError::FailedToDecode))?; + + // handle the response + if message.resp_type == TYPE_RESPONSE || message.resp_type == TYPE_FEED { + // we received the price + // register the info + let mut trading_pair = self + .trading_pairs + .get(message.trading_pair_id) + .unwrap_or_default(); + trading_pair.value = message.price.unwrap_or_default(); + trading_pair.nb_updates += 1; + trading_pair.last_update = self.env().block_timestamp(); + self.trading_pairs + .insert(message.trading_pair_id, &trading_pair); + + // emmit te event + self.env().emit_event(PriceReceived { + trading_pair_id: message.trading_pair_id, + price: message.price.unwrap_or_default(), + }); + } else if message.resp_type == TYPE_ERROR { + // we received an error + self.env().emit_event(ErrorReceived { + trading_pair_id: message.trading_pair_id, + err_no: message.err_no.unwrap_or_default(), + }); + } else { + // response type unknown + return Err(RollupAnchorError::UnsupportedAction); + } + + Ok(()) + } + } + + /// Events emitted when a message is pushed in the queue + #[ink(event)] + pub struct MessageQueued { + pub id: u32, + pub data: Vec, + } + + /// Events emitted when a message is proceed + #[ink(event)] + pub struct MessageProcessedTo { + pub id: u32, + } + + impl rollup_anchor::EventBroadcaster for TestOracle { + fn emit_event_message_queued(&self, id: u32, data: Vec) { + self.env().emit_event(MessageQueued { id, data }); + } + + fn emit_event_message_processed_to(&self, id: u32) { + self.env().emit_event(MessageProcessedTo { id }); + } + } + + impl meta_transaction::EventBroadcaster for TestOracle { + fn emit_event_meta_tx_decoded(&self) { + self.env().emit_event(MetaTxDecoded {}); + } + } + + /// Events emitted when a meta transaction is decoded + #[ink(event)] + pub struct MetaTxDecoded {} + +} +``` \ No newline at end of file diff --git a/ink/crates/phat_rollup_anchor_ink/src/lib.rs b/ink/crates/phat_rollup_anchor_ink/src/lib.rs new file mode 100644 index 0000000..7c2fa23 --- /dev/null +++ b/ink/crates/phat_rollup_anchor_ink/src/lib.rs @@ -0,0 +1,2 @@ +#![cfg_attr(not(feature = "std"), no_std, no_main)] +pub mod traits; diff --git a/ink/crates/phat_rollup_anchor_ink/src/traits/meta_transaction.rs b/ink/crates/phat_rollup_anchor_ink/src/traits/meta_transaction.rs new file mode 100644 index 0000000..782894c --- /dev/null +++ b/ink/crates/phat_rollup_anchor_ink/src/traits/meta_transaction.rs @@ -0,0 +1,154 @@ +use crate::traits::rollup_anchor::{RollupAnchor, RollupAnchorError, RollupCondEqMethodParams}; +use ink::env::hash::{Blake2x256, HashOutput}; +use ink::prelude::vec::Vec; +use openbrush::storage::Mapping; +use openbrush::traits::{AccountId, Hash, Storage}; + +pub type Nonce = u128; +pub type PrepareResult = (ForwardRequest, Hash); +pub type MetatTxRollupCondEqMethodParams = (ForwardRequest, [u8; 65]); + +#[derive(Debug, Eq, PartialEq, scale::Encode, scale::Decode)] +#[cfg_attr(feature = "std", derive(scale_info::TypeInfo))] +pub enum MetaTransactionError { + InvalidDestination, + NonceTooLow, + IncorrectSignature, + PublicKeyNotMatch, + PublicKeyIncorrect, + RollupAnchorError(RollupAnchorError), +} + +/// convertor from RollupAnchorError to MetaTxError +impl From for MetaTransactionError { + fn from(error: RollupAnchorError) -> Self { + MetaTransactionError::RollupAnchorError(error) + } +} + +#[derive(Debug, Eq, PartialEq, Clone, scale::Encode, scale::Decode)] +#[cfg_attr(feature = "std", derive(scale_info::TypeInfo))] +pub struct ForwardRequest { + pub from: AccountId, + pub to: AccountId, + pub nonce: Nonce, + pub data: Vec, +} + +#[derive(Default, Debug)] +#[openbrush::storage_item] +pub struct Data { + nonces: Mapping, +} + +#[openbrush::trait_definition] +pub trait MetaTransaction: Storage + EventBroadcaster + RollupAnchor { + #[ink(message)] + fn prepare( + &self, + from: AccountId, + data: Vec, + ) -> Result<(ForwardRequest, Hash), MetaTransactionError> { + let nonce = self.get_nonce(from); + let to = Self::env().account_id(); + + let request = ForwardRequest { + from, + to, + nonce, + data, + }; + let mut hash = ::Type::default(); + ink::env::hash_encoded::(&request, &mut hash); + + Ok((request, hash.into())) + } + + fn get_nonce(&self, from: AccountId) -> Nonce { + self.data::().nonces.get(&from).unwrap_or(0) + } + + fn verify( + &self, + request: &ForwardRequest, + signature: &[u8; 65], + ) -> Result<(), MetaTransactionError> { + let to = Self::env().account_id(); + if request.to != to { + return Err(MetaTransactionError::InvalidDestination); + } + + let nonce_from = self.get_nonce(request.from); + if request.nonce != nonce_from { + return Err(MetaTransactionError::NonceTooLow); + } + + // at the moment we can only verify ecdsa signatures + let mut hash = ::Type::default(); + ink::env::hash_encoded::(&request, &mut hash); + + let mut public_key = [0u8; 33]; + ink::env::ecdsa_recover(signature, &hash, &mut public_key) + .map_err(|_| MetaTransactionError::IncorrectSignature)?; + + if request.from != get_ecdsa_account_id(&public_key) { + return Err(MetaTransactionError::PublicKeyNotMatch); + } + Ok(()) + } + + fn ensure_meta_tx_valid( + &mut self, + request: &ForwardRequest, + signature: &[u8; 65], + ) -> Result<(), MetaTransactionError> { + // verify the signature + self.verify(request, signature)?; + // update the nonce + let nonce = request.nonce + 1; + self.data::().nonces.insert(&request.from, &nonce); + Ok(()) + } + + #[ink(message)] + fn meta_tx_rollup_cond_eq( + &mut self, + request: ForwardRequest, + signature: [u8; 65], + ) -> Result<(), MetaTransactionError> { + // check the signature + self.ensure_meta_tx_valid(&request, &signature)?; + + // check the attestor role + self.check_attestor_role(request.from)?; + + // decode the data + let data: RollupCondEqMethodParams = scale::Decode::decode(&mut request.data.as_slice()) + .map_err(|_| RollupAnchorError::FailedToDecode)?; + + // emit the event + self.emit_event_meta_tx_decoded(); + + // call the rollup + self.inner_rollup_cond_eq(data.0, data.1, data.2)?; + + Ok(()) + } +} + +pub trait EventBroadcaster { + fn emit_event_meta_tx_decoded(&self); +} + +/// Hashing function for bytes +fn hash_blake2b256(input: &[u8]) -> [u8; 32] { + use ink::env::hash; + let mut output = ::Type::default(); + ink::env::hash_bytes::(input, &mut output); + output +} + +/// Converts a compressed ECDSA public key to AccountId +fn get_ecdsa_account_id(pub_key: &[u8; 33]) -> AccountId { + AccountId::from(hash_blake2b256(pub_key)) +} diff --git a/ink/crates/phat_rollup_anchor_ink/src/traits/mod.rs b/ink/crates/phat_rollup_anchor_ink/src/traits/mod.rs new file mode 100644 index 0000000..f0b8d3f --- /dev/null +++ b/ink/crates/phat_rollup_anchor_ink/src/traits/mod.rs @@ -0,0 +1,2 @@ +pub mod meta_transaction; +pub mod rollup_anchor; diff --git a/ink/crates/phat_rollup_anchor_ink/src/traits/rollup_anchor.rs b/ink/crates/phat_rollup_anchor_ink/src/traits/rollup_anchor.rs new file mode 100644 index 0000000..37d2a40 --- /dev/null +++ b/ink/crates/phat_rollup_anchor_ink/src/traits/rollup_anchor.rs @@ -0,0 +1,264 @@ +use ink::prelude::vec::Vec; +pub use kv_session::traits::{Key, QueueIndex, Value}; +use openbrush::contracts::access_control::{self, AccessControlError, RoleType}; +use openbrush::storage::Mapping; +use openbrush::traits::{AccountId, Storage}; +use scale::{Decode, Encode}; + +pub const ATTESTOR_ROLE: RoleType = ink::selector_id!("ATTESTOR_ROLE"); + +const QUEUE_PREFIX: &[u8] = b"q/"; +const QUEUE_HEAD_KEY: &[u8] = b"_head"; +const QUEUE_TAIL_KEY: &[u8] = b"_tail"; + +#[derive(Default, Debug)] +#[openbrush::storage_item] +pub struct Data { + pub kv_store: Mapping, +} + +pub trait MessageHandler { + fn on_message_received(&mut self, action: Vec) -> Result<(), RollupAnchorError>; +} + +pub trait EventBroadcaster { + fn emit_event_message_queued(&self, id: QueueIndex, data: Vec); + + fn emit_event_message_processed_to(&self, id: QueueIndex); +} + +#[derive(scale::Encode, scale::Decode, Debug, Eq, PartialEq, Clone)] +#[cfg_attr(feature = "std", derive(scale_info::TypeInfo))] +pub enum HandleActionInput { + Reply(Vec), + SetQueueHead(QueueIndex), + GrantAttestor(AccountId), + RevokeAttestor(AccountId), +} + +#[derive(Debug, Eq, PartialEq, scale::Encode, scale::Decode)] +#[cfg_attr(feature = "std", derive(scale_info::TypeInfo))] +pub enum RollupAnchorError { + InvalidPopTarget, + ConditionNotMet, + FailedToDecode, + UnsupportedAction, + AccessControlError(AccessControlError), +} + +/// convertor from AccessControlError to RollupAnchorError +impl From for RollupAnchorError { + fn from(error: AccessControlError) -> Self { + RollupAnchorError::AccessControlError(error) + } +} + +pub type RollupCondEqMethodParams = ( + Vec<(Key, Option)>, + Vec<(Key, Option)>, + Vec, +); + +macro_rules! get_key { + ($id:ident) => { + [QUEUE_PREFIX, &$id.encode()].concat() + }; +} + +macro_rules! get_tail_key { + () => { + [QUEUE_PREFIX, QUEUE_TAIL_KEY].concat() + }; +} + +macro_rules! get_head_key { + () => { + [QUEUE_PREFIX, QUEUE_HEAD_KEY].concat() + }; +} + +macro_rules! get_queue_index { + ($kv:ident, $key:ident) => {{ + match $kv.inner_get_value(&$key) { + Some(v) => QueueIndex::decode(&mut v.as_slice()) + .map_err(|_| RollupAnchorError::FailedToDecode)?, + _ => 0, + } + }}; +} + +#[openbrush::trait_definition] +pub trait RollupAnchor: + Storage + + MessageHandler + + EventBroadcaster + + access_control::AccessControl + + access_control::Internal +{ + #[ink(message)] + fn get_value(&self, key: Key) -> Option { + self.inner_get_value(&key) + } + + fn inner_get_value(&self, key: &Key) -> Option { + self.data::().kv_store.get(key) + } + + fn set_value(&mut self, key: &Key, value: Option<&Value>) { + match value { + None => self.data::().kv_store.remove(key), + Some(v) => self.data::().kv_store.insert(key, v), + } + } + + fn push_message( + &mut self, + data: &M, + ) -> Result { + let id = self.get_queue_tail()?; + let key = get_key!(id); + let encoded_value = data.encode(); + self.set_value(&key, Some(&encoded_value)); + + self.set_queue_tail(id + 1); + self.emit_event_message_queued(id, encoded_value); + + Ok(id) + } + + fn get_message( + &self, + id: QueueIndex, + ) -> Result, RollupAnchorError> { + let key = get_key!(id); + match self.inner_get_value(&key) { + Some(v) => { + let message = + M::decode(&mut v.as_slice()).map_err(|_| RollupAnchorError::FailedToDecode)?; + Ok(Some(message)) + } + _ => Ok(None), + } + } + + fn get_queue_tail(&self) -> Result { + let key = get_tail_key!(); + let index = get_queue_index!(self, key); + Ok(index) + } + + fn get_queue_head(&self) -> Result { + let key = get_head_key!(); + let index = get_queue_index!(self, key); + Ok(index) + } + + fn pop_to(&mut self, target_id: QueueIndex) -> Result<(), RollupAnchorError> { + let current_tail_id = self.get_queue_tail()?; + if target_id > current_tail_id { + return Err(RollupAnchorError::InvalidPopTarget); + } + + let current_head_id = self.get_queue_head()?; + if target_id < current_head_id { + return Err(RollupAnchorError::InvalidPopTarget); + } + + if target_id == current_head_id { + // nothing to do + return Ok(()); + } + + for id in current_head_id..target_id { + let key = get_key!(id); + self.set_value(&key, None); + } + + self.set_queue_head(target_id); + self.emit_event_message_processed_to(target_id); + + Ok(()) + } + + fn set_queue_tail(&mut self, id: QueueIndex) { + let key = get_tail_key!(); + self.set_value(&key, Some(&id.encode())); + } + + fn set_queue_head(&mut self, id: QueueIndex) { + let key = get_head_key!(); + self.set_value(&key, Some(&id.encode())); + } + + #[ink(message)] + #[openbrush::modifiers(access_control::only_role(ATTESTOR_ROLE))] + fn rollup_cond_eq( + &mut self, + conditions: Vec<(Key, Option)>, + updates: Vec<(Key, Option)>, + actions: Vec, + ) -> Result<(), RollupAnchorError> { + self.inner_rollup_cond_eq(conditions, updates, actions) + } + + fn check_attestor_role(&self, attestor: AccountId) -> Result<(), RollupAnchorError> { + if !self.has_role(ATTESTOR_ROLE, Some(attestor)) { + return Err(RollupAnchorError::AccessControlError( + access_control::AccessControlError::MissingRole, + )); + } + + Ok(()) + } + + fn inner_rollup_cond_eq( + &mut self, + conditions: Vec<(Key, Option)>, + updates: Vec<(Key, Option)>, + actions: Vec, + ) -> Result<(), RollupAnchorError> { + // check the conditions + for cond in conditions { + let key = cond.0; + let current_value = self.inner_get_value(&key); + let expected_value = cond.1; + match (current_value, expected_value) { + (None, None) => {} + (Some(v1), Some(v2)) => { + if v1.ne(&v2) { + // condition is not met + return Err(RollupAnchorError::ConditionNotMet); + } + } + (_, _) => return Err(RollupAnchorError::ConditionNotMet), + } + } + + // apply the updates + for update in updates { + self.set_value(&update.0, update.1.as_ref()); + } + + // apply the actions + for action in actions { + self.handle_action(action)?; + } + + Ok(()) + } + + fn handle_action(&mut self, input: HandleActionInput) -> Result<(), RollupAnchorError> { + match input { + HandleActionInput::Reply(action) => self.on_message_received(action)?, + HandleActionInput::SetQueueHead(id) => self.pop_to(id)?, + HandleActionInput::GrantAttestor(address) => { + self.grant_role(ATTESTOR_ROLE, Some(address))? + } + HandleActionInput::RevokeAttestor(address) => { + self.revoke_role(ATTESTOR_ROLE, Some(address))? + } + } + + Ok(()) + } +} diff --git a/ink/crates/phat_rollup_anchor_ink/tests/contract/mod.rs b/ink/crates/phat_rollup_anchor_ink/tests/contract/mod.rs new file mode 100644 index 0000000..923f2ca --- /dev/null +++ b/ink/crates/phat_rollup_anchor_ink/tests/contract/mod.rs @@ -0,0 +1,71 @@ +#![cfg_attr(not(feature = "std"), no_std, no_main)] + +#[openbrush::implementation(Ownable, AccessControl)] +#[openbrush::contract] +pub mod test_contract { + + use ink::env::debug_println; + use openbrush::contracts::access_control::*; + use openbrush::contracts::ownable::*; + use openbrush::traits::Storage; + use phat_rollup_anchor_ink::traits::meta_transaction::{self, *}; + use phat_rollup_anchor_ink::traits::rollup_anchor::{self, *}; + + #[ink(storage)] + #[derive(Default, Storage)] + pub struct MyContract { + #[storage_field] + ownable: ownable::Data, + #[storage_field] + access: access_control::Data, + #[storage_field] + rollup_anchor: rollup_anchor::Data, + #[storage_field] + meta_transaction: meta_transaction::Data, + } + + impl MyContract { + #[ink(constructor)] + pub fn new(phat_attestor: AccountId) -> Self { + let mut instance = Self::default(); + let caller = instance.env().caller(); + // set the owner of this contract + ownable::Internal::_init_with_owner(&mut instance, caller); + // set the admin of this contract + access_control::Internal::_init_with_admin(&mut instance, Some(caller)); + // grant the role attestor to the given address + AccessControl::grant_role(&mut instance, ATTESTOR_ROLE, Some(phat_attestor)) + .expect("Should grant the role ATTESTOR_ROLE"); + instance + } + } + + impl RollupAnchor for MyContract {} + impl MetaTransaction for MyContract {} + + impl rollup_anchor::MessageHandler for MyContract { + fn on_message_received(&mut self, action: Vec) -> Result<(), RollupAnchorError> { + debug_println!("Message received {:?}'", action); + Ok(()) + } + } + + impl rollup_anchor::EventBroadcaster for MyContract { + fn emit_event_message_queued(&self, id: u32, data: Vec) { + debug_println!( + "Emit event 'message queued {{ id: {:?}, data: {:2x?} }}", + id, + data + ); + } + fn emit_event_message_processed_to(&self, id: u32) { + debug_println!("Emit event 'message processed to {:?}'", id); + } + } + + impl meta_transaction::EventBroadcaster for MyContract { + fn emit_event_meta_tx_decoded(&self) { + debug_println!("Meta transaction decoded"); + } + } +} diff --git a/ink/crates/phat_rollup_anchor_ink/tests/kv_store.rs b/ink/crates/phat_rollup_anchor_ink/tests/kv_store.rs new file mode 100644 index 0000000..4734262 --- /dev/null +++ b/ink/crates/phat_rollup_anchor_ink/tests/kv_store.rs @@ -0,0 +1,88 @@ +use openbrush::test_utils::accounts; +use scale::Encode; +use phat_rollup_anchor_ink::traits::rollup_anchor::*; + +mod contract; +use contract::test_contract::MyContract; + +#[ink::test] +fn test_get_no_value() { + let accounts = accounts(); + let contract = MyContract::new(accounts.alice); + + let key = b"0x123".to_vec(); + assert_eq!(None, contract.get_value(key)); +} + +#[ink::test] +fn test_set_encoded_values() { + let accounts = accounts(); + let mut contract = MyContract::new(accounts.alice); + + let key_1 = b"0x123".to_vec(); + let some_value_1 = "0x456".encode(); + contract.set_value(&key_1, Some(&some_value_1)); + + let key_2 = b"0x124".to_vec(); + let some_value_2 = "0x457".encode(); + contract.set_value(&key_2, Some(&some_value_2)); + + match contract.get_value(key_1.clone()) { + Some(v) => assert_eq!(some_value_1, v), + _ => panic!("We should find a value for the key {:?}", key_1), + } + + match contract.get_value(key_2.clone()) { + Some(v) => assert_eq!(some_value_2, v), + _ => panic!("We should find a value for the key {:?}", key_2), + } + + let key_3 = b"0x125".to_vec(); + if let Some(_) = contract.get_value(key_3.clone()) { + panic!("We should not find a value for the key {:?}", key_3); + } +} + +#[ink::test] +fn test_update_same_key() { + let accounts = accounts(); + let mut contract = MyContract::new(accounts.alice); + + let key = b"0x123".to_vec(); + + // update the value + let some_value = "0x456".encode(); + contract.set_value(&key, Some(&some_value)); + + assert_eq!( + contract.inner_get_value(&key), + Some(some_value), + "We should find a value for the key {key:?}" + ); + + // update the value + let another_value = "0x457".encode(); + contract.set_value(&key, Some(&another_value)); + assert_eq!( + contract.inner_get_value(&key), + Some(another_value), + "We should find a value for the key {key:?}" + ); + + // remove the value + contract.set_value(&key, None); + assert_eq!( + contract.inner_get_value(&key), + None, + "We should not find a value for the key {key:?}" + ); + + // update the value + let another_value = "0x458".encode(); + contract.set_value(&key, Some(&another_value)); + assert_eq!( + contract.inner_get_value(&key), + Some(another_value), + "We should find a value for the key {key:?}" + ); +} diff --git a/ink/crates/phat_rollup_anchor_ink/tests/message_queue.rs b/ink/crates/phat_rollup_anchor_ink/tests/message_queue.rs new file mode 100644 index 0000000..7ddd64a --- /dev/null +++ b/ink/crates/phat_rollup_anchor_ink/tests/message_queue.rs @@ -0,0 +1,86 @@ +use openbrush::test_utils::accounts; +use phat_rollup_anchor_ink::traits::rollup_anchor::*; + +mod contract; +use contract::test_contract::MyContract; + +#[ink::test] +fn test_push_and_pop_message() { + let accounts = accounts(); + let mut contract = MyContract::new(accounts.alice); + + assert_eq!(0, contract.get_queue_tail().unwrap()); + assert_eq!(0, contract.get_queue_head().unwrap()); + + // push the first message in the queue + let message1 = 123456u128; + let queue_index = contract.push_message(&message1).unwrap(); + assert_eq!(0, queue_index); + assert_eq!(0, contract.get_queue_head().unwrap()); + assert_eq!(1, contract.get_queue_tail().unwrap()); + + // push the second message in the queue + let message2 = 4589u16; + let queue_index = contract.push_message(&message2).unwrap(); + assert_eq!(1, queue_index); + assert_eq!(0, contract.get_queue_head().unwrap()); + assert_eq!(2, contract.get_queue_tail().unwrap()); + + // get the first message + let message_in_queue: Option = contract.get_message(0).unwrap(); + assert_eq!( + message1, + message_in_queue.expect("we expect a message in the queue") + ); + + // get the seconde message + let message_in_queue: Option = contract.get_message(1).unwrap(); + assert_eq!( + message2, + message_in_queue.expect("we expect a message in the queue") + ); + + // pop the two messages + contract.pop_to(2).unwrap(); + assert_eq!(2, contract.get_queue_head().unwrap()); + assert_eq!(2, contract.get_queue_tail().unwrap()); +} + +#[ink::test] +fn test_pop_messages() { + let accounts = accounts(); + let mut contract = MyContract::new(accounts.alice); + + // pop to the future => error + assert_eq!(Err(RollupAnchorError::InvalidPopTarget), contract.pop_to(2)); + + let message = 4589u16; + contract.push_message(&message).unwrap(); + contract.push_message(&message).unwrap(); + contract.push_message(&message).unwrap(); + contract.push_message(&message).unwrap(); + contract.push_message(&message).unwrap(); + + assert_eq!(0, contract.get_queue_head().unwrap()); + assert_eq!(5, contract.get_queue_tail().unwrap()); + + assert_eq!(Ok(()), contract.pop_to(2)); + + assert_eq!(2, contract.get_queue_head().unwrap()); + assert_eq!(5, contract.get_queue_tail().unwrap()); + + // we do nothing + assert_eq!(Ok(()), contract.pop_to(2)); + + assert_eq!(2, contract.get_queue_head().unwrap()); + assert_eq!(5, contract.get_queue_tail().unwrap()); + + // pop to the past => error + assert_eq!(Err(RollupAnchorError::InvalidPopTarget), contract.pop_to(1)); + + // we do nothing + assert_eq!(Ok(()), contract.pop_to(5)); + + assert_eq!(5, contract.get_queue_head().unwrap()); + assert_eq!(5, contract.get_queue_tail().unwrap()); +} diff --git a/ink/crates/phat_rollup_anchor_ink/tests/meta_transaction.rs b/ink/crates/phat_rollup_anchor_ink/tests/meta_transaction.rs new file mode 100644 index 0000000..d998637 --- /dev/null +++ b/ink/crates/phat_rollup_anchor_ink/tests/meta_transaction.rs @@ -0,0 +1,254 @@ +use ink::env::test::set_callee; +use ink::env::{debug_println, DefaultEnvironment}; +use openbrush::contracts::access_control::{AccessControl, AccessControlError}; +use openbrush::test_utils::accounts; +use openbrush::traits::AccountId; +use phat_rollup_anchor_ink::traits::meta_transaction::*; +use phat_rollup_anchor_ink::traits::rollup_anchor::*; +use scale::Encode; + +mod contract; +use contract::test_contract::MyContract; +use ink_e2e::subxt::tx::Signer; +use ink_e2e::PolkadotConfig; + +#[ink::test] +fn test_get_nonce() { + let accounts = accounts(); + let contract = MyContract::new(accounts.bob); + + // no nonce (ie 0) for new account + assert_eq!(0, contract.get_nonce(accounts.bob)); +} + +#[ink::test] +fn test_prepare() { + let contract_address = AccountId::from([0xFF as u8; 32]); + set_callee::(contract_address); + + let accounts = accounts(); + let contract = MyContract::new(accounts.bob); + + // ecdsa public key d'Alice + let from = ink::primitives::AccountId::from( + Signer::::account_id(&subxt_signer::ecdsa::dev::alice()).0, + ); + + let data = u8::encode(&5); + + // prepare the meta transaction + let (request, hash) = contract + .prepare(from, data.clone()) + .expect("Error when preparing meta tx"); + + assert_eq!(0, request.nonce); + assert_eq!(from, request.from); + assert_eq!(contract_address, request.to); + assert_eq!(&data, &request.data); + + debug_println!("message: {:02x?}", &scale::Encode::encode(&request)); + + debug_println!("code hash: {:02x?}", hash); + let expected_hash = + hex_literal::hex!("9eb948928cf669f05801b791e5770419f1184637cf2ff3e8124c92e44d45e76f"); + assert_eq!(&expected_hash, &hash.as_ref()); +} + +#[ink::test] +fn test_verify() { + let contract_address = AccountId::from([0xFF as u8; 32]); + set_callee::(contract_address); + + let accounts = accounts(); + let contract = MyContract::new(accounts.bob); + + // ecdsa public key d'Alice + let keypair = subxt_signer::ecdsa::dev::alice(); + let from = AccountId::from(Signer::::account_id(&keypair).0); + + let nonce: Nonce = 0; + let data = u8::encode(&5); + let request = ForwardRequest { + from, + to: contract_address, + nonce, + data: data.clone(), + }; + + let message = scale::Encode::encode(&request); + debug_println!("message: {:02x?}", &message); + // Alice signs the message + let signature = keypair.sign(&message).0; + debug_println!("signature: {:02x?}", &signature); + + // the verification must succeed + assert_eq!(Ok(()), contract.verify(&request, &signature)); + + // incorrect 'from' => the verification must fail + let request = ForwardRequest { + from: accounts.bob, + to: contract_address, + nonce, + data: data.clone(), + }; + assert_eq!( + Err(MetaTransactionError::PublicKeyNotMatch), + contract.verify(&request, &signature) + ); + + // incorrect 'to' => the verification must fail + let request = ForwardRequest { + from, + to: accounts.bob, + nonce, + data: data.clone(), + }; + assert_eq!( + Err(MetaTransactionError::InvalidDestination), + contract.verify(&request, &signature) + ); + + // incorrect nonce => the verification must fail + let request = ForwardRequest { + from, + to: contract_address, + nonce: 1, + data: data.clone(), + }; + assert_eq!( + Err(MetaTransactionError::NonceTooLow), + contract.verify(&request, &signature) + ); + + // incorrect data => the verification must fail + let request = ForwardRequest { + from, + to: contract_address, + nonce, + data: u8::encode(&55), + }; + assert_eq!( + Err(MetaTransactionError::PublicKeyNotMatch), + contract.verify(&request, &signature) + ); +} + +#[ink::test] +fn test_ensure_meta_tx_valid() { + let contract_address = AccountId::from([0xFF as u8; 32]); + set_callee::(contract_address); + + let accounts = accounts(); + let mut contract = MyContract::new(accounts.bob); + + // ecdsa public key d'Alice + let keypair = subxt_signer::ecdsa::dev::alice(); + let from = AccountId::from(Signer::::account_id(&keypair).0); + + let nonce: Nonce = 0; + let data = u8::encode(&5); + let request = ForwardRequest { + from, + to: contract_address, + nonce, + data: data.clone(), + }; + + // Alice signs the message + let signature = keypair.sign(&scale::Encode::encode(&request)).0; + debug_println!("signature: {:02x?}", &signature); + + // the verification must succeed + contract + .ensure_meta_tx_valid(&request, &signature) + .expect("Error when using meta tx"); + + // check if the nonce has been updated + assert_eq!(1, contract.get_nonce(from)); + + // test we cannot reuse the same call + // the verification must fail + assert_eq!( + Err(MetaTransactionError::NonceTooLow), + contract.ensure_meta_tx_valid(&request, &signature) + ); +} + +#[ink::test] +fn test_meta_tx_rollup_cond_eq() { + let contract_address = AccountId::from([0xFF as u8; 32]); + set_callee::(contract_address); + + let accounts = accounts(); + let mut contract = MyContract::new(accounts.alice); + + // ecdsa public key d'Alice + let keypair = subxt_signer::ecdsa::dev::alice(); + let from = AccountId::from(Signer::::account_id(&keypair).0); + + let data = RollupCondEqMethodParams::encode(&(vec![], vec![], vec![])); + + let (request, hash) = contract + .prepare(from, data) + .expect("Error when preparing meta tx"); + + debug_println!("code hash: {:02x?}", hash); + let expected_hash = + hex_literal::hex!("8e00f5d6a0f721acb9f4244a1c28787f7d1cb628176b132b2010c880de153e2e"); + assert_eq!(&expected_hash, &hash.as_ref()); + + // Alice signs the message + let signature = keypair.sign(&scale::Encode::encode(&request)).0; + debug_println!("signature: {:02x?}", &signature); + + // add the role => it should be succeed + contract + .grant_role(ATTESTOR_ROLE, Some(request.from)) + .expect("Error when grant the role Attestor"); + assert_eq!( + Ok(()), + contract.meta_tx_rollup_cond_eq(request.clone(), signature) + ); + + // do it again => it must failed + assert_eq!( + Err(MetaTransactionError::NonceTooLow), + contract.meta_tx_rollup_cond_eq(request.clone(), signature) + ); +} + +#[ink::test] +fn test_meta_tx_rollup_cond_eq_missing_role() { + let contract_address = AccountId::from([0xFF as u8; 32]); + set_callee::(contract_address); + + let accounts = accounts(); + let mut contract = MyContract::new(accounts.alice); + + // ecdsa public key d'Alice + let keypair = subxt_signer::ecdsa::dev::alice(); + let from = AccountId::from(Signer::::account_id(&keypair).0); + + let data = RollupCondEqMethodParams::encode(&(vec![], vec![], vec![])); + + let (request, hash) = contract + .prepare(from, data) + .expect("Error when preparing meta tx"); + + debug_println!("code hash: {:02x?}", hash); + let expected_hash = + hex_literal::hex!("8e00f5d6a0f721acb9f4244a1c28787f7d1cb628176b132b2010c880de153e2e"); + assert_eq!(&expected_hash, &hash.as_ref()); + + // Alice signs the message + let signature = keypair.sign(&scale::Encode::encode(&request)).0; + debug_println!("signature: {:02x?}", &signature); + + // missing role + assert_eq!( + Err(MetaTransactionError::RollupAnchorError( + RollupAnchorError::AccessControlError(AccessControlError::MissingRole) + )), + contract.meta_tx_rollup_cond_eq(request.clone(), signature) + ); +} diff --git a/ink/crates/phat_rollup_anchor_ink/tests/rollup_anchor.rs b/ink/crates/phat_rollup_anchor_ink/tests/rollup_anchor.rs new file mode 100644 index 0000000..b9ec5da --- /dev/null +++ b/ink/crates/phat_rollup_anchor_ink/tests/rollup_anchor.rs @@ -0,0 +1,128 @@ +use ink::prelude::vec::Vec; +use openbrush::contracts::access_control; +use openbrush::contracts::access_control::AccessControl; +use openbrush::test_utils::{accounts, change_caller}; +use phat_rollup_anchor_ink::traits::rollup_anchor::*; +use scale::Encode; + +mod contract; +use contract::test_contract::MyContract; + +#[ink::test] +fn test_conditions() { + let accounts = accounts(); + let mut contract = MyContract::new(accounts.alice); + + // no condition, no update, no action => it should work + assert_eq!(contract.rollup_cond_eq(vec![], vec![], vec![]), Ok(())); + + // test with correct condition + let conditions = vec![(123u8.encode(), None)]; + assert_eq!(contract.rollup_cond_eq(conditions, vec![], vec![]), Ok(())); + + // update a value + let updates = vec![(123u8.encode(), Some(456u128.encode()))]; + assert_eq!(contract.rollup_cond_eq(vec![], updates, vec![]), Ok(())); + + // test with the correct condition + let conditions = vec![(123u8.encode(), Some(456u128.encode()))]; + assert_eq!(contract.rollup_cond_eq(conditions, vec![], vec![]), Ok(())); + + // test with incorrect condition (incorrect value) + let conditions = vec![(123u8.encode(), Some(789u128.encode()))]; + assert_eq!( + contract.rollup_cond_eq(conditions, vec![], vec![]), + Err(RollupAnchorError::ConditionNotMet) + ); + + // test with incorrect condition (incorrect value) + let conditions = vec![(123u8.encode(), None)]; + assert_eq!( + contract.rollup_cond_eq(conditions, vec![], vec![]), + Err(RollupAnchorError::ConditionNotMet) + ); + + // test with incorrect condition (incorrect key) + let conditions = vec![ + (123u8.encode(), Some(456u128.encode())), + (124u8.encode(), Some(456u128.encode())), + ]; + assert_eq!( + contract.rollup_cond_eq(conditions, vec![], vec![]), + Err(RollupAnchorError::ConditionNotMet) + ); +} + +#[ink::test] +fn test_action_pop_to() { + let accounts = accounts(); + let mut contract = MyContract::new(accounts.alice); + + // no condition, no update, no action + let mut actions = Vec::new(); + actions.push(HandleActionInput::SetQueueHead(2)); + + assert_eq!( + contract.rollup_cond_eq(vec![], vec![], actions.clone()), + Err(RollupAnchorError::InvalidPopTarget) + ); + + let message = 4589u16; + contract.push_message(&message).unwrap(); + contract.push_message(&message).unwrap(); + + assert_eq!(contract.rollup_cond_eq(vec![], vec![], actions), Ok(())); +} + +#[ink::test] +fn test_action_reply() { + let accounts = accounts(); + let mut contract = MyContract::new(accounts.alice); + + let actions = vec![HandleActionInput::Reply(012u8.encode())]; + + assert_eq!(contract.rollup_cond_eq(vec![], vec![], actions), Ok(())); +} + +#[ink::test] +fn test_grant_role() { + let accounts = accounts(); + let mut contract = MyContract::new(accounts.alice); + + // bob cannot grant the role + change_caller(accounts.bob); + assert_eq!( + Err(access_control::AccessControlError::MissingRole), + contract.grant_role(ATTESTOR_ROLE, Some(accounts.bob)) + ); + + // alice, the owner, can do it + change_caller(accounts.alice); + assert_eq!( + Ok(()), + contract.grant_role(ATTESTOR_ROLE, Some(accounts.bob)) + ); +} + +#[ink::test] +fn test_rollup_cond_eq_role_attestor() { + let accounts = accounts(); + let mut contract = MyContract::new(accounts.alice); + + change_caller(accounts.bob); + + assert_eq!( + Err(RollupAnchorError::AccessControlError( + access_control::AccessControlError::MissingRole + )), + contract.rollup_cond_eq(vec![], vec![], vec![]) + ); + + change_caller(accounts.alice); + contract + .grant_role(ATTESTOR_ROLE, Some(accounts.bob)) + .expect("Error when grant the role Attestor"); + + change_caller(accounts.bob); + assert_eq!(Ok(()), contract.rollup_cond_eq(vec![], vec![], vec![])); +} diff --git a/ink/rust-toolchain.toml b/ink/rust-toolchain.toml new file mode 100644 index 0000000..0402dad --- /dev/null +++ b/ink/rust-toolchain.toml @@ -0,0 +1,11 @@ +[toolchain] +channel = "1.72" +components = [ + "rustc", + "cargo", + "rustfmt", + "rust-src", + "clippy", +] +targets = ["wasm32-unknown-unknown"] +profile = "minimal" diff --git a/phat/Cargo.lock b/phat/Cargo.lock index aa6c64c..e52e5c4 100644 --- a/phat/Cargo.lock +++ b/phat/Cargo.lock @@ -12,26 +12,67 @@ dependencies = [ "regex", ] +[[package]] +name = "addr2line" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +dependencies = [ + "gimli 0.27.3", +] + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli 0.28.0", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "ahash" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.7", + "getrandom 0.2.10", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if", "once_cell", "version_check", ] [[package]] name = "aho-corasick" -version = "0.7.19" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" +checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -52,9 +93,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.65" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98161a4e3e2184da77bb14f02184cdd111e83bbbcc9979dfee3c44b9a85f5602" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "array-bytes" @@ -64,15 +105,15 @@ checksum = "f52f63c5c1316a16a4b35eaac8b76a98248961a533f061684cb2a7cb0eafb6c6" [[package]] name = "array-init" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb6d71005dc22a708c7496eee5c8dc0300ee47355de6256c3b35b12b5fef596" +checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" [[package]] name = "arrayref" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" [[package]] name = "arrayvec" @@ -82,13 +123,24 @@ checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "arrayvec" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" dependencies = [ "serde", ] +[[package]] +name = "async-trait" +version = "0.1.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -101,6 +153,21 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line 0.21.0", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object 0.32.1", + "rustc-demangle", +] + [[package]] name = "base58" version = "0.2.0" @@ -109,9 +176,41 @@ checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" [[package]] name = "base64" -version = "0.13.0" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bip39" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f2635620bf0b9d4576eb7bb9a38a55df78bd1205d26fa994b25911a69f212f" +dependencies = [ + "bitcoin_hashes", + "serde", + "unicode-normalization", +] + +[[package]] +name = "bitcoin_hashes" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" [[package]] name = "bitflags" @@ -119,6 +218,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" + [[package]] name = "bitvec" version = "1.0.1" @@ -133,11 +238,22 @@ dependencies = [ [[package]] name = "blake2" -version = "0.10.4" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "blake2b_simd" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cf849ee05b2ee5fba5e36f97ff8ec2533916700fc0758d40d92136a42f3388" +checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" dependencies = [ - "digest 0.10.5", + "arrayref", + "arrayvec 0.7.4", + "constant_time_eq", ] [[package]] @@ -158,16 +274,16 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "generic-array 0.14.6", + "generic-array 0.14.7", ] [[package]] name = "block-buffer" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array 0.14.6", + "generic-array 0.14.7", ] [[package]] @@ -179,17 +295,35 @@ dependencies = [ "byte-tools", ] +[[package]] +name = "bounded-collections" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb5b05133427c07c4776906f673ccf36c21b102c9829c641a5b56bd151d44fd6" +dependencies = [ + "log", + "parity-scale-codec", + "scale-info", + "serde", +] + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + [[package]] name = "bumpalo" -version = "3.11.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "byte-slice-cast" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87c5fdd0166095e1d463fc6cc01aa8ce547ad77a4e84d42eb6762b084e28067e" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" [[package]] name = "byte-tools" @@ -199,9 +333,9 @@ checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" [[package]] name = "bytemuck" -version = "1.12.3" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaa3a8d9a1ca92e282c96a32d6511b695d7d994d1d102ba85d279f9b2756947f" +checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" [[package]] name = "byteorder" @@ -211,15 +345,18 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.2.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cc" -version = "1.0.73" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] [[package]] name = "cfg-if" @@ -229,25 +366,21 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.22" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ + "android-tzdata", "iana-time-zone", - "num-integer", "num-traits", - "winapi", + "windows-targets 0.48.5", ] [[package]] -name = "codespan-reporting" -version = "0.11.1" +name = "constant_time_eq" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" [[package]] name = "convert_case" @@ -257,19 +390,46 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "cpp_demangle" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" +dependencies = [ + "cfg-if", +] [[package]] name = "cpufeatures" -version = "0.2.5" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] +[[package]] +name = "cranelift-entity" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40099d38061b37e505e63f89bab52199037a72b931ad4868d9089ff7268660b0" +dependencies = [ + "serde", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + [[package]] name = "crunchy" version = "0.2.2" @@ -282,27 +442,17 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array 0.14.6", + "generic-array 0.14.7", "typenum", ] -[[package]] -name = "crypto-mac" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" -dependencies = [ - "generic-array 0.14.6", - "subtle", -] - [[package]] name = "crypto-mac" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" dependencies = [ - "generic-array 0.14.6", + "generic-array 0.14.7", "subtle", ] @@ -333,49 +483,59 @@ dependencies = [ ] [[package]] -name = "cxx" -version = "1.0.78" +name = "curve25519-dalek-ng" +version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f39818dcfc97d45b03953c1292efc4e80954e1583c4aa770bac1383e2310a4" +checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", + "byteorder", + "digest 0.9.0", + "rand_core 0.6.4", + "subtle-ng", + "zeroize", ] [[package]] -name = "cxx-build" -version = "1.0.78" +name = "darling" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e580d70777c116df50c390d1211993f62d40302881e54d4b79727acb83d0199" +checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2", - "quote", - "scratch", - "syn", + "darling_core", + "darling_macro", ] [[package]] -name = "cxxbridge-flags" -version = "1.0.78" +name = "darling_core" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56a46460b88d1cec95112c8c363f0e2c39afdb237f60583b0b36343bf627ea9c" +checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 1.0.109", +] [[package]] -name = "cxxbridge-macro" -version = "1.0.78" +name = "darling_macro" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "747b608fecf06b0d72d440f27acc99288207324b793be2c17991839f3d4995ea" +checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" dependencies = [ - "proc-macro2", + "darling_core", "quote", - "syn", + "syn 1.0.109", ] +[[package]] +name = "data-encoding" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" + [[package]] name = "derive_more" version = "0.99.17" @@ -386,7 +546,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn", + "syn 1.0.109", ] [[package]] @@ -404,31 +564,25 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array 0.14.6", + "generic-array 0.14.7", ] [[package]] name = "digest" -version = "0.10.5" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.3", + "block-buffer 0.10.4", "crypto-common", "subtle", ] [[package]] name = "dotenvy" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d8c417d7a8cb362e0c37e5d815f5eb7c37f79ff93707329d5a194e42e54ca0" - -[[package]] -name = "downcast-rs" -version = "1.2.0" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] name = "dyn-clonable" @@ -448,14 +602,14 @@ checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "dyn-clone" -version = "1.0.9" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f94fa09c2aeea5b8839e414b7b841bf429fd25b9c522116ac97ee87856d88b2" +checksum = "bbfc4744c1b8f2a09adc0e55242f60b1af195d88596bd8700be74418c056c555" [[package]] name = "ed25519-zebra" @@ -464,7 +618,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" dependencies = [ "curve25519-dalek 3.2.0", - "hashbrown", + "hashbrown 0.12.3", "hex", "rand_core 0.6.4", "sha2 0.9.9", @@ -473,19 +627,31 @@ dependencies = [ [[package]] name = "either" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "encoding_rs" -version = "0.8.31" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ "cfg-if", ] +[[package]] +name = "enum-as-inner" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "env_logger" version = "0.10.0" @@ -501,19 +667,25 @@ dependencies = [ [[package]] name = "environmental" -version = "1.1.3" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" + +[[package]] +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b91989ae21441195d7d9b9993a2f9295c7e1a8c96255d8b729accddc124797" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.2.8" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" dependencies = [ "errno-dragonfly", "libc", - "winapi", + "windows-sys 0.48.0", ] [[package]] @@ -596,11 +768,17 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + [[package]] name = "fixed" -version = "1.20.0" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418922d2c280b8c68f82699494cc8c48f392233233a9a8b9a48a57a36c0ad0ef" +checksum = "79386fdcec5e0fde91b1a6a5bcd89677d1f9304f7f986b154a1b9109038854d9" dependencies = [ "az", "bytemuck", @@ -629,9 +807,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -644,9 +822,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.24" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f21eda599937fba36daeb58a22e8f5cee2d14c4a17b5b7739c7c8e5e3b8230c" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" dependencies = [ "futures-channel", "futures-core", @@ -659,9 +837,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.24" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bdd20c28fadd505d0fd6712cdfcb0d4b5648baf45faef7f852afb2399bb050" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" dependencies = [ "futures-core", "futures-sink", @@ -669,15 +847,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.24" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" [[package]] name = "futures-executor" -version = "0.3.24" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ff63c23854bee61b6e9cd331d523909f238fc7636290b96826e9cfa5faa00ab" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" dependencies = [ "futures-core", "futures-task", @@ -687,38 +865,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.24" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbf4d2a7a308fd4578637c0b17c7e1c7ba127b8f6ba00b29f717e9655d85eb68" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" [[package]] name = "futures-macro" -version = "0.3.24" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cd15d1c7456c04dbdf7e88bcd69760d74f3a798d6444e16974b505b0e62f17" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] name = "futures-sink" -version = "0.3.24" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b20ba5a92e727ba30e72834706623d94ac93a725410b6a6b6fbc1b07f7ba56" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" [[package]] name = "futures-task" -version = "0.3.24" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6508c467c73851293f390476d4491cf4d227dbabcd4170f3bb6044959b294f1" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" [[package]] name = "futures-util" -version = "0.3.24" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44fb6cb1be61cc1d2e43b262516aafcf63b241cffdb1d3fa115f91d9c7b09c90" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ "futures-channel", "futures-core", @@ -743,9 +921,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -758,28 +936,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi 0.9.0+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.2.7" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", "libc", "wasi 0.11.0+wasi-snapshot-preview1", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +dependencies = [ + "fallible-iterator", + "indexmap 1.9.3", + "stable_deref_trait", +] + +[[package]] +name = "gimli" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" + [[package]] name = "h2" -version = "0.3.14" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca32592cf21ac7ccab1825cd87f6c9b3d9022c44d086172ed0966bec8af30be" +checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" dependencies = [ "bytes", "fnv", @@ -787,7 +980,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 1.9.3", "slab", "tokio", "tokio-util", @@ -796,18 +989,18 @@ dependencies = [ [[package]] name = "half" -version = "2.1.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad6a9459c9c30b177b925162351f97e7d967c7ea8bab3b8352805327daf45554" +checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" dependencies = [ "crunchy", ] [[package]] name = "hash-db" -version = "0.15.2" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d23bd4e7b5eda0d0f3a307e8b381fdc8ba9000f26fbe912250c0a4cc3956364a" +checksum = "8e7d7786361d7425ae2fe4f9e407eb0efaa0840f5212d109cc018c40c35c6ab4" [[package]] name = "hash256-std-hasher" @@ -824,29 +1017,35 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash", + "ahash 0.7.6", ] [[package]] -name = "heck" -version = "0.4.0" +name = "hashbrown" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.3", +] [[package]] -name = "hermit-abi" -version = "0.1.19" +name = "hashbrown" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "hex" @@ -874,29 +1073,39 @@ checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f" [[package]] name = "hmac" -version = "0.8.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ - "crypto-mac 0.8.0", + "crypto-mac", "digest 0.9.0", ] [[package]] name = "hmac" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "crypto-mac 0.11.1", - "digest 0.9.0", + "digest 0.10.7", +] + +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", ] [[package]] name = "http" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ "bytes", "fnv", @@ -922,9 +1131,9 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" @@ -934,9 +1143,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.20" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -949,7 +1158,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.9", "tokio", "tower-service", "tracing", @@ -958,10 +1167,11 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.23.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87c48c02e0dc5e3b849a2041db3029fd066650f8f717c07bf8ed78ccb895cac" +checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" dependencies = [ + "futures-util", "http", "hyper", "rustls", @@ -971,33 +1181,49 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.51" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5a6ef98976b22b3b7f2f3a806f858cb862044cfa66805aa3ad84cb3d3b785ed" +checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "winapi", + "windows", ] [[package]] name = "iana-time-zone-haiku" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fde6edd6cef363e9359ed3c98ba64590ba9eecba2293eb5a723ab32aee8926aa" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "cxx", - "cxx-build", + "cc", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" -version = "0.3.0" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "idna" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1038,25 +1264,37 @@ checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "indexmap" -version = "1.9.1" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", + "serde", ] [[package]] -name = "ink" -version = "4.0.1" -source = "git+https://github.com/Phala-Network/ink.git?branch=advtest-4.0.1#69d3017129608599796e9ec1c4d5ad16e347b322" -dependencies = [ - "derive_more", +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown 0.14.0", +] + +[[package]] +name = "ink" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9fd4f77d66c94aa7f27a7cf41cd2edbc2229afe34ec475c3f32b6e8fdf561a0" +dependencies = [ + "derive_more", "ink_env", "ink_macro", "ink_metadata", @@ -1068,16 +1306,18 @@ dependencies = [ [[package]] name = "ink_allocator" -version = "4.0.1" -source = "git+https://github.com/Phala-Network/ink.git?branch=advtest-4.0.1#69d3017129608599796e9ec1c4d5ad16e347b322" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "870914970470fd77a3f42d3c5d1918b562817af127fd063ee8b1d9fbf59aa1fe" dependencies = [ "cfg-if", ] [[package]] name = "ink_codegen" -version = "4.0.1" -source = "git+https://github.com/Phala-Network/ink.git?branch=advtest-4.0.1#69d3017129608599796e9ec1c4d5ad16e347b322" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22d79057b2565df31a10af6510a44b161093f110c5f9c22ad02c20af9cea4c29" dependencies = [ "blake2", "derive_more", @@ -1085,7 +1325,7 @@ dependencies = [ "env_logger", "heck", "impl-serde", - "ink_ir 4.0.1 (git+https://github.com/Phala-Network/ink.git?branch=advtest-4.0.1)", + "ink_ir", "ink_primitives", "itertools", "log", @@ -1094,27 +1334,29 @@ dependencies = [ "quote", "serde", "serde_json", - "syn", + "syn 2.0.37", ] [[package]] name = "ink_engine" -version = "4.0.1" -source = "git+https://github.com/Phala-Network/ink.git?branch=advtest-4.0.1#69d3017129608599796e9ec1c4d5ad16e347b322" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "722ec3a5eb557124b001c60ff8f961079f6d566af643edea579f152b15822fe5" dependencies = [ "blake2", "derive_more", "ink_primitives", "parity-scale-codec", - "secp256k1 0.26.0", - "sha2 0.10.6", + "secp256k1 0.27.0", + "sha2 0.10.7", "sha3", ] [[package]] name = "ink_env" -version = "4.0.1" -source = "git+https://github.com/Phala-Network/ink.git?branch=advtest-4.0.1#69d3017129608599796e9ec1c4d5ad16e347b322" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "584e73bc0982f6f1a067bb63ebc75262f6dc54ed2a17060efa73eaba84dc9308" dependencies = [ "arrayref", "blake2", @@ -1122,7 +1364,6 @@ dependencies = [ "derive_more", "ink_allocator", "ink_engine", - "ink_metadata", "ink_prelude", "ink_primitives", "ink_storage_traits", @@ -1130,59 +1371,50 @@ dependencies = [ "parity-scale-codec", "paste", "rlibc", + "scale-decode", + "scale-encode", "scale-info", - "secp256k1 0.26.0", - "sha2 0.10.6", + "secp256k1 0.27.0", + "sha2 0.10.7", "sha3", "static_assertions", ] [[package]] name = "ink_ir" -version = "4.0.1" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "946b940d26e69ded558daafead0979f25f2e9d7e2cf86027f250c3942aa4d0f1" -dependencies = [ - "blake2", - "either", - "itertools", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "ink_ir" -version = "4.0.1" -source = "git+https://github.com/Phala-Network/ink.git?branch=advtest-4.0.1#69d3017129608599796e9ec1c4d5ad16e347b322" +checksum = "5b529c941518e8f450395fab9fe8ebba0a7acbb18778fc7e0a87f6248286ec72" dependencies = [ "blake2", "either", "itertools", "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] name = "ink_macro" -version = "4.0.1" -source = "git+https://github.com/Phala-Network/ink.git?branch=advtest-4.0.1#69d3017129608599796e9ec1c4d5ad16e347b322" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8579576c995ca9baa032584beca19155cbd63b6739570aa9da4d35a0415f4be8" dependencies = [ "ink_codegen", - "ink_ir 4.0.1 (git+https://github.com/Phala-Network/ink.git?branch=advtest-4.0.1)", + "ink_ir", "ink_primitives", "parity-scale-codec", "proc-macro2", "quote", - "syn", + "syn 2.0.37", "synstructure", ] [[package]] name = "ink_metadata" -version = "4.0.1" -source = "git+https://github.com/Phala-Network/ink.git?branch=advtest-4.0.1#69d3017129608599796e9ec1c4d5ad16e347b322" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fddff95ce3e01f42002fdaf96edda691dbccb08c9ae76d7101daa1fa634e601" dependencies = [ "derive_more", "impl-serde", @@ -1194,28 +1426,56 @@ dependencies = [ [[package]] name = "ink_prelude" -version = "4.0.1" -source = "git+https://github.com/Phala-Network/ink.git?branch=advtest-4.0.1#69d3017129608599796e9ec1c4d5ad16e347b322" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8cfdf91d2b442f08efb34dd3780fd6fbd3d033f63b42f62684fe47534948ef6" dependencies = [ "cfg-if", ] +[[package]] +name = "ink_price_feed" +version = "0.0.1" +dependencies = [ + "dotenvy", + "env_logger", + "fixed", + "half", + "hex", + "hex-literal 0.4.1", + "ink", + "parity-scale-codec", + "phat_offchain_rollup", + "pink-extension", + "pink-extension-runtime", + "pink-json 0.4.0 (git+https://github.com/Phala-Network/pink-json.git?branch=pink)", + "pink-subrpc", + "pink-web3", + "scale-info", + "serde", + "subxt-signer", +] + [[package]] name = "ink_primitives" -version = "4.0.1" -source = "git+https://github.com/Phala-Network/ink.git?branch=advtest-4.0.1#69d3017129608599796e9ec1c4d5ad16e347b322" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6414bcad12ebf0c3abbbb192a09e4d06e22f662cf3e19545204e1b0684be12a1" dependencies = [ "derive_more", "ink_prelude", "parity-scale-codec", + "scale-decode", + "scale-encode", "scale-info", "xxhash-rust", ] [[package]] name = "ink_storage" -version = "4.0.1" -source = "git+https://github.com/Phala-Network/ink.git?branch=advtest-4.0.1#69d3017129608599796e9ec1c4d5ad16e347b322" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd728409de235de0489f71ee2d1beb320613fdb50dda9fa1c564825f4ad06daa" dependencies = [ "array-init", "cfg-if", @@ -1231,43 +1491,55 @@ dependencies = [ [[package]] name = "ink_storage_traits" -version = "4.0.1" -source = "git+https://github.com/Phala-Network/ink.git?branch=advtest-4.0.1#69d3017129608599796e9ec1c4d5ad16e347b322" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8dcb50f70377ac35c28d63b06383a0a3cbb79542ea4cdc5b00e3e2b3de4a549" dependencies = [ "ink_metadata", "ink_prelude", "ink_primitives", "parity-scale-codec", "scale-info", - "syn", ] [[package]] name = "io-lifetimes" -version = "1.0.6" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfa919a82ea574332e2de6e74b4c36e74d41982b335080fa59d4ef31be20fdf3" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ + "hermit-abi", "libc", - "windows-sys 0.45.0", + "windows-sys 0.48.0", +] + +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +dependencies = [ + "socket2 0.5.4", + "widestring", + "windows-sys 0.48.0", + "winreg", ] [[package]] name = "ipnet" -version = "2.5.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "is-terminal" -version = "0.4.4" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b6b32576413a8e69b90e952e4a026476040d81017b80445deda5f2d3921857" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ - "hermit-abi 0.3.1", - "io-lifetimes", - "rustix", - "windows-sys 0.45.0", + "hermit-abi", + "rustix 0.38.13", + "windows-sys 0.48.0", ] [[package]] @@ -1281,24 +1553,27 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.4" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.60" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] [[package]] name = "keccak" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9b7d56ba4a8344d6be9729995e6b06f928af29998cdf79fe390cbf6b1fee838" +checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +dependencies = [ + "cpufeatures", +] [[package]] name = "lazy_static" @@ -1308,15 +1583,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.133" +version = "0.2.148" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0f80d65747a3e43d1596c7c5492d95d5edddaabd45a7fcdb02b95f644164966" - -[[package]] -name = "libm" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" +checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" [[package]] name = "libsecp256k1" @@ -1325,7 +1594,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" dependencies = [ "arrayref", - "base64", + "base64 0.13.1", "digest 0.9.0", "libsecp256k1-core", "libsecp256k1-gen-ecmult", @@ -1365,13 +1634,10 @@ dependencies = [ ] [[package]] -name = "link-cplusplus" -version = "1.0.7" +name = "linked-hash-map" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369" -dependencies = [ - "cc", -] +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" @@ -1379,6 +1645,18 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128" + [[package]] name = "local_scheduler" version = "0.1.0" @@ -1398,9 +1676,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -1408,33 +1686,72 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "lru-cache" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" dependencies = [ - "cfg-if", + "linked-hash-map", +] + +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", ] +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + [[package]] name = "matchers" version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" [[package]] -name = "memory_units" -version = "0.4.0" +name = "memfd" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" +checksum = "ffc89ccdc6e10d6907450f753537ebc5c5d3460d2e4e62ea74bd571db62c0f9e" +dependencies = [ + "rustix 0.37.23", +] + +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] [[package]] name = "merlin" @@ -1448,101 +1765,130 @@ dependencies = [ "zeroize", ] +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] [[package]] name = "mio" -version = "0.8.4" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.36.1", + "windows-sys 0.48.0", ] [[package]] name = "nom" -version = "5.1.2" +version = "5.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" +checksum = "08959a387a676302eebf4ddbcbc611da04285579f76f88ee0506c63b1a61dd4b" dependencies = [ "memchr", "version_check", ] [[package]] -name = "num-bigint" -version = "0.4.3" +name = "num-format" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" +dependencies = [ + "arrayvec 0.7.4", + "itoa", +] + +[[package]] +name = "num-traits" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", - "num-integer", - "num-traits", ] [[package]] -name = "num-format" -version = "0.4.3" +name = "num_cpus" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b862ff8df690cf089058c98b183676a7ed0f974cc08b426800093227cbff3b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "arrayvec 0.7.2", - "itoa", + "hermit-abi", + "libc", ] [[package]] -name = "num-integer" -version = "0.1.45" +name = "num_enum" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" dependencies = [ - "autocfg", - "num-traits", + "num_enum_derive", ] [[package]] -name = "num-rational" -version = "0.4.1" +name = "num_enum_derive" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ - "autocfg", - "num-bigint", - "num-integer", - "num-traits", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.37", ] [[package]] -name = "num-traits" -version = "0.2.15" +name = "object" +version = "0.30.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385" dependencies = [ - "autocfg", + "crc32fast", + "hashbrown 0.13.2", + "indexmap 1.9.3", + "memchr", ] [[package]] -name = "num_cpus" -version = "1.13.1" +name = "object" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" dependencies = [ - "hermit-abi 0.1.19", - "libc", + "memchr", ] [[package]] name = "once_cell" -version = "1.15.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "opaque-debug" @@ -1558,11 +1904,11 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-scale-codec" -version = "3.2.1" +version = "3.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "366e44391a8af4cfd6002ef6ba072bae071a96aafca98d7d448a34c5dca38b6a" +checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" dependencies = [ - "arrayvec 0.7.2", + "arrayvec 0.7.4", "bitvec", "byte-slice-cast", "bytes", @@ -1573,22 +1919,16 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.1.3" +version = "3.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9299338969a3d2f491d65f140b00ddec470858402f888af98e8642fb5e8965cd" +checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] -[[package]] -name = "parity-wasm" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" - [[package]] name = "parking_lot" version = "0.12.1" @@ -1601,46 +1941,55 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.3" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys 0.36.1", + "windows-targets 0.48.5", ] [[package]] name = "paste" -version = "1.0.9" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "pbkdf2" -version = "0.4.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" +checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" dependencies = [ - "crypto-mac 0.8.0", + "crypto-mac", ] [[package]] name = "pbkdf2" -version = "0.8.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "crypto-mac 0.11.1", + "digest 0.10.7", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "phat_offchain_rollup" @@ -1662,29 +2011,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.0.12" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.12" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -1703,39 +2052,42 @@ dependencies = [ [[package]] name = "pink-extension" -version = "0.4.1" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3f6a47132abf9c7781b30ed3fca092202c61b2e6fc820ac6c435ad1bb799f1" +checksum = "772ec0c206907d436864919e2de0227fca5f1a33c82bdbf312ff505dde9336bf" dependencies = [ "ink", "log", + "num_enum", "parity-scale-codec", "pink-extension-macro", "scale-info", + "this-crate", ] [[package]] name = "pink-extension-macro" -version = "0.4.1" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1916a26ba3ce57e6b783e6d9683ebfc3a78ec1a6f575aab0300ff885d175fe4" +checksum = "d38ff5c86454de8be6134fcf510009d3a84e9bfc758970755458ba7bafaf496b" dependencies = [ "heck", - "ink_ir 4.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ink_ir", "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 2.0.37", "unzip3", ] [[package]] name = "pink-extension-runtime" -version = "0.4.0" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c94127da5172b75d223415cb9397bf812ca3e6029f0579c3eeb3dc9e480ecfe" +checksum = "3870d27b5621d65109125da483bd7c5d4744d0bc5501cd22c1543d8699ddadaf" dependencies = [ - "getrandom 0.2.7", + "futures", + "getrandom 0.2.10", "hex_fmt", "log", "once_cell", @@ -1745,6 +2097,7 @@ dependencies = [ "ring", "sp-core", "sp-runtime-interface", + "tokio", ] [[package]] @@ -1774,13 +2127,13 @@ checksum = "3da595e670ee22ac5ae563a55388ce2148d68b993fe09ca0099a247cb55cf790" [[package]] name = "pink-subrpc" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ada84ef47e0fd6b10e0fdee583ed731161a578ee8e2a59e8431802a3fd86b559" +checksum = "c866be0ff83521271c4ac4fde6e4e3f5b3658780ab21ed0255359360ca01db03" dependencies = [ "base58", "hex", - "hex-literal 0.3.4", + "hex-literal 0.4.1", "impl-serde", "parity-scale-codec", "pink-extension", @@ -1794,11 +2147,11 @@ dependencies = [ [[package]] name = "pink-web3" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7f901d2c95d105cff22ed144ca3c8907a9caddff2939f4f5cac66f36a5ea2a" +checksum = "c45b0e3c122279f69ce3625c8895589e39afbf63162d08740f201e4bde89f21d" dependencies = [ - "arrayvec 0.7.2", + "arrayvec 0.7.4", "derive_more", "ethabi", "ethereum-types", @@ -1816,9 +2169,9 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "primitive-types" @@ -1836,29 +2189,43 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "1.2.1" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "thiserror", - "toml", + "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.46" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94e2ef8dbfc347b10c094890f778ee2e36ca9bb4262e86dc99cd217e35f3470b" +checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" dependencies = [ "unicode-ident", ] +[[package]] +name = "psm" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +dependencies = [ + "cc", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quote" -version = "1.0.21" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1880,7 +2247,6 @@ dependencies = [ "rand_chacha 0.2.2", "rand_core 0.5.1", "rand_hc", - "rand_pcg", ] [[package]] @@ -1929,7 +2295,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.7", + "getrandom 0.2.10", ] [[package]] @@ -1941,53 +2307,45 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "rand_pcg" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" -dependencies = [ - "rand_core 0.5.1", -] - [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "ref-cast" -version = "1.0.10" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ebf632f3e32bf35133f620cf481f29c99ae0fb01450fd3d85eee0225274ec1" +checksum = "acde58d073e9c79da00f2b5b84eed919c8326832648a5b109b3fce1bb1175280" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.10" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caab98faa75ce294d40512ce514a46b15eafe78d72c9397a68ea45b3a88201b6" +checksum = "7f7473c2cfcf90008193dd0e3e16599455cb601a9fce322b5bb55de799664925" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] name = "regex" -version = "1.6.0" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" +checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-automata 0.3.8", + "regex-syntax 0.7.5", ] [[package]] @@ -1996,22 +2354,39 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" dependencies = [ - "regex-syntax", + "regex-syntax 0.6.29", ] [[package]] -name = "regex-syntax" -version = "0.6.27" +name = "regex-automata" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" +checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.5", +] [[package]] -name = "reqwest" -version = "0.11.12" +name = "regex-syntax" +version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "431949c384f4e2ae07605ccaa56d1d9d2ecdb5cadd4f9577ccfab29f2e5149fc" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + +[[package]] +name = "reqwest" +version = "0.11.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" dependencies = [ - "base64", + "base64 0.21.4", "bytes", "encoding_rs", "futures-core", @@ -2037,6 +2412,7 @@ dependencies = [ "tokio-rustls", "tokio-socks", "tower-service", + "trust-dns-resolver", "url", "wasm-bindgen", "wasm-bindgen-futures", @@ -2054,6 +2430,16 @@ dependencies = [ "reqwest", ] +[[package]] +name = "resolv-conf" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +dependencies = [ + "hostname", + "quick-error", +] + [[package]] name = "ring" version = "0.16.20" @@ -2077,14 +2463,20 @@ checksum = "fc874b127765f014d792f16763a81245ab80500e2ad921ed4ee9e82481ee08fe" [[package]] name = "rlp" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "999508abb0ae792aabed2460c45b89106d97fe4adac593bdaef433c2605847b5" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" dependencies = [ "bytes", "rustc-hex", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc-hash" version = "1.1.0" @@ -2108,44 +2500,81 @@ dependencies = [ [[package]] name = "rustix" -version = "0.36.9" +version = "0.36.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd5c6ff11fecd55b40746d1995a02f2eb375bf8c00d192d521ee09f42bef37bc" +checksum = "c37f1bd5ef1b5422177b7646cba67430579cfe2ace80f284fee876bca52ad941" dependencies = [ - "bitflags", + "bitflags 1.3.2", "errno", "io-lifetimes", "libc", - "linux-raw-sys", + "linux-raw-sys 0.1.4", "windows-sys 0.45.0", ] +[[package]] +name = "rustix" +version = "0.37.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7db8590df6dfcd144d22afd1b83b36c21a18d7cbc1dc4bb5295a8712e9eb662" +dependencies = [ + "bitflags 2.4.0", + "errno", + "libc", + "linux-raw-sys 0.4.7", + "windows-sys 0.48.0", +] + [[package]] name = "rustls" -version = "0.20.6" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" +checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" dependencies = [ "log", "ring", + "rustls-webpki", "sct", - "webpki", ] [[package]] name = "rustls-pemfile" -version = "1.0.1" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +dependencies = [ + "base64 0.21.4", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55" +checksum = "45a27e3b59326c16e23d30aeb7a36a24cc0d29e71d68ff611cdfb4a01d013bed" dependencies = [ - "base64", + "ring", + "untrusted", ] [[package]] name = "ryu" -version = "1.0.11" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "saffron" @@ -2157,11 +2586,74 @@ dependencies = [ "nom", ] +[[package]] +name = "scale-bits" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "036575c29af9b6e4866ffb7fa055dbf623fe7a9cc159b33786de6013a6969d89" +dependencies = [ + "parity-scale-codec", + "scale-info", +] + +[[package]] +name = "scale-decode" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7789f5728e4e954aaa20cadcc370b99096fb8645fca3c9333ace44bb18f30095" +dependencies = [ + "derive_more", + "parity-scale-codec", + "scale-bits", + "scale-decode-derive", + "scale-info", + "smallvec", +] + +[[package]] +name = "scale-decode-derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27873eb6005868f8cc72dcfe109fae664cf51223d35387bc2f28be4c28d94c47" +dependencies = [ + "darling", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "scale-encode" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d70cb4b29360105483fac1ed567ff95d65224a14dd275b6303ed0a654c78de5" +dependencies = [ + "derive_more", + "parity-scale-codec", + "scale-encode-derive", + "scale-info", + "smallvec", +] + +[[package]] +name = "scale-encode-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "995491f110efdc6bea96d6a746140e32bfceb4ea47510750a5467295a4707a25" +dependencies = [ + "darling", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "scale-info" -version = "2.3.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "001cf62ece89779fd16105b5f515ad0e5cedcd5440d3dd806bb067978e7c3608" +checksum = "35c0a159d0c45c12b20c5a844feb1fe4bea86e28f17b92a5f0c42193634d3782" dependencies = [ "bitvec", "cfg-if", @@ -2173,14 +2665,14 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.3.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "303959cf613a6f6efd19ed4b4ad5bf79966a13352716299ad532cfb115f4205c" +checksum = "912e55f6d20e0e80d63733872b40e1227c0bce1e1ab81ba67d696339bfd7fd29" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2193,7 +2685,7 @@ dependencies = [ "arrayvec 0.5.2", "curve25519-dalek 2.1.3", "getrandom 0.1.16", - "merlin", + "merlin 2.0.1", "rand 0.7.3", "rand_core 0.5.1", "sha2 0.8.2", @@ -2202,16 +2694,27 @@ dependencies = [ ] [[package]] -name = "scopeguard" -version = "1.1.0" +name = "schnorrkel" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "844b7645371e6ecdf61ff246ba1958c29e802881a749ae3fb1993675d210d28d" +dependencies = [ + "arrayref", + "arrayvec 0.7.4", + "curve25519-dalek-ng", + "merlin 3.0.0", + "rand_core 0.6.4", + "serde_bytes", + "sha2 0.9.9", + "subtle-ng", + "zeroize", +] [[package]] -name = "scratch" -version = "1.0.2" +name = "scopeguard" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" @@ -2225,36 +2728,36 @@ dependencies = [ [[package]] name = "secp256k1" -version = "0.24.0" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7649a0b3ffb32636e60c7ce0d70511eda9c52c658cd0634e194d5a19943aeff" +checksum = "6b1629c9c557ef9b293568b338dddfc8208c98a18c59d722a9d53f859d9c9b62" dependencies = [ - "secp256k1-sys 0.6.0", + "secp256k1-sys 0.6.1", ] [[package]] name = "secp256k1" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4124a35fe33ae14259c490fd70fa199a32b9ce9502f2ee6bc4f81ec06fa65894" +checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" dependencies = [ - "secp256k1-sys 0.8.0", + "secp256k1-sys 0.8.1", ] [[package]] name = "secp256k1-sys" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7058dc8eaf3f2810d7828680320acda0b25a288f6d288e19278e249bbf74226b" +checksum = "83080e2c2fc1006e625be82e5d1eb6a43b7fd9578b617fcc55814daf286bba4b" dependencies = [ "cc", ] [[package]] name = "secp256k1-sys" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642a62736682fdd8c71da0eb273e453c8ac74e33b9fb310e22ba5b03ec7651ff" +checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" dependencies = [ "cc", ] @@ -2270,33 +2773,44 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.14" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.147" -source = "git+https://github.com/kvinwang/serde.git?branch=pink#0d6920a81befce8e44b854dc67738b0c640247e6" +version = "1.0.188" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" dependencies = [ "serde_derive", ] +[[package]] +name = "serde_bytes" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" +dependencies = [ + "serde", +] + [[package]] name = "serde_derive" -version = "1.0.147" -source = "git+https://github.com/kvinwang/serde.git?branch=pink#0d6920a81befce8e44b854dc67738b0c640247e6" +version = "1.0.188" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] name = "serde_json" -version = "1.0.86" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41feea4228a6f1cd09ec7a3593a682276702cd67b5273544757dae23c096f074" +checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" dependencies = [ "itoa", "ryu", @@ -2342,22 +2856,22 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.5", + "digest 0.10.7", ] [[package]] name = "sha3" -version = "0.10.5" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2904bea16a1ae962b483322a1c7b81d976029203aea1f461e51cd7705db7ba9" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest 0.10.5", + "digest 0.10.7", "keccak", ] @@ -2370,42 +2884,61 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + [[package]] name = "slab" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "socket2" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" dependencies = [ "libc", "winapi", ] +[[package]] +name = "socket2" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "sp-core" -version = "7.0.0" +version = "21.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c78530907dbf7949af928d0ce88b485067389201b6d9b468074b1924f209f0" +checksum = "f18d9e2f67d8661f9729f35347069ac29d92758b59135176799db966947a7336" dependencies = [ "array-bytes", - "base58", - "bitflags", + "bitflags 1.3.2", "blake2", - "byteorder", + "bounded-collections", + "bs58", "dyn-clonable", "ed25519-zebra", "futures", @@ -2415,16 +2948,16 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "merlin", - "num-traits", + "merlin 2.0.1", "parity-scale-codec", "parking_lot", + "paste", "primitive-types", - "rand 0.7.3", + "rand 0.8.5", "regex", "scale-info", - "schnorrkel", - "secp256k1 0.24.0", + "schnorrkel 0.9.1", + "secp256k1 0.24.3", "secrecy", "serde", "sp-core-hashing", @@ -2437,20 +2970,19 @@ dependencies = [ "substrate-bip39", "thiserror", "tiny-bip39", - "wasmi", "zeroize", ] [[package]] name = "sp-core-hashing" -version = "5.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b9d1daa6aebfc144729b630885e91df92ff00560490ec065a56cb538e8895a" +checksum = "2ee599a8399448e65197f9a6cee338ad192e9023e35e31f22382964c3c174c68" dependencies = [ - "blake2", + "blake2b_simd", "byteorder", - "digest 0.10.5", - "sha2 0.10.6", + "digest 0.10.7", + "sha2 0.10.7", "sha3", "sp-std", "twox-hash", @@ -2458,20 +2990,20 @@ dependencies = [ [[package]] name = "sp-debug-derive" -version = "5.0.0" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9ba7352773b96a4aa57e903447f841c6bc26e8c798377db6e7eb332346454" +checksum = "c7f531814d2f16995144c74428830ccf7d94ff4a7749632b83ad8199b181140c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] name = "sp-externalities" -version = "0.13.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef739442230f49d88ece41259e5d886d6b8bc0f4197ef7f1585c39c762ce7ef2" +checksum = "a0f71c671e01a8ca60da925d43a1b351b69626e268b8837f8371e320cf1dd100" dependencies = [ "environmental", "parity-scale-codec", @@ -2481,9 +3013,9 @@ dependencies = [ [[package]] name = "sp-runtime-interface" -version = "7.0.0" +version = "17.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b886a5d34400b0e0c12d389e3bb48b7a93d651cddf7e248124b81fe64c339251" +checksum = "6e676128182f90015e916f806cba635c8141e341e7abbc45d25525472e1bbce8" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -2500,28 +3032,28 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" -version = "6.0.0" +version = "11.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a157f1ce0108b9b87f87e826726049d9b6253318b74410c814be7fc2af416b51" +checksum = "a5d5bd5566fe5633ec48dfa35ab152fd29f8a577c21971e1c6db9f28afb9bbb9" dependencies = [ "Inflector", "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] name = "sp-std" -version = "5.0.0" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3fd4c1d304be101e6ebbafd3d4be9a37b320c970ef4e8df188b16873981c93" +checksum = "53458e3c57df53698b3401ec0934bea8e8cfce034816873c0b0abbd83d7bac0d" [[package]] name = "sp-storage" -version = "7.0.0" +version = "13.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb987ed2e4d7d870170a225083ea962f2a359d75cdf76935d5ed8d91bee912d9" +checksum = "94294be83f11d4958cfea89ed5798f0b6605f5defc3a996948848458abbcc18e" dependencies = [ "impl-serde", "parity-scale-codec", @@ -2533,9 +3065,9 @@ dependencies = [ [[package]] name = "sp-tracing" -version = "6.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e761df87dc940d87720939de8f976d1fc0657e523886ae0d7bf3f7e2e2f0abb6" +checksum = "357f7591980dd58305956d32f8f6646d0a8ea9ea0e7e868e46f53b68ddf00cec" dependencies = [ "parity-scale-codec", "sp-std", @@ -2546,15 +3078,16 @@ dependencies = [ [[package]] name = "sp-wasm-interface" -version = "7.0.0" +version = "14.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f43c40afab6ecac20505907631c929957ed636b7af8795984649bbaa6ff38c3" +checksum = "a19c122609ca5d8246be6386888596320d03c7bc880959eaa2c36bcd5acd6846" dependencies = [ + "anyhow", "impl-trait-for-tuples", "log", "parity-scale-codec", "sp-std", - "wasmi", + "wasmtime", ] [[package]] @@ -2565,9 +3098,9 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "ss58-registry" -version = "1.35.0" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0813c10b9dbdc842c2305f949f724c64866e4ef4d09c9151e96f6a2106773c" +checksum = "5e6915280e2d0db8911e5032a5c275571af6bdded2916abd691a659be25d3439" dependencies = [ "Inflector", "num-format", @@ -2578,12 +3111,24 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "sub0_factory" version = "0.1.0" @@ -2628,7 +3173,7 @@ checksum = "49eee6965196b32f882dd2ee85a92b1dbead41b04e53907f269de3b0dc04733c" dependencies = [ "hmac 0.11.0", "pbkdf2 0.8.0", - "schnorrkel", + "schnorrkel 0.9.1", "sha2 0.9.9", "zeroize", ] @@ -2639,11 +3184,49 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +[[package]] +name = "subtle-ng" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" + +[[package]] +name = "subxt-signer" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1e4cf3f57cb7ee062111a8f590670efb385e60cf5805054c4a7f377b2bc65d" +dependencies = [ + "bip39", + "hex", + "hmac 0.12.1", + "parity-scale-codec", + "pbkdf2 0.12.2", + "regex", + "schnorrkel 0.10.2", + "secp256k1 0.27.0", + "secrecy", + "sha2 0.10.7", + "sp-core-hashing", + "thiserror", + "zeroize", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" -version = "1.0.101" +version = "2.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e90cde112c4b9690b8cbe810cba9ddd8bc1d7472e2cae317b69e9438c1cba7d2" +checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" dependencies = [ "proc-macro2", "quote", @@ -2652,13 +3235,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.12.6" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +checksum = "285ba80e733fac80aa4270fbcdf83772a79b80aa35c97075320abfee4a915b06" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.37", "unicode-xid", ] @@ -2668,57 +3251,70 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "target-lexicon" +version = "0.12.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a" + [[package]] name = "termcolor" -version = "1.1.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" dependencies = [ "winapi-util", ] +[[package]] +name = "this-crate" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23c3dac231fac5770597ae4670029b06ea5adab46e2fd192838e9a77007ec656" + [[package]] name = "thiserror" -version = "1.0.37" +version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" +checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.37" +version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" +checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.37", ] [[package]] name = "thread_local" -version = "1.1.4" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" dependencies = [ + "cfg-if", "once_cell", ] [[package]] name = "tiny-bip39" -version = "0.8.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d" +checksum = "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" dependencies = [ "anyhow", - "hmac 0.8.1", + "hmac 0.12.1", "once_cell", - "pbkdf2 0.4.0", - "rand 0.7.3", + "pbkdf2 0.11.0", + "rand 0.8.5", "rustc-hash", - "sha2 0.9.9", + "sha2 0.10.7", "thiserror", "unicode-normalization", "wasm-bindgen", @@ -2745,36 +3341,48 @@ dependencies = [ [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.21.2" +version = "1.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e03c497dc955702ba729190dc4aac6f2a0ce97f913e5b1b5912fc5039d9099" +checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", - "memchr", "mio", "num_cpus", + "parking_lot", "pin-project-lite", - "socket2", - "winapi", + "signal-hook-registry", + "socket2 0.5.4", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", ] [[package]] name = "tokio-rustls" -version = "0.23.4" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ "rustls", "tokio", - "webpki", ] [[package]] @@ -2791,9 +3399,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.4" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -2804,12 +3412,20 @@ dependencies = [ ] [[package]] -name = "toml" -version = "0.5.9" +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" + +[[package]] +name = "toml_edit" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "serde", + "indexmap 2.0.0", + "toml_datetime", + "winnow", ] [[package]] @@ -2826,14 +3442,26 @@ checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", +] + [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", "valuable", @@ -2882,11 +3510,56 @@ dependencies = [ "tracing-serde", ] +[[package]] +name = "trust-dns-proto" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f7f83d1e4a0e4358ac54c5c3681e5d7da5efc5a7a632c90bb6d6669ddd9bc26" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.2.3", + "ipnet", + "lazy_static", + "rand 0.8.5", + "smallvec", + "thiserror", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "trust-dns-resolver" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aff21aa4dcefb0a1afbfac26deb0adc93888c7d295fb63ab273ef276ba2b7cfe" +dependencies = [ + "cfg-if", + "futures-util", + "ipconfig", + "lazy_static", + "lru-cache", + "parking_lot", + "resolv-conf", + "smallvec", + "thiserror", + "tokio", + "tracing", + "trust-dns-proto", +] + [[package]] name = "try-lock" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "twox-hash" @@ -2895,22 +3568,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", - "digest 0.10.5", + "digest 0.10.7", "rand 0.8.5", "static_assertions", ] [[package]] name = "typenum" -version = "1.15.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "uint" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a45526d29728d135c2900b0d30573fe3ee79fceb12ef534c7bb30e810a91b601" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" dependencies = [ "byteorder", "crunchy", @@ -2920,15 +3593,15 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.8" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.4" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" @@ -2939,12 +3612,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-width" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" - [[package]] name = "unicode-xid" version = "0.2.4" @@ -2965,12 +3632,12 @@ checksum = "99c0ec316ab08201476c032feb2f94a5c8ece5b209765c1fbc4430dd6e931ad6" [[package]] name = "url" -version = "2.3.1" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" dependencies = [ "form_urlencoded", - "idna", + "idna 0.4.0", "percent-encoding", ] @@ -2988,11 +3655,10 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -3010,9 +3676,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -3020,24 +3686,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.37", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.33" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" dependencies = [ "cfg-if", "js-sys", @@ -3047,9 +3713,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3057,85 +3723,187 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.37", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] -name = "wasmi" -version = "0.13.2" +name = "wasmparser" +version = "0.102.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06c326c93fbf86419608361a2c925a31754cf109da1b8b55737070b4d6669422" +checksum = "48134de3d7598219ab9eaf6b91b15d8e50d31da76b8519fe4ecfcec2cf35104b" dependencies = [ - "parity-wasm", - "wasmi-validation", - "wasmi_core", + "indexmap 1.9.3", + "url", ] [[package]] -name = "wasmi-validation" -version = "0.5.0" +name = "wasmtime" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ff416ad1ff0c42e5a926ed5d5fab74c0f098749aa0ad8b2a34b982ce0e867b" +checksum = "f907fdead3153cb9bfb7a93bbd5b62629472dc06dee83605358c64c52ed3dda9" dependencies = [ - "parity-wasm", + "anyhow", + "bincode", + "cfg-if", + "indexmap 1.9.3", + "libc", + "log", + "object 0.30.4", + "once_cell", + "paste", + "psm", + "serde", + "target-lexicon", + "wasmparser", + "wasmtime-environ", + "wasmtime-jit", + "wasmtime-runtime", + "windows-sys 0.45.0", ] [[package]] -name = "wasmi_core" -version = "0.2.1" +name = "wasmtime-asm-macros" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d20cb3c59b788653d99541c646c561c9dd26506f25c0cebfe810659c54c6d7" +checksum = "d3b9daa7c14cd4fa3edbf69de994408d5f4b7b0959ac13fa69d465f6597f810d" dependencies = [ - "downcast-rs", - "libm", - "memory_units", - "num-rational", - "num-traits", + "cfg-if", ] [[package]] -name = "web-sys" -version = "0.3.60" +name = "wasmtime-environ" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +checksum = "a990198cee4197423045235bf89d3359e69bd2ea031005f4c2d901125955c949" dependencies = [ - "js-sys", - "wasm-bindgen", + "anyhow", + "cranelift-entity", + "gimli 0.27.3", + "indexmap 1.9.3", + "log", + "object 0.30.4", + "serde", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-types", ] [[package]] -name = "webpki" -version = "0.22.0" +name = "wasmtime-jit" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +checksum = "0de48df552cfca1c9b750002d3e07b45772dd033b0b206d5c0968496abf31244" dependencies = [ - "ring", - "untrusted", + "addr2line 0.19.0", + "anyhow", + "bincode", + "cfg-if", + "cpp_demangle", + "gimli 0.27.3", + "log", + "object 0.30.4", + "rustc-demangle", + "serde", + "target-lexicon", + "wasmtime-environ", + "wasmtime-jit-icache-coherence", + "wasmtime-runtime", + "windows-sys 0.45.0", ] [[package]] -name = "webpki-roots" -version = "0.22.5" +name = "wasmtime-jit-debug" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368bfe657969fb01238bb756d351dcade285e0f6fcbd36dcb23359a5169975be" +checksum = "6e0554b84c15a27d76281d06838aed94e13a77d7bf604bbbaf548aa20eb93846" dependencies = [ - "webpki", + "once_cell", ] +[[package]] +name = "wasmtime-jit-icache-coherence" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aecae978b13f7f67efb23bd827373ace4578f2137ec110bbf6a4a7cde4121bbd" +dependencies = [ + "cfg-if", + "libc", + "windows-sys 0.45.0", +] + +[[package]] +name = "wasmtime-runtime" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658cf6f325232b6760e202e5255d823da5e348fdea827eff0a2a22319000b441" +dependencies = [ + "anyhow", + "cc", + "cfg-if", + "indexmap 1.9.3", + "libc", + "log", + "mach", + "memfd", + "memoffset", + "paste", + "rand 0.8.5", + "rustix 0.36.15", + "wasmtime-asm-macros", + "wasmtime-environ", + "wasmtime-jit-debug", + "windows-sys 0.45.0", +] + +[[package]] +name = "wasmtime-types" +version = "8.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f6fffd2a1011887d57f07654dd112791e872e3ff4a2e626aee8059ee17f06f" +dependencies = [ + "cranelift-entity", + "serde", + "thiserror", + "wasmparser", +] + +[[package]] +name = "web-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" + +[[package]] +name = "widestring" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" + [[package]] name = "winapi" version = "0.3.9" @@ -3168,16 +3936,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-sys" -version = "0.36.1" +name = "windows" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows_aarch64_msvc 0.36.1", - "windows_i686_gnu 0.36.1", - "windows_i686_msvc 0.36.1", - "windows_x86_64_gnu 0.36.1", - "windows_x86_64_msvc 0.36.1", + "windows-targets 0.48.5", ] [[package]] @@ -3186,137 +3950,197 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-targets", + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", ] [[package]] name = "windows-targets" -version = "0.42.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.1", - "windows_i686_gnu 0.42.1", - "windows_i686_msvc 0.42.1", - "windows_x86_64_gnu 0.42.1", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.1", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.1" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" -version = "0.36.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" -version = "0.42.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" -version = "0.36.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.42.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" -version = "0.36.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" -version = "0.42.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" -version = "0.36.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" -version = "0.42.1" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" -version = "0.36.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" -version = "0.42.1" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "winnow" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" +dependencies = [ + "memchr", +] [[package]] name = "winreg" -version = "0.10.1" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "winapi", + "cfg-if", + "windows-sys 0.48.0", ] [[package]] name = "wyz" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b31594f29d27036c383b53b59ed3476874d518f0efb151b27a4c275141390e" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" dependencies = [ "tap", ] [[package]] name = "xxhash-rust" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "735a71d46c4d68d71d4b24d03fdc2b98e38cea81730595801db779c04fe80d70" +checksum = "9828b178da53440fa9c766a3d2f73f7cf5d0ac1fe3980c1e5018d899fd19e07b" [[package]] name = "zeroize" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn", - "synstructure", + "syn 2.0.37", ] + +[[patch.unused]] +name = "ink" +version = "4.0.1" +source = "git+https://github.com/Phala-Network/ink.git?branch=advtest-4.0.1#69d3017129608599796e9ec1c4d5ad16e347b322" + +[[patch.unused]] +name = "ink_env" +version = "4.0.1" +source = "git+https://github.com/Phala-Network/ink.git?branch=advtest-4.0.1#69d3017129608599796e9ec1c4d5ad16e347b322" + +[[patch.unused]] +name = "serde" +version = "1.0.147" +source = "git+https://github.com/kvinwang/serde.git?branch=pink#0d6920a81befce8e44b854dc67738b0c640247e6" diff --git a/phat/Cargo.toml b/phat/Cargo.toml index 7d1dbdc..72006de 100644 --- a/phat/Cargo.toml +++ b/phat/Cargo.toml @@ -5,6 +5,7 @@ members = [ "contracts/sub0_factory", "contracts/sub_price_feed", "contracts/evm_price_feed", + "contracts/ink_price_feed", ] # Sneak peek of the new test engine! diff --git a/phat/artifacts/ink_price_feed/ink_price_feed.contract b/phat/artifacts/ink_price_feed/ink_price_feed.contract new file mode 100644 index 0000000..00c9fb0 --- /dev/null +++ b/phat/artifacts/ink_price_feed/ink_price_feed.contract @@ -0,0 +1 @@ +{"source":{"hash":"0xdbe35b7090829b1bb84d8037bf0456f60177753bbc7dba9a8b9fe2a2954d1363","language":"ink! 4.3.0","compiler":"rustc 1.72.0","wasm":"0x0061736d0100000001ca011c60027f7f0060037f7f7f017f60027f7f017f60037f7f7f0060047f7f7f7f0060017f017f60057f7f7f7f7f0060047f7f7f7f017f60017f0060067f7f7f7f7f7f0060057f7f7f7f7f017f6000006000017f60047f7e7e7f0060057f7e7e7e7e0060047e7e7e7f0060027f7f017e60057f7f7f7e7e0060037f7e7f0060087f7f7f7f7f7f7f7f0060077f7f7f7e7e7f7f0060027e7f017f60077f7f7f7f7f7f7f017f60037f7e7e0060037e7f7f0060037e7e7f0060077f7f7f7f7f7f7f0060087f7f7f7f7f7f7f7f017f02ce010a057365616c310b6765745f73746f726167650007057365616c301176616c75655f7472616e736665727265640000057365616c3005696e7075740000057365616c300663616c6c65720000057365616c300d64656275675f6d6573736167650002057365616c300f686173685f626c616b65325f3235360003057365616c320b7365745f73746f726167650007057365616c300b7365616c5f72657475726e0003057365616c301463616c6c5f636861696e5f657874656e73696f6e000a03656e76066d656d6f72790201021003cc02ca02010303010d0e040202000000020002000000000000000300000f00000004000800060c02020a020300080808080603080200030009040609071004030303060303030301050505000b080003000003000304050000030005030b010000020805060211000000040b020003080603000303001203000302040000000800000000000302020709060304070c040700000800070906030c000607000000000000030000090005001306000206040002020202010102000200000400040b0403050007140606060300000208001507020a0407020603000409020203020301020202010402020102020003001602010a0200020217180202020202020505000000030203020000190000050000000200030204050300030500000000050000000002030400030000050404000400050003000200010000000000050003050000020505021a070104091b0602040501700134340608017f01418080040b0711020463616c6c0062066465706c6f790070095e010041010b331011f9011517b902b2019502f701e0012d397f6a2f2c9802b60182028902e101d101e801f401ff01fd01fa01ca02328b0232bb01bc01be0132d301e301e901eb01ec01ed01ee01ef0132b7018002fd01f701fe01c70281020aa5d206ca022b01017f037f2002200346047f200005200020036a200120036a2d00003a0000200341016a21030c010b0b0b67000240200020014d044003402002450d02200020012d00003a0000200141016a2101200041016a2100200241016b21020c000b000b200141016b2101200041016b210003402002450d01200020026a200120026a2d00003a0000200241016b21020c000b000b0b2601017f037f2002200346047f200005200020036a20013a0000200341016a21030c010b0b1a0b3f01027f0340200245044041000f0b200241016b210220012d0000210320002d00002104200041016a2100200141016a210120032004460d000b200420036b0b830102017f017e230041106b220424000240200341c000714504402003450d0120022003413f71ad2205862001410020036b413f71ad88842102200120058621010c010b20012003413f71ad862102420021010b2004200137030020042002370308200429030021012000200441086a29030037030820002001370300200441106a24000b9b0102017f067e230041106b220524002005200342ffffffff0f832206200142ffffffff0f8322077e22082006200142208822097e220a20072003422088220b7e7c22064220867c220737030020052007200854ad2009200b7e2006200a54ad4220862006422088847c7c200120047e200220037e7c7c370308200529030021012000200541086a29030037030820002001370300200541106a24000bb00101017f230041406a220424002004200336020c2004200236020820012d0000411947044020042001360214200441246a42023702002004413c6a41013602002004410236021c2004419cb505360218200441023602342004200441306a3602202004200441146a3602382004200441086a3602304101200441186a10120b20002001290200370200200041106a200141106a280200360200200041086a200141086a290200370200200441406b24000b0b002000280200200110150b1000200120002802002000280204104c0bdd0201047f230041a0016b22022400200241d4006a2001290210370200200241cc006a2001290208370200200241406b41003602002002413c6a4188d805360200200220003602382002410236022c200241023602202002410036021820022001290200370244200241fc006a4201370200200241013602742002418cd80536027020024103360294012002200241c4006a36028c01200220024190016a220336027820022002418c016a36029001200241e0006a200241f0006a2204103c2002280260210020022802682101200228023821052002410036029801200242808001370274200241def10536027020052004105820002001200410572002200229037037039001200241106a2003200228027810542002280214210120022802102105200228029001210020022002280294012203360270410a200520012000200410081a200241086a20002003200228027010b401200241a0016a24000bc20101017f230041406a220224002002412236020c200241e88404360208200128020004402002200141046a360214200241246a42023702002002413c6a41013602002002410236021c2002419cb505360218200241023602342002200241306a3602202002200241146a3602382002200241086a3602304101200241186a10120b20002001290200370200200041186a200141186a290200370200200041106a200141106a290200370200200041086a200141086a290200370200200241406b24000b8f0201047f230041f0006b22022400200241186a200141106a280200360200200241106a200141086a29020037030020022001290200370308200241dc006a2201420137020020024101360254200241a08704360250200241043602242002200241206a22043602582002200241086a22053602204101200241d0006a220310122001420137020020024101360254200241a087043602502002410436026c2002200241e8006a36025820022005360268200241406b2201200310162002412c6a42013702002002410536023c20024102360224200241f8a205360220200220013602382002200241386a360228200320041016200228025020022802581018200041811c3b0100200241f0006a24000bc20601017f230041106b22022400027f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d000041016b0e180102030405060708090a0b0c0d0e0f101112131415161718000b200128021441f4b605410b200141186a28020028020c1101000c180b200128021441ffb6054113200141186a28020028020c1101000c170b200128021441b7d305410e200141186a28020028020c1101000c160b20012802144192b705410e200141186a28020028020c1101000c150b200128021441e7c5054112200141186a28020028020c1101000c140b200128021441a0b7054115200141186a28020028020c1101000c130b200128021441b5b7054114200141186a28020028020c1101000c120b200128021441c9b7054116200141186a28020028020c1101000c110b20012802144187d3054119200141186a28020028020c1101000c100b200128021441a0d3054117200141186a28020028020c1101000c0f0b2002200041016a36020c200141dfb705410c2002410c6a410610f6010c0e0b200128021441ebb7054115200141186a28020028020c1101000c0d0b20012802144180b8054119200141186a28020028020c1101000c0c0b20012802144199b8054112200141186a28020028020c1101000c0b0b200128021441abb8054113200141186a28020028020c1101000c0a0b200128021441beb805410f200141186a28020028020c1101000c090b2002200041046a36020c200141cdb80541172002410c6a410710f6010c080b2002200041046a36020c200141e4b80541182002410c6a410710f6010c070b2002200041016a36020c200141fcb80541192002410c6a410810f6010c060b2002200041016a36020c20014195b905411c2002410c6a410810f6010c050b2002200041016a36020c200141b1b905411a2002410c6a410810f6010c040b200128021441cbb9054118200141186a28020028020c1101000c030b2002200041016a36020c200141e3b90541112002410c6a410910f6010c020b2002200041016a36020c200141f4b90541072002410c6a410610f6010c010b200128021441c5d3054114200141186a28020028020c1101000b2101200241106a240020010b5401017f2001410c6a280200210202402000027f0240024020012802040e020001030b20020d02410021024188d8050c010b20020d0120012802002201280204210220012802000b2002103b0f0b20002001103c0b1000200120002802002000280208104c0b3a00024041dcf1052d000045044041ddf1052d00004101710d010b200020011004410947044041dcf10541013a00000b41ddf10541013a00000b0bc40201097f230041d0006b22022400200241206a2001101a02400240024002402002280220220304402002280228210420022802242105200241106a2001101b20022d00104101710d0120022d00112106200241086a2001101b20022d00084101710d0220022d00092107200241306a2001101c20022802302208450d03200228023821092002280234210a200241406b2001101d20022802404504402002411c6a200241cc006a280200360100200020073a0019200020063a0018200020093602142000200a3602102000200836020c200020043602082000200536020420002003360200200220022902443701142000200229011237011a200041206a200241186a2901003701000c050b200041003602000c040b200041003602000c030b200041003602000c020b200041003602000c010b200041003602000b200241d0006a24000b7902017f017e230041106b2202240020022001101c02402002280200220104402002200120022902042203422088a71073024020022802000440200241086a310000422086428080808020520d010b20002003370204200020013602000c020b200041003602000c010b200041003602000b200241106a24000b3801017f230041106b22022400200241086a2001106520022d00092101200020022d00084101713a0000200020013a0001200241106a24000b6f01047f230041106b22022400200241086a200110ba02024020022802080d00200228020c220320012802044b0d00200220034101101f20022802042105200120022802002201200310630d0020002005ad2003ad42208684370204200121040b20002004360200200241106a24000b7d01027f230041206b22022400200241086a2001106541012103024020022d00084101710d000240024020022d00090e020001020b41002103200041003602040c010b200241106a2001101c20022802102201450d00200041086a200229021437020020002001360204410021030b20002003360200200241206a24000bad0102037f027e230041206b22022400200241086a41014111200141186a2903002205501b4106411620012903002206501b6a4100101f200241186a220441003602002002200229030837031020012d0034200241106a220310202001280230200310212006200141086a290300200141106a290300200310222005200141206a290300200141286a29030020031022200041086a200428020036020020002002290310370200200241206a24000b7c01027f230041106b220324000240024002402001450440410121020c010b200141004e2204450d01027f2002450440200341086a2004200110c60120032802080c010b200320042001410110c50120032802000b2202450d020b2000200136020420002002360200200341106a24000f0b10c401000b20011074000b2801017f230041106b22022400200220003a000f20012002410f6a200241106a22001046200024000b2801017f230041106b220224002002200036020c20012002410c6a200241106a22001046200024000b2000200050044020034100108c020f0b20034101108c02200120022003108e020bb50302047f027e230041406a220224000240024002400240200141f8006a2802002204200141fc006a280200460d00200141ec006a2802002103200141f4006a2802002105200241206a200410242002413c6a2002280228360200200220053602342002200336023020022002280220360238200241106a200241306a220310252003200141186a20022802102002280218102620022d00300d02200241386a2903002106200228023421032001200441016a36027820014180016a41013a00002003450d00200220064220883e021420022003360210200241086a200241106a102720022802080d01200228020c2101200241306a200241106a101a20022802302204450d0120022902342106200241306a200241106a101a2002280230450d01200241286a200241386a2802002203360200200220022903302207370320200041186a2003360200200041106a20073702002000411c6a2001360200200041086a200637020020002004360204200041003602000c030b200042003702000c020b20004101360200200041163a00040c010b20022d00312101200041013602002000410b410c20011b3a00040b200241406b24000b5501027f230041206b22022400200241086a41044100101f200241186a22034100360200200220022903083703102001200241106a1021200041086a200328020036020020002002290310370200200241206a24000b7e01037f230041206b22022400200241086a2001410c6a28020020012802046a4100101f20024100360218200220022903083703100340200241106a200120036a2204280200200441046a2802001045200341086a22034110470d000b20002002290310370200200041086a200241186a280200360200200241206a24000bab09020b7f017e23004190046b220424002001280204210a2001280200210b200441386a220c2001280208220541186a2206290000370300200441306a220d200541106a2207290000370300200441286a220e200541086a220829000037030020042005290000370320200441d9006a200141246a290000370000200441d1006a2001411c6a290000370000200441c9006a200141146a290000370000200441013a00402004200129000c370041200441b8036a22012006290000370300200441b0036a22062007290000370300200441a8036a22072008290000370300200420052900003703a003200441dfd9cfeb063602fc0320044188046a220541003602002004420137038004200441fc036a20044180046a220910a701200441086a200341046a4100101f20044180026a22084100360200200420042903083703f80120022003200441f8016a10a801200441d8026a2008280200360200200420042903f8013703d0022009200441d0026a10a901200441f0016a2005280200360200200441a0016a200e290300370300200441a8016a200d290300370300200441b0016a200c290300370300200441c0016a2007290300370300200441c8016a2006290300370300200441d0016a200129030037030020042004290380043703e8012004200429032037039801200420042903a0033703b801200441e0016a4200370300200442003703d8012004420037036820044200370380012009200441e8006a10aa01200441a0036a200b200a200428028004200428028804200441406b10ab0102400240027f0240024020042903a003220f420252044020042f01a8032101200441d0026a200441aa036a41ce0010091a20044188026a200441d6026a290100370100200420042901d0023701820220044190026a200441de026a41c00010091a200420013b0180022004200f3703f801200441a0036a200441f8016a10ac0120042d00a0032201410b470d01200441b8026a290300210f024002400240200441b4026a28020022010440200420013602d0022004200f4220883e02d4022004200441d0026a106520042d00004101710d02024020042d00010e020002030b200441a0036a200441d0026a101d20042802a0030d02200441a8036a280200210220042802a4032103200441ac036a2802000c070b2004200f37031820044100360214200441063a00100c050b200441a0036a200441d0026a10ae0120042d00a003410b470d010b200441043a00100c030b200441073a00100c020b200420042d00a8033a0011200441013a00100c010b200441186a200441a8036a290000370000200420042900a103370011200420013a00100b200441263602fc01200441ffb5053602f8012004200441106a3602d002200441f4006a4202370200200441ac036a41073602002004410236026c2004419cb505360268200441023602a4032004200441a0036a3602702004200441d0026a3602a8032004200441f8016a3602a003410121014101200441e8006a101220042d0010410b470d012004280214210320042802182102200428021c0b2101200020033602042000410c6a2001360200200041086a2002360200410021010c010b200041003a00010b200020013a000020044190046a24000b4801027f230041106b220224002002410036020c024020012002410c6a41041063450440200228020c21010c010b410121030b2000200136020420002003360200200241106a24000ba70101017f230041306b2201240020014180800136020041def1052001100320014180800136022c200141def1053602282001200141286a102920012d00000440200141003a000041c0800441c100200141b0800441f08104102a000b20002001290102370001200041096a2001410a6a290100370000200041116a200141126a290100370000200041186a200141196a290000370000200020012d00013a0000200141306a24000b6601017f230041206b220224002000027f20012002106645044020002002290300370001200041196a200241186a290300370000200041116a200241106a290300370000200041096a200241086a29030037000041000c010b41010b3a0000200241206a24000b7c01017f230041406a220524002005200136020c200520003602082005200336021420052002360210200541246a42023702002005413c6a410a3602002005410236021c2005419cb505360218200541023602342005200541306a3602202005200541106a3602382005200541086a360230200541186a2004103a000b4d02017f027e230041206b2200240020004200370308200042003703002000411036021c20002000411c6a10012000290308210120002903002102200041206a2400410541042001200284501b0b3301017f230041106b220224002002200028020036020c200141d0a005410f2002410c6a410b102e2100200241106a240020000b11002000200141a4f00541ccf00510cc020b810301047f230041406a220524004101210602402000280214220720012002200041186a280200220828020c22011101000d000240200028021c2202410471450440200741b89604410320011101000d02200741dfa005410420011101000d0220074198b505410220011101000d022003200020041102000d02200028021c21020c010b200741bd9604410320011101000d01200541013a0017200541306a419c96043602002005200836020c2005200736020820052002360234200520002d00203a00382005200028021036022820052000290208370320200520002902003703182005200541176a3602102005200541086a220136022c200141dfa005410410e9010d01200541086a4198b505410210e9010d012003200541186a20041102000d01200528022c41c096044102200528023028020c1101000d010b2002410471450440200028021441c396044102200028021828020c11010021060c010b200028021441c296044101200028021828020c11010021060b200541406b240020060b11002000200141e4ee0541b0ef0510cc020bde0101047f230041d0006b2203240020034100360220200342808001370244200341def105360240200341406b220420021056200141202004105720032003290340370318200341106a200341186a200328024810542003280214210220032802102105200328021821012003200328021c22063602404105200520022001200410081a200341086a20012006200328024010b401200320032903083703382004200341386a101c200341286a200410bd022003280228220104402003200329022c3702440b200320013602402000200341406b10be02200341d0006a24000b3701017f230041106b22022400200241086a20014100101f200228020c21012000200228020836020020002001360204200241106a24000b0300010b1a00200041c8006a1034200041d4006a1034200041e0006a10350b810101027f230041306b22012400027f200028020022024504404100210241000c010b200120023602202001410036021c200120023602102001410036020c200120002802042202360224200120023602142000280208210241010b2100200120023602282001200036021820012000360208200141086a109801200141306a24000b810101027f230041306b22012400027f200028020022024504404100210241000c010b200120023602202001410036021c200120023602102001410036020c200120002802042202360224200120023602142000280208210241010b2100200120023602282001200036021820012000360208200141086a108401200141306a24000b2100200220034904402003200220041037000b20002003360204200020013602000b0f0020002001200241a89a0410ce020b4801017f230041206b220124002001410c6a4201370200200141013602042001418cd8053602002001410c36021c200120003602182001200141186a360208200141a88304103a000b930101017f230041306b22022400200241146a42013702002002410136020c2002418cd80536020820024102360224200220002d0000410274220041f4f0056a28020036022c200220004188f1056a280200360228200141146a2802002100200141186a28020021012002200241206a3602102002200241286a36022020002001200241086a10e5012100200241306a240020000b3d01017f230041206b220224002002200036021420024198940436020c20024188d805360208200241013a001820022001360210200241086a10d201000b4601027f230041106b22032400200341086a20021031200328020c210420032802082001200210092101200020023602082000200436020420002001360200200341106a24000bfa0101057f230041306b220224002002027f410020012802042205450d001a2001280200220641046a21040340200428020020036a2103200441086a2104200541016b22050d000b20032001410c6a280200450d001a2003410f4d044041002006280204450d011a0b20034101744100200341004e1b0b10312002410036021020022002290300370308200241286a200141106a290200370300200241206a200141086a29020037030020022001290200370318200241086a200241186a10b901044041d88a044133200241186a41acc70541f88b04102a000b20002002290308370200200041086a200241106a280200360200200241306a24000b8b0902157f037e230041406a220724002007410036023820074201370330027e20040440200741286a200320044100103e200728022c210620072802282108200741206a200320044101103e20072802242109200741186a2003200420082007280220220a2008200a4b22081b220b419ca004103f200728021c210a2007280218210c200741106a2006200920081b2210200b20106a2003200441aca0041040200c200a200728021020072802141041450440200b2004200b6b22082008200b491b41016a2110417f210e2003200410420c020b2003200420104100104320032004201041011043200741086a20032004201041bca004103f2007280208200728020c10420c010b2002ad42808080809020840b211b4100200b6b2116200541066a2117201b42808080808080c0ff0083211c200420106b2118201b42ffffffff8f6083211d201b422088a7210f410021094100210a034002400240024002402004450440201c4200520d0103400240200a450d002002200a4d04402002200a460d010c070b2001200a6a2c000041bf7f4c0d060b2002200a470440027f2001200a6a22062c0000220841004e0440200841ff01710c010b20062d0001413f71210d2008411f71210c200c410674200d722008415f4d0d001a20062d0002413f71200d41067472210d200d200c410c747220084170490d001a200c411274418080f0007120062d0003413f71200d41067472720b2106200f41ff01710d042006418080c400460d034101210f027f41012006418001490d001a41022006418010490d001a41034104200641808004491b0b200a6a210a0c010b0b200f41ff0171450d01200f410173210f200222062208210a0c030b200420096a220841016b220620024f0d00200fad42ff0183422086201d84211b200b200b200e200b200e4b1b200e417f4622131b2212200420042012491b21154100200e20131b210c200e210d0340027f0240200b027f201b200120066a3100008842018350450440200120096a211420122106024002400240034020062015460440200b210603402006200c4d0440200d410020131b210e20092106200821090c0e0b200641016b220620044f0d03200620096a221420024f0d04200320066a2d0000200120146a2d0000460d000b200920106a220920130d081a20180c060b200620096a20024f0d03200620146a2119200320066a211a200641016a2106201a2d000020192d0000460d000b200920166a20066a220920130d061a41000c040b20062004418080041044000b20142002419080041044000b2002200920126a220020002002491b200241a080041044000b200e417f460d012008210941000b220c200b200c4b1b2212200420042012491b2115200c210d200420096a220841016b220620024f0d030c020b20080b220920046a220841016b22062002490d000b0b200741306a200120116a200220116b1045200041086a200741386a28020036020020002007290330370200200741406b24000f0b200f410173210f200a220621080b200741306a220d200120116a200620116b1045200d200520171046200821110c010b0b20012002200a200241c482041047000bdf0101067f024020024102490440410121070c010b410121040240034041012107034041002106200421050340200620096a220820024f0d0302400240200120046a2d00002204200120086a2d000022084b200420084920031b45044020042008460d014101210720052109200541016a22042002490d050c070b200520066a41016a220420096b2107200220044b0d030c010b200641016a22044100200420074622061b20056a22054100200420061b22066a22042002490d010b0b0b0b200921050c010b2008200241cca0041044000b20002007360204200020053602000b3d01017f230041106b22052400200541086a410020032001200220041040200528020c21012000200528020836020020002001360204200541106a24000b3b000240200120024d0440200220044d0d012002200420051037000b20012002200510ce01000b2000200220016b3602042000200120036a3602000b1801017f2001200346047f200020022001100c0541010b450b2b01017e20010440034042012000310000862002842102200041016a2100200141016b22010d000b0b20020bda0101077f410121074101210402400240034020012004220820056a220a4b0440200120056b2008417f736a220420014f0d022005417f7320016a20096b220620014f0d0302400240200020046a2d00002204200020066a2d000022064b200420064920031b45044020042006460d01200841016a21044100210541012107200821090c020b200a41016a220420096b2107410021050c010b4100200541016a2204200420074622061b21052004410020061b20086a21040b20022007470d010b0b0f0b2004200141dca0041044000b2006200141eca0041044000b6b01017f230041306b220324002003200136020420032000360200200341146a42023702002003412c6a410d3602002003410236020c200341fc94043602082003410d3602242003200341206a360210200320033602282003200341046a360220200341086a2002103a000b0d0020002001200120026a10460b2e01017f2000200220016b220210c0012000280208220320002802006a2001200210091a2000200220036a3602080bf80501047f230041f0006b220524002005200336020c2005200236020820052000200141800210f50122062000200110de01024002400240200528020022070440200528020421082005200736021020052008360214200541054100200120064b22061b36021c200541fca0044188d80520061b36021802402005200120024f047f200120034f0d0120030520020b3602282005413c6a4203370200200541dc006a4102360200200541d4006a410236020020054103360234200541c4a2043602302005410d36024c2005200541c8006a3602382005200541186a3602582005200541106a3602502005200541286a3602480c040b200220034d0440024002402002450d00200120024d044020012002460d010c020b200020026a2c00004140480d010b200321020b20052002360220024020002001200210f5012202450d00200120024d044020012002460d010c050b200020026a2c000041bf7f4c0d040b2005200020016a36024c2005200020026a360248200541c8006a10c7012200418080c400460d0220052000360224200520023602282005027f41012000418001490d001a41022000418010490d001a41034104200041808004491b0b20026a36022c2005413c6a4205370200200541ec006a4102360200200541e4006a4102360200200541dc006a4117360200200541d4006a411836020020054105360234200541c0a1043602302005410d36024c2005200541c8006a3602382005200541186a3602682005200541106a3602602005200541286a3602582005200541246a3602502005200541206a3602480c040b200541e4006a4102360200200541dc006a4102360200200541d4006a410d3602002005413c6a4204370200200541043602342005418ca2043602302005410d36024c2005200541c8006a3602382005200541186a3602602005200541106a36025820052005410c6a3602502005200541086a3602480c030b200020014100200620041047000b419cbd05412b2004107e000b200020012002200120041047000b200541306a2004103a000b3401017f230041106b22032400200341086a20012002104920032d00092101200041003a0000200020013a0001200341106a24000b1d0020002001200241f08504410610414101733a0001200041003a00000b3401017f230041106b22032400200341086a20012002104b20032d00092101200041003a0000200020013a0001200341106a24000b1d0020002001200241e88504410610414101733a0001200041003a00000b8f0301057f230041306b2203240002400240200028020022052000280208220472044002402004450d002000410c6a280200210420034100360228200320013602202003200120026a360224200441016a21040340200441016b22040440200341186a200341206a10dd01200328021c418080c400470d010c020b0b200341106a200341206a10dd012003280214418080c400460d00200341086a20032802102001200210de01200328020c2002200328020822041b21022004200120041b21010b2005450440200028021420012002200041186a28020028020c11010021040c030b200028020422042001200120026a10d60122054d0d0120032000200420056b410010d8014101210420032802002205418080c400460d0220032802042106200041146a280200220720012002200041186a280200220028020c1101000d02200520062007200010d90121040c020b200028021420012002200041186a28020028020c11010021040c010b200028021420012002200041186a28020028020c11010021040b200341306a240020040b2401017f20002802002201104e41ff01712200411346047f2001104f41ff01710520000b0b4e01017f230041106b22012400200141086a2000105c027f410120012d0008410171450d001a410520012d0009413a470d001a2000200028020841016a36020841130b2100200141106a240020000bc50601047f230041e0006b22012400200141d0006a2000105c0240024020012d0050410171450d004109210202400240024002400240024020012d0051220341db006b0e03030107000b0240200341fb006b0e03040107000b20034122460d012003412c460d060b200141086a2000105f20012d0008410171044020012d00092103200028020841016a21040340411321022003412c46200341dd004672200341fd0046720d072000200436020820012000105f200441016a210420012d0001210320012d00004101710d000b0b410221020c050b2000105b41ff017121020c040b200141306a2000105c20012d0030410171450d02410b210220012d003141db00470d032000200028020841016a360208410121040340200141286a2000105c4100210220012d0028410171450d040240024020012d00292203412c470440200341dd00460d02200421024100210420020d01410621020c070b2000200028020841016a360208200141206a2000105c20012d0020410171450d0520012d002121030b200341dd00460d032000104f41ff017122024113460d010c050b0b200141186a2000105c20012d0018410171450d0320012d00192203412c470440410e2102200341dd00470d042000200028020841016a360208411321020c040b2000200028020841016a360208200141106a2000105c410f410e20012d001141dd00461b410e20012d00104101711b21020c030b200141c8006a2000105c4104210220012d0048410171450d02410b210220012d004941fb00470d022000200028020841016a360208200141013a005c20012000360258410021030340200141406b2000105c20012d0040410171450440410121020c040b02400240024020012d004122022204412c470440200441fd00460d032003410171450d01410721020c070b2003410171450d002000200028020841016a360208200141386a2000105c20012d0038410171450d0520012d003921020c010b200141003a005c0b200241ff017122034122470440410d2102200341fd00460d030c050b2000105b41ff017122024113470d0441012103200141d8006a104d41ff017122024113460d010c040b0b2000106041ff017121020c020b410f21020c010b410421020b200141e0006a240020020b6c01027f230041206b22022400200242808001370214200241def105360210200241106a2203410010562003200141ff0171410f47047f20034101105620010541000b1056200241086a41def10541808001200228021841808204103620002002280208200228020c1059000b5701027f230041206b22002400200042808001370214200041def105360210200041106a220141011056200141011056200041086a41def10541808001200028021841808204103641012000280208200028020c1059000bbc0202057f017e230041306b2201240020014100360218200142808001370224200141def1053602204100200141206a2202105320012001290320370310200141086a200141106a20012802281054200128020c2103200128020821042001290310210620014100360228200120063703202000200210550240200041ee006a2d000022054102460440200141206a410010560c010b200141206a220241011056200041e0006a280200200041e8006a28020020021057200041ec006a2d000020021058200041ed006a2d000020021058200041406b200210552005450440200141206a410010560c010b200141206a220241011056200041ef006a200210550b200041206a200141206a1055200120012903203703102001200141106a20012802281054200420032001280200200128020410061a200141306a24000b2701017f230041106b220224002002200036020c20012002410c6a4104108a02200241106a24000b4501017f2002200128020422034b044041d3a205412341a8a405107e000b2001200320026b36020420012001280200220120026a36020020002002360204200020013602000b0b00200120004120108a020b3901027f20002802082202200028020422034904402000200241016a360208200028020020026a20013a00000f0b200220034198a4051044000b12002002200110bc02200220002001108a020b2701017f230041106b22022400200220003a000f20012002410f6a4101108a02200241106a24000b0b002000200120021007000b3b01017f230041106b22042400200441086a20012002412020031036200428020c21012000200428020836020020002001360204200441106a24000bbf0101037f230041206b22012400200141086a2000105c027f410420012d00084101712202450d001a0240024020012d0009410420021b220241ff0171220341224704402003412d470440410b200241306b41ff0171410a4f0d041a0b200041146a4100360200200141106a2000105d20012802100d010c020b200041146a41003602002000200028020841016a360208200141106a20002000410c6a105e20012802104102460d010b41130c010b20012d00140b2103200141206a240020030b8e0101047f230041106b22022400200241086a2001105f20022d000921032000027f20022d00084101710440200128020841016a210403404101200341096b220541174b410120057441938080047145720d021a2001200436020820022001105f200441016a210420022d0001210320022d00004101710d000b0b41000b3a0000200020033a0001200241106a24000bf701010a7f230041106b22032400200128020422042001280208220a41016a220220022004491b220541016b21072001280200210802400340200220044f0d012009200220086a2d00002206413a6b41ff017141f601492006412e4622061b210b200241016a210220062009722109200b410171450d000b200241016b2105200241026b21070b200120053602082007417f470440200341086a200a20052008200441dcbe05104020002003280208200328020c10c302200341106a24000f0b230041206b22002400200041146a42003702002000410136020c200041989b0436020820004188d805360210200041086a41dcbe05103a000be109010a7f230041306b220424000240034002402001280208220320012802042206200320064b1b2109027f0240027f02400240024002400240024020032006490440200320096b210b410021052001280200220821070340200320076a220c2d0000220a41fcbe056a2d00000d022001200320056a41016a360208200741016a2107200b200541016a22056a0d000b0b200320064b0d0120004102360200200041023a00040c0b0b200320056a21050240200a41dc00470440200a4122460d01200041123a0004200041023602002001200541016a3602080c0c0b200441206a200320052008200641ccbe05104020022004280220200428022410452001200541016a2203360208200320064f0440410221050c0a0b2001200541026a36020841112105024002400240024002400240200c41016a2d0000220341ee006b0e08010f0f0f020f0304000b024002400240200341e2006b0e050111111102000b200341dc00460d062003412f47044020034122470d112002412210c0020c0f0b2002412f10c0020c0e0b2002410810c0020c0d0b2002410c10c0020c0c0b2002410a10c0020c0b0b2002410d10c0020c0a0b2002410910c0020c090b200110c40222034101710d03410c210502400240200341107622064180f8037122074180b00347044020074180b803460d0d20064180b0bf7f7341ff8fbc7f4b0d01419cbd05412b41fcc005107e000b200441186a200110c20220042d0019210320042d0018410171450d0120030c0b0b2004410036022820034180808004490d05200341808080c00049044020042006413f71418001723a00292004200341167641c001723a002841020c090b20042006413f71418001723a002a20042003411c7641e001723a002820042003411676413f71418001723a002941030c080b20012001280208220741016a360208200341dc00470d0a200441106a200110c20220042d00112103200320042d00104101710d091a2001200741026a360208200341f500470d0a200110c40222034101710d05200341107622074180406b41ffff03714180f803490d0a20074180c8006a41ffff03712006410a7441808080056a4180f8ff1f71722206418080046a22034180b00373418080c4006b418090bc7f490d0a2003418080c400470d060c0a0b200241dc0010c0020c070b20022802080440200441086a200320052008200641acbe05104020022004280208200428020c1045410121072001200541016a360208200441286a2002280200200228020810c30202402004280228220104402000200428022c360208200020013602040c010b200020042d002c3a0004410221070b200020073602000c0b0b2004200320052008200641bcbe05104020042802042102200428020021032001200541016a360208200441286a2003200210c3022000027f2004280228220104402000200428022c3602082000200136020441000c010b200020042d002c3a000441020b3602000c0a0b20092006419cbe051044000b20034108760c050b200420063a002841010c020b20034108760c030b20042007413f71418001723a002b20042006410676413f71418001723a002a20042003410c76413f71418001723a00292004200341127641077141f001723a002841040b21052002200441286a200510450b41130b220541ff01714113460d010b0b20004102360200200020053a00040b200441306a24000b3901017f230041106b22022400200241086a200110bf0220022d00092101200020022d00084101713a0000200020013a0001200241106a24000b5d01027f230041106b22012400200141086a2000105c027f410120012d0008410171450d001a20012d00092202412c470440410e200241fd00470d011a2000200028020841016a36020841130c010b410f0b2100200141106a240020000b1d0020004504402002410010560f0b20024101105620002001200210570bbe3602177f057e230041a0066b22002400024002400240102b41ff017141054604402000418080013602e80141def105200041e8016a100220002802e8012201418180014f0d012000200136029c05200041def10536029805200041003602e80120004198056a200041e8016a410410630d0220002d00eb01210120002d00ea01210320002d00e901210502400240024002400240024002400240024020002d00e8012206410d6b0e04010b0b03000b0240200641ee006b0e03060b02000b200641f50047044020064185014704402006419501460d06200641a201470440200641d101460d06200641fe0147200541ae014772200341a40147200141fa014772720d0d410021030c0e0b20054195014720034195014772200141ff0147720d0c410121030c0d0b200541cb0147200341104772200141ee0047720d0b200041e8016a20004198056a101d20002802e8010d0b200041f0016a2802002207410876210b200041f4016a280200210820002802ec012104410221030c0c0b200541de0147200341d00047722001410c47720d0a410321030c0b0b200541c20047200341d40047722001413447720d09410421030c0a0b200541f10047200341c7004772200141c40047720d08200041e8016a20004198056a101920002802e8012204450d08200041fc016a290200221742208620002902f401221942208884211820002f00ed0120002d00ef0141107472210b2017422088211720002f00850220004187026a2d000041107472210c200028028c02210e20002d008402210920002802f001210820002d00ec0121072019a72102410521030c090b200541fe00460d03200541a201472003413d4772200141e30047720d07200041306a20004198056a102720002802300d0720002802342102200041d8006a20004198056a101a20002802582204450d0720002802602108200028025c2107200041e8016a20004198056a101a20002802e801450d072007410876210b200041f0016a350200211720002903e8012118410721030c080b200541b001472003413f4772200141840147720d06200041d0006a20004198056a102720002802500d0620002802542107200041386a20004198056a10642000290338a70d06200041c8006a290300221742208620002903402219422088842118410821032007410876210b201742208821172019a721020c070b200541df014720034187014772200141e50047720d05410921030c060b200541ba01472003410a47720d04200141a401460d010c040b2003413347200141ea0147720d03200041e8016a20004198056a102920002d00e8010d0320004180026a2903002217422086200041f8016a290300221942208884211820174220882117200041f0016a2802002207410876210b20004188026a2d00002109200041f4016a280200210820002802ec01210420002f01ea01210f20002d00e90121102019a72102410621030c040b200041e8016a20004198056a101920002802e8012204450d02200041fc016a290200221742208620002902f401221942208884211820002f00ed0120002d00ef0141107472210b2017422088211720002f00850220004187026a2d000041107472210c200028028c02210e20002d008402210920002802f001210820002d00ec0121072019a72102410a21030c030b200041043a00e801200041e8016a1038000b20014180800141eccb051037000b1051000b20004100360280032000428080013702ec01200041def1053602e8014100200041e8016a22011053200020002903e8013703f802200041286a200041f8026a20002802f0011054200028022c21062000280228210d20002802f8022105200020002802fc02220a3602e801200d2006200520011000210602400240024002400240027f0240024002400240024002400240024002400240024020002802e8012201200a4d044002400240024020060e0400040401040b2000200136028c032000200536028803200041d8006a20004188036a1029024020002d00580d0020004198036a200041e2006a290100370300200041a0036a200041ea006a290100370300200041a7036a200041f1006a2900003700002000200029015a3703900320002d00592111200041206a20004188036a106520002d00204101710d004102210a0240024020002d00210e020100020b20004190046a20004188036a101a2000280290042205450d0120002802980421012000280294042106200041186a20004188036a101b20002d00184101710d0120002d00192112200041106a20004188036a101b20002d00104101710d0120002d0011211320004188036a20004190046a10660d0120004188046a200041a8046a29030037030020004180046a200041a0046a290300370300200041f8036a20004198046a29030037030020002000290390043703f003200041086a20004188036a106520002d00084101710d010240024020002d0009220a0e020100030b20004188036a20004190046a10660d02200041f8046a200041a8046a290300370300200041f0046a200041a0046a290300370300200041e8046a20004198046a29030037030020002000290390043703e0040b200041f0006a200041f8046a290300370300200041e8006a200041f0046a290300370300200041e0006a200041e8046a290300370300200041d8036a200041f8036a290300370300200041e0036a20004180046a290300370300200041e8036a20004188046a290300370300200020002903e004370358200020002903f0033703d0030b200041c8036a2214200041e8036a290300370300200041c0036a2215200041e0036a290300370300200041b8036a2216200041d8036a290300370300200020002903d0033703b00320004198056a200041d8006a220d412110091a20004188036a200d1066450d020b200041f4016a4200370200200041013602ec012000418084043602e8010c110b200041f4016a4200370200200041013602ec01200041d083043602e8010c100b200741ff0171200b410874722107201742ffffffff0f832219421088211a2019420888221ba7210b2017a7210d2000419f026a200041f0006a29030037000020004197026a200041e8006a2903003700002000418f026a200041e0006a290300370000200041f0016a20004198036a290300370300200041f8016a200041a0036a290300370300200041ff016a200041a7036a290000370000200020002903583700870220002000290390033703e801200041bf026a2014290300370000200041b7026a2015290300370000200041af026a2016290300370000200020002903b0033700a702200041c7016a20004198056a412110092114200041d8006a410172200041e8016a41df0010091a200020133a00c501200020123a00c401200020013602c001200020063602bc01200020053602b8012000200a3a00c601200020113a00580240024002400240027f02400240024002400240024002400240200341016b0e0a0600090a010b02030c04050b0240200445044020004198056a1067200020002802980520002802a00541c88404105a20002802044120470d082000280200220229000721172002280003210520022f0001210120022d00002106200041f8016a2002411f6a2d00003a0000200041f0016a200241176a2900003703002000200229000f3703e8010c010b20084120470d07200041f0016a200441176a290000370300200041f8016a2004411f6a2d00003a00002000200429000f3703e801200429000721172004280003210520042f0001210120042d000021060b200041ff006a2017370000200041fb006a2005360000200041f9006a20013b000020004187016a20002903e8013700002000418f016a200041f0016a29030037000020004197016a200041f8016a2d00003a0000200020063a0078200041e8016a2201200041d8006a41900110091a20011052410f210141000c070b02400240200041d8006a106841ff01712201410f470d004103210120184280808080708342808080808004520d00200041a0056a2203200241176a290000370300200041a8056a22062002411f6a2d00003a00002000200229000f37039805200228000b210a2002280007210f2002280003211020022f0001211120022d00002102410021050240200941ff0171200c410874722201047f200e4120470d01200041f0016a200141176a290000370300200041f8016a2001411f6a2d00003a00002000200129000f3703e801200128000b21132001280007210e2001280003210c20012f0001210920012d0000210141010541000b2112200041d6016a20002903e801370100200041e6016a200041f8016a2d00003a0000200041de016a200041f0016a290300370100200041a3016a200a3600002000419f016a200f3600002000419b016a201036000020004199016a20113b0000200041a7016a200029039805370000200041af016a2003290300370000200041b7016a20062d00003a0000200020023a009801200041d2016a2013360100200041ce016a200e360100200041ca016a200c360100200041c8016a20093b0100200020013a00c701200020123a00c6012000200b3a00c5012000200d3a00c40120002007ad2008ad422086843702bc01200020043602b801200041e8016a2201200041d8006a41900110091a20011052410f21010c020b410221010b410121050b200520011050000b200041e8016a200420082018a72019a741ff0171200b4108744180fe037172201aa7411074721069027f20002d00e801450440200041a0056a2201200041f8016a290300370300200020002903f00137039805200041f4016a4201370200200041013602ec01200041e084043602e8012000410e36029404200020004190046a22033602f001200020004198056a360290044104200041e8016a10122003200041d8006a20022000290398052001290300106b20002d0090040c010b200020002d00e9013a009104200041013a00900441010b2101200041f0016a20004198046a29030037030020002000290390043703e8010c1a0b20004198056a200041d8006a20072002ad20184220868420194220864280808080f01f83201b422886428080808080e03f83201a4230868484201842208884106b20002d0098052101200041f0016a200041a0056a29030037030020002000290398053703e8010c190b027f024020184280808080708342808080808004510440200041b8036a200241176a290000370300200041c0036a22052002411f6a2d00003a00002000200229000f3703b003200229000721182002280003210620022f0001210a20022d00002102200941ff0171200c4108747222010d0141000c020b20004181063b0190030c180b200e4120470d0b200041f0016a200141176a290000370300200041f8016a2001411f6a2d00003a00002000200129000f3703e801200128000b21102001280007210c2001280003210920012f0001210320012d0000210f41010b2101200041b4046a2007ad2008ad42208684370200200041ca046a2010360100200041c6046a200c360100200041c2046a2009360100200041c0046a20033b0100200041bf046a2203200f3a0000200041a7046a200041b8036a290300370000200041af046a20052d00003a00002000200b3a00bd042000200d3a00bc04200020043602b004200020183700970420002006360093042000200a3b009104200020023a009004200020002903b00337009f04200020013a00be04200041de046a200041f8016a2d00003a0000200041d6046a200041f0016a290300370100200041ce046a20002903e801370100200041e8016a20004190046a106c20002d00e801210120002d00e80222044102460d0b20004198056a2205410172200041e8016a220241017241ff0010091a2000419c066a200041ec026a280000360000200020002800e90236009906200020043a009806200020013a009805200220051023200041e0046a2002101320002802e0040d0c200041d8036a2201200041f1046a290000370300200041df036a2202200041f8046a290000370000200020002900e9043703d00320002802e4042204450d0d200041e8046a2d0000210520004184046a2002290000370000200041fd036a2001290300370000200020002903d0033700f503200020053a00f403200020043602f003200041e8016a200041f0036a106d20002903e8012218420252044020002d00f0012101200041e9046a200041f1016a412f10091a200020013a00e804200020183703e004200041e8016a2201200041e0046a101e200041a0056a2001106e200120004198056a41880110091a20004190036a2001200041f8006a2003410020002d00be041b106f0c170b200020002d00f0013a009103200041013a0090030c150b20004181026a200041f0006a290300370000200041f9016a200041e8006a290300370000200041f1016a200041e0006a290300370000200020002903583700e901200041003a00e801230041206b22012400200142808001370214200141def105360210200141106a21020240200041e8016a22002d0000450440200241001056200041016a200210550c010b2002410110562002410110560b0c180b230041406a22012400200141106a200041f8006a41021030200141386a22034200370300200141306a22044200370300200141286a220542003703002001420037032020012802102001280218200141206a1005200141086a41204100101f200128020c2108200128020822022001290320370000200241186a2003290300370000200241106a2004290300370000200241086a2005290300370000200041e8016a220341203602082003200836020420032002360200200141406b240020002802e801210220002802f0012103230041206b22012400200142808001370214200141def105360210200141106a210002402002044020004100105620022003200010570c010b2000410110562000410110560b0c170b4102210141010b20011050000b200041e8016a220141047221020240200041d8006a220341ee006a2d0000410171450440200241003602000c010b2002200341ef006a410110300b200041003602e801230041206b22002400200042808001370214200041def105360210200041106a210202402001280200450440200241001056200141046a2802002001410c6a280200200210610c010b2002410110562002410110560b200041086a41def10541808001200028021841808204103641002000280208200028020c1059000b200041e8016a2201410472210241002103230041106b22052400200041d8006a220441ee006a2d00004102470440200441e0006a2802002109200541086a200441e8006a28020022081031200528020c2107200528020822032009200810091a20022008360208200220073602042002200441406b29010037010e200241166a200441c8006a2901003701002002411e6a200441d0006a290100370100200241266a200441d8006a2901003701002002200441ec006a2f01003b010c0b20022003360200200541106a2400200041003602e801230041206b22022400200242808001370214200241def105360210200241106a210002402001280200450440200041001056200128020422034504402000410010560c020b20004101105620032001410c6a28020020001057200141106a2d00002000105820012d001120001058200141126a200010550c010b2000410110562000410110560b200241086a41def10541808001200228021841808204103641002002280208200228020c1059000b200041d8006a106841ff01712201410f472203450440200041ef006a20194220864280808080f01f83201b422886428080808080e03f83201a4230868484201842208884370000200020093a00772000200436005b2000200f3b0059200020103a005820002002ad20184220868437006720002007ad2008ad4220868437005f200041e8016a2202200041d8006a41900110091a200210520b200320011050000b200a4102460d06200041e8016a20004198016a106c20002d00e801210120002d00e80222034102460d0720004198056a2204410172200041e8016a220241017241ff0010091a2000419c066a200041ec026a280000360000200020002800e90236009906200020033a009806200020013a00980520022004102320004190046a200210132000280290040d08200041f8036a2201200041a1046a290000370300200041ff036a2202200041a8046a29000037000020002000290099043703f0032000280294042203450d0920004198046a2d00002104200041f4046a2002290000370000200041ed046a2001290300370000200020002903f0033700e504200020043a00e404200020033602e004200041e8016a200041e0046a106d20002903e8012218420252044020002d00f001210120004199046a200041f1016a412f10091a200020013a0098042000201837039004200041e8016a220120004190046a101e200041a0056a2001106e200120004198056a41880110091a200041b0036a2001200041f8006a20144100200a1b106f0c0c0b200020002d00f0013a00b103200041013a00b0030c0a0b2001200a41eccb051037000b200041f4016a4200370200200041013602ec01200041ac82043602e80120004188d8053602f001200041e8016a41b48204103a000b20004181043b0190030c0b0b200020013a009103200041013a0090030c0a0b2000200041f0046a2900003700d7032000200041e9046a2900003703d003200041f4016a20002900d703370000200020002802e4043602e8012000200041e8046a2d00003a00ec01200020002903d0033700ed0120004190036a200041e8016a10140c080b20004181083b0190030c070b20004181023b01b00341010c050b200020013a00b103200041013a00b0030c030b2000200041a0046a2900003700f703200020004199046a2900003703f003200041dc036a20002900f70337000020002000280294043602d003200020004198046a2d00003a00d403200020002903f0033700d503200041b0036a200041d0036a10140c010b20004181083b01b0030b20004198056a10330b20002d00b0034100470b2101200041f0016a200041b8036a290300370300200020002903b0033703e8010c030b20004198056a10330b20002d0090032101200041f0016a20004198036a29030037030020002000290390033703e8010c010b20004188d8053602f001200041e8016a41a88304103a000b230041206b22022400200242808001370214200241def105360210200241106a21030240200041e8016a22002d0000220441024704402003410010562004450440200341001056200041046a2802002000410c6a280200200310610c020b200341011056200320002d000110560c010b2003410110562003410110560b200241086a41def10541808001200228021841808204103620012002280208200228020c1059000b200141086a41def10541808001200128021841808204103641002001280208200128020c1059000b3e01027f2000280204220320024922044504402001200220002802002201200241f0a50510cd012000200320026b3602042000200120026a3602000b20040b5f02017f037e230041106b2202240020024200370308200242003703000240200120024110106345044020022903082104200229030021050c010b420121030b2000200537030820002003370300200041106a2004370300200241106a24000b3f01027f230041106b22022400200241003a000f200020012002410f6a410110632201047f41000520022d000f0b3a0001200020013a0000200241106a24000b2f0020014200370000200141186a4200370000200141106a4200370000200141086a420037000020002001412010630bda0101067f230041d0006b2201240020014100360220200142808001370244200141def10536024041888404410a200141406b2203105720012001290340370318200141106a200141186a200128024810542001280214210420012802102105200128021821022001200128021c22063602404104200520042002200310081a200141086a20022006200128024010b401200120012903083703382003200141386a101c200141286a200310bd022001280228220204402001200129022c3702440b200120023602402000200141406b10be02200141d0006a24000b2901017f230041206b2201240020011028200120004120100c2100200141206a24004100410f20001b0ba53302127f107e230041b0056b22052400200520023602dc02200520013602d802200520043602e402200520033602e002200541dc046a420237020020054184036a4102360200200541023602d404200541cc85043602d004200541023602fc022005200541f8026a3602d8042005200541e0026a360280032005200541d8026a3602f802200541e8026a200541d0046a101641def1062d00001a02400240024002400240024002400240024041044118107122010440200541d0026a4106103120052802d402210420052802d002220241dc8504280000360000200241046a41e085042f00003b0000200541c8026a4110103120052802cc02210620052802c8022203418ccd05290000370000200341086a4194cd0529000037000020014110360214200120063602102001200336020c200141063602082001200436020420012002360200200541c0026a4103103120052802c402210320052802c002220241e285042f00003b0000200241026a41e485042d00003a0000200541cc036a4100360200200541bc036a428180808010370200200541b4036a4103360200200541b0036a2003360200200541a8036a200541f0026a280200360200200542013702c403200520013602b803200520023602ac03200520052903e8023703a003200541f8026a200541a0036a107220052f019c0341c801470d01200541d0046a200528029003220120054198036a2802002202107320052802d0040440200541d8046a310000422086428080808020520d030b20054190056a2001200220052802d80220052802dc0241e88504103d200541d0036a20052802900520052802980520052802e00220052802e40241f08504103d20052802d003210120052802d8032102200541e0046a420037030020054280808080103703d804200520023602d404200520013602d004200541b8026a200541d0046a105c200541dc046a21014104210220052d00b802410171450d07410b210220052d00b90241fb00470d07200520052802d80441016a3602d804200541013a00e4032005200541d0046a3602e003410121040340200541b0026a200541d0046a105c4101210220052d00b002410171450d080240024020052d00b1022202412c470440200241fd00460d07200441ff01710d01410721020c0b0b200441ff01710d00200520052802d80441016a3602d804200541a8026a200541d0046a105c20052d00a802410171044020052d00a90221020c020b410421020c0a0b200541003a00e4030b0240200241ff017122044122470440410f2103410d2102200441fd00460d010c0a0b20054198026a200541d0046a105c4104210220052d0098024101712203450d090240027f02400240027f0240024020052d009902410420031b220241ff0171220341224704402003412d46200241306b41ff0171410a49720d010c100b200541003602e404200520052802d80441016a3602d80420054190056a200541d0046a2001105e20052802900522044102460d032005280298052102200528029405210320040d0120054188026a20032002104a20052d0089020c020b200541003602e40420054190056a200541d0046a105d2005280290052202450d0220054180026a2002200528029405104a20052d0081020c010b20054190026a20032002104b20052d0091020b4101710d0320080d0a200541d0046a104e41ff017122024113470d0d200541f8016a200541d0046a105c4104210220052d00f801410171450d0d20052d00f90141fb00470d0c41012103200520052802d80441016a3602d804200541013a00ac042005200541d0046a3602a804410021080340200541f0016a200541d0046a105c410120052d00f001410171450d031a0240024002400240024020052d00f1012202412c470440200241fd00460d03200341ff01710d0141070c090b200341ff01710d00200520052802d80441016a3602d804200541e8016a200541d0046a105c20052d00e801410171450d0720052d00e90121020c010b200541003a00ac040b200241ff017122034122470440410f2102410d200341fd00470d071a0c120b200541e0016a200541d0046a105c410420052d00e0014101712202450d061a027f0240024020052d00e101410420021b220241ff0171220341224704402003412d46200241306b41ff0171410a49720d01410b0c0a0b200541003602e404200520052802d80441016a3602d80420054190056a200541d0046a2001105e20052802900522044102460d072005280298052102200528029405210320040d01200541d0016a20032002104820052d00d1010c020b200541003602e40420054190056a200541d0046a105d2005280290052202450d06200541c8016a2002200528029405104820052d00c9010c010b200541d8016a20032002104920052d00d9010b4101710d014110210220080d11200541d0046a104e41ff017122024113470d11200541c0016a200541d0046a105c4104210220052d00c0014101712203450d1120052d00c101410420031b220241ff017122034122460d022003412d47200241306b41ff0171410a4f710d10200541003602e40420054190056a200541d0046a105d2005280290052208450d042005280294052107410021030c030b2008450d0d41002104200541d0046a106041ff017122024113460d080c100b41002103200541a8046a104d41ff017122024113460d010c0f0b200541003602e404200520052802d80441016a3602d80420054190056a200541d0046a2001105e20052802900522044102460d012005280298052107200528029405210841002103411021022004450d000b0c0d0b20052d00940521020c0c0b41040b21020c0a0b41002104200541e0036a104d41ff017122034113460d010b0b200321020c070b41181074000b200041810e3b01000c070b20004181183b01000c060b20080d010b411021020c020b200541d0046a106041ff017122024113470d01200541a0026a200541d0046a105c410e210220052d00a0024101710d010c020b410b21020b200541003602e003200520023a00e403200541143602ac04200541f685043602a8042005200541e0036a4104723602c004200142023702002005419c056a410f360200200541023602d4042005419cb5053602d0042005410236029405200520054190056a3602d8042005200541c0046a360298052005200541a8046a360290054101200541d0046a101220052802e403210720052802e00321080b02402008450d00027e024002402007450440410021014102210c410121030c010b410021024102210c41002101410121034102210e03400240200121062002220141016a2102024002400240024002400240024002400240200120086a2d00002204412b6b0e0402060301000b200441c00046200441c5004672200441e50046720d04200441d000470440200441df00460d07200441f000470d060b410021042003410171450d080c0b0b20034101710d020c070b2003410171450440200e410247200a72210d410121044100210e41002103200621014100210a200d4101710d0a0c060b41012104200c4102472009724101712006720d0941002101410121034100210c410021090c050b2003410171450440200e410247200a72210d4101210e41002103200621014100210a41012104200d410171450d050c090b41012103200c4102472009724101710440410121040c090b410021014101210c41002109410121042006450d040c080b4101210320012113410121012002210b410121102006450d03410421040c070b2003410171210441002103200121152006210120040d02410821040c060b200441306b41ff0171220d410a4f0440410021042003410171450d030c060b20034101710440200604404101210320104101200441304622011b2110200b200220011b210b41012101410121160c030b410121034101201120114520044130477122041b21112001201220041b211241002101410121090c020b41092104200fac420a7e2217422088a72017a72214411f75470d054101210a4100210320062101200d4100200d6b200d200e4101711b200e4102461b22064100482014200620146a220f4a73450d010c050b4100410620034101711b21040c040b20022007470d010c020b0b410621040c010b2009410171450440410321042016450d010b410721042003200a72410171450d00027f02400240201145044020054180046a41d89e05280200360200200541d09e052902003703f8030c010b200320014571450440200541d0046a2202200820072013201520011b4180a0051075200220052802d00420052802d40420124190a0051075200541f8036a20052802d804200541dc046a28020010760c010b200541d0046a20082007201241f09f051075200541f8036a20052802d804200541dc046a28020010760c010b2001452010410147720d00200541d0046a220120082007200b41a0a0051075200120052802d00420052802d404201341016a41b0a005107520054188046a20052802d804200541dc046a28020010762005280290040c010b20054190046a41d89e05280200360200200541d09e052902003703880441000b21010240024020052802800422022001417f734b0d00027e0240200f450440200520023602d804200520052903f8033703d00420054190056a200541d0046a22021077200520013602b00420052005290388043703a8042002200541a8046a10770c010b200f200f411f7522037320036b210302400240200f41004e0440200120034b0d01200520023602b004200520052903f8033703a8042005200136029805200520052903880437039005200541d0046a200541a8046a20054190056a1078200320016b220120052802ec04220220052802e404220320052802d80422046a6a417f734b0d05200120026a210720052903d00421184100210141ec9e05290200212441e09e052903002125410021024100210620052902dc040c040b200220034b0d01200520023602b004200520052903f8033703a8042005200136029805200520052903880437039005200541d0046a200541a8046a20054190056a1078200320026b220320052802e804220420052802e404220120052802d80422026a6a417f734b0d04200320046a210620052902dc04212420052903d00421254100210441e09e052903002118410021034100210741ec9e052902000c030b200520013602d80420052005290388043703d004200541a8046a200541d0046a220120031079200541c8046a2203200541b0046a280200360200200520052903a8043703c004200520023602d804200520052903f8033703d00420054190056a2001200541c0046a220210782003200541bc046a280200360200200520052902b4043703c0042001200210770c010b200520052903f8033703d004200520023602d804200541a8046a200541d0046a2204200220036b1079200541d8046a200541b0046a280200360200200520052903a8043703d00420054190056a20041077200541a0046a200541bc046a280200360200200520052902b40437039804200520013602c80420052005290388043703c004200420054198046a200541c0046a10780b2005290390052118200528029805210420052802a405210320052802ac05210720052903d004212520052802d804210220052902dc04212420052802e404210120052802e8042106200529029c050b21172018a722080d010b410921040c010b4100210a200320046a41002007410020032004721b22076b470440200520073602ec04200541003602e804200520033602e404200520173702dc04200520043602d804200520084118763a00d304200520084108763b00d104200520183c00d004200520184220883e02d404200541a8016a200541d0046a107a200541b0016a290300221742308620052903a80122184210888421212018423086212620052d00b801201742ffff035672210a0b027f0240027f02402006410020012002721b2203200120026a6a220b450d002005027f200b411b4d044020054198016a420a411b200b6b107b200541a0016a2903004216862005290398012217422a888421182017421686211a202521232002210820242117200121072003210941000c010b200541003602ac05200520033602a805200520013602a4052005202437029c0520052002360298052005202537039005200541d0046a20054190056a411b107c20052903d004212320052802d804210820052902dc04211720052802e404210720052802e8042109420021184280808002211a20052802ec040b3602ec04200520093602e804200520073602e404200520173702dc04200520083602d804200520233703d00420054180016a200541d0046a107a200541f0006a4205411b107b200541e0006a201a201820052903800120054188016a290300100e200541f8006a290300221b42018620052903702218423f8884211e200541e8006a29030042ffffffffffff3f83211a2005290360428080807e8321172018420186211902400240200b411b4d0440201720187c22234230882017202356ad201a201b7c7c221a42108684201954201a4230882217201e542017201e511b0d010c050b201721232019201e84500d010b200541d0006a210820232117201a21184200211b230041206b22042400230041206b2206240002400240024020195045201e507145044020185020172019542018201e542018201e511b720d01200641106a2019201e201e79a7201879a76b220741ff0071100d42012007413f71ad862122200641186a290300211f200629031021200340201720207d211d2018201f7d2017202054ad7d221b4200590440201c202284211c2019201d58201b201e5a201b201e511b450d04201b2118201d21170b201f423f86202042018884212020224201882122201f420188211f0c000b000b024002400240024020185045044020182019540d0320182019510d012018201982211b2018201980212220194280808080105a0d02201b4220862017422088842218201980221b422086201742ffffffff0f83201820198242208684221720198084211c201b42208820228421222017201982211d4200211b0c070b2017201982211d2017201980211c0c030b2017201882211d2017201880211c420121220c050b2017201954201b201e54201b201e511b450440201e423f8620194201888421202019423f86211f428080808080808080807f211803400240201b20207d2017201f54ad7d221d4200530d002017201f7d21172018201c84211c201d50450440201d211b0c010b2017201982211d2017201980201c84211c4200211b0c070b2020423f86201f42018884211f20184201882118202042018821200c000b000b2017211d0c040b20062019201e413f201979a72207201879a722096b41406b20072009461b220741ff0071100d42012007413f71ad86211b200641086a29030021202006290300211f03400240201820207d2017201f54ad7d221d4200530d002017201f7d2117201b201c84211c201d50450440201d21180c010b2017201982211d2017201980201c84211c0c020b2020423f86201f42018884211f201b420188211b202042018821200c000b000b4200211b0c010b2017211d2018211b0b420021220b2004201d3703102004201c370300200441186a201b37030020042022370308200641206a2400200429030021172008200441086a29030037030820082017370300200441206a2400200541406b20052903502217200541d8006a2903002019201e100e2017427e8320172023200529034022177d201a200541c8006a2903007d2017202356ad7d84501b211a200b411c490d01200541003602ac05200520033602a805200520013602a4052005202437029c0520052002360298052005202537039005200541d0046a20054190056a107d024020052802d4040440201a42108642808002842118200541386a210103402018500d0220052802f004210220052802ec04210320052802e804210420052903e004211720052802dc04210620052902d404211b200541306a20184200420a4200100e20052d00d00441306b41ff01712208200128020041ff01712207490d0420072008490d0220052903302118200520023602ac05200520033602a805200520043602a4052005201737029c0520052006360298052005201b37039005200541d0046a20054190056a107d20052802d4040d000b0b201a420183500d020b201a42017c221750201742ffffffffffff3f56720d032017202684221a42808080808080407d2217201a54220120212001ad7c2021542017201a5a1b0c020b41809d05411941c0a005107e000b201a202684221a42808080808080407d2217201a54220120212001ad7c2021542017201a5a1b0b210241000c010b202642808080808080407d221a2026542201202120212001ad7c222156201a20265a1b210241010b2101410521042001200271200a724101710d00200c410247200c712201201a202184420052710d004200201a7d201a20011b211842002021201a420052ad7c7d202120011b0c010b200541013a00e003200520043a00e1032005411b3602ac042005418a86043602a8042005200541e0036a4101723602c004200541dc046a42023702002005419c056a4110360200200541023602d4042005419cb5053602d0042005410236029405200520054190056a3602d8042005200541c0046a360298052005200541a8046a360290054101200541d0046a101220052d00e0030d0120052903e8032118200541f0036a2903000b2117200541106a2018420042e4ceceb58bbc034200100e200541206a2017420042e4ceceb58bbc034200100e200520184200420042e4ceceb58bbc03100e200041003a0000200041106a200541186a29030020052903207c42108622174230883703002000200541086a290300221842208842ffff03832017201842308884421086843703080c010b20004181183b01000b200541b0056a24000bf90102017f027e230041e0006b22022400200041086a2903002103200029030021042002412736025c200241186a2004200310fb01200241206a2903002103200229031821042002290328200241356a200241dc006a10fc0102402003200484500d00200241c9006a4130200228025c41146b100b2002411436025c20022004200310fb01200241086a2903002104200229030021032002290310200241356a200241dc006a10fc012003200484500d00200241366a4130200228025c41016b100b20022003a741306a3a00352002410036025c0b20014100200228025c2200200241356a6a412720006b10d5012100200241e0006a240020000b950201067f230041d0026b220524000240200141ee006a2d000022084102470440200541c8016a200141406b106c20052d00c801210720052d00c80222094102470440200541086a220a410172200541c8016a220641017241ff0010091a2005418c016a200541cc026a280000360000200520052800c90236008901200520093a008801200520073a0008200541a0016a20043703002005200337039801200520023602c0012005410b3a00c401200542003703a8012005420137039001200620054190016a101e200541106a2006106e2006200a41880110091a20002006200141206a200141ef006a410020081b106f0c020b200041013a0000200020073a00010c010b20004181023b01000b200541d0026a24000b870a020b7f017e230041a0036b2202240020012d002d210720012d002c2108200241106a20012802202209200141286a280200220a4100108001027f024020022d0010450440200241c3026a200241306a2d00003a00002002200241286a2903003700bb02200220073a00c502200220083a00c4022002200241276a2d00003a00ba0220022002411f6a2900003701b20220022002411d6a2f00003b01b00220022d0011210320022f011221042002290214210d20022002411c6a2d00003a00af022002200d3700a702200220043b00a502200220033a00a402200220013602a0022002200a36029c022002200936029802200241003602dc02200242003703d002200241003602c802200241086a41021031200228020c210b2002280208220441f1de003b00002002419c016a22034105360200200241dcaa053602980120024102360294012002200436029001200241f8026a20024190016a22051025200520024198026a20022802f8022002280280031026027f024020022d0090010d002002411a6a20032802002203360100200241f0026a20033602002002200229029401220d3701122002200d3703e80220024188036a200241e8026a1081014100210502400240024020022d0088030e03000201020b200228028c0321050b2002419c016a22034105360200200241e1aa053602980120024102360294012002200436029001200241f8026a20024190016a22061025200620024198026a20022802f802200228028003102620022d0090010d012002411a6a2003280200220336010020024198036a20033602002002200229029401220d3701122002200d3703900320024188036a20024190036a108101410021030240024020022d0088030e03000201020b200228028c0321030b410120032005490d021a20024193026a200241e7026a2d00003a0000200220022f00e5023b00910220022f0198022106200241106a220c20024198026a410272412e10091a200241ce006a200241d8026a290300370100200241c6006a200241d0026a290300370100200220022903c80237013e200241aa016a200c41c60010091a200220043a00fc01200241ff016a20044118763a00002002200336028c02200220053602880220024102360284022002200b36028002200241003602f801200241003602f001200220073a009502200220083a009402200220063b01a801200220013602a401200241003602a00120024204370398012002200a360294012002200936029001200220044108763b00fd0141000c050b20022d0089030c010b20022d0091010b2103200241c8026a1034200241d4026a1034200241023a009002200220033a0091012002410a3a0090010c010b200241a3016a41023a0000200241023a009002200241063602900120024282848890a0c080810237009b010b2002411e3602cc02200241a887043602c802200220024190016a360290032002411c6a4202370200200241a4026a4101360200200241023602142002419cb5053602102002410236029c02200220024198026a360218200220024190036a3602a0022002200241c8026a360298024101200241106a101220022d0090020b2103200241106a20024190016a41800110091a200220024194026a28000036009b022002200228009102360298020240200341024704402000200241106a418001100922014184016a200228009b023600002001200228029802360081010c010b200041053a00000b200020033a008001200241a0036a24000be70301027f230041e0006b22022400200220012802183602042002200128020836020c200220012802003602082002200141146a2802003602142002200128020c360210200241246a4203370200200241dc006a4102360200200241d4006a220141023602002002410436021c200241b886043602182002410d36024c2002200241c8006a3602202002200241106a3602582002200241086a3602502002200241046a3602484103200241186a2203101220032002280208200228020c200228021020022802141069024020022d0018450440200241386a2203200241286a29030037030020022002290320370330200142013702002002410136024c200241e086043602482002410e3602442002200241406b3602502002200241306a3602404103200241c8006a1012200041106a2003290300370300200020022903303703082000410a3a00342000200228020436023020004200370318200042013703000c010b20022d00192201410c47044020004202370300200020013a00080c010b200241d4006a42003702002002410136024c20024180870436024820024188d8053602504102200241c8006a1012200041286a420037030020004200370320200041003a00342000200228020436023020004201370318200042003703000b200241e0006a24000b5101017f2000280208220220002802044604402000200210b602200028020821020b2000200241016a36020820002802002002410c6c6a22002001290200370200200041086a200141086a2802003602000bc0880102237f037e230041c00d6b22042400200441a00a6a200141186a413010091a20014180016a2d00002126200141f8006a280200211f200141f4006a280200210c200141ec006a280200210b200141e4006a280200210e200141e8006a2802002109200141e0006a2802002111200141d8006a280200210d200141dc006a2802002107200141d4006a280200210f200141cc006a28020021062004200141d0006a2802004100200141c8006a28020022081b3602f80c200420063602f40c200420083602f00c200441003602ec0c2004200841004722053602e80c200420063602e40c200420083602e00c200441003602dc0c200420053602d80c200441b00b6a2206200441d80c6a2208108201200420074100200f1b3602f80c2004200d3602f40c2004200f3602f00c200441003602ec0c2004200f41004722053602e80c2004200d3602e40c2004200f3602e00c200441003602dc0c200420053602d80c200441bc0b6a2008108201200441c40b6a280200210720042802b00b211e20042802b80b212020042802bc0b212420042009410020111b3602d00b2004200e3602cc0b200420113602c80b200441003602c40b2004201141004722053602c00b2004200e3602bc0b200420113602b80b200441003602b40b200420053602b00b20082006108301024020042802d80c450440200441b00b6a1084014104211d0c010b4101212120044198026a410420042802d00b41016a2205417f20051b2205200541044d1b108501200441e00c6a2903002128200441e80c6a2903002127200428029c022122200428029802221d20042903d80c370200201d41106a2027370200201d41086a2028370200200441013602e005200420223602dc052004201d3602d805200441d80c6a2205200441b00b6a412410091a20044198066a2005108301200428029806044041182105034020042802dc052021460440200441d8056a20042802f80c41016a2206417f20061b10860120042802d805211d0b200441a0066a290300212820042903980621272005201d6a220641106a200441a8066a290300370200200641086a2028370200200620273702002004202141016a22213602e005200541186a210520044198066a200441d80c6a1083012004280298060d000b20042802dc0521220b200441d80c6a1084010b2026047f200441e40c6a4105360200200441dcaa053602e00c2004200c3602dc0c2004200b3602d80c200441b00b6a200441d80c6a102520042902b40b212920042802b00b0541000b2125200441d80c6a200441a00a6a413010091a20044190026a41044100101f2004280294022106200428029002220541baec959307360000200441043602a0042004200636029c042004200536029804200420243602a006200420242007410c6c6a22233602a4062004201e360298062004201e2020410c6c6a221c36029c06200441b00b6a20044198066a1087010240024020042802b40b044020044188026a200441b80b6a2205280200108801200441003602e00820042004290388023703d8082005200441a0066a29030037030020042004290398063703b00b200441a00a6a200441b00b6a10870120042802a40a0440200441d8086a200441a80a6a28020010890120042802bc0b210b20042802b80b210720042802b40b210620042802b00b210520042802e0082109200420042802d8083602e005200420093602dc052004200441e0086a3602d805200545200520064672450440200620056b410c6e21060340200441d8056a2005280200200541086a280200108a012005410c6a2105200641016b22060d000b0b2007450d02200441a80a6a200441e0056a280200360200200420042903d8053703a00a2007200b470440200b20076b410c6e21050340200441a00a6a2007280200200741086a280200108a012007410c6a2107200541016b22050d000b0b20042802a00a20042802a40a3602000c030b200441ac0a6a4200370200200441013602a40a200441fca7053602a00a20044188d8053602a80a200441a00a6a4188b505103a000b200441ac0a6a4200370200200441013602a40a200441fca7053602a00a20044188d8053602a80a200441a00a6a4188a905103a000b20042802d80520042802dc053602000b02400240024020042802e00822134504404100210c410021060c010b20042802d808210a0240201341154f044041042013410176410c6c108b01220d0440200a41206a21174110211b4104418001108b0141ecad05108c0121144100210c03400240024002402013200c220e6b22094102490d00200a200e410c6c220b6a220628020c2205200641146a28020022072006280200200641086a280200108d014504404102210620094102460d02200b20176a21080340200841086b280200220c2008280200220b20052007108d010d032008410c6a2108200c2105200b2107200641016a22062009470d000b0c010b41022106024020094102460d00200b20176a21080340200841086b280200220c2008280200220b20052007108d01450d012008410c6a2108200c2105200b21072009200641016a2206470d000b200921060b20044180026a200e2006200e6a220c200a2013418cad05108e01200441f8016a200428028002220720042802840222094101762208200841d8ab05108f0120042802fc01210b20042802f8012105200441f0016a20072009410c6c6a200841746c6a2008200841e8ab05108f0120094102490d0220042802f401211820042802f0012008410c6c6a410c6b2107200841016b22152109200b2108024003402008450d0120152018490440200441a80a6a2211200541086a220f280200360200200420052902003703a00a200f200741086a220f28020036020020052007290200370200200f2011280200360200200720042903a00a3702002007410c6b21072005410c6a2105200841016b2108200941016b2209417f460d050c010b0b200920184188ac051044000b200b200b41f8ab051044000b200921060b2006200e6a210c0b0240200c200e49200c20134b72450440200c20134f2006410a4f72450440200441e8016a200e200e410a6a2205201320052013491b220c200a2013419cae05108e0120042802e80120042802ec0141012006200641014d1b1090010b2010201b46044041042010410474108b0141fcad05108c0120142010410374100921142010410174211b0b201420104103746a2205200e3602042005200c200e6b360200200441e0016a2014201041016a2210201310910120042802e0014101470d0120042802e401210b0240034020142010200b419cad0510920122052802002119200441d8016a2005280204221120142010200b41016a221841acad0510920122052802042005280200220f6a200a201341bcad05108e0120042802d80122072019410c6c22086a2105200720042802dc01220e410c6c6a21150240024002402019200e20196b22094b0440200d20052009410c6c22061009220e20066a2108201941004c200941004c720d012015410c6b21060340200620052008410c6b2208280200200841086a2802002005410c6b2209280200200941086a280200108d01220941746c6a220520082009410c6c6a220820091b2209290200370200200641086a200941086a280200360200200520074d0d022006410c6b21062008200e4b0d000b0c010b2008200d20072008100922066a2108201941004c200e20194c720d0103402007200520062005280200200541086a2802002006280200200641086a280200108d01220e1b2209290200370200200741086a200941086a2802003602002007410c6a21072006200e410173410c6c6a220620084f0d032005200e410c6c6a22052015490d000b0c020b200521070b200d21060b20072006200820066b10091a201020184b0440201420184103746a220520113602042005200f20196a360200200b20104f0d022014200b4103746a2205200541086a2010200b417f736a410374100a200441d0016a2014201041016b2210201310910120042802d401210b20042802d0014101470d040c010b0b0c080b0c080b41acae05412c41d8ae05107e000b200c2013490d000b0c020b419cbd05412b41dcad05107e000b201341014d0d00200a201341011090010b1093012105200441003602b40b200420053602b00b200a2013410c6c6a210b410021074100210c02400240034002400240024002402007450440200a200b460d02200a2802002208450d02200a2902042127200a410c6a210a0c010b2028212720062208450d010b0240200a200b460440200b21090c010b200a410c6a2109200a28020022060d020b410021060c020b20042802b00b210620042802b40b220a450d05200a210920062105034002400240024020052f018a0122080440200941016b21092005418c016a220720084102746a280200220b2f018a01221341054f0d03410520136b22192007200841016b22084102746a28020022172f018a0122074b0d022017200720196b22153b018a01200b41053b018a01200b41046a22182019410c6c6a20182013410c6c100a201741046a220e201541016a2211410c6c6a200720116b220f2018410420136b22071094012007200f470d0120052008410c6c6a220d41046a22082902002127200e2015410c6c6a220541086a280200210720082005290200370200200d410c6a2205280200210820052007360200200441a80a6a20083602002018200f410c6c6a220541086a200836020020052027370200200420273703a00a2009450d03200b418c016a2205201941027422076a2005201341027441046a100a2005201720114102746a418c016a200710091a4100210703402005280200220820073b0188012008200b360200200541046a2105200741016a22074106470d000b0c030b41c8b205411941e4b205107e000b41d8b10541284180b205107e000b4190b205412741b8b205107e000b200b210520090d000b0c050b200a2902042128410121072009210a20082027422088a720062028422088a7109501450d010b024002400240024020052f018a01410b4f044041002107034020052802002205450d02200741016a210720052f018a01410b4f0d000b0c020b20052f018a012207410b4f0d032005200741016a3b018a0120052007410c6c6a220741086a2027370200200741046a20083602000c020b200441c8016a200441b00b6a10960120042802cc01210720042802c80121050b1093012110200441003602a40a200420103602a00a200741016b220a210f200a04400340200441c0016a200441a00a6a109601200f41016b220f0d000b200a20042802a40a470d0420042802a00a21100b20052f018a01220a410a4b0d042005200a41016a220d3b018a012005200a410c6c6a220a41086a2027370200200a41046a20083602002005200d4102746a418c016a20103602002010200d3b018801201020053602002007450d000340200520052f018a014102746a418c016a2802002105200741016b22070d000b0b41012107200c41016a210c2009210a0c010b0b41d8af05412041f8b005107e000b4198b105413041c8b105107e000b41d8af0541204188b105107e000b2004200a3602cc0b200420063602c80b200441003602c40b2004200a3602bc0b200420063602b80b200441003602b40b2004200c410020061b3602d00b2004200641004722053602c00b200420053602b00b200420044198046a3602d40b200441a00a6a200441b00b6a109701024020042802a00a450440200441b00b6a10980141042108410021050c010b41012105200441b8016a410420042802d00b41016a2206417f20061b2206200641044d1b108801200441a80a6a280200210720042802bc01210620042802b801220820042903a00a370200200841086a2007360200200441013602e005200420063602dc05200420083602d805200441a00a6a2206200441b00b6a412810091a20044198066a20061097012004280298060440410c2107034020042802dc052005460440200441d8056a20042802c00a41016a2206417f20061b10890120042802d80521080b2004290398062127200720086a220641086a200441a0066a280200360200200620273702002004200541016a22053602e0052007410c6a210720044198066a200441a00a6a1097012004280298060d000b20042802d80521080b200441a00a6a1098010b200441023a00d8082004200836029806200420082005410c6c6a36029c062004200441d8086a3602a4062004200441d80c6a3602a006200441a00a6a20044198066a109901027f20042802a00a4504404104210b4100211b41000c010b200441b0016a4104108501200441a80a6a22072903002128200441b00a6a2206290300212720042802b401211b20042802b001220b20042903a00a370200200b41106a2027370200200b41086a202837020041012112200441013602e0052004201b3602dc052004200b3602d805200441b80b6a200441a0066a29030037030020042004290398063703b00b200441a00a6a200441b00b6a10990120042802a00a044041182105034020042802dc052012460440200441d8056a410110860120042802d805210b0b2007290300212820042903a00a21272005200b6a220941106a2006290300370200200941086a2028370200200920273702002004201241016a22123602e005200541186a2105200441a00a6a200441b00b6a10990120042802a00a0d000b20042802dc05211b0b201b41807e710b21150240024002400240027f0240024002400240024002400240024002400240024002400240024020042d00d808220541024704402005410047211b0c010b200b450d000240024002402012044020124115490d014104201241017641186c108b01220d0440200b41386a21134104418001108b0141ecad05108c0121164100210c4110211903400240024002402012200c220e6b22094102490d00200b200e41186c22056a220a2802182207200a41206a2802002206200a280200200a41086a280200109a0141ff017141ff014704404102210a20094102460d02200520136a21050340200541086b28020022082005280200220c20072006109a0141ff017141ff01460d03200541186a210520082107200c2106200a41016a220a2009470d000b0c010b4102210a024020094102460d00200520136a21050340200541086b28020022082005280200220c20072006109a0141ff017141ff01470d01200541186a210520082107200c21062009200a41016a220a470d000b2009210a0b200441a8016a200e200a200e6a220c200b2012418cad05109b01200441a0016a20042802a801220520042802ac0122064101762217201741d8ab05109c0120042802a401211820042802a001210920044198016a2005200641186c6a201741686c6a2017201741e8ab05109c0120064102490d02200428029c012111201741016b2108200428029801201741186c6a41186b210f410021100240034020102018460d0120082011490440410021050340200520096a2206280200210720062005200f6a220628020036020020062007360200200541046a22054118470d000b200941186a2109200f41186b210f201041016a22102017460d050c010b0b20172010417f736a20114188ac051044000b2018201841f8ab051044000b2009210a0b200a200e6a210c0b0240200c200e49200c20124b72450440200c20124f200a410a4f7245044020044190016a200e200e410a6a2205201220052012491b220c200b2012419cae05109b012004280290012004280294014101200a200a41014d1b109d010b2019201a4604404104201a410474108b0141fcad05108c012016201a41037410092116201a41017421190b2016201a4103746a2205200e3602042005200c200e6b36020020044188016a2016201a41016a221a20121091012004280288014101470d01200428028c012114024003402016201a2014419cad051092012205280200211020044180016a200528020422112016201a201441016a221741acad0510920122052802042005280200220f6a200b201241bcad05109b012004280280012207201041186c22086a21052007200428028401220a41186c6a21180240024002402010200a20106b22094b0440200d2005200941186c22061009220e20066a2108201041004c200941004c720d01201841186b210603402006200541684100200841186b2209280200200941086a280200200541186b2209280200200941086a280200109a0141ff0171220a41ff014622091b6a2205200841684100200a41ff01471b6a220820091b2209290200370200200641106a200941106a290200370200200641086a200941086a290200370200200520074d0d02200641186b21062008200e4b0d000b0c010b2008200d20072008100922066a2108201041004c200a20104c720d0103402007200520062005280200200541086a2802002006280200200641086a280200109a0141ff0171220a41ff014622091b220e290200370200200741106a200e41106a290200370200200741086a200e41086a290200370200200741186a21072006200a41ff014741186c6a220620084f0d032005200941186c6a22052018490d000b0c020b200521070b200d21060b20072006200820066b10091a2017201a490440201620174103746a220520113602042005200f20106a3602002014201a4f0d02201620144103746a2205200541086a201a2014417f736a410374100a200441f8006a2016201a41016b221a2012109101200428027c211420042802784101470d040c010b0b0c1c0b0c1c0b41acae05412c41d8ae05107e000b200c2012490d000b0c030b419cbd05412b41dcad05107e000b200441003602f004200441003602e8040c020b201241014d0d00200b20124101109d010b109e012106200441003602dc05200420063602d8052004200b201241186c6a220f3602c80a2004200b3602c40a20042015201b41ff0171723602c00a2004200b3602bc0a200441003602a00a200441a80a6a2111200441a00a6a4104722109410021054100210a02400240034002400240027f20050440200b21052009210b20110c010b200b200f460d012004200b41186a22053602c40a200b41046a0b2107200b280200220e0d010b20042802d805210b20042802dc0522060440200441ac0a6a211b20062109200b2105034002400240024020052f018e0222080440200941016b210920054190026a220720084102746a280200220c2f018e02221641054f0d03410520166b22102007200841016b22114102746a280200221a2f018e02220d4b0d02201a200d20106b22173b018e02200c41053b018e02200c41046a22132010410c6c22086a20132016410c6c2207100a2008200c4188016a220e6a200e2007100a201a41046a220f201741016a2218410c6c22086a200d20186b220d2013410420166b22071094012007200d470d01200e2008201a4188016a22076a200d410c6c22151009210e200441b80b6a221920072017410c6c22086a220741086a280200360200200420072902003703b00b200441a80a6a220d20052011410c6c6a2211410c6a22072802003602002008200f6a220529020021282007200541086a280200360200201141046a2205290200212720052028370200201b20114188016a2207290200370200201b41086a220820114190016a2205280200360200200420273703a00a20052019280200360200200720042903b00b370200200441a0066a2207200d280200360200200420042903a00a37039806201920082802003602002004201b2902003703b00b201320156a220541086a20072802003602002005200429039806370200200e20156a220520042903b00b370200200541086a20192802003602002009450d03200c4190026a2205201041027422076a2005201641027441046a100a2005201a20184102746a4190026a200710091a4100210703402005280200220820073b018c022008200c360200200541046a2105200741016a22074106470d000b0c030b41c8b205411941e4b205107e000b41d8b10541284180b205107e000b4190b205412741b8b205107e000b200c210520090d000b0b2004200a3602f004200420063602ec042004200b3602e8040c040b2007280210210d200728020c21082007280208210c2007290200212702402005200f46044041002107200f210b0c010b20052802002107200441b80b6a2005410c6a290200370300200441c00b6a200541146a2802003602002004200541186a220b3602c40a200420052902043703b00b0b201120042903b00b370200201141106a200441c00b6a280200360200201141086a200441b80b6a290300370200200420073602a40a2007044041012105200e2027422088a7200720042802ac0a109501450d010b200441013602a00a024002400240024020062f018e02410b4f044041002105034020062802002206450d02200541016a210520062f018e02410b4f0d000b0c020b20062f018e022205410b4f0d032006200541016a3b018e0220062005410c6c6a220541086a2027370200200541046a200e36020020054190016a200d3602002005418c016a200836020020054188016a200c3602000c020b200441f0006a200441d8056a109f0120042802742105200428027021060b109e01210f200441003602b40b2004200f3602b00b200541016b220b2107200b04400340200441e8006a200441b00b6a109f01200741016b22070d000b200b20042802b40b470d0420042802b00b210f0b20062f018e02220b410a4b0d042006200b41016a22073b018e022006200b410c6c6a220b41086a2027370200200b41046a200e360200200b418c016a2008360200200b4188016a200c360200200b4190016a200d360200200620074102746a4190026a200f360200200f20073b018c02200f20063602002005450d000340200620062f018e024102746a4190026a2802002106200541016b22050d000b0b200a41016a210a20042802c40a210b20042802a00a210520042802c80a210f0c010b0b41d8af05412041f8b005107e000b4198b105413041c8b105107e000b41d8af0541204188b105107e000b200441e0006a2020108501200441003602a006200420042903603703980620044198066a202010860120042802a006210602402020450d00200441ac0a6a2109200428029806200641186c6a21050340201e280200220a450d01200441a00a6a200a201e280208220720042802980420042802a00410a001200441b00b6a200a200720042802980420042802a00410a001200920042802e80420042802ec0420042802b00b20042802b80b10a10110a201200541106a200441b00a6a290300370200200541086a200441a80a6a290300370200200520042903a00a370200200541186a2105200641016a2106201e410c6a221e201c470d000b0b200441b0056a200636020020042004290398063703a805027f024020250440200441a00a6a200441d80c6a20252029422088a72209102620042d00a00a0d01200441ba0b6a200441ac0a6a2802002206360100200420042902a40a22273701b20b200441a80a6a22052006360200200420273703a00a20042802b005220720042802ac05460440230041106b22062400200641086a200441a8056a2007410110aa022006280208200628020c10c201200641106a240020042802b00521070b20042802a805200741186c6a22062009360208200620293e020420062025360200200620042903a00a37020c200641146a20052802003602002004200741016a3602b0050b200420213602e008200420223602dc082004201d3602d808200441023a00d6032004202336029c0620042024360298062004200441d6036a3602ac062004200441d80c6a3602a8062004200441e8046a3602a406200420044198046a3602a006200441a00a6a20044198066a10a301024020042802a00a4504404100210541042108410021070c010b200441d8006a4104108501200441a80a6a22092903002128200441b00a6a22062903002127200428025c21072004280258220820042903a00a370200200841106a2027370200200841086a202837020041012105200441013602e005200420073602dc05200420083602d805200441c00b6a200441a8066a290300370300200441b80b6a200441a0066a29030037030020042004290398063703b00b200441a00a6a200441b00b6a10a30120042802a00a450d0041182107034020042802dc052005460440200441d8056a410110860120042802d80521080b2009290300212820042903a00a2127200720086a220a41106a2006290300370200200a41086a2028370200200a20273702002004200541016a22053602e005200741186a2107200441a00a6a200441b00b6a10a30120042802a00a0d000b20042802dc0521070b0240024020042d00d60322064102470440200641004721070c010b20080d010b200741ff01714100470c020b200441d8086a200510860120042802d80820042802e008220941186c6a2008200541186c10091a20042902ac05212820042802a8052107200441b80b6a22064100360200200442013703b00b200441d0006a41204100101f200441003602a80a200420042903503703a00a200441e40c6a200441a00a6a10a401200441b00b6a20042802a00a20042802a80a1045200420042800b50b360298062004200628000036009b0620042802b00b04402004200428009b063600b30320042004280298063602b00320042903d8082127200441e8046a103520260440200441003602a00a2004201f3602a40a200141086a200441a00a6a106e0b027f0240200520096a2205450440200141106a280200450d010b200441fc066a2005360200200441f4066a2027370200200441ec066a2028370200200441e8066a2007360200200441e4066a20012802142206360200200441e0066a2001280204220936020020044180076a200129020837030020044188076a200141106a2802003602002004200128020022083602dc0620012d008401210f20012d0085010c010b4100210820042d008c07210f20042802e406210620042802e006210920042d008d070b2107200441880c6a200441e8066a412410091a0c040b20042d00b40b211b200441e8046a10350c020b20042d00a10a0b211b200441e8046a10350b200420042800b30336008308200420042802b00336028008200441e5066a200428028008360000200441e8066a2205200428008308360000200441013602d8062004410b410c201b41ff01711b3a00dc06200441103602b40b200441c687043602b00b2004200441d8066a41047236029806200441ac0a6a4202370200200441e40c6a4101360200200441023602a40a2004419cb5053602a00a200441023602dc0c2004200441d80c6a3602a80a200420044198066a3602e00c2004200441b00b6a3602d80c4101200441a00a6a1012200441e0066a2802002109200441e4066a280200210620042802d806210120042802dc062108200441880c6a2005412410091a20010d012004418d076a2d000021072004418c076a2d0000210f0b200441a4026a200441880c6a412410091a2008450d0120030440200441d8066a2201200441a4026a412410091a200441b0036a200110a501200120024102103020042802e0064121470d0720042802d806220d2d0003210c200d2900072128200d2f0000210b200441d8036a200d41026a2d00003a0000200d41066a2d0000210a200d411f6a2f00002105200d2f00042101200d29000f2127200441ed036a200d41176a290000370000200441f5036a20053b0000200441dc036a200a3a00002004200b3b01d603200420283700dd03200420273700e503200420013b01da032004200c3a00d903200441f0066a220a4200370300200441e8066a22054200370300200441e0066a22014200370300200442003703d806200441d6036a4121200441d8066a220e100520044190046a221c200a29030037030020044188046a220a200529030037030020044180046a22152001290300370300200420042903d8063703f803200441b8046a200441b0036a10a601200441b0046a201c290300370300200441a8046a200a290300370300200441a0046a2015290300370300200420042903f80337039804200441003a008008200441b80a6a220d200641186a290000370300200441b00a6a220b200641106a290000370300200441a80a6a220c200641086a290000370300200420062900003703a00a200441be989bf1073602d808200441900c6a22164100360200200442013703880c200441d8086a200441880c6a220510a701200441c8006a200441c0046a221228020041246a4100101f200441e00c6a22014100360200200420042903483703d80c20044198046a200441d80c6a221110a40120042802b8042012280200201110a801200441b80b6a2001280200360200200420042903d80c3703b00b2005200441b00b6a10a901200441e0076a201628020036020020044190076a201529030037030020044198076a200a290300370300200441a0076a201c290300370300200441b0076a200c290300370300200441b8076a200b290300370300200441c0076a200d290300370300200420042903880c3703d807200420042903f80337038807200420042903a00a3703a807200441d0076a4200370300200442003703c807200442003703d806200442003703f006200441a8086a200e10aa0120112008200920042802a80820042802b00820044180086a10ab0120042903d80c22284202510d0320042f01e00c2101200441880c6a200441e20c6a41ce0010091a200441c00b6a2004418e0c6a290100370100200420042901880c3701ba0b200441c80b6a200441960c6a41c00010091a200420013b01b80b200420283703b00b200441d80c6a200441b00b6a10ac0120042d00d80c2201410b470d04200441f00b6a2903002128200441ec0b6a2802002201450d05200420284220883e0294092004200136029009200441406b20044190096a106520042d00404101710d06027f0240024020042d00410e020001090b200441386a20044190096a106520042d00384101710d0802400240024020042d00390e0200010b0b200441a8056a20044190096a102920042d00a8050d0a200441fe096a20042d00ac053a0000200441f0096a200441bd056a290000370300200441f8096a200441c5056a280000360200200420042f01aa053b01fc092004200441b5056a2900003703e809200441b1056a2201280000210b20042d00a905211420042800ad052116200441a8056a20044190096a102920042d00a8050d0a200441980a6a200441c1056a290000370300200441900a6a200441b9056a290000370300200441880a6a2001290000370300200420042900a9053703800a200441206a20044190096a106420042802200d0a200441306a290300212820042903282127200441a8056a20044190096a101c20042802a8052212450d0a200441e6096a220d200441fe096a2d00003a0000200441a80a6a220c200441f0096a290300370300200441b00a6a2205200441f8096a280200360200200441bc0a6a200441880a6a290300370200200441c40a6a200441900a6a290300370200200441cc0a6a200441980a6a290300370200200420042f01fc093b01e409200420042903e8093703a00a200420042903800a3702b40a20043502b005212920042802ac05210a200441d80c6a200441a00a6a2201413410091a20044190096a200110660d0a200441d8096a200441b80a6a290300370300200441d0096a2005290300370300200441c8096a200c290300370300200441e2096a200d2d00003a0000200420042903a00a3703c009200420042f01e4093b01e009200441880c6a200441d80c6a413410091a0c010b20044190096a10ad010d0941002114410021120b2004418e096a200441e2096a2d00003a0000200420042f01e0093b018c09200441d8086a200441880c6a413410091a200441d0086a200441d8096a290300370300200441c8086a200441d0096a290300370300200441c0086a200441c8096a290300370300200420042903c0093703b80841010c010b200441a00a6a20044190096a10ae0120042d00a00a410b460d072004418e096a20042d00a70a3a0000200420042f00a50a3b018c0920042d00a40a211420042802a80a211620042802ac0a210b41000b210e200441be096a220d2004418e096a2d00003a0000200420042f018c093b01bc09200441d8056a200441d8086a413410091a200441b0096a220c200441d0086a290300370300200441a8096a2205200441c8086a290300370300200441a0096a2201200441c0086a290300370300200420042903b80837039809200e0440200441b00a6a200b360200200441ac0a6a2016360200200441ab0a6a200d2d00003a0000200420143a00a80a200420042f01bc093b00a90a200441b40a6a200441d8056a413410091a200441f00a6a2028370300200441e80a6a2027370300200441800b6a2029370300200441fc0a6a200a360200200441f80a6a2012360200200441880b6a200429039809370300200441900b6a2001290300370300200441980b6a2005290300370300200441a00b6a200c290300370300200441003602a00a41010c0e0b200441013602a00a200441073a00a40a0c0c0b200441d8066a2201200441a4026a412410091a200441880c6a200110a501200120024101103020042802e0064120470d07200441003602e00620044182086a221120042802d806220141026a2d00003a0000200420012f00003b0180082001290007212720012d0003210e200441e80c6a221c2001411f6a2d00003a0000200441e00c6a220d200141176a2900003703002004200129000f3703d80c200441d8036a220c200141066a2d00003a0000200420012f00043b01d603200441b80a6a220b200641186a290000370300200441b00a6a220a200641106a290000370300200441a80a6a2205200641086a290000370300200420062900003703a00a20044195c7f4a1073602b003200441a0066a220341003602002004420137039806200441b0036a20044198066a221510a701200441b00b6a2201200441880c6a10a6012015200110a9012004418b076a200e3a00002004418f076a2027370000200441e0076a20032802003602002004418a076a20112d00003a00002004418c076a20042f01d6033b01002004418e076a200c2d00003a000020044197076a20042903d80c3700002004419f076a200d290300370000200441a7076a201c2d00003a000020042004290398063703d807200420042f0180083b018807200441d0076a4200370300200441c0076a200b290300370300200441b8076a200a290300370300200441b0076a2005290300370300200442003703c807200442003703d806200442003703f006200420042903a00a3703a80720044180086a200441d8066a10aa0120042802800821032004280288082101200441003a009806200441a00a6a2008200920032001201510ab0120042903a00a22274202510d0820042f01a80a2101200441b00b6a200441aa0a6a41ce0010091a201c200441b60b6a290100370100200420042901b00b3701e20c200441f00c6a200441be0b6a41c00010091a200420013b01e00c200420273703d80c200441a00a6a200441d80c6a10ac0120042d00a00a2201410b460440200441880d6a290300212820042903800d2127200441f10a6a200641186a290000370000200441e90a6a200641106a290000370000200441e10a6a200641086a290000370000200441d90a6a200629000037000020044195c7f4a1073602b003200441a0066a220541003602002004420137039806200441b0036a220320044198066a220110a701200441b00b6a2206200441880c6a10a6012001200610a901200441c00a6a4200370300200441d00a6a2028370300200441840b6a2005280200360200200442003703b80a200441003a00d80a200420273703c80a200442003703a00a20042004290398063702fc0a200441e00b6a4200370300200442003703d80b200442023703c00b200442003703b00b2003200220082009200f2007200441a00a6a200610af0120042802b0032201450d0a200441b0036a20082009200120042802b80310b00120042802b0030440200441a4066a200441b8036a280200360200200420042903b00337029c062004410b3a0098060c0c0b200420042d00b4033a009906200441033a0098060c0b0b200441a0066a200441a80a6a290000370000200420042900a10a37009906200420013a0098060c0a0b200041810c3b01000c0f0b200041003a0000200041003602040c0e0b200420042d00e00c3a00a50a200441013a00a40a200441013602a00a0c080b200441ac0a6a200441e00c6a290000370000200420042900d90c3700a50a200420013a00a40a200441013602a00a0c070b200441ac0a6a2028370200200441a80a6a4100360200200441063a00a40a200441013602a00a0c060b200441043a00a40a200441013602a00a0c050b200441183a00a00a0c060b200441053a0098060c020b200420042d00a80a3a009906200441013a0098060c010b200420042d00b4033a009906200441023a0098060b200441d8086a20044198066a10b1012004027f20042d00d808410b460440200441e4066a200441e4086a280200360200200420042902dc083702dc0641190c010b200441e3066a200441e0086a280200360000200420042903d8083700db06200420042900d8063703a8052004200441df066a2900003700af05200420042903a8053703e804200420042900af053700ef0420042802e4082101200441e0066a20042900ef04370000200420042903e8043700d906200420013602e80641100b3a00d806200441d8056a200441d8066a41f58704411a100f20042d00d80522014119460440200441d0026a200441e4056a280200360200200420042902dc053703c8020c040b200420042900d905370398042004200441e0056a29000037009f04200441a0036a200429009f04370000200420013a009803200420042802e8053602a803200420042903980437009903200020044198036a10140c050b200441233602b40b200441a5b6053602b00b2004200441a00a6a4104723602880c200441e4066a4202370200200441e40c6a4107360200200441023602dc062004419cb5053602d806200441023602dc0c2004200441d80c6a3602e0062004200441880c6a3602e00c2004200441b00b6a3602d80c4101200441d8066a101220042802f80a211220042d00b00a210b20042d00ac0a211620042d00a80a211420042802a00a450b2105200441a6056a220120042d00a70a3a0000200441a2056a221f200441ab0a6a22152d00003a00002004419e056a2223200441af0a6a22112d00003a00002004419a056a221c200441b30a6a220d2d00003a0000200420042f00a50a3b01a405200420042f00a90a3b01a005200420042f00ad0a3b019c05200420042f00b10a3b01980520042d00a40a210a20042d00b40a210e20044196056a220c200441b70a6a2d00003a0000200420042f00b50a3b01940520044198066a200441b80a6a41c00010091a200441e8046a200441fc0a6a412c10091a02400240024002400240024020050440200441e6046a220a201f2d00003a0000200441e2046a220520232d00003a0000200441de046a2201201c2d00003a0000200441da046a220d200c2d00003a0000200420042f01a0053b01e404200420042f019c053b01e004200420042f0198053b01dc04200420042f0194053b01d804200441d8056a20044198066a41c00010091a200441a8056a200441e8046a412c10091a200441d6046a220c200a2d00003a0000200441d2046a220a20052d00003a0000200441ce046a220520012d00003a0000200420042f01e4043b01d404200420042f01e0043b01d004200420042f01dc043b01cc04200441ca046a2201200d2d00003a0000200420042f01d8043b01c80420044192096a200c2d00003a0000200420042f01d4043b019009200441fe096a200a2d00003a0000200420042f01d0043b01fc09200441e6096a20052d00003a0000200420042f01cc043b01e409200441e2096a20012d00003a0000200420042f01c8043b01e0092012450d05200441d8086a200441a8056a412c10091a20044198066a200441d8056a41c00010091a200441f0096a220c200441b0056a280200360200200420042902a8053703e809200441186a41204100101f200441ec086a2902002129200441f4086a290200212820042902e40821272004280218220d41186a220a200441fc086a290200370000200d2027370000200d41106a22052028370000200d41086a22012029370000200441f1066a200a290000370000200441e9066a2005290000370000200441e1066a20012900003700002004200d2900003700d906200441003a00d806200441e00c6a2201200441d8066a41c8b605411b41e4b60510b301200441203602dc0c200420023602d80c200441003602b80b2004428080013702a40a200441def1053602a00a20024120200441a00a6a220d10572001200d1055200420042903a00a3703b00b200441106a200441b00b6a20042802a80a1054200428021421052004280210210220042802b00b210a200420042802b40b22013602a00a410d20022005200a200d10081a200441086a200a200120042802a00a10b401200420042903083703880c200d410041c100100b200441880c6a200d41c10010630d01200441b8076a200441a00a6a220141c10010091a200441e3066a200441e6096a2d00003a0000200420143a00d806200420163a00dc062004200b3a00e006200420042f0190093b00d906200420044192096a2d00003a00db06200420042f01fc093b00dd062004200441fe096a2d00003a00df06200420042f01e4093b00e1062004200e3a00e406200441e7066a200441e2096a2d00003a0000200420042f01e0093b00e506200441e8066a20044198066a41c00010091a200441b4076a200c280200360200200420123602a807200420042903e8093702ac07200120034101103020042802a80a4120470d02200441003602a80a200441ba086a221120042802a00a220141026a2d00003a0000200420012f00003b01b8082001290007212720012d0003210e200441c00b6a221c2001411f6a2d00003a0000200441b80b6a220d200141176a2900003703002004200129000f3703b00b200441aa086a220c200141066a2d00003a0000200420012f00043b01a808200441f00c6a220b200641186a290000370300200441e80c6a220a200641106a290000370300200441e00c6a2205200641086a290000370300200420062900003703d80c2004418eefc2a30236029809200441f0046a22024100360200200442013703e80420044198096a200441e8046a221510a701200441880c6a2201200441d8066a10b5012015200110a901200441d30a6a200e3a0000200441d70a6a2027370000200441a80b6a2002280200360200200441d20a6a20112d00003a0000200441d40a6a20042f01a8083b0100200441d60a6a200c2d00003a0000200441df0a6a20042903b00b370000200441e70a6a200d290300370000200441ef0a6a201c2d00003a0000200420042903e8043703a00b200420042f01b8083b01d00a200441980b6a4200370300200441880b6a200b290300370300200441800b6a200a290300370300200441f80a6a2005290300370300200442003703900b200442003703a00a200442003703b80a200420042903d80c3703f00a200441b8086a200441a00a6a10aa0120042802b808210220042802c0082101200441003a00e804200441d80c6a2008200920022001201510ab0120042903d80c22274202510d0320042f01e00c2101200441880c6a200441e20c6a41ce0010091a201c2004418e0c6a290100370100200420042901880c3701ba0b200441c80b6a200441960c6a41c00010091a200420013b01b80b200420273703b00b200441d80c6a200441b00b6a10ac0120042d00d80c2201410b460440200441e00b6a290300212820042903d80b2127200441a90d6a200641186a290000370000200441a10d6a200641106a290000370000200441990d6a200641086a290000370000200441910d6a20062900003700002004418eefc2a30236029809200441f0046a22054100360200200442013703e80420044198096a2202200441e8046a220110a701200441880c6a2206200441d8066a10b5012001200610a901200441f80c6a4200370300200441880d6a2028370300200441bc0d6a2005280200360200200442003703f00c200441003a00900d200420273703800d200442003703d80c200420042903e8043702b40d200441b80c6a4200370300200442003703b00c200442023703980c200442003703880c2002200320082009200f2007200441d80c6a200610af012004280298092201450d0520044198096a20082009200120042802a00910b0012004280298090440200441f4046a200441a0096a28020036020020042004290398093702ec042004410b3a00e8040c080b200420042d009c093a00e904200441033a00e8040c070b200441f0046a200441e00c6a290000370000200420042900d90c3700e904200420013a00e8040c060b200441e6046a220320012d00003a0000200441e2046a2202201f2d00003a0000200441de046a220120232d00003a0000200441da046a2206201c2d00003a0000200420042f01a4053b01e404200420042f01a0053b01e004200420042f019c053b01dc04200420042f0198053b01d804200441d6046a220520032d00003a0000200420042f01e4043b01d404200441d2046a220320022d00003a0000200420042f01e0043b01d004200441ce046a220220012d00003a0000200420042f01dc043b01cc04200441ca046a220120062d00003a0000200420042f01d8043b01c804200420052d00003a00a70a200420042f01d4043b00a50a200420143a00a80a201520032d00003a0000200420042f01d0043b00a90a200420163a00ac0a201120022d00003a0000200420042f01cc043b00ad0a2004200b3a00b00a200d20012d00003a0000200420042f01c8043b00b10a2004200a3a00a40a200441113a00a00a0c060b41a4ca0541c900200441a00a6a41acc70541f0ca05102a000b200441053a00e8040c030b200420042d00e00c3a00e904200441013a00e8040c020b200420042d009c093a00e904200441023a00e8040c010b200441153a00a00a0c010b20044180086a200441e8046a10b10120042d008008410b460440200441ac0a6a2004418c086a28020036020020042004290284083702a40a200441193a00a00a0c010b200441ab0a6a20044188086a28020036000020042004290380083700a30a200420042900a00a3703800a2004200441a70a6a2900003700870a200420042903800a3703c009200420042900870a3700c709200428028c082101200441a80a6a20042900c709370000200420042903c0093700a10a200420013602b00a200441103a00a00a0b200441e8026a200441a00a6a41d68704411f100f20042d00e80222014119470d01200441d0026a200441f4026a280200360200200420042902ec023703c8020b200020042903c802370204200041003a00002000410c6a200441d0026a2802003602000c010b200420042900e9023703d8022004200441f0026a2900003700df0220044188036a20042900df02370000200420013a008003200420042802f80236029003200420042903d80237008103200020044180036a10140b200441c00d6a24000f0b200441ac0a6a4200370200200441013602a40a200441d4aa053602a00a20044188d8053602a80a200441a00a6a41ccad05103a000b200441ac0a6a4200370200200441013602a40a200441d4aa053602a00a20044188d8053602a80a200441a00a6a418cae05103a000bb70402047f037e230041c0026b2200240002400240102b41ff01712201410546044020004180800136027841def105200041f8006a100220002802782201418180014f0d012000200136027c200041def105360278200041003602080240200041f8006a200041086a410410630d0020002d000841ed01470d0020002d000941cb00470d0020002d000a419d01470d0020002d000b411b470d0020004188026a106720004198026a1028200020002802880220002802900241948404105a20002802044120470d032000280200220141086a2900002104200141106a29000021052001290000210620004190016a2202200141186a29000037030020004188016a2201200537030020004180016a22032004370300200041106a200041a0026a290300370300200041186a200041a8026a290300370300200041206a200041b0026a290300370300200020063703782000200029039802370308200041306a2003290300370300200041386a2001290300370300200041406b200229030037030020002000290378370328200041f8006a2201200041086a41ee0010091a200041023a00e60120011052230041206b22002400200042808001370214200041def105360210200041106a220141001056200141001056200041086a41def10541808001200028021841808204103641002000280208200028020c1059000b1051000b200020013a0078200041f8006a1038000b20014180800141eccb051037000b41a484044112200041b8026a419cd80541b88404102a000b950101027f0240027f410041d4f1052802002202200020016a41016b410020006b7122036a22002002490d001a41d8f1052802002000490440200341ffff036a22012003490d0220014110764000220041ffff034b0d022000411074220220014180807c716a22002002490d0241d8f10520003602004100200220036a22002002490d011a0b41d4f105200036020020020b0f0b41000ba708020f7f017e230041f0006b2202240020024100360220200242808001370264200241def1053602602001280200200141086a280200200241e0006a220410572001410c6a280200200141146a28020020041057200128021821032004200141206a280200220410bc02200404402003200441186c6a210403402003280200200341086a280200200241e0006a220510572003410c6a280200200341146a28020020051057200341186a22032004470d000b0b200141246a2802002001412c6a280200200241e0006a2201105720022002290360370318200241106a200241186a200228026810542002280214210420022802102105200228021821032002200228021c22063602604101200520042003200110081a200241086a20032006200228026041eccb05103620022002290308370328200241003b01600240200241286a2001410210630d0020022f01602108200241e0006a200241286a101a20022802602209450d002002280268210a2002280264210b2002200241286a10ba0220022802000d00024002400240200228022c41186e22012002280204220420012004491b2205450440410421010c010b200541d5aad52a4b0d01200541186c22034100480d01200541d6aad52a494102742003108b012201450d020b41002103200241003602382002200536023420022001360230200404400340200241d0006a200241286a101a2002280250220c450d042002280258210d2002280254210e200241e0006a200241286a101a2002280260450d04200241c8006a220f200241e8006a2802003602002002200229036037034020022802342003460440200241306a2105230041206b22012400027f4100200341016a2203450d001a4104200528020422064101742207200320032007491b2203200341044d1b220341186c2107200341d6aad52a494102742110024020060440200141043602142001200641186c360218200120052802003602100c010b200141003602140b200120102007200141106a10c30120012802004504402001280204210620052003360204200520063602004181808080780c010b200141086a280200210320012802040b200310c201200141206a240020022802382103200228023021010b2001200341186c6a2203200e3602042003200c360200200341086a200d3602002003410c6a2002290340370200200341146a200f2802003602002002200228023841016a2203360238200441016b22040d000b200228023021010b2001450d0220022902342111200241e0006a200241286a101c2002280260450d0220002002290360370218200041206a200241e8006a280200360200200020083b0124200020113702102000200136020c2000200a3602082000200b36020420002009360200200241f0006a24000f0b10c401000b20031074000b41a4ca0541c900200241e0006a41acc70541f0ca05102a000bbc0502067f027e2000027f02402002450d00200241076b22034100200220034f1b2107200141036a417c7120016b21084100210303400240024002400240027e02400240024002400240024002400240200120036a2d0000220441187441187522064100480440428080808080202109428080808010210a200441989d046a2d000041026b0e030104020c0b200820036b4103714504400240200320074f0d000340200120036a220441046a280200200428020072418081828478710d01200341086a22032007490d000b0b200220034d0d0d0340200120036a2c00004100480d0e2002200341016a2203470d000b0c0f0b200341016a21030c0c0b200341016a22042002490d01420021090c090b42002109200341016a22052002490d020c080b200120046a2c000041bf7f4a0d080c060b42002109200341016a220520024f0d06200120056a2c0000210502400240200441e001470440200441ed01460d012006411f6a41ff0171410c490d022006417e71416e470d0420054140480d050c040b200541607141a07f460d040c030b2005419f7f4a0d020c030b20054140480d020c010b200120056a2c000021050240024002400240200441f0016b0e050100000002000b2006410f6a41ff017141024b200541404e720d030c020b200541f0006a41ff017141304f0d020c010b2005418f7f4a0d010b200341026a220420024f0d05200120046a2c000041bf7f4a0d024200210a200341036a220420024f0d06200120046a2c000041bf7f4c0d04428080808080e0000c030b428080808080200c020b4200210a200341026a220420024f0d04200120046a2c000041bf7f4c0d020b428080808080c0000b2109428080808010210a0c020b200441016a21030c020b4200210a0b200020092003ad84200a8437020441010c030b200220034b0d000b0b20002001360204200041086a200236020041000b3602000b870101017f230041306b220124002001200036020c2001411c6a420137020020014102360214200141b88a043602102001410d36022c2001200141286a36021820012001410c6a360228230041206b220024002000200141106a36021420004198940436020c20004188d805360208200041003a0018200041c88a04360210200041086a10d201000b3b00200220034f044020002003360204200020013602002000410c6a200220036b3602002000200120036a3602080f0b41d3a20541232004107e000ba00102077f017e230041106b22032400024020024504400c010b200121072002210803402005200420061b200520072d000041df004722091b21054100200441016a20091b2104200741016a2107200620096a2106200841016b22080d000b0b200320012002200220046b41f49d051075200320032802002003280204200541849e0510752003290308210a200020063602082000200a370200200341106a24000baa0101037f230041206b22022400200241186a2203200141086a280200360200200220012902003703102002200241106a22041085022002280200210120032002410c6a2203280200360200200220022902043703102002200410870220002002290204370200200041086a20032802003602002002280200210320002001360218200041d09e0529020037020c200041146a41d89e052802003602002000200336021c200241206a24000bf70202047f027e230041306b22032400200341286a2204200141086a28020036020020032001290200370320200341106a200341206a1085022003280210210502402003411c6a22062802002201044020032902142107200341086a200241086a280200360200200320022902003703000c010b2004200241086a28020036020020032002290200370320200341106a200341206a108502200341086a41d89e05280200360200200341d09e05290200370300200328021020056a210520062802002101200329021421070b200341286a200341086a28020036020020032003290300370320200341106a200341206a10870220032802102102200329021421082003411c6a220428020022064504402003200136022820032007370320200341106a200341206a108702200328021020026a210220032902142107200428020021010b2000200236021c2000200837020c200020013602082000200737020020002005360218200041146a2006360200200341306a24000be402010a7f230041206b22042400200128020022092001280204220b6a2107200b2106200921082002210502400240034041002103034020032006460d02200320086a220c2d000041df00460440200520036b2105200a41016a210a200c41016a21082003417f7320066a21060c020b2005200341016a2203470d000b0b200620056b2103200520086a21070c010b4100210320052006460d00200441146a42003702002004410136020c200441b89e0536020820044188d805360210200441086a41c09e05103a000b200441086a2009200b2002200a6a41949e051075200320076a2106200428020c2108200428020821094100210502402003450d00034020072d000041df0047044020032105200721060c020b200741016a2107200341016b22030d000b0b2000200636020c200020023602082000200836020420002009360200200041106a2005360200200041146a200128020820026b360200200441206a24000bb80502097f067e230041c0016b220224000240200128021c2001280218200128021420012802086a6a6a22044180014b2203450440200241386a200141186a290200370300200241306a200141106a290200370300200241286a200141086a290200370300200220012902003703200c010b200241b8016a200141186a290200370300200241b0016a200141106a290200370300200241a8016a200141086a290200370300200220012902003703a001200241406b200241a0016a20044180016b107c200241286a200241e8006a290300370300200241306a200241f0006a290300370300200241386a200241f8006a290300370300200220022903603703200b20024198016a2204200241386a290300220b37030020024190016a2205200241306a290300220c37030020024188016a2206200241286a290300220d37030020022002290320220e37038001200241b8016a2207200b370300200241b0016a2208200c370300200241a8016a2209200d3703002002200e3703a001200241406b200241a0016a107d024020022802444504404200210b4200210c0c010b200241406b41047221014200210b4200210c03402006200141086a290200220d3703002005200141106a290200220e3703002004200141186a290200220f37030020022001290200221037038001200241106a200c4200420a4200100e2002200b4200420a4200100e20022d0040210a2007200f3703002008200e3703002009200d370300200220103703a00120034100200241186a2802006b41ff01712002290310220b200241086a2903007c220c200b5447722002290300427e83220d200a41306bad42ff01837c220b200d542203200c200c2003ad7c220c56200b200d5a1b722103200241406b200241a0016a107d20022802440d000b0b2000200c3703082000200b370300200020034101713a0010200241c0016a24000bb90102027f037e230041306b220324004201210602400240024020020e020201000b0340200341106a20014201200241017122041b2005420020041b20062007100e200341206a2001200520012005100e200241034b2104200341286a2903002105200341186a290300210720032903202101200329031021062002410176210220040d000b0b20032001200520062007100e200341086a2903002107200329030021060b2000200637030020002007370308200341306a24000b9f0b02087f037e230041e0006b22032400200341186a41f09e05290300220b370300200341106a41e89e05290300220c370300200341e09e05290300220d370308200341306a200141106a2204290200370300200341286a200141086a220729020037030020032001290200370320200128021c21060240027f0240024002402002200128021822054f044020022005460440410021042000410036021c20002002360218200041106a41f09e05290300370200200041086a41e89e05290300370200200041e09e0529030037020020002001290200370220200041286a200141086a290200370200200041306a200141106a2902003702000c060b200220056b220220012802082207490d0141002104200341346a41d89e05280200360200200341106a2208200141086a280200360200200341286a2209200141146a220a280200360200200320012902003703082003200129020c370320200341d09e0529020037022c20022007460440200020032903083702002000410036021c2000200536021820002003290320370220200041106a200341186a290300370200200041086a2008290300370200200041286a2009290300370200200041306a200341306a2903003702000c060b2001410c6a2101200220076b2202200a2802002204490d02200341286a220741d89e052802003602002003411c6a200141086a28020036020020032001290200370214200341d09e0529020037032020022004460440200020032903083702002000410036021c2000200536021820002003290320370220200041106a200341186a290300370200200041086a200341106a290300370200200041286a2007290300370200200041306a200341306a29030037020020060c050b2006200220046b22014b0d0320012006460440200020032903083702002000200636021c2000200536021820002003290320370220200041106a200341186a290300370200200041086a200341106a290300370200200041286a200341286a290300370200200041306a200341306a29030037020041000c050b200341d4006a42003702002003410136024c200341b89e0536024820034188d805360250200341c8006a41809f05103a000b2000410036021c20002002360218200041106a200b370200200041086a200c3702002000200d37020020002001290200370220200041286a2007290200370200200041306a2004290200370200200520026b21040c040b200341406b200141086a28020036020020032001290200370338200341c8006a200341386a20021079200341106a2201200341d0006a280200360200200341286a2202200341dc006a28020036020020032003290348220b37030820032003290254370320200041106a200341186a290300370200200041086a20012903003702002000200b370200410021042000410036021c2000200536021820002003290320370220200041286a2002290300370200200041306a200341306a2903003702000c030b200341406b200141086a28020036020020032001290200370338200341c8006a200341386a200210792003411c6a200341d0006a280200360200200341286a2201200341dc006a2802003602002003200329034837021420032003290254370320200041106a200341186a290300370200200041086a200341106a29030037020020002003290308370200410021042000410036021c2000200536021820002003290320370220200041286a2001290300370200200041306a200341306a2903003702000c020b200020032903083702002000200136021c2000200536021820002003290320370220200041106a200341186a290300370200200041086a200341106a290300370200200041286a200341286a290300370200200041306a200341306a290300370200200620016b0b2104410021060b2000413c6a2006360200200041386a2004360200200341e0006a24000bed0602057f017e230041d0006b220224000240024020012802182203450440200241206a2204200141086a28020036020020022001290200370318200241086a2203200241186a10860220034104722103200228020c450d0120022d00082105200241406b2206200341086a280200360200200220032902002207370338200241cc006a200141146a2802003602002002200129020c3702442002412b6a200241c8006a290300370000200241236a20062903003700002002200737001b200128021c2101200020053a000020002002290018370001200041096a2004290000370000200041116a200241286a290000370000200041186a2002412f6a280000360000200020013602202000410036021c0c020b200241406b2204200141086a280200360200200241cc006a200141146a2802003602002002200129020c370244200241236a20042903003700002002412b6a200241c8006a2903003700002002200129020037001b200128021c2101200041303a000020002002290018370001200041096a200241206a290000370000200041116a200241286a290000370000200041186a2002412f6a280000360000200020013602202000200341016b36021c0c010b2004200141146a2802003602002002200129020c370318200241086a200241186a108602200228020c044020022d00082104200241cc006a200341086a28020036020020022003290200370244200241406b2203200141086a2802003602002002412b6a200241c8006a290300370000200241236a20032903003700002002200129020037001b200128021c2101200020043a000020002002290018370001200041096a200241206a290000370000200041116a200241286a290000370000200041186a2002412f6a280000360000200020013602202000410036021c0c010b200128021c2203450440200041003602040c010b200241cc006a2001410c6a220441086a280200360200200241406b2205200141086a280200360200200220042902003702442002412b6a200241c8006a290300370000200241236a20052903003700002002200129020037001b200041303a000020002002290018370001200041096a200241206a290000370000200041116a200241286a290000370000200041186a2002412f6a2800003600002000200341016b3602202000410036021c0b200241d0006a24000b4601017f230041206b220324002003410c6a42003702002003410136020420034188d8053602082003200136021c200320003602182003200341186a36020020032002103a000b0c002000350200200110d4010bfa0701067f230041f0006b22042400200441286a41041031200428022c21052004280228220641eeeab1e306360000024020034504402004410436023820042006360230200420053602340c010b20044100360258200441cc006a4201370200200441013602442004418cd8053602402004410d3602642004200441e0006a3602482004200441d8006a360260200441306a200441406b10160b200441cc006a22084201370200200441023602442004418cd0053602402004410536025c2004200441d8006a3602482004200441306a360258200441e0006a2203200441406b2205101620052001200220031099020240024020042802402201044020042802482102200441d0006a420037030020044280808080103703482004200236024420042001360240200441206a200441406b105c4101210320042d0020410171450d0120042d002141fb00470d012004200428024841016a360248200441013a005c2004200441406b3602584100210141012106410021050340200441186a200441406b105c20042d0018410171450d0202400240024020042d00192202412c470440200241fd00460d0120014101710d060c020b2001410171450d012004200428024841016a360248200441106a200441406b105c20042d0010410171450d0520042d001121020c020b200620074520054572720d04200441406b106041ff01714113470d04200441406b109a0241ff01714113470d04200441086a20052009419cd00510b102200441406b2004280208200428020c109b02200428024022014504400c050b20042802484120470d04200041003a0000200041106a200129000f3700002000410c6a200128000b360000200041046a2001290003370000200041026a20012f00013b0000200020012d00003a0001200041186a200141176a290000370000200041206a2001411f6a2d00003a00000c050b200441003a005c0b200241ff01714122470d022004200441406b105c20042d0000410171450d0220042d00014122470d02200441003602542004200428024841016a360248200441e0006a200441406b2008109d0220042802604102460d0202400240200428026422012004280268220241a8d405410710414504402001200241b0d405410610410d012001200241b6d405410210410d0241012101200441d8006a109e0241ff01714113460d030c050b20070d04200441e0006a200441406b109f0241012101200428026022070d020c040b20050d03200441e0006a200441406b109f0220042802602205450d0320042802642109410121010c010b2006450d02200441e0006a200441406b10a202410021064101210120042d0060450d000b0c010b20042d004421030b200041013a0000200020033a00010b200441f0006a24000b5f01027f230041106b22022400024020012802002203450440200041023a00000c010b2002200128020836020c200220033602082002200241086a1027200042810220023502044220864280028420022802001b3702000b200241106a24000bff0202047f017e23004180016b22022400200241106a22032001412410091a200241c8006a200310a602024020022802484504402000410036020820004204370200200241106a1098010c010b200241086a4104200228023041016a2201417f20011b2201200141044d1b108801200241d0006a2802002101200228020c2104200228020822032002290348370200200341086a2001360200200241013602402002200436023c20022003360238200241c8006a2201200241106a412410091a200241f0006a200110a60220022802700440410c2101410121040340200228023c2004460440200241386a200228026841016a2203417f20031b108901200228023821030b20022903702106200120036a220541086a200241f8006a280200360200200520063702002002200441016a22043602402001410c6a2101200241f0006a200241c8006a10a60220022802700d000b0b200241c8006a109801200041086a200241406b280200360200200020022903383702000b20024180016a24000b9b0101027f230041306b22022400200241086a200110ab02024020022802082201450440200041003602000c010b200241206a220320012002280210410c6c6a2201410c6a2802003602002002412c6a20014190016a2802003602002000200141046a290200370200200220014188016a290200370224200041086a2003290300370200200041106a200241286a2903003702000b200241306a24000b2501017f230041106b2201240003402001200010ab0220012802000d000b200141106a24000b15002000200141d6aad52a411841d5aad52a10d1020b4201027f230041106b2202240020012000280204200028020822036b4b0440200241086a20002003200110aa022002280208200228020c10c2010b200241106a24000b7201027f20012802082103027f02402001280200220245044020030d0141000c020b200128020420026b410c6e22022003450d011a2001410c6a28020020036b410c6e20026a0c010b2001410c6a28020020036b410c6e0b21022000410136020420002002360200200041086a20023602000b17002000200141abd5aad500410c41aad5aad50010d1020bdd0101047f230041206b22022400200120002802042203200028020822046b4b0440027f4100200120046a22012004490d001a410420034101742205200120012005491b2201200141044d1b2201410c6c2105200141abd5aad5004941027421040240200304402002410436021420022003410c6c360218200220002802003602100c010b200241003602140b200220042005200241106a10c30120022802004504402002280204210320002001360204200020033602004181808080780c010b200241086a280200210120022802040b200110c2010b200241206a24000b6001037f230041106b22032400200341086a20021031200328020c21042003280208200120021009210120002000280204220541016a36020420002802082005410c6c6a220020023602082000200436020420002001360200200341106a24000b100041def1062d00001a2000200110710b15002000450440419cbd05412b2001107e000b20000b15002000200120022003109a0141ff017141ff01460b1300200020012002200320042005410c10cb020b3e01017f230041106b22052400200541086a41002003200120022004108e01200528020c21012000200528020836020020002001360204200541106a24000bad02010b7f230041106b220624002001200241016b4b0440200120024704400340200641086a4100200241016a22022000200141e8ae05108e012006280208220a200628020c2207410c6c6a2203410c6b22042802002208200441086a220b2802002209200341186b2205280200200541086a220c280200108d0104402004280204210d20042005290200370200200b200c280200360200027f200741026b22050440200341246b210303402003410c6a2204200820092003280200200341086a2207280200108d01450d021a20042003290200370200200441086a20072802003602002003410c6b2103200541016b22050d000b0b200a0b220420093602082004200d360204200420083602000b20012002470d000b0b200641106a24000f0b41f8ae05412e41a8af05107e000bc20101047f024020024102490d00024002400240200241037420016a220441086b2205280200220720052802046a2003460d00200441106b280200220520074d0d0020024103490d032001200241036b22034103746a2802002204200520076a4d0d0120024104490d03200241037420016a41206b280200200420056a4d0d010c030b20024103490d012001200241036b22034103746a28020021040b4101210620042007490d010b200241026b2103410121060b20002003360204200020063602000b5101017f230041206b22042400200120024d0440200441146a42003702002004410136020c200441d4aa0536020820044188d805360210200441086a2003103a000b200441206a2400200020024103746a0b2901017f4104418c01108b012200450440418c011074000b200041003b018a012000410036020020000b240020012003460440200220002001410c6c10091a0f0b41d8b10541284180b205107e000b0f00200020012002200310414101730bd80101067f230041206b220224002001280204210520012802002104410441bc01108b01220304402003200436028c01200341003b018a0120034100360200200241186a41003a000020024200370310200241086a200241106a10b802200228020804402003418c016a2106200228020c21040340200620044102746a280200220720043b018801200720033602002002200241106a10b8022002280204210420022802000d000b0b200120033602002001200541016a22013602042000200136020420002003360200200241206a24000f0b41bc011074000b4d01027f230041106b220224002002200110a602024020022802002203450440200041003602000c010b20002003200228020820012802242200280200200028020810a0010b200241106a24000b2501017f230041106b2201240003402001200010a70220012802000d000b200141106a24000b820202067f017e230041306b2202240002400240200128020022032001280204470440200128020c210620012003410c6a36020020032802002104200241086a200341086a28020022031031200228020820042003100921052002200310312002280204210420022802002005200310092107200241206a200128020820052003102620022d0020450d01200620022d00213a00000b200041003602000c010b2002411c6a2002412c6a2802002201360100200220022902242208370114200041146a20013600002000200837000c200041076a20044118763a0000200020044108763b000520002003360008200020043a0004200020073602000b200241306a24000b2900417f200020022001200320012003491b100c2200200120036b20001b220041004720004100481b0b1300200020012002200320042005411810cb020b3e01017f230041106b22052400200541086a41002003200120022004109b01200528020c21012000200528020836020020002001360204200541106a24000b9003010c7f230041206b220524002001200241016b4b0440200120024704400340200541086a4100200241016a22022000200141e8ae05109b012005280208220c200528020c220741186c6a220341186b2206280200220a200641086a2208280200220b200341306b2209280200200941086a2204280200109a0141ff017141ff014604402006280204210d200541186a220e200641146a2802003602002005200629020c3703102008200429020037020020062009290200370200200641106a200941106a290200370200027f200741026b22070440200341c8006b21030340200341186a2204200a200b2003280200200341086a2208280200109a0141ff017141ff01470d021a20042003290200370200200441106a200341106a290200370200200441086a2008290200370200200341186b2103200741016b22070d000b0b200c0b2204200d3602042004200a3602002004200b3602082004200529031037020c200441146a200e2802003602000b20012002470d000b0b200541206a24000f0b41f8ae05412e41a8af05107e000b2901017f4104419002108b0122004504404190021074000b200041003b018e022000410036020020000bd80101067f230041206b220224002001280204210520012802002104410441c002108b01220304402003200436029002200341003b018e0220034100360200200241186a41003a000020024200370310200241086a200241106a10b8022002280208044020034190026a2106200228020c21040340200620044102746a280200220720043b018c02200720033602002002200241106a10b8022002280204210420022802000d000b0b200120033602002001200541016a22013602042000200136020420002003360200200241206a24000f0b41c0021074000b3901017f230041106b220524002005410c6a2004360200200520033602082005200236020420052001360200200020051025200541106a24000bab0101077f024002402000450d000340200041fc006a2104200041046a210520002f018e022208410c6c2107417f2106034002402007450440200821060c010b200641016a21062004410c6a21042007410c6b2107200541086a21092005280200210a2005410c6a210520022003200a2009280200109a0141ff01710e020401000b0b2001450d01200141016b2101200020064102746a4190026a28020021000c000b000b410021040b20040b3301017f2001450440200041003602000f0b20012802002202450440200041003602000f0b20002002200141086a280200103b0b920301057f230041e0006b2202240002402001280200220320012802044704402001280214210520012003410c6a360200200241206a2003280200200328020820012802082203280200200328020810a001200241406b2001410c6a2802002201280200200141046a28020020022802202203200228022810a10110a201024002400240200241306a20022802402201047f2002200228024836025c200220013602582002200241d8006a102720022802000d01200228020441016a0541010b1024200228023045044020022d003421010c030b20022802242101200241cf006a200241386a2802002204360000200241176a2206200436000020022002290330370047200241106a2204200241c8006a290200370300200220022800253602402002200241286a2800003600432002200229024037030820030d010c020b410121010c010b20002002290308370005200041146a20062800003600002000410d6a2004290300370000200020013a0004200020033602000c020b200520013a00000b200041003602000b200241e0006a24000b0d0020012000200041206a10460b9c0201087f0240200141206a2802002205450440410421060c010b024002402005410c6c220241a4d5aad5024b0d00200541246c22034100480d0020012802182104200241a5d5aad50249410274200310a8022206450d01200220046a21094100210320062102034020042802002107200428020421082002410c6a2004280208360200200241086a2008360200200241046a2007200820071b36020020022007453a0000200241246a2102200341016a21032004410c6a22042009470d000b0c020b10c401000b20031074000b20002006360218200041206a20033602002000411c6a2005360200200020012902003702002000200129020c37020c200041086a200141086a280200360200200041146a200141146a2802003602000bc10201057f230041206b22022400200241086a200141206a280200220341246c2205200141146a2802002206200141086a28020022046a41186c6a410c6a4100101f200241003602182002200229030837031020012802002004200241106a220410b7022001410c6a2802002006200410b7022001280218210120042003108f022003044003400240024002400240024020012d000041016b0e03010203000b200241106a22034100108c02200141046a2802002001410c6a280200200310a8010c030b200241106a22034101108c02200141046a280200200310210c020b200241106a22034102108c02200141016a200310a4010c010b200241106a22034103108c02200141016a200310a4010b200141246a2101200541246b22050d000b0b20002002290310370200200041086a200241186a280200360200200241206a24000b0d0020012000200041046a10460b110020022001108f0220022000200110450b3c01037f2001280200210320002001280208220210c0012000280208220420002802006a2003200210091a200141003602082000200220046a3602080bc10202047f027e230041206b22032400410121022001290300220650450440417f200141086a1091022202200141106a1091026a2205200220054b1b41016a21020b200341086a417f20014188016a2802002205417f417f200241d0006a2204200220044b1b22024101411120012903182207501b6a2204200220044b1b22026a41046a2204200220044b1b4100101f2003410036021820032003290308370310200141306a200341106a220210a401200141d0006a200210a4012001290370200141f8006a2903002002108e0202402006500440200341106a4100108c020c010b200341106a22024101108c02200141086a20021096020b2007200141206a290300200141286a290300200341106a220210222001280280012005200210a801200041086a200341186a28020036020020002003290310370200200341206a24000be10e02047f087e230041d0016b22062400200641b8016a220820032004109702200641a4016a42013702002006410536028c012006410136029c0120064194d805360298012006200836028801200620064188016a3602a001200641e8006a20064198016a1016200641e0006a41041031200628026421032006280260220441eeeab1e306360000024020052d00004504402006410436028001200620043602782006200336027c0c010b200641b0016a200541196a290000370300200641a8016a200541116a290000370300200641a0016a200541096a2900003703002006200529000137039801200641c4016a4201370200200641023602bc012006419cce053602b8012006411136028c01200620064188016a3602c001200620064198016a36028801200641f8006a200641b8016a10160b200641c4016a4105360200200641a4016a220842023702002006410336029c01200641eca90536029801200641053602bc012006200641b8016a3602a0012006200641f8006a3602c0012006200641e8006a3602b80120064188016a220320064198016a220410162004200120022003109902024002402006280298012201044020062802a0012102200641a8016a420037030020064280808080103703a0012006200236029c012006200136029801200641d8006a20064198016a105c024020062d0058410171450d0020062d005941fb00470d00200620062802a00141016a3602a001200641013a008c01200620064198016a36028801410021044100210241002103410021010340200641d0006a20064198016a105c20062d0050410171450d0102400240024020062d00512205412c470440200541fd00460d0120044101710d050c020b2004410171450d01200620062802a00141016a3602a001200641c8006a20064198016a105c20062d0048410171450d0420062d004921050c020b200145200245720d0320064198016a106041ff01714113470d0320064198016a109a0241ff01714113470d032009410020031b220145044020004202370300200041013a00080c060b02400240200741024d044020074102460d010c090b20012c000241bf7f4c0d080b20064198016a200141026a200741026b109b022006280298012201450d00200620062802a0013602bc01200620013602b80120064198016a200641b8016a109c0202402006290398014200520d00200641a8016a2201290300210d20062903a001210e20064198016a200641b8016a109c0220062903980150450d002001290300210f20062903a0012110200641406b200641b8016a106520062d00404101710d000240024020062d00410e020100020b4201210b0b200641286a200641b8016a1064200628022822010d00200641386a290300210a2006290330210c20064198016a200641b8016a101c2006280298012203450d0020062802a0012104200628029c012105200641206a200641b8016a102720062802200d0020062802242107200641186a200641b8016a106520062d00184101710d00027e0240024020062d00190e020100030b200641b8016a10ad010d024100210242000c010b20064198016a200641b8016a101c2006280298012202450d01200629029c010b2111200020043600502000200536004c20002003360048200020113700402000200236003c200020073600382000200f370030200020103700282000200d3700202000200e370018200041176a200a4238883c0000200041156a200a4228883d0000200041116a200a4208883e00002000200a423886200c420888843700092000200c3c000820004202200b20011b3703000c070b20004202370300200041053a00080c060b20004202370300200041013a00080c050b200641003a008c010b200541ff01714122470d01200641106a20064198016a105c20062d0010410171450d0120062d00114122470d01200641003602ac01200620062802a00141016a3602a001200641b8016a20064198016a2008109d0220062802b8014102460d010240024020062802bc01220420062802c001220541a8d405410710414504402004200541b0d405410610410d012004200541b6d405410210410d024101210420064188016a109e0241ff01714113460d030c040b20010d03200641b8016a20064198016a109f024101210420062802b80122010d020c030b20030d0220064198016a104e41ff01714113470d02200641086a20064198016a105c20062d0008410171450d0220062d000941ee00460440200620062802a00141016a3602a001417d2105034020054504404101210441002109410121030c040b200620064198016a10a00220062d0000410171450d04200541ffcb056a2103200541016a210520032d000020062d0001460d000b0c030b200641b8016a20064198016a10a10220062802b8012209450d0220062802bc01210741012104410121030c010b20020d01200641b8016a20064198016a10a202410121044101210220062d00b801450d000b0b20004202370300200041013a00080c010b20062d009c01210120004202370300200020013a00080b200641d0016a24000f0b20012007410220074184aa051047000ba20101047f230041106b220324000240027f024002402001280238220241800247044020020d012000410b3a00000c040b2001413c6a28020022020d0141090c020b200020023602042000410a3a00000c020b200341086a200141c4006a28020022011031200328020c2104200328020822052002200110091a41080b21022000200136000c2000200436000820002005360004200020023a00000b200341106a24000b3601027f230041106b22012400200141086a2000106520012d0008210020012d00092102200141106a240020022000410171724100470bd30302027f017e230041406a22022400200241086a20011065024020022d000841017104402000410b3a00000c010b02400240024002400240024002400240024002400240024020022d00090e0b000102030405060708090b0a0b410b21032000200110a30241ff01712201410747047f200020013a0001410005410b0b3a00000c0b0b410b21032000200110a30241ff01712201410747047f200020013a0001410105410b0b3a00000c0a0b410b21032000200110a30241ff01712201410747047f200020013a0001410205410b0b3a00000c090b410b21032000200110a30241ff01712201410747047f200020013a0001410305410b0b3a00000c080b200041043a00000c070b200041053a00000c060b200041063a00000c050b200041073a00000c040b200241206a2001101c2000027f20022802200440200241386a200241286a28020022033602002002411c6a20033600002002200229032022043703302002200437001420002002290011370001200041086a200241186a29000037000041080c010b410b0b3a00000c030b200041093a00000c020b2000410b3a00000c010b200220011027410b210120002002280200047f410b0520002002280204360204410a0b3a00000b200241406b24000baf4c021a7f087e23004190106b22082400200841c0036a4105103120082802c003210920082802c403210a200841003602c00e2008200a3602bc0e200820093602b80e200841003602d00f200841c6dd053602cc0f200841c1dd053602c80f4100210a024002400240200841c80f6a10c701220b418080c40047047f41c6dd05210e41c1dd05210f0340200820082802d00f220c200e6a200f20082802cc0f220e6a6b20082802c80f220f6a3602d00f0240200b41a3074604400240200c450d00200c41054f0440200c4105460d010c070b200c41c1dd056a2c000041bf7f4c0d060b200c41c1dd056a2109410021110240034041948d042110200941c1dd05460d01200941016b220b2d0000220a411874411875220d4100480440200d413f71027f200941026b220b2d0000220a411874411875220d41404e0440200a411f710c010b200d413f71027f200941036b220b2d0000220a411874411875220d41404e0440200a410f710c010b200d413f71200941046b220b2d0000410771410674720b410674720b41067472220a418080c400460d020b027f0240201141ff01710d00200a108302450d00418080c400210a41000c010b41010b2111200b2109200a418080c400460d000b200a108402450d000240200c41026a2209450d00200941054f044020094105460d010c070b200941c1dd056a2c000041bf7f4c0d060b200841003a00c005200841c6dd053602bc052008200941c1dd056a3602b80502400340200841b8056a10c7012209418080c400460d0120091083020d000b20091084020d010b41968d0421100b200841b80e6a2010201041026a10460c010b02400240200b4180014f04404100210941ff0a211141ff0a210a03400240200b201141017620096a220c410374220d41f8c4046a28020022104d0440200c210a200b2010470d01200d41fcc4046a280200220b418080c40047200b4180b00373418080c4006b418090bc7f4f710d05200b41ffffff0171410c6c220941f49c056a280200220a0d0441e900210b0c050b200c41016a21090b200a20096b21112009200a490d000b0c020b200b41c1006b41ff0171411a49410574200b72210b0c010b200841b80e6a220c41e90010bd01200c200a10bd01200941f09c056a280208220b450d010b200841b80e6a200b10bd010b200841c80f6a10c701220b418080c400470d000b20082802c00e210a20082802b80e0520090b200a41b1cd05410510412109200841b8056a41ece50541f80810091a200841b40e6a418f01360200410541dfe20541c6dd0520091b41dae20541c1dd0520091b220c6b2209200941054f1b210e4100210902400240024002400240024003402008200941016a220a3602b00e0240200841b8056a20094103746a220928020441054604402009280200210b41002109024003402009200e460d012009200c6a210d2009200b6a2110200941016a210920102d0000221041c1006b41ff0171411a49410574201072200d2d0000220d41c1006b41ff0171411a49410574200d72460d000b2012200941016b200e4922096a211220090d020b2012418f014f0d054101210a200841c80f6a200141011030201241017441c0da056a2f0100210920082802d00f4120470d03200841c1056a20082802c80f220a41086a290000370000200841c9056a200a41106a290000370000200841d1056a200a41186a2900003700002008200a2900003700b9054100210a0c040b201241016a21120b200a2209418f01470d000b20004100360200200041033a00040c040b200841c4056a200841d00f6a280200360200200820082903c80f3702bc050b2008200a3a00b805200841c8036a200841b8056a4194aa05411c41b0aa0510b3012008027f2009413f4d0440410110af02220b20093a000041010c010b410210af02220b20094106742009410876723a0001200b200941fc017141027641c000723a000041020b2209360290042008200936028c042008200b3602880420084188046a200841c8036a200841e8036a104620082802880421094100210e200841b8036a200828029004220a41076a4100101f200841003602a00f200820082903b8033703980f200841980f6a220c41aacd0541b1cd051046200c2009200a104520082802a00f210920082802980f210a200841003a00e506200841b8056a220c410041a001100b200841003602e006200841013a00ea0620084181023601e606200842003703d806200841c0003a00e406200841c80f6a220b200c200a200910b002200841b0036a200b10d00120082802b40341c000460440200841b80e6a220920082802b00341c000100a20084188046a2009200841ba0e6a1046200828028804211002402008280290042209450d000340200e20106a2d00000d012009200e41016a220e470d000b2009210e0b200841a8036a2009200e6b418a016c41e4006e220a41016a220b4101101f20082802a803210d2009200e4d0d02200e20092009200e491b2113200e210f200a210c03400240200f20106a2d0000211102400240200a200c4b0440200a21090c010b200a21092011450d010b0340200d200b200941cc8e0410c90121122009200a4b0d022009200d6a20122d000041087420116a22122012413a6e2211413a6c6b3a0000200941016b22154100200920154f1b2209200c4b201241394b720d000b0b2009210c200f41016a220f2013470d010c040b0b2009200b41dc8e041044000b0c060b2012418f0141b0da051044000b41002109024003402009200d6a2d00000d01200b200941016a2209470d000b200b21090b200841003602c005200842013703b805200e04400340200841b8056a413110c801200e41016b220e0d000b0b2009200a4d04402009200b2009200b4b1b210e0340200d200b200941ac8e0410c9012d0000220a41394b0d03200841b8056a200a41988d046a2d000010c801200e200941016a2209470d000b0b20082802c005211c20082802b805211d200841a0036a413e103120082802a403210920082802a0034188cf05413e1009210a2008413e3602c005200820093602bc052008200a3602b805200841c80f6a20022003200841b8056a109902024020082802c80f2209044020082802d00f210a200841c8056a420037030020084280808080103703c0052008200a3602bc05200820093602b80520084198036a200841b8056a105c4101210d20082d009803410171450d0120082d00990341fb00470d01200820082802c00541016a3602c005200841013a008c042008200841b8056a2209360288044100210b410021134100210e410021154100211203402009410c6a211002400240034020084190036a2009105c20082d009003410171450d0502400240024020082d009103220a412c470440200a41fd00460d01200b4101710d090c020b200b410171450d012009200928020841016a36020820084188036a2009105c20082d008803410171450d0820082d008903210a0c020b201545201245200e4572720d07200841b8056a106041ff01714113470d07200841b8056a109a0241ff01714113470d07201641ff01712013722115200841003602c005200842043703b80502402014450d00200f2014410c6c6a21120340200f2802002209450d01200f280208211020084180036a200f280204220a10312008280280032009200a10092109200841f8026a200a103120082802fc02211120082802f8022009200a1009211420082802c005220b20082802bc05460440200841b8056a210d230041206b22092400027f4100200b41016a220c450d001a4104200d280204220b4101742213200c200c2013491b220c200c41044d1b220c4104742113200c41808080c0004941027421160240200b04402009200d280200360210200941043602142009200b4104743602180c010b200941003602140b200920162013200941106a10c30120092802004504402009280204210b200d200c360204200d200b3602004181808080780c010b200941086a280200210c20092802040b200c10c201200941206a240020082802c005210b0b20082802b805200b4104746a22092011410876220c3b00052009201036020c200920113a000420092014360200200941076a200c4110763a0000200941086a200a3600002008200b41016a3602c005200f410c6a220f2012470d000b0b200841f0026a2015103120082802f002200e201510092109200841e8026a2015103120082802e8022009201510091a200841e0026a2017103120082802e0022018201710092109200841d8026a2017103120082802d8022009201710091a200841b8056a200220034101108001024002400240024020082d00b805450440200841f1036a200841c2056a290100370000200841f9036a200841ca056a29010037000020084180046a200841d1056a290000370000200820082901ba053700e903200820082d00b90522163a00e8032007290310222250450d01200841e9036a21090c020b20082d00b905210120004100360200200020013a00040c0c0b200841b8056a20022003410010800120082d00b805044020082d00b90521090c030b200841bf046a2209200841d1056a290000370000200841b8046a220a200841ca056a290100370300200841b0046a200841c2056a2901002223370300200820082901ba0522253703a80420082d00b9052116200841df0f6a220c2009290000370000200841d80f6a2209200a290300370300200841d00f6a220a2023370300200820253703c80f200841d0026a4104103120082802d00241eeeab1e306360000200841c1056a200a290300370000200841c9056a2009290300370000200841d0056a200c290000370000200820163a00b805200820082903c80f3700b905200841c40e6a4201370200200841023602bc0e2008419cce053602b80e2008411136028c04200820084188046a220b3602c00e2008200841b8056a220936028804200841980f6a220f200841b80e6a220a1016200841c4056a220c4201370200200841023602bc05200841ecd0053602b8052008410536028c042008200b3602c0052008200f36028804200a20091016200920022003200a10990220082802b8052209450d0120082802c005210a200841c8056a420037030020084280808080103703c0052008200a3602bc05200820093602b805200841c8026a200841b8056a105c024020082d00c802410171450d0020082d00c90241fb00470d00200820082802c00541016a3602c005200841013a00bc0f2008200841b8056a3602b80f4100210a410021194100210f410021144100210d410021130340200841c0026a200841b8056a105c20082d00c002410171450d0102400240024020082d00c1022209412c470440200941fd00460d01200a4101710d050c020b200a410171450d01200820082802c00541016a3602c005200841b8026a200841b8056a105c20082d00b802410171450d0420082d00b90221090c020b201445201345200d4572720d03200841b8056a106041ff01714113470d03200841b8056a109a0241ff01714113470d03200841b0026a200d200f41ff0171201972418cd10510b102200841b8056a20082802b00220082802b402109b024101210920082802b805450d0620082802c005210a200841a8026a20102018419cd10510b102200841b8056a20082802a80220082802ac02109b0220082802b805450d0620082802c005210c200841a0026a200e201541acd10510b102200841b8056a20082802a00220082802a402109b0220082802b805450d0602400240200a412046044020082802c005210e20084198026a2012201741bcd10510b102200828029c02220a4504404100210d0c020b02400240024020082802980222092d0000412b6b0e03010200020b4101210d20084190026a2009200a410141d0930410cb012008280294020d010c030b4101210d20084188026a2009200a410141d0930410cb01200828028c02450d0220084180026a2009200a410141e0930410cb01200828028402210a20082802800221090b0240200a41094f04404100210b0340200841f8016a20092d000010f80120082802f8014504404101210d0c050b4102210d200b41ffffffff004b0d04200b410474220f20082802fc016a220b200f490d04200941016a2109200a41016b220a0d000b0c010b200a4504404100210b0c010b4101210d0340200841f0016a20092d000010f80120082802f001450d03200941016a2109200a41016b220a0d000b20082802f401210b0b200c4120460d020b410121090c080b2008200d3a00b80541ccd1054115200841b8056a41bcc70541e4d105102a000b41012109200e4120470d0620224202510440200b410371ad2125420121264104210a42002122200841a8046a21090c050b20073500192007411f6a3100004230862007411d6a33000042208684842122200741186a2d0000210a2007290020212542012126200841a8046a21090c040b200841003a00bc0f0b200941ff01714122470d01200841e8016a200841b8056a105c20082d00e801410171450d0120082d00e9014122470d01200841003602cc05200820082802c00541016a3602c005200841b80e6a200841b8056a200c109d0220082802b80e4102460d010240024020082802bc0e220920082802c00e220a41a8d405410710414504402009200a41b0d405410610414504402009200a41b6d405410210410d024101210a200841b80f6a109e0241ff01714113460d040c050b200d0d04200841b8056a104e41ff01714113470d04200841e0016a200841b8056a105c20082d00e001410171450d0420082d00e10141fb00470d04200820082802c00541016a3602c005200841013a008c042008200841b8056a360288044100210a4100210e41002110410021124100210d0340200841d8016a200841b8056a105c20082d00d801410171450d0502400240024020082d00d9012209412c470440200941fd00460d01200a4101710d090c020b200a410171450d01200820082802c00541016a3602c005200841d0016a200841b8056a105c20082d00d001410171450d0820082d00d10121090c020b200d4520124572201045200e4572720d07200f41807e7121194101210a200841b8056a106041ff01714113460d060c070b200841003a008c040b200941ff01714122470d05200841c8016a200841b8056a105c20082d00c801410171450d0520082d00c9014122470d05200841003602cc05200820082802c00541016a3602c005200841b80e6a200841b8056a200c109d0220082802b80e4102460d05024002400240024020082802bc0e220920082802c00e220a41c0d405410a10410d002009200a41d0d405410b10410d002009200a41e0d405410610410d012009200a41f0d405410910410d022009200a4180d505410a10410d022009200a4190d505410e10410d032009200a41a0d505410f10410d034101210a20084188046a109e0241ff01714113460d040c090b200d0d08200841b80e6a200841b8056a109f0220082802b80e220d450d0820082802bc0e210f4101210a0c030b20120d07200841b80e6a200841b8056a109f0220082802b80e2212450d0720082802bc0e21174101210a0c020b20100d06200841b80e6a200841b8056a109f0220082802b80e2210450d0620082802bc0e21184101210a0c010b200e0d05200841b80e6a200841b8056a109f0220082802b80e220e450d0520082802bc0e21154101210a0c000b000b2013450d010c030b20140d02200841b80e6a200841b8056a10a2024101210a4101211420082d00b80e450d010c020b200841b80e6a200841b8056a109f024101210a20082802b80e22130d000b0b200841013a00b80541ccc705412b200841b8056a41f8c70541fcd005102a000b200841a0046a200941176a29000037000020084199046a200941106a29000037000020084191046a200941086a290000370000200820163a0088042008200929000037008904200741306a2903002127200729032821280240200729030050450440200729030821240c010b2008201c36029c0f2008201d3602980f200841c4056a220e4201370200200841023602bc05200841f8ce053602b805200841023602bc0e2008200841b80e6a3602c0052008200841980f6a3602b80e200841c80f6a2207200841b8056a220910162009200220032007109902024020082802b8052202044020082802c0052103200841c8056a420037030020084280808080103703c005200820033602bc05200820023602b805200841c0016a200841b8056a105c4101211020082d00c001410171450d0120082d00c10141fb00470d01200820082802c00541016a3602c005200841013a00bc0e2008200841b8056a3602b80e4100210b4101210c42002123410021020340200841b8016a200841b8056a105c20082d00b801410171450d0202400240024020082d00b90122092203412c470440200341fd00460d01200b4101710d060c020b200b410171450d01200820082802c00541016a3602c005200841b0016a200841b8056a105c20082d00b001410171450d0520082d00b10121090c020b20024520235072200c724101710d04200841b8056a106041ff01714113470d04200841b8056a109a0241ff01714113470d040c050b200841003a00bc0e0b200941ff01714122470d02200841a0016a200841b8056a105c20082d00a001410171450d0220082d00a1014122470d02200841003602cc05200820082802c00541016a3602c005200841c80f6a200841b8056a200e109d0220082802c80f4102460d020240024020082802cc0f220320082802d00f220741a8d405410710414504402003200741b0d405410610410d012003200741b6d405410210410d024101210b200841b80e6a109e0241ff01714113460d030c050b20020d04200841c80f6a200841b8056a109f024101210b20082802c80f22020d020c040b202350450d03200841b8056a104e41ff01714113470d0320084198016a200841b8056a105c20082d0098014101712203450d030240024020082d009901410420031b220341ff0171412d6b0e0405010100010b4101210b200820082802c00541016a3602c00542012123420021240c020b200341316b41ff017141094f0d034101210b200820082802c005220741016a3602c005200341306bad42ff0183212420084190016a200841b8056a105f4201212320082d009001410171450d0120082d009101220d2203413049200341394b720d01200741026a21090340200820093602c00520084180016a20244200420a4200100e2008290388014200520d042008290380012229200d41306bad42ff01837c22242029540d04200841f8006a200841b8056a105f20082d0078410171450d0220082d0079220d22034130490d02200941016a21092003413a490d000b0c010b200c410171450d02200841c80f6a200841b8056a10a2024100210c4101210b20082d00c80f450d000b0c010b20082d00bc0521100b20004100360200200020103a00040c0b0b200841c8046a2202200641e80010091a200820053a00b105200820043a00b005200841e00e6a2027370300200820223e00c10e200841c70e6a20224230883c0000200841c50e6a20224220883d0000200820283703d80e200820243703d00e200820253703c80e2008200a3a00c00e200820263703b80e200841003602800f200842013703f80e2002200841f80e6a220210ad02200841b80e6a200210b202201e20021021201f20021021200841e8036a200210a40120084188046a200210a4010240024020082802800f22024180024d0440200841880f6a20082802f80e2002200110b3020c010b20082802f80e2103200841003a00e506200841b8056a2204410041a001100b200841003602e006200841013a00ea0620084181023601e606200842003703d806200841203a00e406200841c80f6a220520042003200210b002200841a8016a200510d00120082802ac014120470d0120082802a801220241086a2900002122200241106a290000212420022900002123200841b00f6a200241186a290000370300200841a80f6a2024370300200841a00f6a2022370300200820233703980f200841880f6a200841980f6a4120200110b3020b20082802900f41c00046044020082802880f22012d00002103200841c80f6a2202200141016a413f10091a200841b8056a22044102722002413f10091a200820033a00b905200841013a00b805200841e10f6a200841e0036a290000370000200841d90f6a200841d8036a290000370000200841d10f6a200841d0036a290000370000200820082900c8033700c90f200841003a00c80f200841003602c00f200842013703b80f418401200841b80f6a220110202002200110ae0220014101108c0220012004410172200841f9056a1046200841b80e6a200110b202200841c8046a200110ad02200820082802c00f22013602c40f200841a00f6a22024100360200200842013703980f200841c40f6a200841980f6a220310900220082802b80f21042003200110c0012002280200220220082802980f6a2004200110091a200041086a200120026a360200200020082903980f3702000c0c0b20004100360200200041023a00040c0b0b0c0e0b20082d00bc0521090b20004100360200200020093a00040c080b200841003a008c040b200a41ff01714122470d05200841f0006a2009105c20082d0070410171450d0520082d00714122470d05200941003602142009200928020841016a360208200841c80f6a20092010109d0220082802c80f4102460d0520082802cc0f220a20082802d00f220c41a8d405410710410d01200a200c41b0d40541061041450440200a200c41b6d405410210410d034101210b20084188046a109e0241ff01714113460d010c060b0b200e0d042008280288042209104e41ff01714113470d04200841e8006a2009105c20082d0068410171450d0420082d006941fb00470d042009200928020841016a360208200841013a009c0f200820093602980f200841e0006a2009105c20082d0060410171450d0420082d0061210b4100210e410021184100211341002119410021104100211a4100211b4100210f410021112009210a0340024002400240200b41ff0171220c412c470440200c41fd00460d0120114101710d090c020b2011410171450d01200a200a28020841016a360208200841d8006a200a105c20082d0058410171450d0820082d0059210b0c020b200e45201845722013452019457272201045200f4572201a45201b457272720d07201641807e7121134101210b2009106041ff01714113460d050c070b200841003a009c0f0b200b41ff01714122470d05200841d0006a200a105c20082d0050410171450d0520082d00514122470d05200a41146a4100360200200a200a28020841016a360208200841c80f6a200a200a410c6a109d0220082802c80f4102460d0502400240024002400240024002400240024020082802cc0f220c20082802d00f220b41b0d505410810410d00200c200b41c0d505410910410d00200c200b41d0d505410810410d01200c200b41e0d505410910410d01200c200b41f0d505411010410d02200c200b4180d605411110410d02200c200b41a0d605410b10410d03200c200b41b0d605410c10410d03200c200b41c0d605410b10410d04200c200b41d0d605410c10410d04200c200b41dcd605410410410d05200c200b41e0d605411210410d06200c200b4180d705411310410d06200c200b41a0d705410c10410d07200c200b41b0d705410d10410d07200841980f6a109e0241ff01714113470d0e0c080b200e0d0d200841c80f6a20082802980f220a109f0220082802c80f220e450d0d20082802cc0f21160c070b20180d0c200841c80f6a20082802980f220a109f0220082802c80f2218450d0c20082802cc0f21170c060b20130d0b200841c80f6a20082802980f220a10a2024101211320082d00c80f450d050c0b0b20190d0a200841c80f6a20082802980f220a10a20220082d00c80f0d0a20082802cc0f211e410121190c040b20100d09200841c80f6a20082802980f220a10a2024101211020082d00c80f450d030c090b200f0d0820082802980f220a104e41ff01714113470d08200841c8006a200a105c20082d0048410171450d0820082d004941db00470d08200a200a28020841016a360208200841003602d00f200842043703c80f200841406b200a105c20082d0040410171450d0820082d0041210b4104210f410021144101210c034002400240200b41ff01712211412c470440201141dd00460d02200c450d0c4100210c0c010b200a200a28020841016a360208200841386a200a105c20082d0038410171450d0b20082d0039210b0b200b41ff017141dd00460d0a200841306a200a105c20082d0030410171450d0a20082d003141db00470d0a200a200a28020841016a360208200841286a200a105c20082d0028410171450d0a027f20082d0029220b412c470440200b41dd00460d0c41010c010b200a200a28020841016a360208200841206a200a105c20082d0020410171450d0b20082d0021210b41000b2120200b41ff017141dd00460d0a200841b80e6a200a10a10220082802b80e2221450d0a20082802bc0e210b200841186a200a105c20082d0018410171450d0a024020082d00192211412c470440201141dd00460d0c2020450d010c0c0b200a200a28020841016a360208200841106a200a105c20082d0010410171450d0b20082d001121110b201141ff017141dd00460d0a200841b80e6a200a10b40220082d00b80e0d0a20083502bc0e2122200a10b50241ff01714113470d0a20082802cc0f2014460440200841c80f6a201410b60220082802d00f211420082802c80f210f0b200f2014410c6c6a2211200b41ff0171ad200b41807e71ad2022422086848437020420112021360200200820082802d00f41016a22143602d00f200841086a200a105c20082d0009210b20082d00084101710d010c0a0b0b200f450d08200a10b50241ff01714113460d020c080b201a0d07200841c80f6a20082802980f220a10a20220082d00c80f0d0720082802cc0f211f4101211a0c010b201b0d06200841c80f6a20082802980f220a10a2024101211b20082d00c80f0d060b2008200a105c4101211120082d0001210b20082d00004101710d000b0c040b20120d03200841c80f6a2008280288042209109f024101210b20082802c80f22120d010c030b20150d02200841c80f6a200828028804220910a2024101210b4101211520082d00c80f450d000b0c010b20082d00cc0f210d0b200041003602002000200d3a00040b20084190106a24000f0b200a413a41bc8e041044000b41c1dd0541052009410541848d041047000b41c1dd0541054100200c41f48c041047000b41acd8054124200841b80f6a419cd80541b4d905102a000bb20601057f230041f0006b22052400200541306a220620032004109702200541cc006a2208420137020020054102360244200541bcd2053602402005410536025c2005200541d8006a36024820052006360258200541e0006a2203200541406b2204101620042001200220031099020240024020052802402201044020052802482102200541d0006a420037030020054280808080103703482005200236024420052001360240200541286a200541406b105c4101210120052d0028410171450d0120052d002941fb00470d012005200528024841016a360248200541013a005c2005200541406b3602584100210341012106410021020340200541206a200541406b105c20052d0020410171450d0202400240024020052d00212204412c470440200441fd00460d0120034101710d060c020b2003410171450d012005200528024841016a360248200541186a200541406b105c20052d0018410171450d0520052d001921040c020b200620074520024572720d04200541406b106041ff01714113470d04200541406b109a0241ff01714113470d04200541106a2002200941ccd20510b102200541406b20052802102005280214109b02200528024045044020004280808080103702000c060b20002005290340370200200041086a200541c8006a2802003602000c050b200541003a005c0b200441ff01714122470d02200541086a200541406b105c20052d0008410171450d0220052d00094122470d02200541003602542005200528024841016a360248200541e0006a200541406b2008109d0220052802604102460d0202400240200528026422032005280268220441a8d405410710414504402003200441b0d405410610410d012003200441b6d405410210410d0241012103200541d8006a109e0241ff01714113460d030c050b20070d04200541e0006a200541406b109f0241012103200528026022070d020c040b20020d03200541e0006a200541406b109f0220052802602202450d0320052802642109410121030c010b2006450d02200541e0006a200541406b10a202410021064101210320052d0060450d000b0c010b20052d004421010b20004100360200200020013a00040b200541f0006a24000ba20101017f230041406a220224002002412336020c200241a5b60536020820012d0000410b47044020022001360214200241246a42023702002002413c6a41073602002002410236021c2002419cb505360218200241023602342002200241306a3602202002200241146a3602382002200241086a3602304101200241186a10120b20002001290200370200200041086a200141086a290200370200200241406b24000b8f0301017f230041106b22022400027f02400240024002400240024002400240024002400240200028020022002d000041016b0e0a0102030405060708090a000b2002200041016a36020c200141dcd20541162002410c6a410810f6010c0a0b2002200041016a36020c200141f2d20541152002410c6a410810f6010c090b2002200041016a36020c20014187d30541192002410c6a410810f6010c080b2002200041016a36020c200141a0d30541172002410c6a410810f6010c070b200128021441b7d305410e200141186a28020028020c1101000c060b200128021441c5d3054114200141186a28020028020c1101000c050b200128021441d9d3054108200141186a28020028020c1101000c040b200128021441e1d3054112200141186a28020028020c1101000c030b2002200041046a36020c200141f3d305410d2002410c6a411210f6010c020b20012802144180d4054114200141186a28020028020c1101000c010b2002200041046a36020c20014194d405410f2002410c6a411310f6010b2101200241106a240020010b810101017f230041106b2205240020012d000045044020002001290001370000200041186a200141196a290000370000200041106a200141116a290000370000200041086a200141096a290000370000200541106a24000f0b200541086a2001410c6a2802003602002005200129020437030020022003200541b8af052004102a000b2300200220034904402003200241eccb051037000b20002003360204200020013602000bb30101047f230041206b22022400200241086a417f200141d8006a280200220541d4006a22042004200541046a491b41c1006a4100101f200241186a22044100360200200220022903083703102001200241106a220310a401200141206a200310a4012001290340200141c8006a2903002003108e02200141d0006a2802002005200310a8012003200141e0006a200141a1016a1046200041086a200428020036020020002002290310370200200241206a24000b0c002000280200200110b7010b9d0301057f230041406a220224002000280208210520002802002103200128021441fd93044101200141186a28020028020c11010021002005044041012104034020004101712100027f410120000d001a0240024002400240200128021c22064104714504402004410171450d010c040b20044101710d0120012802182104200128021421000c020b4101200128021441bb96044102200128021828020c1101000d031a0c020b41012001280214220041f6a20541012001280218220428020c1101000d021a0b200241013a00172002200436020c20022000360208200220063602342002419c9604360230200220012d00203a00382002200128021036022820022001290208370320200220012902003703182002200241176a3602102002200241086a36022c2003200241186a10b801450440200228022c41c096044102200228023028020c1101000c020b41010c010b2003200110b8010b2100200341016a210341002104200541016b22050d000b0b410121032000450440200128021441c896044101200128021828020c11010021030b200241406b240020030bb20101037f23004190016b22022400027f200128021c220341107145044020034120714504402000310000200110d4010c020b20002d0000210341ff0021000340200241106a20006a413041372003410f712204410a491b20046a3a0000200041016b21002003220441047621032004410f4b0d000b200241086a200241106a200041016a10e401200141022002280208200228020c10d5010c010b20002d0000200110e7010b210020024190016a240020000b0d00200020014190880410cd020bfe0301057f230041406a22032400200341306a2001360200200341033a003820034120360228200341003602342003200036022c2003410036022020034100360218027f02400240200228021022014504402002410c6a28020022004103742105200041ffffffff017121072002280208210441002101034020012005460d02200228020020016a220041046a28020022060440200328022c20002802002006200328023028020c1101000d040b200141086a21012004280200210020042802042106200441086a21042000200341186a2006110200450d000b0c020b200241146a28020022074105742100200741ffffff3f71210703402000450d01200228020020046a220541046a28020022060440200328022c20052802002006200328023028020c1101000d030b20032001280210360228200320012d001c3a003820032001280218360234200341106a20022802082205200141086a10e20120032003290310370318200341086a2005200110e20120032003290308370320200441086a2104200041206b210020012802142106200141206a2101200520064103746a2205280200200341186a2005280204110200450d000b0c010b200228020420074b0440200328022c200228020020074103746a22002802002000280204200328023028020c1101000d010b41000c010b41010b2101200341406b240020010b0f00200028020020012002104541000b0e002000280200200110bd0141000b950201027f230041106b22022400024020002002410c6a027f0240024020014180014f04402002410036020c2001418010490d012001418080044f0d0220022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d41030c030b2000280208220320002802044604402000200310bf01200028020821030b2000200341016a360208200028020020036a20013a00000c030b20022001413f71418001723a000d2002200141067641c001723a000c41020c010b20022001413f71418001723a000f20022001410676413f71418001723a000e20022001410c76413f71418001723a000d2002200141127641077141f001723a000c41040b10450b200241106a24000b5301017f230041206b2202240020002802002100200241186a200141106a290200370300200241106a200141086a290200370300200220012902003703082000200241086a10b9012100200241206a240020000b2f01017f230041106b22022400200241086a20002001410110c1012002280208200228020c10c201200241106a24000b4201027f230041106b2202240020012000280204200028020822036b4b0440200241086a20002003200110c1012002280208200228020c10c2010b200241106a24000bca0101027f230041206b22042400027f4100200220036a22032002490d001a4108200128020422024101742205200320032005491b2203200341084d1b2203417f73411f7621050240200204402004200236021820044101360214200420012802003602100c010b200441003602140b200420052003200441106a10c30120042802004504402004280204210220012003360204200120023602004181808080780c010b200441086a280200210320042802040b21052000200336020420002005360200200441206a24000b2000024020004181808080784704402000450d0120011074000b0f0b10c401000bec0101037f230041106b220424002000027f024002402001044020024100480d01027f20032802040440200341086a2802002205450440200441086a20012002410010c50120042802082103200428020c0c020b2003280200210602402001200210712203450440410021030c010b20032006200510091a0b20020c010b20042001200210c6012004280200210320042802040b21052003044020002003360204200041086a200536020041000c040b20002001360204200041086a20023602000c020b20004100360204200041086a20023602000c010b200041003602040b41010b360200200441106a24000b3c01017f230041206b22002400200041146a42003702002000410136020c200041fca70536020820004188d805360210200041086a41988904103a000b2b0020020440200345044041def1062d00001a0b20012002107121010b20002002360204200020013602000b3a01017f230041106b22032400200341086a20012002410010c501200328020c21012000200328020836020020002001360204200341106a24000bb70101047f200028020022012000280204460440418080c4000f0b2000200141016a36020020012d00002203411874411875410048047f2000200141026a36020020012d0001413f7121022003411f712104200341df014d044020044106742002720f0b2000200141036a36020020012d0002413f712002410674722102200341f00149044020022004410c74720f0b2000200141046a3602002004411274418080f0007120012d0003413f71200241067472720520030b0b8a0101027f230041106b220224000240200141ff004d04402000280208220320002802044604402000200310bf01200028020821030b2000200341016a360208200028020020036a20013a00000c010b2002410036020c20022001413f71418001723a000d2002200141067641c001723a000c20002002410c6a2200200041027210460b200241106a24000b1800200120024d04402002200120031044000b200020026a0bd530022d7e077f230041a0016b22342400200229033821292002290330212a2002290328212b2002290320212c2002290318212e2002290310212f2002290308213020022903002131203441206a4100418001100b203441186a20002001200141016b22354100200120354f1b41807f7122382001200120384b1b41c0900410cb0120342802182136027f203428021c223541ff004d0440203441106a41002035203441206a223741d0900410cc01203428021020342802142036203541e0900410cd0120370c010b203441086a41004180012036203541f090041040418001213520342802080b213620384180016a213a2006ad42017d21322005200672ad42017d213341002105034020054180016a21372033212d2032211f2035213920362106200520384704402034200520372000200141d08f04104041800121394200212d4200211f203428020021060b202c2006290070221d2006290030221b2029202e7c7c2220200629003822267c2020202d8542f9c2f89b91a3b3f0db00854220892228428f928b87dad882d8da007d222120298542288922227c221e20062900002220202c20317c7c221a200629000822277c201a20032039ad7c222d8542d1859aeffacf9487d10085422089221a428892f39dffccf984ea007c221c202c8542288922237c2225201a85423089220c201c7c220a202385420189221c7c7c22242006290078221a7c201c20242006290020221c202a202f7c7c2209200629002822237c2009201f8542ebfa86dabfb5f6c11f85422089221f42abf0d3f4afeebcb73c7c2209202a8542288922087c220f201f85423089220d85422089220e2006290010221f202b20307c7c220b200629001822247c200b20042003202d56ad7c220485429fd8f9d9c291da829b7f85422089220342c5b1d5d9a7af94ccc4007d220b202b8542288922077c22102003854230892212200b7c220b7c22138542288922117c2215200629006822037c201e202885423089221e20217c2216202285420189222120062900602228200f7c7c222220037c202120122022854220892221200a7c222285422889220a7c220f202185423089221220227c2214200a8542018922217c220a201b7c2021200a2007200b85420189220b2006290040222120257c7c2225200629004822227c201e202585422089221e2009200d7c22257c2209200b85422889220d7c220b201e85423089220785422089220a200820258542018922082006290050221e20107c7c2210200629005822257c2008200c201085422089220c20167c22088542288922107c2216200c85423089220c20087c22087c22178542288922187c221920237c200e201585423089220e20137c22132011854201892211200b201d7c7c220b201e7c200b200c85422089220c20147c220b20118542288922117c2215200c85423089220c200b7c220b20118542018922117c221420247c2011201420082010854201892208200f20227c7c220f201a7c2008200e200f854220892208200720097c22097c220f85422889220e7c220720088542308922088542208922102009200d8542018922092016201c7c7c220d20217c2009200d201285422089220920137c220d8542288922127c22132009854230892209200d7c220d7c22118542288922167c2214201a7c200a201985423089220a20177c22172018854201892218200720257c7c220720267c20072009854220892209200b7c220b20188542288922077c22182009854230892209200b7c220b20078542018922077c221920037c20072019200d201285420189220d201520277c7c220720287c2007200a85422089220a2008200f7c22087c220f200d85422889220d7c2207200a85423089220a8542208922122008200e854201892208201320207c7c220e201f7c2008200c200e85422089220c20177c220885422889220e7c2213200c85423089220c20087c22087c22158542288922177c221920227c2010201485423089221020117c22112016854201892216200720257c7c220720217c2007200c85422089220c200b7c220b20168542288922077c2216200c85423089220c200b7c220b20078542018922077c2214201c7c200720142008200e854201892208201820237c7c220e201f7c2008200e2010854220892208200a200f7c220a7c220f85422889220e7c22072008854230892208854220892210200a200d85420189220a201320287c7c220d20207c200a2009200d85422089220a20117c220985422889220d7c2213200a85423089220a20097c22097c22118542288922147c221820257c2012201985423089221220157c22152017854201892217200720267c7c220720277c2007200a85422089220a200b7c220b20178542288922077c2217200a85423089220a200b7c220b20078542018922077c2219201d7c200720192009200d8542018922092016201e7c7c220d201d7c2009200d20128542208922092008200f7c22087c220f85422889220d7c220720098542308922098542208922122008200e854201892208201320247c7c220e201b7c2008200c200e85422089220c20157c220885422889220e7c2213200c85423089220c20087c22087c22158542288922167c2219201a7c2010201885423089221020117c22112014854201892214200720267c7c220720227c2007200c85422089220c200b7c220b20148542288922077c2214200c85423089220c200b7c220b20078542018922077c221820217c200720182008200e854201892208200320177c7c220e20287c2008200e20108542208922082009200f7c22097c220f85422889220e7c220720088542308922088542208922102009200d854201892209201320247c7c220d20277c2009200a200d85422089220a20117c220985422889220d7c2213200a85423089220a20097c22097c22118542288922177c2218201e7c2012201985423089221220157c221520168542018922162007201c7c7c220720207c2007200a85422089220a200b7c220b20168542288922077c2216200a85423089220a200b7c220b20078542018922077c2219201a7c200720192009200d8542018922092014201f7c7c220d201b7c2009200d20128542208922092008200f7c22087c220f85422889220d7c220720098542308922098542208922122008200e854201892208201320237c7c220e201e7c2008200c200e85422089220c20157c220885422889220e7c2213200c85423089220c20087c22087c22158542288922147c221920247c2010201885423089221020117c22112017854201892217200720227c7c220720207c2007200c85422089220c200b7c220b20178542288922077c2217200c85423089220c200b7c220b20078542018922077c221820037c200720182008200e8542018922082016201f7c7c220e201c7c2008200e20108542208922082009200f7c22097c220f85422889220e7c220720088542308922088542208922102009200d854201892209201320237c7c220d20267c2009200a200d85422089220a20117c220985422889220d7c2213200a85423089220a20097c22097c22118542288922167c221820217c2012201985423089221220157c221520148542018922142007201b7c7c220720217c2007200a85422089220a200b7c220b20148542288922077c2214200a85423089220a200b7c220b20078542018922077c221920247c200720192009200d8542018922092017201d7c7c220d20277c2009200d20128542208922092008200f7c22087c220f85422889220d7c220720098542308922098542208922122008200e854201892208201320257c7c220e20287c2008200c200e85422089220c20157c220885422889220e7c2213200c85423089220c20087c22087c22158542288922177c221920277c2010201885423089221020117c221120168542018922162007201f7c7c220720287c2007200c85422089220c200b7c220b20168542288922077c2216200c85423089220c200b7c220b20078542018922077c221820227c200720182008200e854201892208201420207c7c220e20257c2008200e20108542208922082009200f7c22097c220f85422889220e7c220720088542308922088542208922102009200d8542018922092013201b7c7c220d201e7c2009200a200d85422089220a20117c220985422889220d7c2213200a85423089220a20097c22097c22118542288922147c2218201c7c2012201985423089221220157c221520178542018922172007201a7c7c2207201d7c2007200a85422089220a200b7c220b20178542288922077c2217200a85423089220a200b7c220b20078542018922077c2219201e7c200720192009200d8542018922092016201c7c7c220d20037c2009200d20128542208922092008200f7c22087c220f85422889220d7c220720098542308922098542208922122008200e854201892208201320267c7c220e20237c2008200c200e85422089220c20157c220885422889220e7c2213200c85423089220c20087c22087c22158542288922167c221920217c2010201885423089221020117c22112014854201892214200720287c7c220720237c2007200c85422089220c200b7c220b20148542288922077c2214200c85423089220c200b7c220b20078542018922077c221820257c200720182008200e8542018922082017201d7c7c220e20037c2008200e20108542208922082009200f7c22097c220f85422889220e7c220720088542308922088542208922102009200d854201892209201320277c7c220d201a7c2009200a200d85422089220a20117c220985422889220d7c2213200a85423089220a20097c22097c22118542288922177c221820247c2012201985423089221220157c22152016854201892216200720227c7c2207201f7c2007200a85422089220a200b7c220b20168542288922077c2216200a85423089220a200b7c220b20078542018922077c221920227c200720192009200d854201892209201420207c7c220d20267c2009200d20128542208922092008200f7c22087c220f85422889220d7c220720098542308922098542208922122008200e8542018922082013201b7c7c220e20247c2008200c200e85422089220c20157c220885422889220e7c2213200c85423089220c20087c22087c22158542288922147c2219201f7c2010201885423089221020117c22112017854201892217200320077c7c220720257c2007200c85422089220c200b7c220b20178542288922077c2217200c85423089220c200b7c220b20078542018922077c2218201e7c200720182008200e854201892208201620287c7c220e20277c2008200e20108542208922082009200f7c22097c220f85422889220e7c220720088542308922088542208922102009200d854201892209201320267c7c220d201d7c2009200a200d85422089220a20117c220985422889220d7c2213200a85423089220a20097c22097c22118542288922167c221820207c2012201985423089221220157c22152014854201892214200720217c7c2207201b7c2007200a85422089220a200b7c220b20148542288922077c2214200a85423089220a200b7c220b20078542018922077c221920217c200720192009200d854201892209201720237c7c220d20207c2009200d20128542208922092008200f7c22087c220f85422889220d7c220720098542308922098542208922122008200e8542018922082013201a7c7c220e201c7c2008200c200e85422089220c20157c220885422889220e7c2213200c85423089220c20087c22087c22158542288922177c2219201e7c2010201885423089221020117c221120168542018922162007201b7c7c2207201a7c2007200c85422089220c200b7c220b20168542288922077c2216200c85423089220c200b7c220b20078542018922077c221820237c200720182008200e854201892208201420257c7c220e20247c2008200e20108542208922082009200f7c22097c220f85422889220e7c220720088542308922088542208922102009200d8542018922092013201d7c7c220d20227c2009200a200d85422089220a20117c220985422889220d7c2213200a85423089220a20097c22097c22118542288922147c221820277c2012201985423089221220157c22152017854201892217200720277c7c2207201c7c2007200a85422089220a200b7c220b20178542288922077c2217200a85423089220a200b7c220b20078542018922077c221920237c200720192009200d854201892209201620287c7c220d201f7c2009200d20128542208922092008200f7c22087c220f85422889220d7c220720098542308922098542208922122008200e854201892208200320137c7c220e20267c2008200c200e85422089220c20157c220885422889220e7c2213200c85423089220c20087c22087c22158542288922167c221920037c2010201885423089221020117c221120148542018922142007201e7c7c2207201f7c2007200c85422089220c200b7c220b20148542288922077c2214200c85423089220c200b7c220b20078542018922077c221820207c200720182008200e854201892208201720267c7c220e201b7c2008200e20108542208922082009200f7c22097c220f85422889220e7c220720088542308922088542208922102009200d854201892209201320217c7c220d201c7c2009200a200d85422089220a20117c220985422889220d7c2213200a85423089220a20097c22097c22118542288922177c2218201b7c2012201985423089221220157c22152016854201892216200720247c7c220720287c2007200a85422089220a200b7c220b20168542288922077c2216200a85423089220a200b7c220b20078542018922077c221920267c200720192009200d8542018922092014201a7c7c220d20257c2009200d20128542208922092008200f7c22087c220f85422889220d7c220720098542308922098542208922122008200e854201892208201320227c7c220e201d7c2008200c200e85422089220c20157c220885422889220e7c2213200c85423089220c20087c22087c22158542288922147c2219201d7c2010201885423089221020117c22112017854201892217200720207c7c220720277c2007200c85422089220c200b7c220b20178542288922077c2217200c85423089220c200b7c220b20078542018922077c2218201a7c200720182008200e8542018922082016201c7c7c220e20237c2008200e20108542208922082009200f7c22097c220f85422889220e7c220720088542308922088542208922102009200d8542018922092013201f7c7c220d20247c2009200a200d85422089220a20117c220985422889220d7c2213200a85423089220a20097c22097c22118542288922167c221820037c20032012201985423089220320157c22122014854201892215200720287c7c22077c2007200a85422089220a200b7c220b20158542288922077c2215200a85423089220a200b7c220b20078542018922077c2214201b7c200720142009200d85420189221b201720217c7c220920227c201b200320098542208922032008200f7c221b7c22098542288922087c220f200385423089220385422089220d200e201b85420189221b2013201e7c7c220e20257c201b200c200e85422089221b20127c220c85422889220e7c2207201b85423089221b200c7c220c7c22128542288922137c221420237c201e2010201885423089222320117c221e2016854201892210200f201d7c7c221d7c201b201d85422089221d200b7c221b201085422889220f7c220b201d85423089221d201b7c221b200f85420189220f7c221020247c2010201a200c200e85420189221a201520227c7c22247c201a2023202485422089221a200320097c22037c22238542288922247c2222201a85423089221a85422089220c200320088542018922032007201c7c7c221c20217c2003200a201c854220892203201e7c221c8542288922217c221e2003854230892203201c7c221c7c220a200f8542288922097c2208200c85423089220c200a7c220a20098542018985201f201a20237c221f202485420189221a201e20207c7c22207c201a201d202085422089221d200d201485423089222020127c221a7c22238542288922247c221e201d85423089221d85212c20262013201a854201892226202220257c7c221a7c2003201a854220892203201b7c221b20268542288922267c221a2003854230892203201c202185420189221c200b20277c7c222720287c201f2020202785422089221f7c2220201c8542288922277c221c201f85423089221f20207c2220202785420189202b8585212b201d20237c221d2008202e8585212e201e203085200a8521302003201b7c2203201c2031858521312029200320268542018985201f852129202a201d20248542018985200c85212a2020202f85201a85212f202d210320372205203a470d000b200220293703382002202a3703302002202b3703282002202c3703202002202e3703182002202f3703102002203037030820022031370300203441a0016a24000b28002002200349044020032002200410dc01000b2000200220036b3602042000200120036a3602000b3d000240200120024d044020024180014d0d01200241800120041037000b20012002200410ce01000b2000200220016b3602042000200120036a3602000b7b002001200346044020002002200110091a0f0b230041306b220024002000200336020420002001360200200041146a42023702002000412c6a410d3602002000410336020c200041809c043602082000410d3602242000200041206a360210200020003602282000200041046a360220200041086a2004103a000b0f0020002001200241dc9a0410ce020ba80101067f230041206b22022400200241186a20002d00d0012204200441800120046b22032001280204220520032005491b22036a200041e0910410cc01200228021c210420022802182106200241106a200128020022072005200341f09104103f20062004200228021020022802144180920410cd01200020002d00d00120036a3a00d001200241086a2007200520034190920410cb0120012002290308370200200241206a24000b4101017f230041106b22022400200241086a200141c00020012d004041d09204103f200228020c21012000200228020836020020002001360204200241106a24000b0e0020002802001a03400c000b000b6201017f230041406a220124002001200036020c2001412c6a420137020020014102360224200141f8a2053602202001411436023c2001200141386a36022820012001410c6a360238200141106a200141206a103c200128021020012802181018000b2100200042ec9cecb4fcacd18dfe003703082000428debbeb9d1d693c81c3703000bbe0202057f017e230041306b2204240041272102024020004290ce00540440200021070c010b0340200441096a20026a220341046b200020004290ce008022074290ce007e7da7220541ffff037141e4006e220641017441c897046a2f00003b0000200341026b2005200641e4006c6b41ffff037141017441c897046a2f00003b0000200241046b2102200042ffc1d72f5621032007210020030d000b0b2007a7220341e3004b0440200241026b2202200441096a6a2007a72203200341ffff037141e4006e220341e4006c6b41ffff037141017441c897046a2f00003b00000b02402003410a4f0440200241026b2202200441096a6a200341017441c897046a2f00003b00000c010b200241016b2202200441096a6a200341306a3a00000b20014100200441096a20026a412720026b10d5012101200441306a240020010be403010a7f4188d8052106230041106b22072400200028021c2205410171220820036a210402402005410471450440410021060c010b4188d80520014188d8056a10d60120046a21040b412b418080c40020081b21080240200028020045044041012105200041146a2802002204200041186a280200220020082006200110d7010d01200420022003200028020c11010021050c010b2004200028020422094f044041012105200041146a2802002204200041186a280200220020082006200110d7010d01200420022003200028020c11010021050c010b200541087104402000280210210c2000413036021020002d0020210d41012105200041013a0020200041146a280200220a200041186a280200220b20082006200110d7010d01200741086a2000200920046b410110d80120072802082201418080c400460d01200728020c2106200a20022003200b28020c1101000d0120012006200a200b10d9010d012000200d3a00202000200c360210410021050c010b4101210520072000200920046b410110d80120072802002209418080c400460d002007280204210a200041146a2802002204200041186a280200220020082006200110d7010d00200420022003200028020c1101000d002009200a2004200010d90121050b200741106a240020050ba80301077f230041106b220224000240200120006b220141104f04402000200041036a417c71220520006b220010da012005200120006b2200417c716a200041037110da016a21042000410276210303402003450d0220022005200341c0012003200341c0014f1b41a09b0410db01200228020c21032002280208210520022002280200200228020422002000417c7141889d0410db01200228020c2107024020022802042200450440410021010c010b2002280200220620004102746a21084100210103404100210003402001200020066a2802002201417f734107762001410676724181828408716a2101200041046a22004110470d000b200641106a22062008470d000b0b200141087641ff81fc0771200141ff81fc07716a418180046c41107620046a21042007450d000b2002280208210020074102742103410021010340200120002802002201417f734107762001410676724181828408716a2101200041046a2100200341046b22030d000b200141087641ff81fc0771200141ff81fc07716a418180046c41107620046a21040c010b2000200110da0121040b200241106a240020040b39000240027f2002418080c40047044041012000200220012802101102000d011a0b20030d0141000b0f0b200020032004200128020c1101000ba00101027f20022105024002400240024020012d0020220441016b0e03010200030b200341ff01710d00410021040c020b41002105200221040c010b20024101762104200241016a41017621050b200441016a2102200141186a2802002103200128021021042001280214210102400340200241016b2202450d01200120042003280210110200450d000b418080c40021040b20002005360204200020043602000b3201017f027f0340200120012004460d011a200441016a2104200220002003280210110200450d000b200441016b0b2001490b2c01017f200104400340200220002c000041bf7f4a6a2102200041016a2100200141016b22010d000b0b20020b3e00200220034f044020002003360204200020013602002000410c6a200220036b3602002000200120034102746a3602080f0b41d3a20541232004107e000b0f0020002001200241889a0410ce020b4e01047f2001280200210220012802042103200110c7012204418080c400470440200120012802002001280208220520036a200220012802046a6b6a3602080b20002004360204200020053602000b3f01017f024002402001450d00200120034f044020012003460d010c020b200120026a2c00004140480d010b200221040b20002001360204200020043602000bb40201017f230041f0006b220624002006200136020c2006200036020820062003360214200620023602102006410236021c2006419c950436021802402004280200450440200641cc006a410a360200200641c4006a410a360200200641e4006a42033702002006410436025c200641d895043602582006410236023c2006200641386a3602600c010b200641306a200441106a290200370300200641286a200441086a29020037030020062004290200370320200641e4006a4204370200200641d4006a4115360200200641cc006a410a360200200641c4006a410a3602002006410436025c200641fc95043602582006410236023c2006200641386a3602602006200641206a3602500b2006200641106a3602482006200641086a3602402006200641186a360238200641d8006a2005103a000b140020002802002001200028020428020c1102000b14002001280214200141186a280200200010ba010b5501027f0240027f02400240200228020041016b0e020103000b200241046a0c010b200120022802044103746a22012802044116470d0120012802000b2802002104410121030b20002004360204200020033602000b9c0202027f017e23004190016b2202240020002802002100027f0240200128021c220341107145044020034120710d012000290300200110d4010c020b2000290300210441ff0021000340200241106a20006a413041d7002004a7410f712203410a491b20036a3a0000200041016b21002004420f5621032004420488210420030d000b200241086a200241106a200041016a10e401200141022002280208200228020c10d5010c010b2000290300210441ff0021000340200241106a20006a413041372004a7410f712203410a491b20036a3a0000200041016b21002004420f5621032004420488210420030d000b2002200241106a200041016a10e401200141022002280200200228020410d5010b210020024190016a240020000b2d0020024181014f0440200241800141b8970410dc01000b200041800120026b3602042000200120026a3602000b4e01017f230041206b22032400200341186a200241106a290200370300200341106a200241086a2902003703002003200229020037030820002001200341086a10ba012100200341206a240020000b8d0201037f23004190016b22022400027f0240200128021c220341107145044020034120710d0120002001107f0c020b2000280200210041ff0021030340200241106a20036a413041d7002000410f712204410a491b20046a3a0000200341016b21032000410f4b21042000410476210020040d000b200241086a200241106a200341016a10e401200141022002280208200228020c10d5010c010b2000280200210041ff0021030340200241106a20036a413041372000410f712204410a491b20046a3a0000200341016b21032000410f4b21042000410476210020040d000b2002200241106a200341016a10e401200141022002280200200228020410d5010b210020024190016a240020000b7e01037f23004190016b2202240041ff0021030340200241106a20036a413041d7002000410f712204410a491b20046a3a0000200341016b2103200041ff0171220441047621002004410f4b0d000b200241086a200241106a200341016a10e401200141022002280208200228020c10d501210020024190016a240020000b7101017f230041206b22022400027f41012000200110e6010d001a200241146a42003702002002410136020c200241f4930436020820024188d8053602104101200141146a280200200141186a280200200241086a10e5010d001a200041046a200110e6010b2100200241206a240020000bb40601117f230041e0006b22032400200341003b0154200320023602502003410036024c20034281808080a001370244200320023602402003410036023c20032002360238200320013602342003410a3602302000280204210b2000280200210c2000280208210d200341c8006a210e027f0340024002400240024020032d00550d0020032802342109027f0240200328024022062003280238220f4b0440200921010c010b2003280244210520092101024003402005200e6a41016b2112200328023c21040340200420064b0d03200120046a210020122d00002107027f024002400240200620046b220841084f04402000200041036a417c712202460440200841086b2110410021020c030b200341286a20072000200220006b220210ea0120032802284101470d01200328022c210241010c040b200341186a20072000200810ea01200328021c210220032802180c030b2002200841086b22104b0d010b200741818284086c21110340200020026a220a2802002011732213417f73201341818284086b71200a41046a280200201173220a417f73200a41818284086b7172418081828478710d01200241086a220220104d0d000b0b200341206a2007200020026a200820026b10ea01200328022420026a210220032802204101460b4101470d022003200220046a41016a220436023c20042005492004200f4b720d000b200341106a41002005200e4104418ca00410402001200420056b6a20052003280210200328021410414504402003280244210520032802342101200328024022062003280238220f4d0d010c030b0b200328024c21002003200328023c220136024c200120006b2102200020096a0c020b2003200636023c0b20032d00550d01200341013a005520014520032d005445200328024c2200200328025022024671720d01200220006b2102200020016a0b2100200d2d00000d010c020b41000c040b200c41b496044104200b28020c1101000d010b2003410a36025c200d2002047f200341086a20002002200241016b41b09b0410cb01200341dc006a41012003280208200328020c10410541000b3a0000200c20002002200b28020c110100450d010b0b41010b2102200341e0006a240020020b5701027f024002402003450440410021030c010b200141ff017121054101210103402005200220046a2d0000460440200421030c030b2003200441016a2204470d000b0b410021010b20002003360204200020013602000beb0101017f230041106b220224002002410036020c20002002410c6a027f0240024020014180014f04402001418010490d012001418080044f0d0220022001413f71418001723a000e20022001410c7641e001723a000c20022001410676413f71418001723a000d41030c030b200220013a000c41010c020b20022001413f71418001723a000d2002200141067641c001723a000c41020c010b20022001413f71418001723a000f20022001410676413f71418001723a000e20022001410c76413f71418001723a000d2002200141127641077141f001723a000c41040b10e9012100200241106a240020000b0d002000200141bc990410cd020b0e0020002802002001200210e9010b0c002000280200200110eb010b5301017f230041206b2202240020002802002100200241186a200141106a290200370300200241106a200141086a290200370300200220012902003703082000200241086a10ec012100200241206a240020000ba30201027f230041206b22022400200241186a41003a0000200241003b0116200241fd003a001f20022001410f7141f9c5056a2d00003a001e20022001410476410f7141f9c5056a2d00003a001d20022001410876410f7141f9c5056a2d00003a001c20022001410c76410f7141f9c5056a2d00003a001b20022001411076410f7141f9c5056a2d00003a001a20022001411476410f7141f9c5056a2d00003a0019200141017267410276220341026b2201410b4f04402001410a41fcb10410dc01000b200241086a200241166a20016a410c20036b410341fcb10410362002280208200228020c418cb20441034190b20410cd012000410a3a000b200020013a000a200041086a2002411e6a2f01003b000020002002290116370000200241206a24000b3d01017f230041106b22032400200341086a2001410a200241a0b2041036200328020c21012000200328020836020020002001360204200341106a24000b7101017f230041206b22022400200220013b010e200241186a220141003b0100200242003703102002200241106a410210f101200228020020022802042002410e6a410241b0b20410cd0120004180043b000a200041086a20012f01003b000020002002290310370000200241206a24000bdd0201087f230041106b22082400410121070240024002402002450d00200120024101746a210a20004180fe0371410876210b41002102200041ff0171210d0340200141026a210c200220012d00016a2109200b20012d000022014704402001200b4b0d0220092102200c2201200a460d020c010b200841086a200220092003200441e4a4041040200828020c210120082802082102024003402001450d01200141016b210120022d0000210e200241016a2102200d200e470d000b410021070c030b20092102200c2201200a470d000b0b2006450d00200520066a2103200041ffff037121020340200541016a210020052d00002201411874411875220441004e047f20000520002003460d0320052d0001200441ff0071410874722101200541026a0b2105200220016b22024100480d012007410173210720032005470d000b0b200841106a240020074101710f0b419cbd05412b41d4a404107e000bf50701087f230041306b220224000240027f4101200128021422074127200141186a28020028021022081102000d001a0240024002400240024002400240024002402000280200220341096b0e050604010105000b2003450d0620034127460d01200341dc00460d020b2003410b742105410021014121210041212104027f034002402005200041017620016a2200410274419cbe046a280200410b7422064d044020052006470440200021040c020b41010c030b200041016a21010b200420016b210020012004490d000b2001210041000b2104027f0240027f0240200020046a220041204d044020004102742204419cbe046a280200411576210120004120470d0141d7052105411f0c020b2000412141ecb0041044000b200441a0be046a28020041157621052000450d01200041016b0b410274419cbe046a28020041ffffff00710c010b41000b2104200541016b2100024020052001417f736a450d0041d7052001200141d7054d1b2106200320046b2109200541016b21054100210403400240200120064704402004200141a0bf046a2d00006a220420094d0d01200121000c030b200641d70541fcb0041044000b2005200141016a2201470d000b0b0240024002400240200041017145044020034120490d04200341ff00490d03200341808004490d02200341808008490d01200341b0c70c6b41d0ba2b49200341ef83384b72200341cba60c6b4105492003419ef40b6b41e20b497272200341e1d70b6b419f1849200341a29d0b6b410e4972200341feffff0071419ef00a46200341e0ffff007141e0cd0a467272720d04200341baee0a6b4106490d040c030b200241106a200310f0010c0a0b200341f4a404412c41cca50441c4014190a70441c20310f3010d010c020b200341d2aa04412841a2ab04419f0241c1ad0441af0210f301450d010b2002200336021420024180013a00100c070b200241106a200310f0010c060b200241106a41dcce0010f2010c050b200241106a41dcb80110f2010c040b200241106a41dcdc0110f2010c030b200241106a41dce40110f2010c020b200241106a41dce80110f2010c010b200241106a41dce00010f2010b02400340024020022d001041800147044020022d001a220020022d001b4f0d032002200041016a3a001a2000410a4f0d05200241106a20006a2d000021010c010b20022802142101200241286a220041003b010020024200370320200241086a200241206a410010f1012002280208200228020c2002412f6a410041b0b20410cd01200241186a20002f01003b010020022002290320370310200241003b011a0b200720012008110200450d000b41010c010b2007412720081102000b2104200241306a240020040f0b2000410a41c0b2041044000b7d01037f230041106b22032400200120024b0440200341086a200241036b22044100200220044f1b2204200241016a2000200141cca3041040200328020841016b2100200328020c2101034020010440200020016a2105200141016b2202210120052c00004140480d010b0b200220046a21010b200341106a240020010ba20201047f230041406a220524004101210702402000280214220620012002200041186a280200220228020c22011101000d000240200028021c2208410471450440200641c59604410120011101000d022003200020041102000d0220002802142106200028021828020c21010c010b200641c69604410220011101000d01200541013a0017200541306a419c96043602002005200236020c2005200636020820052008360234200520002d00203a00382005200028021036022820052000290208370320200520002902003703182005200541176a3602102005200541086a36022c2003200541186a20041102000d01200528022c41c096044102200528023028020c1101000d010b200641f093044101200111010021070b200541406b240020070b1b0020012802144180a6054105200141186a28020028020c1101000b4301027f41012102200141306b2203410a4f0440417f2001412072220141d7006b22022002200141e1006b491b220341104921020b20002003360204200020023602000b0c002000280200200110e1010b0b002000280200200110110bbb0202017f027e230041d0006b2203240002402002428080205a0440200341206a2001420042f3b2d8c19e9ebdcc957f4200100e200341106a2001420042d2e1aadaeda7c987f6004200100e200341406b2002420042f3b2d8c19e9ebdcc957f4200100e200341306a2002420042d2e1aadaeda7c987f6004200100e200341386a290300200341186a290300200341286a290300220420032903107c2202200454ad7c220520032903307c2204200554ad7c20042004200341c8006a290300200220032903407c200254ad7c7c220456ad7c2205423e88210220054202862004423e888421040c010b2002422d8620014213888442bda282a38eab04802104420021020b200320042002428080e0b0b79fb79cf5004200100e20002004370300200020023703082000200329030020017c370310200341d0006a24000b810602057f027e0240027f02402002280200220441144f0440200042ffff83fea6dee111580440200042ffc1d72f560d02200421050c040b2002200441106b2205360200200120056a2000200042808084fea6dee11180220042808084fea6dee1117e7d2208428080e983b1de1680a741017441c897046a2f00003b0000200120046a220341046b200842e40080220942e40082a741017441c897046a2f00003b0000200341066b20084290ce008042e40082a741017441c897046a2f00003b0000200341086b200842c0843d8042e40082a741017441c897046a2f00003b00002003410a6b20084280c2d72f80a741e4007041017441c897046a2f00003b00002003410c6b20084280c8afa02580a741e4007041017441c897046a2f00003b00002003410e6b20084280a094a58d1d80a741ffff037141e4007041017441c897046a2f00003b00002008200942e4007e7da70c020b41909904411c41ac9904107e000b2001200441086b22056a200020004280c2d72f8022004280c2d72f7e7da7220341c0843d6e41017441c897046a2f00003b0000200120046a220641046b200341e4006e220741e4007041017441c897046a2f00003b0000200641066b20034190ce006e41ffff037141e4007041017441c897046a2f00003b00002003200741e4006c6b0b2103200120046a41026b200341017441c897046a2f00003b00000b02402000a72203418fce004d0440200521040c010b2001200541046b22046a200320034190ce006e22034190ce006c6b220641ffff037141e4006e220741017441c897046a2f00003b0000200120056a41026b2006200741e4006c6b41ffff037141017441c897046a2f00003b00000b0240200341ffff0371220541e3004d0440200321050c010b2001200441026b22046a2003200541e4006e220541e4006c6b41ffff037141017441c897046a2f00003b00000b0240200541ffff0371410a4f04402001200441026b22046a200541ffff037141017441c897046a2f00003b00000c010b2001200441016b22046a200541306a3a00000b200220043602000b0c0020014189c6054102104c0b3001017f230041106b220224002002200036020c200141d9b204410d2002410c6a4119102e2100200241106a240020000b11002000200141fcef054190f00510cc020bfc0202047f027e23004190016b2202240020002802002100027f0240200128021c220341107145044020034120710d0120002001106a0c020b200041086a2903002106200029030021074180012100034002402000450440410021000c010b200041016b2200200241106a6a413041d7002007a7410f712203410a491b20036a3a00002007420f5621032006420052210420065021052006423c862007420488842107200642048821062003200420051b0d010b0b200241086a200241106a200010e401200141022002280208200228020c10d5010c010b200041086a2903002106200029030021074180012100034002402000450440410021000c010b200041016b2200200241106a6a413041372007a7410f712203410a491b20036a3a00002007420f5621032006420052210420065021052006423c862007420488842107200642048821062003200420051b0d010b0b2002200241106a200010e401200141022002280200200228020410d5010b210020024190016a240020000b3101017f230041106b220224002002200036020c200141fcb20441112002410c6a411a10f6012100200241106a240020000b940201037f23004190016b2202240020002802002100027f0240200128021c220341107145044020034120710d0120002001107f0c020b2000280200210041ff0021030340200241106a20036a413041d7002000410f712204410a491b20046a3a0000200341016b21032000410f4b21042000410476210020040d000b200241086a200241106a200341016a10e401200141022002280208200228020c10d5010c010b2000280200210041ff0021030340200241106a20036a413041372000410f712204410a491b20046a3a0000200341016b21032000410f4b21042000410476210020040d000b2002200241106a200341016a10e401200141022002280200200228020410d5010b210020024190016a240020000b1c00200041eb06419cb4044190b3044194b30441234121412210d0020b1c00200041bb0241e0bb044188bb04418cbb0441164114411510d0020bf10102047f017e230041306b22022400200241086a2204200141086a220328020036020020022001290200370300200241286a200328020036020020022001290200370320200241106a200241206a1086024100210102402002280214450d0020022d00104130470d00200241106a41047221030340200241086a200341086a2802002205360200200220032902002206370300200241286a200536020020022006370320200141016a2101200241106a200241206a1086022002280214450d0120022d00104130460d000b0b20002002290300370204200020013602002000410c6a2004280200360200200241306a24000b7d01057f200128020422020440200241016b21032002200128020022026a210520022d000021060340024020032204450440200521020c010b200441016b2103200241016a22022d000041df00460d010b0b2000200436020820002002360204200020063a00002000200128020841016b36020c0f0b200041003602040b960101067f2001280208210420012802002105024020012802042202450440410021020c010b03402005200241016b22066a2d000021070340200622010440200141016b220620056a2d000041df00460d010b0b20074130470d01200341016a2103200441016b2104200122020d000b410021020b20002005360204200020033602002000410c6a2004360200200041086a20023602000b860101017f0240200141c1006b41ff017141064f0440200141e1006b41ff01714106490d01200141306b220341ff0171410a4f0440200020023602042000200141ff01713602000f0b2000418280c400360200200020033a00040f0b2000418280c4003602002000200141376b3a00040f0b2000418280c4003602002000200141d7006b3a00040b9e0301047f230041d0006b2202240020002802002103410121000240200141146a280200220441a89404410c200141186a280200220128020c1101000d000240200328020c220504402002200536021c200241c4006a42013702002002410236023c200241b89404360238200241033602242002200241206a36024020022002411c6a36022020042001200241386a10e501450d010c020b200241086a20032802002205200328020428020c110000200229030842c1f7f9e8cc93b2d14185200241106a29030042e4dec78590d085de7d858450450d002002200536021c200241c4006a42013702002002410236023c200241b894043602382002411b3602242002200241206a36024020022002411c6a36022020042001200241386a10e5010d010b200328020821002002412c6a4203370200200241cc006a410d360200200241c4006a410d3602002002410336022420024180940436022020022000410c6a3602482002200041086a3602402002410236023c200220003602382002200241386a36022820042001200241206a10e50121000b200241d0006a240020000b5901037f02402000280208220420026a220320044f04402003200028020422054b0d01200028020020046a2002200120024188a40510cd01200020033602080f0b2004200341f8a30510ce01000b2003200541f8a3051037000bb90301017f230041106b22022400027f024002400240024002400240024002400240024002400240024020002d000041016b0e0c0102030405060708090a0b0c000b2002200041016a36020c200141b8a40541062002410c6a410910f6010c0c0b200128021441bea405410d200141186a28020028020c1101000c0b0b200128021441cba405410e200141186a28020028020c1101000c0a0b200128021441d9a405410b200141186a28020028020c1101000c090b200128021441e4a405411a200141186a28020028020c1101000c080b200128021441fea405410e200141186a28020028020c1101000c070b2001280214418ca5054110200141186a28020028020c1101000c060b2001280214419ca505410c200141186a28020028020c1101000c050b200128021441a8a505410b200141186a28020028020c1101000c040b200128021441b3a5054107200141186a28020028020c1101000c030b200128021441baa505410f200141186a28020028020c1101000c020b200128021441c9a5054111200141186a28020028020c1101000c010b200128021441daa5054113200141186a28020028020c1101000b2101200241106a240020010b2801017f230041106b22022400200220013a000f20002002410f6a200241106a22001046200024000b2801017f230041106b22022400200220003b010e20012002410e6a200241106a22001046200024000b2c01017f230041106b22032400200320013703082003200037030020022003200341106a22021046200224000b2501017f230041106b220224002002200136020c2002410c6a2000109002200241106a24000b5d01017f20002802002202413f4d044020012002410274108c020f0b200241ffff004d044020024102744101722001108d020f0b200241ffffffff034d04402002410274410272200110210f0b20014103108c022000280200200110210b3b01017e027f41012000290300220142c000540d001a4102200142808001540d001a41042001428080808004540d001a4109200179a74103766b0b0bcf0302077f017e230041306b22022400200241206a2001106541012103024020022d00204101710d00024002400240024002400240024020022d0021220441037141016b0e03020301000b200441fc0171410276ad2109410021030c060b200441027622050e050402020203020b200220043a002d200241013a002c200220013602282002200241286a10930220022f01000d0420022f0102220141ff014d0d04200141fcff0371410276ad2109410021030c040b200220043a002d200241013a002c20022001360228200241086a200241286a10940220022802080d03200228020c220141ffff034d0d032001410276ad2109410021030c030b200441134b0d02200541046a210741002104410121060340200241106a2001106520022d00104101710d03200231001142ff01832004410374413871ad8620098421092006220441ff0171200749220820046a210620080d000b2009427f412820054103746b413871ad885821030c020b200242003703282001200241286a410810630d0120022903282209428080808080808080015421030c010b200241186a200110272002280218410047200235021c2209428080808004547221030b2000200937030820002003ad370300200241306a24000b4901027f230041106b22022400200241003b010e024020012002410e6a410210bb0245044020022f010e21010c010b410121030b200020013b0102200020033b0100200241106a24000b4901027f230041106b220224002002410036020c024020012002410c6a410410bb02450440200228020c21010c010b410121030b2000200136020420002003360200200241106a24000b0c002000280200200110c7020b13002000200110a402200041086a200110a4020bc70301047f230041206b220324002003410036021820034201370310200341106a200241017410c001200120026a2106418080c40021020340024002402002418080c400470440418080c40021050c010b20012006460d0120012d00002202410f7141f9c5056a2d00002105200241047641f9c5056a2d00002102200141016a21010b200341086a2003411c6a4104027f0240024020024180014f04402003410036021c2002418010490d012002418080044f0d0220032002413f71418001723a001e20032002410c7641e001723a001c20032002410676413f71418001723a001d41030c030b200328021822042003280214460440200341106a200410bf01200328021821040b200328021020046a20023a00002003200441016a360218200521020c040b20032002413f71418001723a001d2003200241067641c001723a001c41020c010b20032002413f71418001723a001f2003200241127641f001723a001c20032002410676413f71418001723a001e20032002410c76413f71418001723a001d41040b4180c7051036200341106a2003280208200328020c1045200521020c010b0b20002003290310370200200041086a200341186a280200360200200341206a24000ba40201037f230041d0006b22022400027f024020012d001c410471450440200141186a2802002103200141146a28020021040c010b2002413c6a42003702002002410136023420024194d80536023020024188d8053602384101200141146a2802002204200141186a2802002203200241306a10e5010d011a0b41002101024003402002200020016a36020c2002411c36022c20024101360224200241013602142002418cd8053602102002410136021c20022002410c6a360228200241033a004c20024108360248200242203703402002428080808020370338200241023602302002200241306a3602202002200241286a36021820042003200241106a10e5010d01200141016a22014120470d000b41000c010b41010b2100200241d0006a240020000bcf0401087f230041a0016b22042400200441d4006a42013702002004410136024c2004418cd8053602482004410d36023c200420032802083602442004200441386a3602502004200441c4006a360238200441286a200441c8006a101641044130108b0122050440200441206a410c103120042802242109200428022022064180cd05290000370000200641086a4188cd05280000360000200441186a41101031200428021c210a20042802182207418ccd05290000370000200741086a4194cd05290000370000200441106a410e10312004280214210b20042802102208419ccd05290000370000200841066a41a2cd05290000370000200541206a410e3602002005411c6a200b36020020052008360218200541103602142005200a3602102005200736020c2005410c3602082005200936020420052006360200200541246a20042903283702002005412c6a200441306a280200360200200441086a20021031200428020c210620042802082001200210092101200441041031200428020421072004280200220841d09ecda20536000020044184016a410436020020044180016a20073602002004418c016a4282808080203702002004419c016a200341086a2802003602002004200836027c20042005360288012004200236027820042006360274200420013602702004200329020037029401200441c8006a200441f0006a1072024020042f016c41c80146044020002004290360370200200041086a200441e8006a2802003602000c010b20004100360200200041003a00040b200441a0016a24000f0b41301074000b2e01017f230041106b22012400200141086a2000105c20012d00082100200141106a2400410e411320004101711b0bf30301047f23004180016b22032400024020024101714504402003418280c4003602282003420237033820032002360234200320013602302003200341286a360240200341206a200341306a10c502024020032d00204101714504404100210141012104410021020c010b20032d00212105200341d8006a2206200341306a10c60241012102200341186a4108200328025841016a2201417f20011b2201200141084d1b4100101f200328021c21012003280218220420053a0000200341013602502003200136024c20032004360248200341e8006a200341406b280200360200200341e0006a200341386a29030037030020032003290330370358200341106a200610c50220032d0010410171450d0020032d001121010340200328024c2002460440200341f0006a200341d8006a10c602200341c8006a200328027041016a2204417f20041b10c001200328024821040b200220046a20013a00002003200241016a2202360250200341086a200341d8006a10c50220032d0009210120032d00084101710d000b200328024c2101200328024821040b20032802282205418280c4004604402000200236020820002001360204200020043602000c020b2000200536020420004100360200200041086a200328022c3602000c010b200042808080808080c0083702000b20034180016a24000b6402017f027e230041206b22022400200241106a20011092024201210302402002290310a70d0020022903182104200220011092022002290300a70d00200041106a200229030837030020002004370308420021030b20002003370300200241206a24000bc40901077f230041406a220324000240034002402001280208220420012802042206200420064b1b2108027f0240027f0240024002400240024002402004200649044020012802002107200421050340200520076a2d0000220941fcbe056a2d00000d022001200541016a220536020820052008470d000b0b200420064b0d0120004102360200200041023a00040c0b0b0240200941dc0047044020094122460d01200041123a0004200041023602002001200541016a3602080c0c0b200341306a200420052007200641ecbc05104020022003280230200328023410452001200541016a360208200341286a200110a00220032d0028410171450440410221050c0a0b4111210502400240024002400240024020032d0029220441ee006b0e08010f0f0f020f0304000b024002400240200441e2006b0e050111111102000b200441dc00460d062004412f47044020044122470d112002412210c0020c0f0b2002412f10c0020c0e0b2002410810c0020c0d0b2002410c10c0020c0c0b2002410a10c0020c0b0b2002410d10c0020c0a0b2002410910c0020c090b200110c10222044101710d03410c210502400240200441107622064180f8037122074180b00347044020074180b803460d0d20064180b0bf7f7341ff8fbc7f4b0d01419cbd05412b418cbd05107e000b200341206a200110c20220032d0021210420032d0020410171450d0120040c0b0b2003410036023820044180808004490d05200441808080c00049044020032006413f71418001723a00392003200441167641c001723a003841020c090b20032006413f71418001723a003a20032004411c7641e001723a003820032004411676413f71418001723a003941030c080b20012001280208220741016a360208200441dc00470d0a200341186a200110c20220032d00192104200420032d00184101710d091a2001200741026a360208200441f500470d0a200110c10222044101710d05200441107622074180406b41ffff03714180f803490d0a20074180c8006a41ffff03712006410a7441808080056a4180f8ff1f71722206418080046a22044180b00373418080c4006b418090bc7f490d0a2004418080c400470d060c0a0b200241dc0010c0020c070b20022802080440200341106a200420052007200641ccbc0510402002200328021020032802141045410121042001200541016a360208200341386a2002280200200228020810c30202402003280238220104402000200328023c360208200020013602040c010b200020032d003c3a0004410221040b200020043602000c0b0b200341086a200420052007200641dcbc051040200328020c2102200328020821042001200541016a360208200341386a2004200210c3022000027f2003280238220104402000200328023c3602082000200136020441000c010b200020032d003c3a000441020b3602000c0a0b2008200641bcbc051044000b20044108760c050b200320063a003841010c020b20044108760c030b20032007413f71418001723a003b20032006410676413f71418001723a003a20032004410c76413f71418001723a00392003200441127641077141f001723a003841040b21052002200341386a200510450b41130b220541ff01714113460d010b0b20004102360200200020053a00040b200341406b24000b2501017f20002802002201104e41ff01712200411346047f200110c90241ff01710520000b0b2a01017f2001104e41ff0171220241134604402000200110a1020f0b20004100360200200020023a00040b3a01037f2000200128020822022001280204492203047f2001200241016a360208200128020020026a2d00000541000b3a0001200020033a00000be10101037f230041206b22022400200241086a2001105c20022d0009410420022d000841017122041b210302400240024020040440200341ff01714122470d01200141146a41003602002001200128020841016a360208200241106a20012001410c6a109d02200228021022014102460d0220014504402002280214210120002002280218360204200020013602000c040b20004100360200200041103a00040c030b20004100360200200020033a00040c020b200041003602002000410b3a00040c010b20022d0014210120004100360200200020013a00040b200241206a24000b2a01017f2001104e41ff0171220241134604402000200110b4020f0b200041013a0000200020023a00010b3d01027f230041106b22012400200141086a2000106520012d0009210020012d00082102200141106a2400410741072000200041074f1b20024101711b0bf30202027f027e230041206b22022400024020002903002204423f58044020012004a7410274108c020c010b200442ffff005804402004a74102744101722001108d020c010b200442ffffffff035804402004a7410274410272200110210c010b200479a7220341274d044020014113200341037622034102746b108c02200341086b2103200029030021040340200120042205a7108c0220044208882104200341016a22030d000b200220043703002005428002540d012002420037021420024188d8053602102002410136020c200241d0a605360208230041206b2200240020004188a60536020420002002360200200041186a200241086a220141106a290200370300200041106a200141086a290200370300200020012902003703082000418c9504200041046a418c9504200041086a41d8a60510df01000b200241146a42003702002002410136020c200241a0a70536020820024188d805360210200241086a41a8a705103a000b200241206a24000bcb0302037f047e230041306b22022400024020002903002205423f56200041086a2903002206420052220420065022031b45044020012005a7410274108c020c010b200542ffff0056200420031b4504402005a74102744101722001108d020c010b200542ffffffff03562006420052220420031b4504402005a7410274410272200110210c010b20067920057942407d20041ba7220341e7004d044020014133200341037622034102746b108c02200341106b2103200041086a2903002105200029030021060340200120062207a7108c0220052208423886200642088884210620054208882105200341016a22030d000b2002200637030820022005370310200850200742800254710d012002420037022420024188d8053602202002410136021c200241d0a605360218230041206b22002400200041b8a7053602042000200241086a360200200041186a200241186a220141106a290200370300200041106a200141086a29020037030020002001290200370308200041c8af05200041046a41c8af05200041086a41c8a70510df01000b200241246a42003702002002410136021c200241a0a70536021820024188d805360220200241186a41d8a705103a000b200241306a24000b5f01027f230041106b220224002002200110a7020240024020022802002201044020012002280208410c6c6a220141046a28020022030d010b200041003602000c010b2000200141086a290200370204200020033602000b200241106a24000bf00301077f230041106b2204240002400240024002402001280220220245044020012802002102200141003602002002450d032001280208210220012802042203450440200128020c2203450d020340200228028c012102200341016b22030d000b0c020b200221050c020b2001200241016b360220024002400240027f410020012802002205200128020422021b4504402005450d022001410c6a2802002106200141086a2802000c010b200141086a28020021022001410c6a280200220304400340200228028c012102200341016b22030d000b0b20014200370208200120023602042001410136020041000b2107200620022f018a01490d02034020042002200710a90220042802002202450d02200428020421072004280208220620022f018a014f0d000b0c020b419cbd05412b4188b405107e000b419cbd05412b41f8b305107e000b200641016a210302402007450440200221080c010b200220034102746a418c016a210320072105034020032802002208418c016a2103200541016b22050d000b410021030b2001200836020420002006360208200020073602042000200236020020012003ad4220863702080c030b200221030b20042003200510a902034020042802002201450d0120042001200428020410a9020c000b000b200041003602000b200441106a24000b11002001047f20002001108b010520000b0b3c01027f0240200128020022040440200241016a210320012f01880121020c010b200121030b2000200436020020002003ad2002ad422086843702040bd70101037f230041206b22042400027f4100200220036a22032002490d001a4104200128020422024101742205200320032005491b2203200341044d1b220341186c2105200341d6aad52a494102742106024020020440200441043602142004200241186c360218200420012802003602100c010b200441003602140b200420062005200441106a10c30120042802004504402004280204210220012003360204200120023602004181808080780c010b200441086a280200210320042802040b21052000200336020420002005360200200441206a24000bf00301077f230041106b2204240002400240024002402001280220220245044020012802002102200141003602002002450d032001280208210220012802042203450440200128020c2203450d0203402002280290022102200341016b22030d000b0c020b200221050c020b2001200241016b360220024002400240027f410020012802002205200128020422021b4504402005450d022001410c6a2802002106200141086a2802000c010b200141086a28020021022001410c6a2802002203044003402002280290022102200341016b22030d000b0b20014200370208200120023602042001410136020041000b2107200620022f018e02490d02034020042002200710ac0220042802002202450d02200428020421072004280208220620022f018e024f0d000b0c020b419cbd05412b4188b405107e000b419cbd05412b41f8b305107e000b200641016a210302402007450440200221080c010b200220034102746a4190026a2103200721050340200328020022084190026a2103200541016b22050d000b410021030b2001200836020420002006360208200020073602042000200236020020012003ad4220863702080c030b200221030b20042003200510ac02034020042802002201450d0120042001200428020410ac020c000b000b200041003602000b200441106a24000b3c01027f0240200128020022040440200241016a210320012f018c0221020c010b200121030b2000200436020020002003ad2002ad422086843702040b6f0020002d00682001102020002d006920011020200041386a200110ae02200041186a200110a502200041286a20011096020240200029030050044020014100108c020c010b20014101108c02200041086a200110a5020b200041dc006a280200200041e4006a280200200110a8010b850100024002400240024002400240024020002d00000e050001020304050b20014100108c020c050b20014101108c02200041046a20011090020f0b20014102108c02200041046a2802002000410c6a280200200110a8010f0b20014103108c020c020b20014104108c022001200041016a200041156a10460b0f0b200041016a200110a4010b1801017f4101200010a8022201044020010f0b20001074000b990902047f0a7e230041b0026b22042400024020013100ad01220a500440200442f1edf4f8a5a7fda7a57f370330200420012903900142ebfa86dabfb5f6c11f85370348200420012903800142d1859aeffacf9487d10085370338200420013301b00142abf0d3f4afeebcb73c85370328200420012903a00142bbceaaa6d8d0ebb3bb7f85370320200420014198016a29030042f9c2f89b91a3b3f0db0085370350200420014188016a290300429fd8f9d9c291da829b7f85370340200420012d00ac012205ad42ff018320013100ae014210868420013100af014218868420013502a80142208684428892f39dffccf984ea008537031820022003200441186a4200420020012d00b201410010ca01200020053a004020002004290350370038200020042903483700302000200429034037002820002004290338370020200020042903303700182000200429032837001020002004290320370008200020042903183700000c010b20014188016a290300210b20014198016a290300210c20013502a801210d20013100af01210e20013100ae01210f20012903a001211020013301b00121112001290380012108200129039001210920012d00ac01210620012d00b2012105200441186a2207200141800110091a200441e0016a22014200370300200442003703d801200441013a00eb01200420053a00ea01200420063a00e90120044180013a00e8012004200c42f9c2f89b91a3b3f0db00853703d0012004200942ebfa86dabfb5f6c11f853703c8012004200b429fd8f9d9c291da829b7f853703c0012004200842d1859aeffacf9487d100853703b801200442f1edf4f8a5a7fda7a57f3703b0012004201142abf0d3f4afeebcb73c853703a8012004201042bbceaaa6d8d0ebb3bb7f853703a00120042006ad42ff0183200a42088684200f42108684200e42188684200d42208684428892f39dffccf984ea008537039801200420033602f401200420023602f00120044198016a21052007200441f0016a10cf0120042802f40122060440200441186a418001200520042903d801200129030020042d00ea01410110ca01200420042903d80122084280017c22093703d801200120012903002008200956ad7c370300200441003a00e8010b200641016b22014100200120064d1b41807f7122030440200441106a20042802f00122012006200341a09204103f20042802102004280214200520042903d801200441e0016a220229030020042d00ea01410110ca01200420042903d80122082003ad7c22093703d801200220022903002008200956ad7c370300200441086a20012006200341b0920410cb01200420042903083703f0010b200441186a2202200441f0016a220110cf012001200541c00010091a2004200241800120042d00e80141c09204103f20042802002004280204200120042903d801200441e0016a29030020042d00ea01410010ca01200020042d00e9013a0040200020042903a802370038200020042903a0023700302000200429039802370028200020042903900237002020002004290388023700182000200429038002370010200020042903f801370008200020042903f0013700000b200441b0026a24000b480002400240200241024d044020024102460d010c020b20012c000241bf7f4a0d000c010b2000200241026b3602042000200141026a3602000f0b200120024102200220031047000b6902017e017f0240200029030050044020014100108c020c010b410f200029030822027aa741016b22032003410f4f1b410120031b200029031042012002420c88220220024201581b80a7410474722001108d020b200041186a200110a402200041206a200110a5020be60101037f230041d0006b2204240020044100360220200442808001370244200441def105360240200441406b2205410110562003412020051057200120022005105720042004290340370318200441106a200441186a200428024810542004280214210220042802102103200428021821012004200428021c22063602404102200320022001200510081a200441086a20012006200428024010b401200420042903083703382005200441386a101c200441286a200510bd022004280228220104402004200429022c3702440b200420013602402000200441406b10be02200441d0006a24000bf40202057f017e230041206b22032400200341186a2001105c4101210220032d0019410420032d001841017122051b210402400240024020050440024002400240200441ff0171412d6b0e0400020201020b2000410a3a00010c050b41002102200041003602042001200128020841016a3602080c040b200441316b41ff017141094f04402000410b3a00010c040b20012001280208220241016a360208200341106a2001105f200441306b41ff01712104024020032d0010410171450d0020032d00112205413049200541394b720d00200241026a21020340200120023602082004ad420a7e2207422088a70d042007a72206200541306b41ff01716a22042006490d03200341086a2001105f20032d0008410171450d0120032d000922054130490d01200241016a21022005413a490d000b0b20002004360204410021020c030b200020043a00010c020b2000410a3a0001410121020c010b2000410a3a0001410121020b200020023a0000200341206a24000b870101027f230041106b22012400200141086a2000105c027f410020012d0008410171450d001a20012d00092202412c470440410e200241dd00470d011a2000200028020841016a36020841130c010b2000200028020841016a36020820012000105c410f410e20012d000141dd00461b410e20012d00004101711b0b2100200141106a240020000bcb0101047f230041206b22022400027f4100200141016a2201450d001a4104200028020422034101742204200120012004491b2201200141044d1b2201410c6c2104200141abd5aad5004941027421050240200304402002410436021420022003410c6c360218200220002802003602100c010b200241003602140b200220052004200241106a10c30120022802004504402002280204210320002001360204200020033602004181808080780c010b200241086a280200210120022802040b200110c201200241206a24000b6f01017f20022001108f0220010440200141186c210103402000280200200041086a280200200210a80102402000410c6a220328020045044020024100108c020c010b20024101108c022003280200200041146a280200200210a8010b200041186a2100200141186b22010d000b0b0b5001037f024020012d00080d0020012802002203200128020422044b0d00200320044f044041012102200141013a00080c010b410121022001200341016a3602000b20002003360204200020023602000b2f00200128021441b7d30541e7c50520002802002d000022001b410e411220001b200141186a28020028020c1101000b9b0201037f230041306b22022400200241206a2001106541012103024020022d00204101710d00024002400240024020022d0021220441037141016b0e03020301000b200441fc01714102762101410021030c030b200441044f0d02200241186a2001102720022802180d02200228021c22014180808080044921030c020b200220043a002d200241013a002c20022001360228200241086a200241286a10930220022f01080d0120022f010a220441ff014d0d01200441fcff03714102762101410021030c010b200220043a002d200241013a002c20022001360228200241106a200241286a10940220022802100d002002280214220341027621012003418080044921030b2000200136020420002003360200200241306a24000b4201017f20002d00042103200041003a0004200345044020002802002001200210630f0b2001200041056a2d00003a00002000280200200141016a200241016b10630b7501017f230041106b2202240002402001413f4d04402000200141027410560c010b200141ffff004d0440200220014102744101723b010e20002002410e6a4102108a020c010b200141ffffffff034d04402001410274410272200010530c010b2000410310562001200010530b200241106a24000b18002000200141f0ca0541acc70541c90041a4ca0510cf020b1700200020014194ca0541ccbb05412d4180c90510cf020b3001037f2000200128020822022001280204492203047f200128020020026a2d00000541000b3a0001200020033a00000b3901017f2000280208220220002802044604402000200210bf01200028020821020b2000200241016a360208200028020020026a20013a00000b0b00200041fcbc0510d2020b4101027f230041106b22022400200241086a200110bf0220022d00092101200020022d00084101712203453a000020002001410220031b3a0001200241106a24000b4a01017f230041106b2203240020032001200210732000027f20032802004504402000200341086a28020036020420032802040c010b2000410c3a000441000b360200200341106a24000b0b00200041ecbe0510d2020b9b0201087f230041106b22032400024020012802042202450440410221020c010b200128021021052001200220022001280208220420022004491b22026b36020420012001280200220420026a36020002400240024020020440200341086a20042d0000200128020c2207410174220810880220032802082206418280c400460440200241014d0d0220032d000c210941012102200341086a20042d0001200841017210880220032802082206418280c400460d030b2005200328020c220436020420052006360200410021020c030b4100410041e0c8051044000b4101410141f0c8051044000b20032d000c20094104747221040b2001200741016a36020c0b200020043a0001200020024102472002713a0000200341106a24000b6301027f024002402001280210280200418280c400470d0020012802042203450d0020012802082201450d01200320016e22022003200120026c476a21020b2000428080808010370200200041086a20023602000f0b4190c705411941f0cc05107e000b3100200128021420002d0000410274220041b8f1056a2802002000419cf1056a280200200141186a28020028020c1101000b7701017f230041206b22012400200141086a2000105c027f410420012d0008410171450d001a410b20012d00094122470d001a200041146a41003602002000200028020841016a360208200141106a20002000410c6a109d02411320012802104102470d001a20012d00140b2100200141206a240020000be20501047f230041d0006b22012400200141406b2000105c0240024020012d0040410171450d004109210202400240024002400240024020012d0041220341db006b0e03030107000b0240200341fb006b0e03040107000b20034122460d012003412c460d060b200141086a2000105f20012d0008410171044020012d00092103200028020841016a21040340411321022003412c46200341dd004672200341fd0046720d072000200436020820012000105f200441016a210420012d0001210320012d00004101710d000b0b410221020c050b200010c80241ff017121020c040b200141206a2000105c20012d0020410171450d02410b210220012d002141db00470d032000200028020841016a360208410121040340200141186a2000105c20012d0018410171450440410021020c050b0240024020012d00192202412c470440200241dd00460d02200441ff017121034100210420030d01410621020c070b2000200028020841016a360208200141106a2000105c20012d0010410171450d0520012d001121020b200241dd00460d03200010c90241ff017122024113460d010c050b0b200010b50241ff017121020c030b200141386a2000105c4104210220012d0038410171450d02410b210220012d003941fb00470d022000200028020841016a360208200141013a004c20012000360248410021030340200141306a2000105c20012d0030410171450440410121020c040b02400240024020012d00312202412c470440200241fd00460d032003410171450d01410721020c070b2003410171450d002000200028020841016a360208200141286a2000105c20012d0028410171450d0520012d002921020c010b200141003a004c0b200222034122470440410d2102200341fd00460d030c050b200010c80241ff017122024113470d0441012103200141c8006a109e0241ff017122024113460d010c040b0b2000106041ff017121020c020b410f21020c010b410421020b200141d0006a240020020b0f0020002802002d0000200110e7010b3e000240200120024d0440200220044d0d012002200420051037000b20012002200510ce01000b2000200220016b36020420002003200120066c6a3602000b3000200128021420002802002d0000410274220020036a280200200020026a280200200141186a28020028020c1101000b5801017f230041206b2203240020032000360204200341186a200141106a290200370300200341106a200141086a29020037030020032001290200370308200341046a2002200341086a10ba012100200341206a240020000b6901017f230041306b220424002004200136020420042000360200200441146a42023702002004412c6a410d3602002004410236020c200420033602082004410d3602242004200441206a3602102004200441046a36022820042004360220200441086a2002103a000b4701017f230041106b220624002001280200044020002001290200370200200041086a200141086a280200360200200641106a24000f0b20052004200641086a20032002102a000bcf0201057f2000410b74210b200521082005210a027f03400240200b200841017620096a220841027420036a280200410b74220c4d0440200b200c4704402008210a0c020b41010c030b200841016a21090b200a20096b21082009200a490d000b2009210841000b210a027f0240027f02402008200a6a220820074d04402008410274220a20036a280200411576210920082007470d012001210b20060c020b2008200541ecb0041044000b200a20046a280200411576210b2008450d01200841016b0b41027420036a28020041ffffff00710c010b41000b210a200b41016b21080240200b2009417f736a450d0020012009200920014d1b210c2000200a6b2100200b41016b210b4100210a034002402009200c470440200a200920026a2d00006a220a20004d0d01200921080c030b200c200141fcb0041044000b200b200941016a2209470d000b0b20084101710b5601027f0240024002402001450440410421050c010b200120044b0d01200120036c22064100480d012001200249410274200610a8022205450d020b20002001360204200020053602000f0b10c401000b20061074000bc50101087f0240027f200028020422032000280208220441046a4f0440200320046b22024100200220034d1b2107200028020020046a2108410021020340024020022007470440410121062000200220046a41016a360208200220086a2d0000418cc1056a2d0000220941ff01470d014180220c040b200220046a200320011044000b200541047420096a2105200241016a22024104470d000b41002102410021060c020b20002003360208410121064180040b2102410021050b20054110742002722006720b0b9aef010f00418080040b981e980f010072000000b305000014000000980f010072000000b305000021000000980f010072000000a7050000210000001d00000001000000010000001e00000054686520657865637574656420636f6e7472616374206d757374206861766520612063616c6c6572207769746820612076616c6964206163636f756e742069642e2f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f696e6b5f656e762d342e332e302f7372632f656e67696e652f6f6e5f636861696e2f696d706c732e7273000000810001006c0000006b0100000e000000810001006c0000002401000023000000656e636f756e746572656420756e6578706563746564206572726f72100101001c000000810001006c000000ed00000017000000980f01007200000037040000170000002f686f6d652f677569676f752f70726f6772616d6d696e672f706861742d6f6666636861696e2d726f6c6c75702f706861742f636f6e7472616374732f696e6b5f70726963655f666565642f6c69622e727300005401010052000000330000000500000073746f7261676520656e7472792077617320656d70747900b801010017000000636f756c64206e6f742070726f7065726c79206465636f64652073746f7261676520656e74727900d8010100270000006174746573745f6b657900005401010052000000710000001d000000496e76616c6964204b6579204c656e67746800005401010052000000710000003a0000005401010052000000900000001500000070726963653a20005802010007000000616e737765725f70726963653a206661696c656420746f207265616420717565756568747470733a2f2f6170692e636f696e6765636b6f2e636f6d2f6170692f76332f73696d706c652f70726963653f6964733d2676735f63757272656e636965733d008a02010032000000bc0201000f000000616363657074474554000000746f6b656e300000746f6b656e316661696c656420746f207061727365206a736f6e6661696c656420746f207061727365207265616c206e756d626572526571756573742072656365697665643a202825030100130000003b0b0100020000003b0b010002000000f00901000100000050726963653a200058030100070000004661696c20746f206465636f64652074686520707269636568030100180000006572726f7220696e2074686520726f6c6c75703a2000000088030100150000006661696c656420746f2063726561746520726f6c6c757020636c69656e746661696c656420746f20636f6d6d69746661696c656420746f207375626d697420726f6c6c7570206d6574612d74786661696c656420746f207375626d697420726f6c6c7570207478001f00000004000000040000002000000021000000220000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f616c6c6f632f7372632f7261775f7665632e727300280401006f0000000c020000050000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f616c6c6f632f7372632f616c6c6f632e72736d656d6f727920616c6c6f636174696f6e206f6620206279746573206661696c65640015050100150000002a0501000d000000a80401006d000000a40100000d0000006120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f722f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f616c6c6f632f7372632f666d742e727300008b0501006b00000062020000200000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f616c6c6f632f7372632f7374722e727300080601006b000000970100003b000000080601006b000000980100002f000000cf83cf8231323334353637383941424344454647484a4b4c4d4e505152535455565758595a6162636465666768696a6b6d6e6f707172737475767778797a2f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f6261736535382d302e322e302f7372632f6c69622e727300d2060100590000005400000022000000d2060100590000005400000019000000d2060100590000003e00000020000000d2060100590000003f000000110000002f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f626c616b6532625f73696d642d312e302e322f7372632f706f727461626c652e72736c0701006400000096000000150000002f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f626c616b6532625f73696d642d312e302e322f7372632f677574732e7273e007010060000000ef00000019000000e007010060000000f700000009000000e007010060000000f700000026000000e007010060000000f1000000150000002f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f626c616b6532625f73696d642d312e302e322f7372632f6c69622e727300800801005f000000aa01000009000000800801005f000000aa01000056000000800801005f000000aa01000045000000800801005f000000ac01000013000000800801005f000000ce01000012000000800801005f000000d601000016000000800801005f000000e50100000e000000800801005f0000004e0200000a0000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f6e756d2f6d6f642e72730000600901006e000000ae05000018000000600901006e000000b105000019000000292e2e00f1090100020000003a5b0000086c010000000000fc09010001000000fc090100010000002300000000000000010000002400000070616e69636b65642061742027272c20340a010001000000350a010003000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e646578206973200000480a010020000000680a0100120000001f0000000400000004000000250000003d3d617373657274696f6e206661696c65643a2060286c6566742020726967687429600a20206c6566743a2060602c0a2072696768743a20606000009e0a010019000000b70a010012000000c90a01000c000000d50a010001000000603a20009e0a010019000000b70a010012000000c90a01000c000000f80a0100030000001f0000000c0000000400000026000000270000002800000020202020207b202c20207b0a2c0a7d207d28280a5d2f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f666d742f6e756d2e727300490b01006e00000069000000140000003030303130323033303430353036303730383039313031313132313331343135313631373138313932303231323232333234323532363237323832393330333133323333333433353336333733383339343034313432343334343435343634373438343935303531353235333534353535363537353835393630363136323633363436353636363736383639373037313732373337343735373637373738373938303831383238333834383538363837383838393930393139323933393439353936393739383939617373657274696f6e206661696c65643a202a63757272203e203139490b01006e000000ea010000050000001f0000000400000004000000290000002a0000002b00000072616e676520737461727420696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e67746820d40c010012000000e60c01002200000072616e676520656e6420696e64657820180d010010000000e60c010022000000736c69636520696e64657820737461727473206174202062757420656e64732061742000380d0100160000004e0d01000d000000617474656d7074656420746f20696e64657820736c69636520757020746f206d6178696d756d207573697a656c0d01002c000000ff65010071000000c20500002500000066550100700000000f0a00001e000000736f7572636520736c696365206c656e67746820282920646f6573206e6f74206d617463682064657374696e6174696f6e20736c696365206c656e6774682028c00d010015000000d50d01002b000000f0090100010000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f7374722f636f756e742e7273180e0100700000004f0000003200000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010041da9e040b330202020202020202020202020202020202020202020202020202020202020303030303030303030303030303030304040404040041989f040bde7d2f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f7374722f7061747465726e2e72730000980f010072000000b801000026000000980f010072000000420500000c000000980f0100720000004205000022000000980f0100720000005605000030000000980f0100720000003506000015000000980f0100720000006306000015000000980f01007200000064060000150000005b2e2e2e5d6279746520696e64657820206973206e6f742061206368617220626f756e646172793b20697420697320696e7369646520202862797465732029206f662060811001000b0000008c10010026000000b210010008000000ba10010006000000d50a010001000000626567696e203c3d20656e642028203c3d2029207768656e20736c6963696e6720600000e81001000e000000f610010004000000fa10010010000000d50a010001000000206973206f7574206f6620626f756e6473206f6620600000811001000b0000002c11010016000000d50a0100010000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f7374722f6d6f642e727300005c1101006e000000030100001d0000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f756e69636f64652f7072696e7461626c652e7273dc110100780000001a00000036000000dc110100780000000a0000001c000000000601010301040205070702080809020a050b020e041001110212051311140115021702190d1c051d081f0124016a046b02af03b102bc02cf02d102d40cd509d602d702da01e005e102e704e802ee20f004f802fa03fb010c273b3e4e4f8f9e9e9f7b8b9396a2b2ba86b1060709363d3e56f3d0d1041418363756577faaaeafbd35e01287898e9e040d0e11122931343a4546494a4e4f64655cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66698f92116f5fbfeeef5a62f4fcff53549a9b2e2f2728559da0a1a3a4a7a8adbabcc4060b0c151d3a3f4551a6a7cccda007191a22253e3fe7ecefffc5c604202325262833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf6e6fbe935e227b0503042d036603012f2e80821d03310f1c0424091e052b0544040e2a80aa06240424042808340b4e43813709160a08183b45390363080930160521031b05014038044b052f040a070907402027040c0936033a051a07040c07504937330d33072e080a8126524b2b082a161a261c1417094e042409440d19070a0648082709750b423e2a063b050a0651060105100305808b621e48080a80a65e22450b0a060d133a060a362c041780b93c64530c48090a46451b4808530d49070a80f6460a1d03474937030e080a0639070a813619073b031c56010f320d839b66750b80c48a4c630d843010168faa8247a1b98239072a045c06260a460a28051382b05b654b0439071140050b020e97f80884d62a09a2e781330f011d060e0408818c89046b050d0309071092604709743c80f60a73087015467a140c140c570919808781470385420f1584501f060680d52b053e2101702d031a040281401f113a050181d02a82e680f7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae381d0d2c040907020e06809a83d80411030d0377045f060c04010f0c0438080a062808224e81540c1d03090736080e040907090780cb250a840600010305050606020706080709110a1c0b190c1a0d100e0c0f0410031212130916011704180119031a071b011c021f1620032b032d0b2e01300331023201a702a902aa04ab08fa02fb05fd02fe03ff09ad78798b8da23057588b8c901cdd0e0f4b4cfbfc2e2f3f5c5d5fe2848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d11293a3b4549575b5c5e5f64658d91a9b4babbc5c9dfe4e5f00d11454964658084b2bcbebfd5d7f0f183858ba4a6bebfc5c7cfdadb4898bdcdc6cecf494e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff806d71dedf0e1f6e6f1c1d5f7d7eaeaf7fbbbc16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f747596262e2fa7afb7bfc7cfd7df9a409798308f1fd2d4ceff4e4f5a5b07080f10272feeef6e6f373d3f42459091536775c8c9d0d1d8d9e7feff00205f2282df048244081b04061181ac0e80ab051f09811b03190801042f043404070301070607110a500f1207550703041c0a090308030703020303030c0405030b06010e15054e071b0757070206170c500443032d03010411060f0c3a041d255f206d046a2580c80582b0031a0682fd03590716091809140c140c6a060a061a0659072b05460a2c040c040103310b2c041a060b0380ac060a062f314d0380a4083c030f033c0738082b0582ff1118082f112d03210f210f808c048297190b158894052f053b07020e180980be22740c80d61a0c0580ff0580df0cf29d033709815c1480b80880cb050a183b030a06380846080c06740b1e035a0459098083181c0a16094c04808a06aba40c170431a10481da26070c050580a61081f50701202a064c04808d0480be031b030f0d2f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f756e69636f64652f756e69636f64655f646174612e727300f01701007b0000005000000028000000f01701007b0000005c000000160000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f6573636170652e72730000008c1801006d00000034000000050000005c757b008c1801006d000000340000001a0000008c1801006d00000051000000090000008c1801006d00000051000000130000008c1801006d0000006200000023000000456d7074795a65726f5061727365496e744572726f72506f734f766572666c6f774e65674f766572666c6f7754727946726f6d536c6963654572726f72000000b00200005d13a00212172022bd1f60227c2c20300530603415a0e035f8a460370ca6a0371efbe03700fee043fd01614480072148010ae148240da149ab0e214b2f18614b3b196159301ce159f31e615d30342161f06a61624f6fe162f0afa1639dbca16400cf616567d1e16500da616600e0a167aee22169ebe4216bd0e8a16bfbf3e16b01006e6cf001bf6c270106010b01230101014701040101010401020200c00402040109020101fb07cf010501312d01010102010201012c010b060a0b010123010a1510016508010a0104210101011e1b5b0b3a0b0401020118182b032c0107020608293a370101010408040103070a020d010f013a010404080114021a010202390104020402020303011e0203010b0239010405010204011402160601013a0102010104080107020b021e013d010c0132010301370101030503010407020b021d013a0102010601050214021c0239020404080114021d014801070301015a0102070b09620102090901010749021b0101010101370e01050102050b0124090166040106010202021902040310040d01020206010f015e01000300031d021e021e02400201070801020b030105012d053301410222017603040209010603db0202013a010107010101010208060a02012701081f3104300101050101050128090c0220040202010338010102030101033a08020240065203010d0107040106010302323f0d012265000101030b030d030d030d020c0508020a01020102053105010a01010d01100d3321000271037d010f0160202f0100012404030505015d065d030001000600016204010a01011c0450020e224e011703670303020801030104011902050197021a120d012608190b2e03300102040202110115024206020202020c01080123010b01330101030202050201011b010e02050201016405090379010201040100019311001003010c1022010201a901070106010b01230101012f012d02430115030001e20195050006012a010900030102050428030401a502000400025003460b31047b01360f290102020a0331040202020104010a013203240501083e010c0234090a0402015f0302010102060102019d01030815023902030125070305c3080203010117015406010104020102ee04060201021b025508020101026a0101010206010165030204010500090102000201010401900402020401200a280602040801090602032e0d010200070106010152160207010201027a06030101020107010148020301010100020b023405050101010011060f00053b07090400013f114002010200040107010200020104002e02170003091002071e0494030037043208010e011605010f00070111020701020105053e2101a00e00013d04000500076d08000500011e6080f00000a0100000a013e006801c2008161fa008b624c009002c201340a6601330abe01400fb601721ff20180004a11880072119800ce11ba018e11c406e611d00d4a11da6d6e11d00df812230e0612500e9212630f161268af1b226411a061a2f010a0104010517011f01c3010404d0012407021e0560012a0402020204010106010103010101140153018b08a601260929002601010501022b0104005602060009072b020340c040000206022602060208010101010101011f0235010701010303010703040206040d0503010774010d01100d65010401020a0101030506010101010101040106040102040505040111200302003400e5060403020c2601010501002e121e84660304013b05020101010518050103002b010e065000070c05001a061a005060240424740b010f01070102010b010f0107010200010203012a010900330d3300400040005501470102020102020204010c010101070141010402080107011c0104010501010307010002190119011f0119011f0119011f0119011f01190108000a01140606003e0044001a061a061a00000003000083042000910560005d13a0001217201f0c20601fef2ca02b2a30202c6fa6e02c02a8602d1efb602e00fe20369eff6036fd01e136010a2137240de137ab0e61392f18a139301c6148f31ea14c40346150f06aa1514f6f21529dbca15200cf615365d1a15300da215400e0e155aee26157ece42159d0e8a1592000ee59f0017f5a00700007002d0101010201020101480b30151001650702060202010423011e1b5b0b3a09090118040109010301052b033c082a180120370101010408040103070a021d013a0101010204080109010a021a010202390104020402020303011e0203010b0239010405010204011402160601013a0101020104080107030a021e013b0101010c01090128010301370101030503010407020b021d013a01020102010301050207020b021c02390201010204080109010a021d0148010401020301010801510102070c08620102090b0749021b0101010101370e01050102050b0124090166040106010202021902040310040d01020206010f01000300031d021e021e02400201070801020b09012d030101750222017603040209010603db0202013a010107010101010208060a0201301f310430070101050128090c0220040202010338010102030101033a0802029803010d0107040106010302c6400001c32100038d016020000669020004010a200250020001030104011902050197021a120d012608190b2e0330010204020227014306020202020c0108012f01330101030202050201012a020801ee010201040100010010101000020001e201950500030102050428030401a502000400025003460b31047b01360f290102020a033104020207013d03240501083e010c0234090a0402015f0302010102060102019d010308150239020101010116010e070305c308020301011701510102060101020101020102eb010204060201021b025508020101026a0101010206010165030204010500090102f5010a0201010401900402020401200a280602040801090602032e0d010200070106010152160207010201027a06030101020107010148020301010100020b023405050101010001060f00053b0700013f0451010002002e0217000101030405080802071e0494030037043208010e011605010f000701110207010201056401a00700013d04000400076d07006080f00000c0000000e0000000c1000000e1000000c2000000e2000000c3000000e3000000c4000000e4000000c5000000e5000000c6000000e6000000c7000000e7000000c8000000e8000000c9000000e9000000ca000000ea000000cb000000eb000000cc000000ec000000cd000000ed000000ce000000ee000000cf000000ef000000d0000000f0000000d1000000f1000000d2000000f2000000d3000000f3000000d4000000f4000000d5000000f5000000d6000000f6000000d8000000f8000000d9000000f9000000da000000fa000000db000000fb000000dc000000fc000000dd000000fd000000de000000fe000000000100000101000002010000030100000401000005010000060100000701000008010000090100000a0100000b0100000c0100000d0100000e0100000f010000100100001101000012010000130100001401000015010000160100001701000018010000190100001a0100001b0100001c0100001d0100001e0100001f010000200100002101000022010000230100002401000025010000260100002701000028010000290100002a0100002b0100002c0100002d0100002e0100002f0100003001000000004000320100003301000034010000350100003601000037010000390100003a0100003b0100003c0100003d0100003e0100003f0100004001000041010000420100004301000044010000450100004601000047010000480100004a0100004b0100004c0100004d0100004e0100004f010000500100005101000052010000530100005401000055010000560100005701000058010000590100005a0100005b0100005c0100005d0100005e0100005f010000600100006101000062010000630100006401000065010000660100006701000068010000690100006a0100006b0100006c0100006d0100006e0100006f010000700100007101000072010000730100007401000075010000760100007701000078010000ff000000790100007a0100007b0100007c0100007d0100007e0100008101000053020000820100008301000084010000850100008601000054020000870100008801000089010000560200008a010000570200008b0100008c0100008e010000dd0100008f01000059020000900100005b0200009101000092010000930100006002000094010000630200009601000069020000970100006802000098010000990100009c0100006f0200009d010000720200009f01000075020000a0010000a1010000a2010000a3010000a4010000a5010000a601000080020000a7010000a8010000a901000083020000ac010000ad010000ae01000088020000af010000b0010000b10100008a020000b20100008b020000b3010000b4010000b5010000b6010000b701000092020000b8010000b9010000bc010000bd010000c4010000c6010000c5010000c6010000c7010000c9010000c8010000c9010000ca010000cc010000cb010000cc010000cd010000ce010000cf010000d0010000d1010000d2010000d3010000d4010000d5010000d6010000d7010000d8010000d9010000da010000db010000dc010000de010000df010000e0010000e1010000e2010000e3010000e4010000e5010000e6010000e7010000e8010000e9010000ea010000eb010000ec010000ed010000ee010000ef010000f1010000f3010000f2010000f3010000f4010000f5010000f601000095010000f7010000bf010000f8010000f9010000fa010000fb010000fc010000fd010000fe010000ff010000000200000102000002020000030200000402000005020000060200000702000008020000090200000a0200000b0200000c0200000d0200000e0200000f020000100200001102000012020000130200001402000015020000160200001702000018020000190200001a0200001b0200001c0200001d0200001e0200001f020000200200009e01000022020000230200002402000025020000260200002702000028020000290200002a0200002b0200002c0200002d0200002e0200002f020000300200003102000032020000330200003a020000652c00003b0200003c0200003d0200009a0100003e020000662c0000410200004202000043020000800100004402000089020000450200008c020000460200004702000048020000490200004a0200004b0200004c0200004d0200004e0200004f0200007003000071030000720300007303000076030000770300007f030000f303000086030000ac03000088030000ad03000089030000ae0300008a030000af0300008c030000cc0300008e030000cd0300008f030000ce03000091030000b103000092030000b203000093030000b303000094030000b403000095030000b503000096030000b603000097030000b703000098030000b803000099030000b90300009a030000ba0300009b030000bb0300009c030000bc0300009d030000bd0300009e030000be0300009f030000bf030000a0030000c0030000a1030000c1030000a3030000c3030000a4030000c4030000a5030000c5030000a6030000c6030000a7030000c7030000a8030000c8030000a9030000c9030000aa030000ca030000ab030000cb030000cf030000d7030000d8030000d9030000da030000db030000dc030000dd030000de030000df030000e0030000e1030000e2030000e3030000e4030000e5030000e6030000e7030000e8030000e9030000ea030000eb030000ec030000ed030000ee030000ef030000f4030000b8030000f7030000f8030000f9030000f2030000fa030000fb030000fd0300007b030000fe0300007c030000ff0300007d03000000040000500400000104000051040000020400005204000003040000530400000404000054040000050400005504000006040000560400000704000057040000080400005804000009040000590400000a0400005a0400000b0400005b0400000c0400005c0400000d0400005d0400000e0400005e0400000f0400005f04000010040000300400001104000031040000120400003204000013040000330400001404000034040000150400003504000016040000360400001704000037040000180400003804000019040000390400001a0400003a0400001b0400003b0400001c0400003c0400001d0400003d0400001e0400003e0400001f0400003f04000020040000400400002104000041040000220400004204000023040000430400002404000044040000250400004504000026040000460400002704000047040000280400004804000029040000490400002a0400004a0400002b0400004b0400002c0400004c0400002d0400004d0400002e0400004e0400002f0400004f040000600400006104000062040000630400006404000065040000660400006704000068040000690400006a0400006b0400006c0400006d0400006e0400006f040000700400007104000072040000730400007404000075040000760400007704000078040000790400007a0400007b0400007c0400007d0400007e0400007f04000080040000810400008a0400008b0400008c0400008d0400008e0400008f040000900400009104000092040000930400009404000095040000960400009704000098040000990400009a0400009b0400009c0400009d0400009e0400009f040000a0040000a1040000a2040000a3040000a4040000a5040000a6040000a7040000a8040000a9040000aa040000ab040000ac040000ad040000ae040000af040000b0040000b1040000b2040000b3040000b4040000b5040000b6040000b7040000b8040000b9040000ba040000bb040000bc040000bd040000be040000bf040000c0040000cf040000c1040000c2040000c3040000c4040000c5040000c6040000c7040000c8040000c9040000ca040000cb040000cc040000cd040000ce040000d0040000d1040000d2040000d3040000d4040000d5040000d6040000d7040000d8040000d9040000da040000db040000dc040000dd040000de040000df040000e0040000e1040000e2040000e3040000e4040000e5040000e6040000e7040000e8040000e9040000ea040000eb040000ec040000ed040000ee040000ef040000f0040000f1040000f2040000f3040000f4040000f5040000f6040000f7040000f8040000f9040000fa040000fb040000fc040000fd040000fe040000ff040000000500000105000002050000030500000405000005050000060500000705000008050000090500000a0500000b0500000c0500000d0500000e0500000f050000100500001105000012050000130500001405000015050000160500001705000018050000190500001a0500001b0500001c0500001d0500001e0500001f050000200500002105000022050000230500002405000025050000260500002705000028050000290500002a0500002b0500002c0500002d0500002e0500002f0500003105000061050000320500006205000033050000630500003405000064050000350500006505000036050000660500003705000067050000380500006805000039050000690500003a0500006a0500003b0500006b0500003c0500006c0500003d0500006d0500003e0500006e0500003f0500006f05000040050000700500004105000071050000420500007205000043050000730500004405000074050000450500007505000046050000760500004705000077050000480500007805000049050000790500004a0500007a0500004b0500007b0500004c0500007c0500004d0500007d0500004e0500007e0500004f0500007f0500005005000080050000510500008105000052050000820500005305000083050000540500008405000055050000850500005605000086050000a0100000002d0000a1100000012d0000a2100000022d0000a3100000032d0000a4100000042d0000a5100000052d0000a6100000062d0000a7100000072d0000a8100000082d0000a9100000092d0000aa1000000a2d0000ab1000000b2d0000ac1000000c2d0000ad1000000d2d0000ae1000000e2d0000af1000000f2d0000b0100000102d0000b1100000112d0000b2100000122d0000b3100000132d0000b4100000142d0000b5100000152d0000b6100000162d0000b7100000172d0000b8100000182d0000b9100000192d0000ba1000001a2d0000bb1000001b2d0000bc1000001c2d0000bd1000001d2d0000be1000001e2d0000bf1000001f2d0000c0100000202d0000c1100000212d0000c2100000222d0000c3100000232d0000c4100000242d0000c5100000252d0000c7100000272d0000cd1000002d2d0000a013000070ab0000a113000071ab0000a213000072ab0000a313000073ab0000a413000074ab0000a513000075ab0000a613000076ab0000a713000077ab0000a813000078ab0000a913000079ab0000aa1300007aab0000ab1300007bab0000ac1300007cab0000ad1300007dab0000ae1300007eab0000af1300007fab0000b013000080ab0000b113000081ab0000b213000082ab0000b313000083ab0000b413000084ab0000b513000085ab0000b613000086ab0000b713000087ab0000b813000088ab0000b913000089ab0000ba1300008aab0000bb1300008bab0000bc1300008cab0000bd1300008dab0000be1300008eab0000bf1300008fab0000c013000090ab0000c113000091ab0000c213000092ab0000c313000093ab0000c413000094ab0000c513000095ab0000c613000096ab0000c713000097ab0000c813000098ab0000c913000099ab0000ca1300009aab0000cb1300009bab0000cc1300009cab0000cd1300009dab0000ce1300009eab0000cf1300009fab0000d0130000a0ab0000d1130000a1ab0000d2130000a2ab0000d3130000a3ab0000d4130000a4ab0000d5130000a5ab0000d6130000a6ab0000d7130000a7ab0000d8130000a8ab0000d9130000a9ab0000da130000aaab0000db130000abab0000dc130000acab0000dd130000adab0000de130000aeab0000df130000afab0000e0130000b0ab0000e1130000b1ab0000e2130000b2ab0000e3130000b3ab0000e4130000b4ab0000e5130000b5ab0000e6130000b6ab0000e7130000b7ab0000e8130000b8ab0000e9130000b9ab0000ea130000baab0000eb130000bbab0000ec130000bcab0000ed130000bdab0000ee130000beab0000ef130000bfab0000f0130000f8130000f1130000f9130000f2130000fa130000f3130000fb130000f4130000fc130000f5130000fd130000901c0000d0100000911c0000d1100000921c0000d2100000931c0000d3100000941c0000d4100000951c0000d5100000961c0000d6100000971c0000d7100000981c0000d8100000991c0000d91000009a1c0000da1000009b1c0000db1000009c1c0000dc1000009d1c0000dd1000009e1c0000de1000009f1c0000df100000a01c0000e0100000a11c0000e1100000a21c0000e2100000a31c0000e3100000a41c0000e4100000a51c0000e5100000a61c0000e6100000a71c0000e7100000a81c0000e8100000a91c0000e9100000aa1c0000ea100000ab1c0000eb100000ac1c0000ec100000ad1c0000ed100000ae1c0000ee100000af1c0000ef100000b01c0000f0100000b11c0000f1100000b21c0000f2100000b31c0000f3100000b41c0000f4100000b51c0000f5100000b61c0000f6100000b71c0000f7100000b81c0000f8100000b91c0000f9100000ba1c0000fa100000bd1c0000fd100000be1c0000fe100000bf1c0000ff100000001e0000011e0000021e0000031e0000041e0000051e0000061e0000071e0000081e0000091e00000a1e00000b1e00000c1e00000d1e00000e1e00000f1e0000101e0000111e0000121e0000131e0000141e0000151e0000161e0000171e0000181e0000191e00001a1e00001b1e00001c1e00001d1e00001e1e00001f1e0000201e0000211e0000221e0000231e0000241e0000251e0000261e0000271e0000281e0000291e00002a1e00002b1e00002c1e00002d1e00002e1e00002f1e0000301e0000311e0000321e0000331e0000341e0000351e0000361e0000371e0000381e0000391e00003a1e00003b1e00003c1e00003d1e00003e1e00003f1e0000401e0000411e0000421e0000431e0000441e0000451e0000461e0000471e0000481e0000491e00004a1e00004b1e00004c1e00004d1e00004e1e00004f1e0000501e0000511e0000521e0000531e0000541e0000551e0000561e0000571e0000581e0000591e00005a1e00005b1e00005c1e00005d1e00005e1e00005f1e0000601e0000611e0000621e0000631e0000641e0000651e0000661e0000671e0000681e0000691e00006a1e00006b1e00006c1e00006d1e00006e1e00006f1e0000701e0000711e0000721e0000731e0000741e0000751e0000761e0000771e0000781e0000791e00007a1e00007b1e00007c1e00007d1e00007e1e00007f1e0000801e0000811e0000821e0000831e0000841e0000851e0000861e0000871e0000881e0000891e00008a1e00008b1e00008c1e00008d1e00008e1e00008f1e0000901e0000911e0000921e0000931e0000941e0000951e00009e1e0000df000000a01e0000a11e0000a21e0000a31e0000a41e0000a51e0000a61e0000a71e0000a81e0000a91e0000aa1e0000ab1e0000ac1e0000ad1e0000ae1e0000af1e0000b01e0000b11e0000b21e0000b31e0000b41e0000b51e0000b61e0000b71e0000b81e0000b91e0000ba1e0000bb1e0000bc1e0000bd1e0000be1e0000bf1e0000c01e0000c11e0000c21e0000c31e0000c41e0000c51e0000c61e0000c71e0000c81e0000c91e0000ca1e0000cb1e0000cc1e0000cd1e0000ce1e0000cf1e0000d01e0000d11e0000d21e0000d31e0000d41e0000d51e0000d61e0000d71e0000d81e0000d91e0000da1e0000db1e0000dc1e0000dd1e0000de1e0000df1e0000e01e0000e11e0000e21e0000e31e0000e41e0000e51e0000e61e0000e71e0000e81e0000e91e0000ea1e0000eb1e0000ec1e0000ed1e0000ee1e0000ef1e0000f01e0000f11e0000f21e0000f31e0000f41e0000f51e0000f61e0000f71e0000f81e0000f91e0000fa1e0000fb1e0000fc1e0000fd1e0000fe1e0000ff1e0000081f0000001f0000091f0000011f00000a1f0000021f00000b1f0000031f00000c1f0000041f00000d1f0000051f00000e1f0000061f00000f1f0000071f0000181f0000101f0000191f0000111f00001a1f0000121f00001b1f0000131f00001c1f0000141f00001d1f0000151f0000281f0000201f0000291f0000211f00002a1f0000221f00002b1f0000231f00002c1f0000241f00002d1f0000251f00002e1f0000261f00002f1f0000271f0000381f0000301f0000391f0000311f00003a1f0000321f00003b1f0000331f00003c1f0000341f00003d1f0000351f00003e1f0000361f00003f1f0000371f0000481f0000401f0000491f0000411f00004a1f0000421f00004b1f0000431f00004c1f0000441f00004d1f0000451f0000591f0000511f00005b1f0000531f00005d1f0000551f00005f1f0000571f0000681f0000601f0000691f0000611f00006a1f0000621f00006b1f0000631f00006c1f0000641f00006d1f0000651f00006e1f0000661f00006f1f0000671f0000881f0000801f0000891f0000811f00008a1f0000821f00008b1f0000831f00008c1f0000841f00008d1f0000851f00008e1f0000861f00008f1f0000871f0000981f0000901f0000991f0000911f00009a1f0000921f00009b1f0000931f00009c1f0000941f00009d1f0000951f00009e1f0000961f00009f1f0000971f0000a81f0000a01f0000a91f0000a11f0000aa1f0000a21f0000ab1f0000a31f0000ac1f0000a41f0000ad1f0000a51f0000ae1f0000a61f0000af1f0000a71f0000b81f0000b01f0000b91f0000b11f0000ba1f0000701f0000bb1f0000711f0000bc1f0000b31f0000c81f0000721f0000c91f0000731f0000ca1f0000741f0000cb1f0000751f0000cc1f0000c31f0000d81f0000d01f0000d91f0000d11f0000da1f0000761f0000db1f0000771f0000e81f0000e01f0000e91f0000e11f0000ea1f00007a1f0000eb1f00007b1f0000ec1f0000e51f0000f81f0000781f0000f91f0000791f0000fa1f00007c1f0000fb1f00007d1f0000fc1f0000f31f000026210000c90300002a2100006b0000002b210000e5000000322100004e21000060210000702100006121000071210000622100007221000063210000732100006421000074210000652100007521000066210000762100006721000077210000682100007821000069210000792100006a2100007a2100006b2100007b2100006c2100007c2100006d2100007d2100006e2100007e2100006f2100007f2100008321000084210000b6240000d0240000b7240000d1240000b8240000d2240000b9240000d3240000ba240000d4240000bb240000d5240000bc240000d6240000bd240000d7240000be240000d8240000bf240000d9240000c0240000da240000c1240000db240000c2240000dc240000c3240000dd240000c4240000de240000c5240000df240000c6240000e0240000c7240000e1240000c8240000e2240000c9240000e3240000ca240000e4240000cb240000e5240000cc240000e6240000cd240000e7240000ce240000e8240000cf240000e9240000002c0000302c0000012c0000312c0000022c0000322c0000032c0000332c0000042c0000342c0000052c0000352c0000062c0000362c0000072c0000372c0000082c0000382c0000092c0000392c00000a2c00003a2c00000b2c00003b2c00000c2c00003c2c00000d2c00003d2c00000e2c00003e2c00000f2c00003f2c0000102c0000402c0000112c0000412c0000122c0000422c0000132c0000432c0000142c0000442c0000152c0000452c0000162c0000462c0000172c0000472c0000182c0000482c0000192c0000492c00001a2c00004a2c00001b2c00004b2c00001c2c00004c2c00001d2c00004d2c00001e2c00004e2c00001f2c00004f2c0000202c0000502c0000212c0000512c0000222c0000522c0000232c0000532c0000242c0000542c0000252c0000552c0000262c0000562c0000272c0000572c0000282c0000582c0000292c0000592c00002a2c00005a2c00002b2c00005b2c00002c2c00005c2c00002d2c00005d2c00002e2c00005e2c00002f2c00005f2c0000602c0000612c0000622c00006b020000632c00007d1d0000642c00007d020000672c0000682c0000692c00006a2c00006b2c00006c2c00006d2c0000510200006e2c0000710200006f2c000050020000702c000052020000722c0000732c0000752c0000762c00007e2c00003f0200007f2c000040020000802c0000812c0000822c0000832c0000842c0000852c0000862c0000872c0000882c0000892c00008a2c00008b2c00008c2c00008d2c00008e2c00008f2c0000902c0000912c0000922c0000932c0000942c0000952c0000962c0000972c0000982c0000992c00009a2c00009b2c00009c2c00009d2c00009e2c00009f2c0000a02c0000a12c0000a22c0000a32c0000a42c0000a52c0000a62c0000a72c0000a82c0000a92c0000aa2c0000ab2c0000ac2c0000ad2c0000ae2c0000af2c0000b02c0000b12c0000b22c0000b32c0000b42c0000b52c0000b62c0000b72c0000b82c0000b92c0000ba2c0000bb2c0000bc2c0000bd2c0000be2c0000bf2c0000c02c0000c12c0000c22c0000c32c0000c42c0000c52c0000c62c0000c72c0000c82c0000c92c0000ca2c0000cb2c0000cc2c0000cd2c0000ce2c0000cf2c0000d02c0000d12c0000d22c0000d32c0000d42c0000d52c0000d62c0000d72c0000d82c0000d92c0000da2c0000db2c0000dc2c0000dd2c0000de2c0000df2c0000e02c0000e12c0000e22c0000e32c0000eb2c0000ec2c0000ed2c0000ee2c0000f22c0000f32c000040a6000041a6000042a6000043a6000044a6000045a6000046a6000047a6000048a6000049a600004aa600004ba600004ca600004da600004ea600004fa6000050a6000051a6000052a6000053a6000054a6000055a6000056a6000057a6000058a6000059a600005aa600005ba600005ca600005da600005ea600005fa6000060a6000061a6000062a6000063a6000064a6000065a6000066a6000067a6000068a6000069a600006aa600006ba600006ca600006da6000080a6000081a6000082a6000083a6000084a6000085a6000086a6000087a6000088a6000089a600008aa600008ba600008ca600008da600008ea600008fa6000090a6000091a6000092a6000093a6000094a6000095a6000096a6000097a6000098a6000099a600009aa600009ba6000022a7000023a7000024a7000025a7000026a7000027a7000028a7000029a700002aa700002ba700002ca700002da700002ea700002fa7000032a7000033a7000034a7000035a7000036a7000037a7000038a7000039a700003aa700003ba700003ca700003da700003ea700003fa7000040a7000041a7000042a7000043a7000044a7000045a7000046a7000047a7000048a7000049a700004aa700004ba700004ca700004da700004ea700004fa7000050a7000051a7000052a7000053a7000054a7000055a7000056a7000057a7000058a7000059a700005aa700005ba700005ca700005da700005ea700005fa7000060a7000061a7000062a7000063a7000064a7000065a7000066a7000067a7000068a7000069a700006aa700006ba700006ca700006da700006ea700006fa7000079a700007aa700007ba700007ca700007da70000791d00007ea700007fa7000080a7000081a7000082a7000083a7000084a7000085a7000086a7000087a700008ba700008ca700008da700006502000090a7000091a7000092a7000093a7000096a7000097a7000098a7000099a700009aa700009ba700009ca700009da700009ea700009fa70000a0a70000a1a70000a2a70000a3a70000a4a70000a5a70000a6a70000a7a70000a8a70000a9a70000aaa7000066020000aba700005c020000aca7000061020000ada700006c020000aea700006a020000b0a700009e020000b1a7000087020000b2a700009d020000b3a7000053ab0000b4a70000b5a70000b6a70000b7a70000b8a70000b9a70000baa70000bba70000bca70000bda70000bea70000bfa70000c0a70000c1a70000c2a70000c3a70000c4a7000094a70000c5a7000082020000c6a700008e1d0000c7a70000c8a70000c9a70000caa70000d0a70000d1a70000d6a70000d7a70000d8a70000d9a70000f5a70000f6a7000021ff000041ff000022ff000042ff000023ff000043ff000024ff000044ff000025ff000045ff000026ff000046ff000027ff000047ff000028ff000048ff000029ff000049ff00002aff00004aff00002bff00004bff00002cff00004cff00002dff00004dff00002eff00004eff00002fff00004fff000030ff000050ff000031ff000051ff000032ff000052ff000033ff000053ff000034ff000054ff000035ff000055ff000036ff000056ff000037ff000057ff000038ff000058ff000039ff000059ff00003aff00005aff000000040100280401000104010029040100020401002a040100030401002b040100040401002c040100050401002d040100060401002e040100070401002f040100080401003004010009040100310401000a040100320401000b040100330401000c040100340401000d040100350401000e040100360401000f0401003704010010040100380401001104010039040100120401003a040100130401003b040100140401003c040100150401003d040100160401003e040100170401003f040100180401004004010019040100410401001a040100420401001b040100430401001c040100440401001d040100450401001e040100460401001f0401004704010020040100480401002104010049040100220401004a040100230401004b040100240401004c040100250401004d040100260401004e040100270401004f040100b0040100d8040100b1040100d9040100b2040100da040100b3040100db040100b4040100dc040100b5040100dd040100b6040100de040100b7040100df040100b8040100e0040100b9040100e1040100ba040100e2040100bb040100e3040100bc040100e4040100bd040100e5040100be040100e6040100bf040100e7040100c0040100e8040100c1040100e9040100c2040100ea040100c3040100eb040100c4040100ec040100c5040100ed040100c6040100ee040100c7040100ef040100c8040100f0040100c9040100f1040100ca040100f2040100cb040100f3040100cc040100f4040100cd040100f5040100ce040100f6040100cf040100f7040100d0040100f8040100d1040100f9040100d2040100fa040100d3040100fb040100700501009705010071050100980501007205010099050100730501009a050100740501009b050100750501009c050100760501009d050100770501009e050100780501009f05010079050100a00501007a050100a10501007c050100a30501007d050100a40501007e050100a50501007f050100a605010080050100a705010081050100a805010082050100a905010083050100aa05010084050100ab05010085050100ac05010086050100ad05010087050100ae05010088050100af05010089050100b00501008a050100b10501008c050100b30501008d050100b40501008e050100b50501008f050100b605010090050100b705010091050100b805010092050100b905010094050100bb05010095050100bc050100800c0100c00c0100810c0100c10c0100820c0100c20c0100830c0100c30c0100840c0100c40c0100850c0100c50c0100860c0100c60c0100870c0100c70c0100880c0100c80c0100890c0100c90c01008a0c0100ca0c01008b0c0100cb0c01008c0c0100cc0c01008d0c0100cd0c01008e0c0100ce0c01008f0c0100cf0c0100900c0100d00c0100910c0100d10c0100920c0100d20c0100930c0100d30c0100940c0100d40c0100950c0100d50c0100960c0100d60c0100970c0100d70c0100980c0100d80c0100990c0100d90c01009a0c0100da0c01009b0c0100db0c01009c0c0100dc0c01009d0c0100dd0c01009e0c0100de0c01009f0c0100df0c0100a00c0100e00c0100a10c0100e10c0100a20c0100e20c0100a30c0100e30c0100a40c0100e40c0100a50c0100e50c0100a60c0100e60c0100a70c0100e70c0100a80c0100e80c0100a90c0100e90c0100aa0c0100ea0c0100ab0c0100eb0c0100ac0c0100ec0c0100ad0c0100ed0c0100ae0c0100ee0c0100af0c0100ef0c0100b00c0100f00c0100b10c0100f10c0100b20c0100f20c0100a0180100c0180100a1180100c1180100a2180100c2180100a3180100c3180100a4180100c4180100a5180100c5180100a6180100c6180100a7180100c7180100a8180100c8180100a9180100c9180100aa180100ca180100ab180100cb180100ac180100cc180100ad180100cd180100ae180100ce180100af180100cf180100b0180100d0180100b1180100d1180100b2180100d2180100b3180100d3180100b4180100d4180100b5180100d5180100b6180100d6180100b7180100d7180100b8180100d8180100b9180100d9180100ba180100da180100bb180100db180100bc180100dc180100bd180100dd180100be180100de180100bf180100df180100406e0100606e0100416e0100616e0100426e0100626e0100436e0100636e0100446e0100646e0100456e0100656e0100466e0100666e0100476e0100676e0100486e0100686e0100496e0100696e01004a6e01006a6e01004b6e01006b6e01004c6e01006c6e01004d6e01006d6e01004e6e01006e6e01004f6e01006f6e0100506e0100706e0100516e0100716e0100526e0100726e0100536e0100736e0100546e0100746e0100556e0100756e0100566e0100766e0100576e0100776e0100586e0100786e0100596e0100796e01005a6e01007a6e01005b6e01007b6e01005c6e01007c6e01005d6e01007d6e01005e6e01007e6e01005f6e01007f6e010000e9010022e9010001e9010023e9010002e9010024e9010003e9010025e9010004e9010026e9010005e9010027e9010006e9010028e9010007e9010029e9010008e901002ae9010009e901002be901000ae901002ce901000be901002de901000ce901002ee901000de901002fe901000ee9010030e901000fe9010031e9010010e9010032e9010011e9010033e9010012e9010034e9010013e9010035e9010014e9010036e9010015e9010037e9010016e9010038e9010017e9010039e9010018e901003ae9010019e901003be901001ae901003ce901001be901003de901001ce901003ee901001de901003fe901001ee9010040e901001fe9010041e9010020e9010042e9010021e9010043e901006900000007030041809d050bd301617474656d707420746f20646976696465206279207a65726f2f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f66697865642d312e32342e302f7372632f62797465732e7273994e01005b0000002c0000002b000000994e01005b0000002d0000003a000000994e01005b000000520000001f000000696e646578206f7574206f6620626f756e647300244f010013000000994e01005b0000004f0000000d000000086c010041e09e050b03086c010041ec9e050b03086c010041809f050b8507994e01005b00000050010000090000002f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f66697865642d312e32342e302f7372632f66726f6d5f7374722e72730000904f01005e000000d104000029000000904f01005e000000cc04000028000000904f01005e000000cd0400002d000000904f01005e000000d804000028000000904f01005e000000d904000033000000904f01005e0000003d03000001000000506172736546697865644572726f726b696e64496e76616c696444696769744d6973706c616365645369676e4d6973706c61636564556e64657273636f72654e6f446967697473546f6f4d616e79506f696e74734f766572666c6f77457870496e76616c696444696769744578704e6f446967697473546f6f4d616e794578704578704f766572666c6f77756e61626c6520746f206465636f64652073656c6563746f72656e636f756e746572656420756e6b6e6f776e2073656c6563746f72756e61626c6520746f206465636f646520696e707574636f756c64206e6f74207265616420696e7075747061696420616e20756e70617961626c65206d657373616765617373657274696f6e206661696c65643a206d6964203c3d2073656c662e6c656e28290a00086c01000000000076510100010000002f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f696e6b5f656e762d342e332e302f7372632f656e67696e652f6f6e5f636861696e2f6275666665722e7273000000885101006d0000005a00000009000000885101006d0000005a00000031000000885101006d0000006500000009000000885101006d0000008d000000210000004465636f646543616c6c65655472617070656443616c6c656552657665727465644b65794e6f74466f756e645f42656c6f7753756273697374656e63655468726573686f6c645472616e736665724661696c65645f456e646f776d656e74546f6f4c6f77436f64654e6f74466f756e644e6f7443616c6c61626c65556e6b6e6f776e4c6f6767696e6744697361626c656443616c6c52756e74696d654661696c656445636473615265636f766572794661696c6564000000645d010067000000770000000e0000004572726f72004190a6050ba501736869667465642073756666696369656e74206269747320726967687420746f206c656164206f6e6c79206c656164696e67207a65726f733b20716564000000105301003d000000fb5c0100690000005e0100001100000050726576696f7573206d617463682061726d206d61746368657320616e7974696e67206c657373207468616e20325e33303b2071656400006853010036000000fb5c01006900000057010000110041c8a7050bd717fb5c0100690000008a01000011000000fb5c01006900000083010000110000006361706163697479206f766572666c6f77000000e8530100110000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f616c6c6f632f7372632f7665632f737065635f66726f6d5f697465725f6e65737465642e727300000004540100810000003b000000120000007b226964223a312c226a736f6e727063223a22322e30222c226d6574686f64223a2273746174655f63616c6c222c22706172616d73223a5b22436f6e7472616374734170695f63616c6c222c2022222c20000000985401004e000000e654010003000000b666010002000000b86601005e00000069010000210000005075626c6963206b657920636f6e76657273696f6e206661696c6564b86601005e000000230100000a000000496e646578206f7574206f6620626f756e64730040550100130000005f686561645f7461696c2f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f736c6963652f6d6f642e727300006655010070000000ce030000200000006655010070000000ce0300002d0000006655010070000000d2030000200000006655010070000000d20300002b0000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f736c6963652f736f72742e72730000001856010071000000340400000d0000001856010071000000410400001800000018560100710000004204000019000000185601007100000043040000240000001856010071000000490400000d000000185601007100000087040000400000001856010071000000ad0400004e0000001856010071000000bb040000560000001856010071000000cf0400001100000018560100710000003705000028000000617373657274696f6e206661696c65643a20656e64203e3d20737461727420262620656e64203c3d206c656e185601007100000026050000050000001856010071000000a30000001e000000617373657274696f6e206661696c65643a206f666673657420213d2030202626206f6666736574203c3d206c656e000018560100710000009b000000050000002c0000000c000000040000002d0000001f00000004000000040000002e000000617373657274696f6e206661696c65643a20696478203c2043415041434954592f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f6e6f64652e72730000f85701007e0000008f02000009000000f85701007e000000a002000009000000617373657274696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e686569676874202d2031f85701007e0000009c02000009000000617373657274696f6e206661696c65643a207372632e6c656e2829203d3d206473742e6c656e2829f85701007e0000001c07000005000000617373657274696f6e206661696c65643a206f6c645f6c6566745f6c656e203e3d20636f756e7400f85701007e000000ca0500000d000000617373657274696f6e206661696c65643a206c656e203e2030000000f85701007e00000065010000090000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f6e617669676174652e72730000745901008200000059020000300000007459010082000000c7000000270000002f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f616c6c6f632f7372632f7665632f6d6f642e727300185a01006f0000001a0b00000d0000003a200000086c010000000000985a0100020000002f686f6d652f677569676f752f70726f6772616d6d696e672f706861742d6f6666636861696e2d726f6c6c75702f706861742f6372617465732f726f6c6c75702f7372632f636c69656e74732f696e6b2e7273526f6c6c757020736e617073686f743a206661696c656420746f206765742073746f726167656472792072756e20616e642073656e64207472616e73616374696f6e206661696c6564486173682073686f756c64206265206f66206c656e67746820333200ac5a0100530000003d0100000e000000556e6b6e6f776e4c6f636b4661696c6564546f5265616456657273696f6e4465636f64654f766572666c6f774661696c6564546f4465636f646553746f726167654661696c6564546f476574426c6f636b486173684661696c6564546f476574426c6f636b4e756d62657253657373696f6e4572726f7253657373696f6e4661696c6564546f4465636f646553657373696f6e4661696c6564546f47657453746f726167655175657565496e6465784f766572666c6f774c6f636b56657273696f6e4f766572666c6f775270634e6574776f726b4572726f72496e6b4661696c6564546f43616c6c436f6e7472616374496e6b4661696c6564546f5175657279436f6e7472616374496e6b4661696c6564546f44727952756e436f6e7472616374496e6b4661696c6564546f4372656174655472616e73616374696f6e496e6b4661696c6564546f53656e645472616e73616374696f6e496e6b4661696c6564546f507265706172654d6574615478496e6b4661696c6564546f4465636f64654b564572726f722f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f7061726974792d7363616c652d636f6465632d332e362e352f7372632f636f6d706163742e72732f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f7061726974792d7363616c652d636f6465632d332e362e352f7372632f636f6465632e7273002300000000000000010000002f0000002f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f70696e6b2d6a736f6e2d302e342e302f7372632f64652f726561642e7273dc5d010060000000ac00000013000000dc5d010060000000b500000034000000dc5d010060000000b100000029000000dc5d010060000000bb00000030000000dc5d0100600000002801000025000000dc5d010060000000090200002f00000063616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c75652f686f6d652f677569676f752f2e636172676f2f6769742f636865636b6f7574732f70696e6b2d6a736f6e2d613863336430323265313132363666662f666631626534622f7372632f64652f726561642e72730000c75e010053000000ae00000013000000c75e010053000000b700000034000000c75e010053000000b300000029000000c75e010053000000bd00000030000000c75e0100530000001701000017000000c75e010053000000410100002500000001010101010101010101010101010101010101010101010101010101010101010000010041d8bf050b01010041fcc0050bea13c75e010053000000270200002f000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00010203040506070809ffffffffffffff0a0b0c0d0e0fffffffffffffffffffffffffffffffffffffffffffffffffffff0a0b0c0d0e0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff456f665768696c6550617273696e674c697374456f665768696c6550617273696e674f626a656374456f665768696c6550617273696e67537472696e67456f665768696c6550617273696e674e756d626572456f665768696c6550617273696e6756616c75654578706563746564436f6c6f6e45787065637465644c697374436f6d6d614f72456e6445787065637465644f626a656374436f6d6d614f72456e644578706563746564536f6d654964656e744578706563746564536f6d6556616c7565496e76616c69644e756d626572496e76616c696454797065496e76616c6964556e69636f6465436f6465506f696e744b65794d757374426541537472696e67547261696c696e6743686172616374657273547261696c696e67436f6d6d61437573746f6d4572726f72496e76616c6964457363617065436f6e74726f6c4368617261637465725768696c6550617273696e67537472696e674661696c6564546f47657453746f726167653031323334353637383961626364656628292f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f636861722f6d6574686f64732e727300000b63010073000000d10600000a000000617474656d707420746f20646976696465206279207a65726f000000230000000000000001000000300000001d00000001000000010000003100000063616c6c65642060526573756c743a3a756e77726170282960206f6e20616e2060457272602076616c7565001d0000000100000001000000320000002f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f6865782d302e342e332f7372632f6c69622e727300000864010056000000c7000000250000000864010056000000c700000041000000617373756d652074686520636861696e20657874656e73696f6e206d6574686f64206e65766572206661696c732f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f696e6b5f656e762d342e332e302f7372632f636861696e5f657874656e73696f6e2e727300ad64010066000000cc0100000f000000656e636f756e7465726564206572726f72207768696c65206465636f64696e6720636861696e20657874656e73696f6e206d6574686f642063616c6c2072657475726e2076616c7565000000ad64010066000000c90100001a0000002f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f696e6b5f656e762d342e332e302f7372632f656e67696e652f6f6e5f636861696e2f6578742e72730000806501006a000000e400000014000000756c6c2f686f6d652f677569676f752f2e7275737475702f746f6f6c636861696e732f312e37322d7838365f36342d756e6b6e6f776e2d6c696e75782d676e752f6c69622f727573746c69622f7372632f727573742f6c6962726172792f636f72652f7372632f736c6963652f697465722e7273ff65010071000000cd05000015000000436f6e74656e742d547970656170706c69636174696f6e2f6a736f6e436f6e74656e742d4c656e677468535335385052456b68616c615d7d2f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f70696e6b2d7375627270632d302e342e332f7372632f6c69622e7273223078220000166701000300000019670100010000007b226964223a312c226a736f6e727063223a22322e30222c226d6574686f64223a2273797374656d5f6163636f756e744e657874496e646578222c22706172616d73223a5b22225d7d0000002c6701004600000072670100030000007b226964223a312c20226a736f6e727063223a22322e30222c20226d6574686f64223a202273746174655f67657452756e74696d6556657273696f6e227d7b226964223a312c20226a736f6e727063223a22322e30222c20226d6574686f64223a2022636861696e5f676574426c6f636b48617368222c22706172616d73223a5b000000c667010043000000b666010002000000b86601005e00000097000000200000007b226964223a312c20226a736f6e727063223a22322e30222c20226d6574686f64223a2022636861696e5f676574486561646572222c22706172616d73223a5b2c68010040000000b666010002000000b86601005e000000ab0000000a000000b86601005e000000ae00000016000000b86601005e000000b000000016000000b86601005e000000b200000016000000b86601005e000000b500000026000000626c6f636b206e756d626572206f766572666c6f77000000b86601005e000000b5000000450000007b226964223a312c226a736f6e727063223a22322e30222c226d6574686f64223a22617574686f725f7375626d697445787472696e736963222c22706172616d73223a5b22000000f4680100450000007267010003000000b86601005e00000055010000120000004661696c6564546f44727952756e436f6e74726163744661696c6564546f5175657279436f6e74726163744661696c6564546f4372656174655472616e73616374696f6e4661696c6564546f53656e645472616e73616374696f6e4661696c6564546f4465636f6465496e76616c6964416464726573734c656e6774684e6f526573756c744661696c6564546f52656164526573756c74436f6e74726163744572726f72436f6e7472616374556e6b6e6f776e4572726f72436f6e74726163745472617070656400000000006a736f6e72706300726573756c7469640000000000000000706172656e7448617368000000000000706172656e745f6861736800000000006e756d6265720041f0d4050ba1017374617465526f6f740000000000000073746174655f726f6f7400000000000065787472696e73696373526f6f74000065787472696e736963735f726f6f7400737065634e616d650000000000000000737065635f6e616d6500000000000000696d706c4e616d650000000000000000696d706c5f6e616d6500000000000000617574686f72696e6756657273696f6e617574686f72696e675f76657273696f6e0041a0d6050b527370656356657273696f6e0000000000737065635f76657273696f6e00000000696d706c56657273696f6e0000000000696d706c5f76657273696f6e617069737472616e73616374696f6e56657273696f6e004180d7050b137472616e73616374696f6e5f76657273696f6e0041a0d7050bb31a737461746556657273696f6e0000000073746174655f76657273696f6e537562525043526571756573744661696c6564496e76616c6964426f6479496e76616c69645369676e61747572655373353850617273654661696c65644465636f64654661696c6564000030780000086c010000000000086c01000200000023000000000000000100000033000000736c69636520697320616c7761797320746865206e6563657373617279206c656e6774682f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f73702d636f72652d68617368696e672d392e302e302f7372632f6c69622e72730000506c010062000000230000000a0000002f686f6d652f677569676f752f2e636172676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631376432326262613135303031662f737335382d72656769737472792d312e34332e302f7372632f616464726573735f666f726d61742e7273c46c01006c0000006f0000001b00000003002b00010035009e0834009f080a003005b801880039005c002200050041003905392706003a083c334e0024003600432c422c40082c00d907800032002c2e1d0042001100120021004f261600810007005604440040005d005a00621115034300651ba222b622693970236e0072143f0064007b2f0d007100f0077e001a001b00d70715000800040026002c08c6048a1c100002000b001f008300e507de2c4d00270028009a0204050505970830009f2f25003300650047004800ac00c504050d38001e0031000c012900580059000000630062000c006900ff002e002f0009002000b322c1071700fc00ec0545005100a40114001c00ce17ce082a000f00cf26a60fe3035f1b75000e002d00df1c8900230013003700490018001900426172654564323535313942617265536563703235366b3142617265537232353531394449434f4943454b49434f534e4f576163616c61616a756e61616c6c666561745f6e6574776f726b616c74616972616d706c6974756465616e6d6f6c6172657361737461726176656e74757362616a756e626173696c69736b626966726f7374626974677265656e62697474656e736f7263616c616d61726963656e747269667567656365726563657373636573732d746573746e6574636861696e666c6970636861696e78636c6f756477616c6b5f6d61696e6e6574636c6f766572636f6d706f7361626c65636f6e7465787466726565636f726463727573746461726b64617277696e6961646174616869676877617964656e746e6574646f636b2d706f732d6d61696e6e6574646f7261666163746f72792d706f6c6b61646f7465646765776172656566696e697479657175696c69627269756d657778667261676e6f76616672657175656e637967316765656b67656e736869726f676d676f6c64656e5f67617465676f6c64656e5f676174655f7379646e6579676f726f6861736865646865696b6f68756d616e6f646568796472616478696274696461696d70616374696e7465677269746565696e74656772697465652d696e636f676e69746f696e7465726c61796a6f7973747265616d6a7570697465726b61626f6368616b617065786b61726d61636861696e6b61727572616b6174616c636861696e6b696c746b696e74737567696b726573746b726967616e6b756c7570756b7573616d616c616d696e61726c6974656e7472796c69746d75736c6f67696f6e6c75686e6d616e74616d617468636861696e6d617468636861696e2d746573746e65746d65746171756974795f6e6574776f726b6d6f6f6e6265616d6d6f6f6e72697665726d6f6f6e73616d616e656174636f696e6e66746d6172746e6f646c656f616b6f726967696e747261696c2d70617261636861696e70336470336474706172616c6c656c7065617170656572706c61797370656e64756c756d7068616c617069636173736f70696f6e6565725f6e6574776f726b706f6c69706f6c6b61646578706f6c6b6164657870617261636861696e706f6c6b61646f74706f6c6b61666f756e647279706f6c6b61736d697468706f6c796d657368706f6e74656d2d6e6574776f726b71756172747a5f6d61696e6e657472657365727665643436726573657276656434377265796e6f6c6473726f626f6e6f6d69637373617070686972655f6d61696e6e65747365616c737368696674736f6369616c2d6e6574776f726b736f63696574616c736f7261736f72615f646f745f70617261736f72615f6b7573616d615f706172617374616669737562736f6369616c737562737061636573756273706163655f746573746e657473756273747261746573796e65737468657369617433726e74616e676c657465726e6f6174696465666974696e6b6572746f74656d756e6961727473756e697175655f6d61696e6e657476617261766c6e7761747278786e6574776f726b7a65697467656973747a65726f7a65726f2d616c70686176696c6c65005e6e01000b000000696e01000d000000766e01000b000000816e010004000000856e010003000000886e0100040000008c6e010004000000906e010005000000956e0100050000009a6e01000f000000a96e010006000000af6e010009000000b86e010005000000bd6e010004000000c16e010005000000c66e010007000000cd6e010005000000d26e010008000000da6e010007000000e16e010008000000e96e010009000000f26e010008000000fa6e01000a000000046f010004000000086f0100040000000c6f01000c000000186f010009000000216f010006000000276f010011000000386f0100060000003e6f01000a000000486f01000b000000536f010004000000576f0100050000005c6f010004000000606f010008000000686f01000b000000736f0100070000007a6f0100100000008a6f0100140000009e6f010008000000a66f010007000000ad6f01000b000000b86f010003000000bb6f010008000000c36f010009000000cc6f010002000000ce6f010004000000d26f010008000000da6f010002000000dc6f01000b000000e76f010012000000f96f010004000000fd6f01000600000003700100050000000870010008000000107001000700000017700100060000001d70010006000000237001000a0000002d7001001400000041700100080000004970010009000000527001000700000059700100070000006070010005000000657001000a0000006f70010006000000757001000a0000007f7001000400000083700100080000008b70010005000000907001000600000096700100060000009c70010006000000a270010007000000a970010008000000b170010006000000b770010006000000bd70010004000000c170010005000000c670010009000000cf70010011000000e070010011000000f170010008000000f97001000900000002710100080000000a71010008000000127101000700000019710100050000001e710100030000002171010015000000367101000300000039710100040000003d710100080000004571010004000000497101000900000052710100080000005a710100050000005f71010007000000667101000f00000075710100040000007971010008000000817101001100000092710100080000009a7101000c000000a67101000a000000b071010008000000b87101000e000000c67101000e000000d47101000a000000de7101000a000000e871010008000000f07101000a000000fa710100100000000a720100050000000f72010005000000147201000e00000022720100080000002a720100040000002e7201000d0000003b720100100000004b7201000500000050720100090000005972010008000000617201001000000071720100090000007a7201000b000000857201000400000089720100060000008f7201000600000095720100060000009b72010006000000a172010005000000a672010007000000ad7201000e000000bb72010004000000bf72010003000000c272010004000000c672010009000000cf72010009000000d872010004000000dc7201000f00000013000000150000001500000015000000140000000d000000160000001800000011000000110000000d0000000b0000001700000010000000120000000d0000000b0000000d000000220000008c6101009f610100b4610100c9610100de610100f2610100ff610100156201002d6201003e6201004f6201005c620100676201007e6201008e620100a0620100ad620100b8620100c5620100050000000c0000000b0000000b0000000400000050190100635001006619010071190100551901000c0000000d00000013000000080000000d000000080000000f0000000b0000000a0000000b000000635001006f5001007c5001008f50010097500100a4500100ac500100bb500100c6500100d0500100190000001c000000160000001400000019000000db500100f450010010510100265101003a510100130000000b00000010000000040000000b0000000c0000000d000000bd6b0100d06b0100db6b0100eb6b0100ef6b0100fa6b0100f36901","build_info":{"build_mode":"Debug","cargo_contract_version":"3.2.0","rust_toolchain":"stable-x86_64-unknown-linux-gnu","wasm_opt_settings":{"keep_debug_symbols":false,"optimization_passes":"Z"}}},"contract":{"name":"ink_price_feed","version":"0.0.1","authors":["GuiGou"]},"spec":{"constructors":[{"args":[],"default":false,"docs":[],"label":"default","payable":false,"returnType":{"displayName":["ink_primitives","ConstructorResult"],"type":4},"selector":"0xed4b9d1b"}],"docs":[],"environment":{"accountId":{"displayName":["AccountId"],"type":0},"balance":{"displayName":["Balance"],"type":21},"blockNumber":{"displayName":["BlockNumber"],"type":18},"chainExtension":{"displayName":["ChainExtension"],"type":24},"hash":{"displayName":["Hash"],"type":22},"maxEventTopics":4,"timestamp":{"displayName":["Timestamp"],"type":23}},"events":[],"lang_error":{"displayName":["ink","LangError"],"type":6},"messages":[{"args":[],"default":false,"docs":[" Gets the owner of the contract"],"label":"owner","mutates":false,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":7},"selector":"0xfeaea4fa"},{"args":[],"default":false,"docs":[" Gets the attestor address used by this rollup"],"label":"get_attest_address","mutates":false,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":8},"selector":"0xa29595ff"},{"args":[{"label":"attest_key","type":{"displayName":["Option"],"type":10}}],"default":false,"docs":[" Set attestor key.",""," For dev purpose."],"label":"set_attest_key","mutates":true,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":11},"selector":"0x85cb106e"},{"args":[],"default":false,"docs":[" Gets the sender address used by this rollup"],"label":"get_sender_address","mutates":false,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":14},"selector":"0x75de500c"},{"args":[],"default":false,"docs":[" Gets the config"],"label":"get_target_contract","mutates":false,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":15},"selector":"0x0d425434"},{"args":[{"label":"rpc","type":{"displayName":["String"],"type":3}},{"label":"pallet_id","type":{"displayName":["u8"],"type":2}},{"label":"call_id","type":{"displayName":["u8"],"type":2}},{"label":"contract_id","type":{"displayName":["Vec"],"type":9}},{"label":"sender_key","type":{"displayName":["Option"],"type":10}}],"default":false,"docs":[" Configures the rollup target (admin only)"],"label":"config","mutates":true,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":11},"selector":"0x70714744"},{"args":[{"label":"new_owner","type":{"displayName":["AccountId"],"type":0}}],"default":false,"docs":[" Transfers the ownership of the contract (admin only)"],"label":"transfer_ownership","mutates":true,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":11},"selector":"0x107e33ea"},{"args":[{"label":"trading_pair_id","type":{"displayName":["TradingPairId"],"type":18}},{"label":"token0","type":{"displayName":["String"],"type":3}},{"label":"token1","type":{"displayName":["String"],"type":3}}],"default":false,"docs":[" Feeds a price by a rollup transaction"],"label":"feed_price_from_coingecko","mutates":false,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":19},"selector":"0x10a23d63"},{"args":[{"label":"trading_pair_id","type":{"displayName":["TradingPairId"],"type":18}},{"label":"price","type":{"displayName":["u128"],"type":21}}],"default":false,"docs":[" Feeds a price data point to a customized rollup target.",""," For dev purpose."],"label":"feed_custom_price","mutates":false,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":19},"selector":"0xd1b03f84"},{"args":[],"default":false,"docs":[" Processes a price request by a rollup transaction"],"label":"answer_price","mutates":false,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":19},"selector":"0x95df8765"},{"args":[{"label":"rpc","type":{"displayName":["String"],"type":3}},{"label":"pallet_id","type":{"displayName":["u8"],"type":2}},{"label":"call_id","type":{"displayName":["u8"],"type":2}},{"label":"contract_id","type":{"displayName":["Vec"],"type":9}},{"label":"sender_key","type":{"displayName":["Option"],"type":10}}],"default":false,"docs":[" Processes a price request by a rollup transaction"],"label":"answer_price_with_config","mutates":false,"payable":false,"returnType":{"displayName":["ink","MessageResult"],"type":19},"selector":"0x6eba0aa4"}]},"storage":{"root":{"layout":{"struct":{"fields":[{"layout":{"leaf":{"key":"0x00000000","ty":0}},"name":"owner"},{"layout":{"enum":{"dispatchKey":"0x00000000","name":"Option","variants":{"0":{"fields":[],"name":"None"},"1":{"fields":[{"layout":{"struct":{"fields":[{"layout":{"leaf":{"key":"0x00000000","ty":3}},"name":"rpc"},{"layout":{"leaf":{"key":"0x00000000","ty":2}},"name":"pallet_id"},{"layout":{"leaf":{"key":"0x00000000","ty":2}},"name":"call_id"},{"layout":{"array":{"layout":{"leaf":{"key":"0x00000000","ty":2}},"len":32,"offset":"0x00000000"}},"name":"contract_id"},{"layout":{"enum":{"dispatchKey":"0x00000000","name":"Option","variants":{"0":{"fields":[],"name":"None"},"1":{"fields":[{"layout":{"array":{"layout":{"leaf":{"key":"0x00000000","ty":2}},"len":32,"offset":"0x00000000"}},"name":"0"}],"name":"Some"}}}},"name":"sender_key"}],"name":"Config"}},"name":"0"}],"name":"Some"}}}},"name":"config"},{"layout":{"array":{"layout":{"leaf":{"key":"0x00000000","ty":2}},"len":32,"offset":"0x00000000"}},"name":"attest_key"}],"name":"InkPriceFeed"}},"root_key":"0x00000000"}},"types":[{"id":0,"type":{"def":{"composite":{"fields":[{"type":1,"typeName":"[u8; 32]"}]}},"path":["ink_primitives","types","AccountId"]}},{"id":1,"type":{"def":{"array":{"len":32,"type":2}}}},{"id":2,"type":{"def":{"primitive":"u8"}}},{"id":3,"type":{"def":{"primitive":"str"}}},{"id":4,"type":{"def":{"variant":{"variants":[{"fields":[{"type":5}],"index":0,"name":"Ok"},{"fields":[{"type":6}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":5},{"name":"E","type":6}],"path":["Result"]}},{"id":5,"type":{"def":{"tuple":[]}}},{"id":6,"type":{"def":{"variant":{"variants":[{"index":1,"name":"CouldNotReadInput"}]}},"path":["ink_primitives","LangError"]}},{"id":7,"type":{"def":{"variant":{"variants":[{"fields":[{"type":0}],"index":0,"name":"Ok"},{"fields":[{"type":6}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":0},{"name":"E","type":6}],"path":["Result"]}},{"id":8,"type":{"def":{"variant":{"variants":[{"fields":[{"type":9}],"index":0,"name":"Ok"},{"fields":[{"type":6}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":9},{"name":"E","type":6}],"path":["Result"]}},{"id":9,"type":{"def":{"sequence":{"type":2}}}},{"id":10,"type":{"def":{"variant":{"variants":[{"index":0,"name":"None"},{"fields":[{"type":9}],"index":1,"name":"Some"}]}},"params":[{"name":"T","type":9}],"path":["Option"]}},{"id":11,"type":{"def":{"variant":{"variants":[{"fields":[{"type":12}],"index":0,"name":"Ok"},{"fields":[{"type":6}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":12},{"name":"E","type":6}],"path":["Result"]}},{"id":12,"type":{"def":{"variant":{"variants":[{"fields":[{"type":5}],"index":0,"name":"Ok"},{"fields":[{"type":13}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":5},{"name":"E","type":13}],"path":["Result"]}},{"id":13,"type":{"def":{"variant":{"variants":[{"index":0,"name":"BadOrigin"},{"index":1,"name":"NotConfigured"},{"index":2,"name":"InvalidKeyLength"},{"index":3,"name":"InvalidAddressLength"},{"index":4,"name":"NoRequestInQueue"},{"index":5,"name":"FailedToCreateClient"},{"index":6,"name":"FailedToCommitTx"},{"index":7,"name":"FailedToFetchPrice"},{"index":8,"name":"FailedToGetStorage"},{"index":9,"name":"FailedToCreateTransaction"},{"index":10,"name":"FailedToSendTransaction"},{"index":11,"name":"FailedToGetBlockHash"},{"index":12,"name":"FailedToDecode"},{"index":13,"name":"InvalidRequest"},{"index":14,"name":"FailedToCallRollup"}]}},"path":["ink_price_feed","ink_price_feed","Error"]}},{"id":14,"type":{"def":{"variant":{"variants":[{"fields":[{"type":10}],"index":0,"name":"Ok"},{"fields":[{"type":6}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":10},{"name":"E","type":6}],"path":["Result"]}},{"id":15,"type":{"def":{"variant":{"variants":[{"fields":[{"type":16}],"index":0,"name":"Ok"},{"fields":[{"type":6}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":16},{"name":"E","type":6}],"path":["Result"]}},{"id":16,"type":{"def":{"variant":{"variants":[{"index":0,"name":"None"},{"fields":[{"type":17}],"index":1,"name":"Some"}]}},"params":[{"name":"T","type":17}],"path":["Option"]}},{"id":17,"type":{"def":{"tuple":[3,2,2,1]}}},{"id":18,"type":{"def":{"primitive":"u32"}}},{"id":19,"type":{"def":{"variant":{"variants":[{"fields":[{"type":20}],"index":0,"name":"Ok"},{"fields":[{"type":6}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":20},{"name":"E","type":6}],"path":["Result"]}},{"id":20,"type":{"def":{"variant":{"variants":[{"fields":[{"type":10}],"index":0,"name":"Ok"},{"fields":[{"type":13}],"index":1,"name":"Err"}]}},"params":[{"name":"T","type":10},{"name":"E","type":13}],"path":["Result"]}},{"id":21,"type":{"def":{"primitive":"u128"}}},{"id":22,"type":{"def":{"composite":{"fields":[{"type":1,"typeName":"[u8; 32]"}]}},"path":["ink_primitives","types","Hash"]}},{"id":23,"type":{"def":{"primitive":"u64"}}},{"id":24,"type":{"def":{"variant":{}},"path":["pink_extension","chain_extension","PinkExt"]}}],"version":"4"} \ No newline at end of file diff --git a/phat/artifacts/ink_price_feed/ink_price_feed.json b/phat/artifacts/ink_price_feed/ink_price_feed.json new file mode 100644 index 0000000..b305ed9 --- /dev/null +++ b/phat/artifacts/ink_price_feed/ink_price_feed.json @@ -0,0 +1,1273 @@ +{ + "source": { + "hash": "0xdbe35b7090829b1bb84d8037bf0456f60177753bbc7dba9a8b9fe2a2954d1363", + "language": "ink! 4.3.0", + "compiler": "rustc 1.72.0", + "build_info": { + "build_mode": "Debug", + "cargo_contract_version": "3.2.0", + "rust_toolchain": "stable-x86_64-unknown-linux-gnu", + "wasm_opt_settings": { + "keep_debug_symbols": false, + "optimization_passes": "Z" + } + } + }, + "contract": { + "name": "ink_price_feed", + "version": "0.0.1", + "authors": [ + "GuiGou" + ] + }, + "spec": { + "constructors": [ + { + "args": [], + "default": false, + "docs": [], + "label": "default", + "payable": false, + "returnType": { + "displayName": [ + "ink_primitives", + "ConstructorResult" + ], + "type": 4 + }, + "selector": "0xed4b9d1b" + } + ], + "docs": [], + "environment": { + "accountId": { + "displayName": [ + "AccountId" + ], + "type": 0 + }, + "balance": { + "displayName": [ + "Balance" + ], + "type": 21 + }, + "blockNumber": { + "displayName": [ + "BlockNumber" + ], + "type": 18 + }, + "chainExtension": { + "displayName": [ + "ChainExtension" + ], + "type": 24 + }, + "hash": { + "displayName": [ + "Hash" + ], + "type": 22 + }, + "maxEventTopics": 4, + "timestamp": { + "displayName": [ + "Timestamp" + ], + "type": 23 + } + }, + "events": [], + "lang_error": { + "displayName": [ + "ink", + "LangError" + ], + "type": 6 + }, + "messages": [ + { + "args": [], + "default": false, + "docs": [ + " Gets the owner of the contract" + ], + "label": "owner", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 7 + }, + "selector": "0xfeaea4fa" + }, + { + "args": [], + "default": false, + "docs": [ + " Gets the attestor address used by this rollup" + ], + "label": "get_attest_address", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 8 + }, + "selector": "0xa29595ff" + }, + { + "args": [ + { + "label": "attest_key", + "type": { + "displayName": [ + "Option" + ], + "type": 10 + } + } + ], + "default": false, + "docs": [ + " Set attestor key.", + "", + " For dev purpose." + ], + "label": "set_attest_key", + "mutates": true, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 11 + }, + "selector": "0x85cb106e" + }, + { + "args": [], + "default": false, + "docs": [ + " Gets the sender address used by this rollup" + ], + "label": "get_sender_address", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 14 + }, + "selector": "0x75de500c" + }, + { + "args": [], + "default": false, + "docs": [ + " Gets the config" + ], + "label": "get_target_contract", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 15 + }, + "selector": "0x0d425434" + }, + { + "args": [ + { + "label": "rpc", + "type": { + "displayName": [ + "String" + ], + "type": 3 + } + }, + { + "label": "pallet_id", + "type": { + "displayName": [ + "u8" + ], + "type": 2 + } + }, + { + "label": "call_id", + "type": { + "displayName": [ + "u8" + ], + "type": 2 + } + }, + { + "label": "contract_id", + "type": { + "displayName": [ + "Vec" + ], + "type": 9 + } + }, + { + "label": "sender_key", + "type": { + "displayName": [ + "Option" + ], + "type": 10 + } + } + ], + "default": false, + "docs": [ + " Configures the rollup target (admin only)" + ], + "label": "config", + "mutates": true, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 11 + }, + "selector": "0x70714744" + }, + { + "args": [ + { + "label": "new_owner", + "type": { + "displayName": [ + "AccountId" + ], + "type": 0 + } + } + ], + "default": false, + "docs": [ + " Transfers the ownership of the contract (admin only)" + ], + "label": "transfer_ownership", + "mutates": true, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 11 + }, + "selector": "0x107e33ea" + }, + { + "args": [ + { + "label": "trading_pair_id", + "type": { + "displayName": [ + "TradingPairId" + ], + "type": 18 + } + }, + { + "label": "token0", + "type": { + "displayName": [ + "String" + ], + "type": 3 + } + }, + { + "label": "token1", + "type": { + "displayName": [ + "String" + ], + "type": 3 + } + } + ], + "default": false, + "docs": [ + " Feeds a price by a rollup transaction" + ], + "label": "feed_price_from_coingecko", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 19 + }, + "selector": "0x10a23d63" + }, + { + "args": [ + { + "label": "trading_pair_id", + "type": { + "displayName": [ + "TradingPairId" + ], + "type": 18 + } + }, + { + "label": "price", + "type": { + "displayName": [ + "u128" + ], + "type": 21 + } + } + ], + "default": false, + "docs": [ + " Feeds a price data point to a customized rollup target.", + "", + " For dev purpose." + ], + "label": "feed_custom_price", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 19 + }, + "selector": "0xd1b03f84" + }, + { + "args": [], + "default": false, + "docs": [ + " Processes a price request by a rollup transaction" + ], + "label": "answer_price", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 19 + }, + "selector": "0x95df8765" + }, + { + "args": [ + { + "label": "rpc", + "type": { + "displayName": [ + "String" + ], + "type": 3 + } + }, + { + "label": "pallet_id", + "type": { + "displayName": [ + "u8" + ], + "type": 2 + } + }, + { + "label": "call_id", + "type": { + "displayName": [ + "u8" + ], + "type": 2 + } + }, + { + "label": "contract_id", + "type": { + "displayName": [ + "Vec" + ], + "type": 9 + } + }, + { + "label": "sender_key", + "type": { + "displayName": [ + "Option" + ], + "type": 10 + } + } + ], + "default": false, + "docs": [ + " Processes a price request by a rollup transaction" + ], + "label": "answer_price_with_config", + "mutates": false, + "payable": false, + "returnType": { + "displayName": [ + "ink", + "MessageResult" + ], + "type": 19 + }, + "selector": "0x6eba0aa4" + } + ] + }, + "storage": { + "root": { + "layout": { + "struct": { + "fields": [ + { + "layout": { + "leaf": { + "key": "0x00000000", + "ty": 0 + } + }, + "name": "owner" + }, + { + "layout": { + "enum": { + "dispatchKey": "0x00000000", + "name": "Option", + "variants": { + "0": { + "fields": [], + "name": "None" + }, + "1": { + "fields": [ + { + "layout": { + "struct": { + "fields": [ + { + "layout": { + "leaf": { + "key": "0x00000000", + "ty": 3 + } + }, + "name": "rpc" + }, + { + "layout": { + "leaf": { + "key": "0x00000000", + "ty": 2 + } + }, + "name": "pallet_id" + }, + { + "layout": { + "leaf": { + "key": "0x00000000", + "ty": 2 + } + }, + "name": "call_id" + }, + { + "layout": { + "array": { + "layout": { + "leaf": { + "key": "0x00000000", + "ty": 2 + } + }, + "len": 32, + "offset": "0x00000000" + } + }, + "name": "contract_id" + }, + { + "layout": { + "enum": { + "dispatchKey": "0x00000000", + "name": "Option", + "variants": { + "0": { + "fields": [], + "name": "None" + }, + "1": { + "fields": [ + { + "layout": { + "array": { + "layout": { + "leaf": { + "key": "0x00000000", + "ty": 2 + } + }, + "len": 32, + "offset": "0x00000000" + } + }, + "name": "0" + } + ], + "name": "Some" + } + } + } + }, + "name": "sender_key" + } + ], + "name": "Config" + } + }, + "name": "0" + } + ], + "name": "Some" + } + } + } + }, + "name": "config" + }, + { + "layout": { + "array": { + "layout": { + "leaf": { + "key": "0x00000000", + "ty": 2 + } + }, + "len": 32, + "offset": "0x00000000" + } + }, + "name": "attest_key" + } + ], + "name": "InkPriceFeed" + } + }, + "root_key": "0x00000000" + } + }, + "types": [ + { + "id": 0, + "type": { + "def": { + "composite": { + "fields": [ + { + "type": 1, + "typeName": "[u8; 32]" + } + ] + } + }, + "path": [ + "ink_primitives", + "types", + "AccountId" + ] + } + }, + { + "id": 1, + "type": { + "def": { + "array": { + "len": 32, + "type": 2 + } + } + } + }, + { + "id": 2, + "type": { + "def": { + "primitive": "u8" + } + } + }, + { + "id": 3, + "type": { + "def": { + "primitive": "str" + } + } + }, + { + "id": 4, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 5 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 6 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 5 + }, + { + "name": "E", + "type": 6 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 5, + "type": { + "def": { + "tuple": [] + } + } + }, + { + "id": 6, + "type": { + "def": { + "variant": { + "variants": [ + { + "index": 1, + "name": "CouldNotReadInput" + } + ] + } + }, + "path": [ + "ink_primitives", + "LangError" + ] + } + }, + { + "id": 7, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 0 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 6 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 0 + }, + { + "name": "E", + "type": 6 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 8, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 9 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 6 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 9 + }, + { + "name": "E", + "type": 6 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 9, + "type": { + "def": { + "sequence": { + "type": 2 + } + } + } + }, + { + "id": 10, + "type": { + "def": { + "variant": { + "variants": [ + { + "index": 0, + "name": "None" + }, + { + "fields": [ + { + "type": 9 + } + ], + "index": 1, + "name": "Some" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 9 + } + ], + "path": [ + "Option" + ] + } + }, + { + "id": 11, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 12 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 6 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 12 + }, + { + "name": "E", + "type": 6 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 12, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 5 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 13 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 5 + }, + { + "name": "E", + "type": 13 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 13, + "type": { + "def": { + "variant": { + "variants": [ + { + "index": 0, + "name": "BadOrigin" + }, + { + "index": 1, + "name": "NotConfigured" + }, + { + "index": 2, + "name": "InvalidKeyLength" + }, + { + "index": 3, + "name": "InvalidAddressLength" + }, + { + "index": 4, + "name": "NoRequestInQueue" + }, + { + "index": 5, + "name": "FailedToCreateClient" + }, + { + "index": 6, + "name": "FailedToCommitTx" + }, + { + "index": 7, + "name": "FailedToFetchPrice" + }, + { + "index": 8, + "name": "FailedToGetStorage" + }, + { + "index": 9, + "name": "FailedToCreateTransaction" + }, + { + "index": 10, + "name": "FailedToSendTransaction" + }, + { + "index": 11, + "name": "FailedToGetBlockHash" + }, + { + "index": 12, + "name": "FailedToDecode" + }, + { + "index": 13, + "name": "InvalidRequest" + }, + { + "index": 14, + "name": "FailedToCallRollup" + } + ] + } + }, + "path": [ + "ink_price_feed", + "ink_price_feed", + "Error" + ] + } + }, + { + "id": 14, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 10 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 6 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 10 + }, + { + "name": "E", + "type": 6 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 15, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 16 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 6 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 16 + }, + { + "name": "E", + "type": 6 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 16, + "type": { + "def": { + "variant": { + "variants": [ + { + "index": 0, + "name": "None" + }, + { + "fields": [ + { + "type": 17 + } + ], + "index": 1, + "name": "Some" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 17 + } + ], + "path": [ + "Option" + ] + } + }, + { + "id": 17, + "type": { + "def": { + "tuple": [ + 3, + 2, + 2, + 1 + ] + } + } + }, + { + "id": 18, + "type": { + "def": { + "primitive": "u32" + } + } + }, + { + "id": 19, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 20 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 6 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 20 + }, + { + "name": "E", + "type": 6 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 20, + "type": { + "def": { + "variant": { + "variants": [ + { + "fields": [ + { + "type": 10 + } + ], + "index": 0, + "name": "Ok" + }, + { + "fields": [ + { + "type": 13 + } + ], + "index": 1, + "name": "Err" + } + ] + } + }, + "params": [ + { + "name": "T", + "type": 10 + }, + { + "name": "E", + "type": 13 + } + ], + "path": [ + "Result" + ] + } + }, + { + "id": 21, + "type": { + "def": { + "primitive": "u128" + } + } + }, + { + "id": 22, + "type": { + "def": { + "composite": { + "fields": [ + { + "type": 1, + "typeName": "[u8; 32]" + } + ] + } + }, + "path": [ + "ink_primitives", + "types", + "Hash" + ] + } + }, + { + "id": 23, + "type": { + "def": { + "primitive": "u64" + } + } + }, + { + "id": 24, + "type": { + "def": { + "variant": {} + }, + "path": [ + "pink_extension", + "chain_extension", + "PinkExt" + ] + } + } + ], + "version": "4" +} \ No newline at end of file diff --git a/phat/artifacts/ink_price_feed/ink_price_feed.wasm b/phat/artifacts/ink_price_feed/ink_price_feed.wasm new file mode 100644 index 0000000..c9ab4ad Binary files /dev/null and b/phat/artifacts/ink_price_feed/ink_price_feed.wasm differ diff --git a/phat/contracts/ink_price_feed/.env_localhost b/phat/contracts/ink_price_feed/.env_localhost new file mode 100644 index 0000000..81fa643 --- /dev/null +++ b/phat/contracts/ink_price_feed/.env_localhost @@ -0,0 +1,10 @@ +# Example for Local node +# Substrate node where the Phat Rollup Anchor is deployed +RPC=http://127.0.0.1:9944 +PALLET_ID=8 +CALL_ID=6 +CONTRACT_ID=9d01d1ab7fbd42c526413147295c777067319b4523e386c26c7d1694848dcb02 +# The attestor secp256k1 private key. Without the "0x" prefix. // alice +ATTEST_KEY=e5be9a5092b81bca64be81d212e7f2f9eba183bb7a90954f7b76361f6edb5c0a +# Enable Meta-Tx by uncommenting the next line. It uses //bob +SENDER_KEY=398f0c28f98885e046333d4a41c19cee4c37368a9832c6502f6cfd182e2aef89 \ No newline at end of file diff --git a/phat/contracts/ink_price_feed/.env_shibuya b/phat/contracts/ink_price_feed/.env_shibuya new file mode 100644 index 0000000..bdd21d7 --- /dev/null +++ b/phat/contracts/ink_price_feed/.env_shibuya @@ -0,0 +1,10 @@ +# Example for Testnet Shibuya +# Substrate node where the Phat Rollup Anchor is deployed +RPC=https://shibuya.public.blastapi.io +PALLET_ID=70 +CALL_ID=6 +CONTRACT_ID=70acf57ede961d46ffcd133d5d8fa98fc0c4ebede29d2dd884dc5a7425aa9ee0 +# The attestor secp256k1 private key. Without the "0x" prefix. // alice +ATTEST_KEY=e5be9a5092b81bca64be81d212e7f2f9eba183bb7a90954f7b76361f6edb5c0a +# Enable Meta-Tx by uncommenting the next line. It uses //bob +SENDER_KEY=398f0c28f98885e046333d4a41c19cee4c37368a9832c6502f6cfd182e2aef89 \ No newline at end of file diff --git a/phat/contracts/ink_price_feed/Cargo.toml b/phat/contracts/ink_price_feed/Cargo.toml new file mode 100755 index 0000000..f365e32 --- /dev/null +++ b/phat/contracts/ink_price_feed/Cargo.toml @@ -0,0 +1,55 @@ +[package] +name = "ink_price_feed" +version = "0.0.1" +authors = ["GuiGou"] +edition = "2021" + +# Necessary due to the cargo bug bug: https://github.com/rust-lang/cargo/issues/10118 +[profile.release] +overflow-checks = false + +[dependencies] +ink = { version = "4.3.0", default-features = false } + +scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] } +scale-info = { version = "2.9.0", default-features = false, features = ["derive"], optional = true } +serde = { version = "1.0.188", default-features = false, features = ["derive", "alloc"]} +fixed = { version = "1", default-features = false, features = ["serde"] } + +pink-extension = { version = "0.4.4", default-features = false } +pink-json = { git = "https://github.com/Phala-Network/pink-json.git", branch = "pink", default-features = false, features = ["de-number-as-str"] } +pink-web3 = { version = "0.20.2", default-features = false, features = ["pink", "signing"] } + +phat_offchain_rollup = { path = "../../crates/rollup", default-features = false, features = ["ink"] } + +subrpc = { package = "pink-subrpc", version = "0.4.3", default-features = false } + +hex = { version = "0.4", default-features = false } + +[dev-dependencies] +dotenvy = "0.15" +env_logger = "0.10.0" +pink-extension-runtime = { version = "0.4.4", default-features = false } +hex-literal = "0.4.1" +subxt-signer = { version = "0.31.0" } + +[build-dependencies] +half = { version = "=2.2.1", default-features = false } + +[lib] +path = "lib.rs" + +[features] +default = ["std", "logging"] +std = [ + "ink/std", + "scale/std", + "scale-info/std", + "phat_offchain_rollup/std", + "pink-extension/std", + "subrpc/std", + "pink-json/std", + "pink-web3/std", +] +ink-as-dependency = [] +logging = ["phat_offchain_rollup/logging"] diff --git a/phat/contracts/ink_price_feed/README.md b/phat/contracts/ink_price_feed/README.md new file mode 100644 index 0000000..e2302ee --- /dev/null +++ b/phat/contracts/ink_price_feed/README.md @@ -0,0 +1,75 @@ +# InkPriceFeed + +Implements a simple price feed with Ink! Offchain Rollup. It supports streaming a price feed and +answering individual requests from the Ink! contract side. + + +## Build + +To build the contract: + +```bash +cargo contract build +``` + +## Run Integration tests + +### Deploy the ink! smart contract `test_oracle` + +Before you can run the tests, you need to have an ink! smart contract deployed in a Substrate node with pallet-contracts. + +#### Use the default ink! smart contract + +You can use the default smart contract deployed on Shibuya (`YV332vU7tXvdX8GoqhGky8RypeCk89rZVtGwtwVAAwYmfLX`). + +#### Or deploy your own ink! smart contract + +You can build the smart contract +```bash +cd ../../ink/contracts/test_oracle +cargo contract build +``` +And use Contracts-UI or Polkadot.js to deploy your contract and interact with it. +You will have to configure `alice` as attestor. + +### Add trading pairs and push some requests + +Use Contracts-UI or Polkadot.js to interact with your smart contract deployed on local node or Shibuya. +You can create a new trading pair and request a price feed by the Phat Contract. + +In Shibuya, there are already 3 trading pairs defined in the contracts `YV332vU7tXvdX8GoqhGky8RypeCk89rZVtGwtwVAAwYmfLX`. + - id 11 for the pair `polkadot`/`usd` + - id 12 for `astar`/`usd` + - id 13 for `pha`/`usd` + +If you want to create another request for the trading pair with the id 12 +```bash +cargo contract call --contract YV332vU7tXvdX8GoqhGky8RypeCk89rZVtGwtwVAAwYmfLX --message request_price --args 12 --url wss://rpc.shibuya.astar.network --suri "bottom drive obey lake curtain smoke basket hold race lonely fit walk" ../../../ink/artifacts/test_oracle/test_oracle.wasm +``` + +### Run the integration tests + +Copy `.env_localhost` or `.env_shibuya` as `.env` if you haven't done it before. +It tells the Phat Contract how to connect to ink! smart contract you just created. + +And finally execute the following command to start integration tests execution. + +```bash +cargo test -- --ignored --test-threads=1 +``` + +### Parallel in Integration Tests + +The flag `--test-threads=1` is necessary because by default [Rust unit tests run in parallel](https://doc.rust-lang.org/book/ch11-02-running-tests.html). +There may have a few tests trying to send out transactions at the same time, resulting +conflicting nonce values. +The solution is to add `--test-threads=1`. So the unit test framework knows that you don't want +parallel execution. + +### Enable Meta-Tx + +Meta transaction allows the Phat Contract to submit rollup tx with attest key signature while using +arbitrary account to pay the gas fee. To enable meta tx in the unit test, change the `.env` file +and specify `SENDER_KEY`. + + diff --git a/phat/contracts/ink_price_feed/lib.rs b/phat/contracts/ink_price_feed/lib.rs new file mode 100755 index 0000000..14789a9 --- /dev/null +++ b/phat/contracts/ink_price_feed/lib.rs @@ -0,0 +1,640 @@ +#![cfg_attr(not(feature = "std"), no_std, no_main)] + +extern crate alloc; +extern crate core; + +#[ink::contract(env = pink_extension::PinkEnvironment)] +mod ink_price_feed { + use alloc::{format, string::String, vec, vec::Vec}; + use ink::env::debug_println; + + use pink_extension::chain_extension::signing; + use pink_extension::{debug, error, info, warn, ResultExt}; + use scale::{Decode, Encode}; + use serde::Deserialize; + + use phat_offchain_rollup::clients::ink::{Action, ContractId, InkRollupClient}; + + pub type TradingPairId = u32; + + /// Message to request the price of the trading pair + /// message pushed in the queue by this contract and read by the offchain rollup + #[derive(Encode, Decode)] + struct PriceRequestMessage { + /// id of the pair (use as key in the Mapping) + trading_pair_id: TradingPairId, + /// trading pair like 'polkdatot/usd' + /// Note: it will be better to not save this data in the storage + token0: String, + token1: String, + } + /// Message sent to provide the price of the trading pair + /// response pushed in the queue by the offchain rollup and read by this contract + #[derive(Encode, Decode)] + struct PriceResponseMessage { + /// Type of response + resp_type: u8, + /// id of the pair + trading_pair_id: TradingPairId, + /// price of the trading pair + price: Option, + /// when the price is read + err_no: Option, + } + + /// Type of response when the offchain rollup communicate with this contract + const TYPE_ERROR: u8 = 0; + const TYPE_RESPONSE: u8 = 10; + const TYPE_FEED: u8 = 11; + + #[ink(storage)] + pub struct InkPriceFeed { + owner: AccountId, + config: Option, + /// Key for signing the rollup tx. + attest_key: [u8; 32], + } + + #[derive(Encode, Decode, Debug)] + #[cfg_attr( + feature = "std", + derive(scale_info::TypeInfo, ink::storage::traits::StorageLayout) + )] + struct Config { + /// The RPC endpoint of the target blockchain + rpc: String, + pallet_id: u8, + call_id: u8, + /// The rollup anchor address on the target blockchain + contract_id: ContractId, + /// Key for sending out the rollup meta-tx. None to fallback to the wallet based auth. + sender_key: Option<[u8; 32]>, + } + + #[derive(Encode, Decode, Debug)] + #[repr(u8)] + #[cfg_attr(feature = "std", derive(scale_info::TypeInfo))] + pub enum Error { + BadOrigin, + NotConfigured, + InvalidKeyLength, + InvalidAddressLength, + NoRequestInQueue, + FailedToCreateClient, + FailedToCommitTx, + FailedToFetchPrice, + + FailedToGetStorage, + FailedToCreateTransaction, + FailedToSendTransaction, + FailedToGetBlockHash, + FailedToDecode, + InvalidRequest, + FailedToCallRollup, + } + + type Result = core::result::Result; + + impl From for Error { + fn from(error: phat_offchain_rollup::Error) -> Self { + error!("error in the rollup: {:?}", error); + debug_println!("error in the rollup: {:?}", error); + Error::FailedToCallRollup + } + } + + impl InkPriceFeed { + #[ink(constructor)] + pub fn default() -> Self { + const NONCE: &[u8] = b"attest_key"; + let private_key = signing::derive_sr25519_key(NONCE); + Self { + owner: Self::env().caller(), + attest_key: private_key[..32].try_into().expect("Invalid Key Length"), + config: None, + } + } + + /// Gets the owner of the contract + #[ink(message)] + pub fn owner(&self) -> AccountId { + self.owner + } + + /// Gets the attestor address used by this rollup + #[ink(message)] + pub fn get_attest_address(&self) -> Vec { + signing::get_public_key(&self.attest_key, signing::SigType::Sr25519) + } + + /// Gets the attestor address used by this rollup in the meta transaction + #[ink(message)] + pub fn get_attest_address_meta_tx(&self) -> Vec { + use ink::env::hash; + let input = signing::get_public_key(&self.attest_key, signing::SigType::Ecdsa); + let mut output = ::Type::default(); + ink::env::hash_bytes::(&input, &mut output); + output.to_vec() + } + + /// Set attestor key. + /// + /// For dev purpose. + #[ink(message)] + pub fn set_attest_key(&mut self, attest_key: Option>) -> Result<()> { + self.attest_key = match attest_key { + Some(key) => key.try_into().or(Err(Error::InvalidKeyLength))?, + None => { + const NONCE: &[u8] = b"attest_key"; + let private_key = signing::derive_sr25519_key(NONCE); + private_key[..32] + .try_into() + .or(Err(Error::InvalidKeyLength))? + } + }; + Ok(()) + } + + /// Gets the sender address used by this rollup + #[ink(message)] + pub fn get_sender_address(&self) -> Option> { + if let Some(Some(sender_key)) = self.config.as_ref().map(|c| c.sender_key.as_ref()) { + let sender_key = signing::get_public_key(sender_key, signing::SigType::Sr25519); + Some(sender_key) + } else { + None + } + } + + /// Gets the config + #[ink(message)] + pub fn get_target_contract(&self) -> Option<(String, u8, u8, ContractId)> { + self.config + .as_ref() + .map(|c| (c.rpc.clone(), c.pallet_id, c.call_id, c.contract_id)) + } + + /// Configures the rollup target (admin only) + #[ink(message)] + pub fn config( + &mut self, + rpc: String, + pallet_id: u8, + call_id: u8, + contract_id: Vec, + sender_key: Option>, + ) -> Result<()> { + self.ensure_owner()?; + self.config = Some(Config { + rpc, + pallet_id, + call_id, + contract_id: contract_id + .try_into() + .or(Err(Error::InvalidAddressLength))?, + sender_key: match sender_key { + Some(key) => Some(key.try_into().or(Err(Error::InvalidKeyLength))?), + None => None, + }, + }); + Ok(()) + } + + /// Transfers the ownership of the contract (admin only) + #[ink(message)] + pub fn transfer_ownership(&mut self, new_owner: AccountId) -> Result<()> { + self.ensure_owner()?; + self.owner = new_owner; + Ok(()) + } + + /// Fetches the price of a trading pair from CoinGecko + fn fetch_coingecko_price(token0: &str, token1: &str) -> Result { + use fixed::types::U80F48 as Fp; + + // Fetch the price from CoinGecko. + // + // Supported tokens are listed in the detailed documentation: + // + let url = format!( + "https://api.coingecko.com/api/v3/simple/price?ids={token0}&vs_currencies={token1}" + ); + let headers = vec![("accept".into(), "application/json".into())]; + let resp = pink_extension::http_get!(url, headers); + if resp.status_code != 200 { + return Err(Error::FailedToFetchPrice); + } + // The response looks like: + // {"polkadot":{"usd":5.41}} + // + // serde-json-core doesn't do well with dynamic keys. Therefore we play a trick here. + // We replace the first token name by "token0" and the second token name by "token1". + // Then we can get the json with constant field names. After the replacement, the above + // sample json becomes: + // {"token0":{"token1":5.41}} + let json = String::from_utf8(resp.body) + .or(Err(Error::FailedToDecode))? + .replace(token0, "token0") + .replace(token1, "token1"); + let parsed: PriceResponse = pink_json::from_str(&json) + .log_err("failed to parse json") + .or(Err(Error::FailedToDecode))?; + // Parse to a fixed point and convert to u128 by rebasing to 1e18 + let fp = Fp::from_str(parsed.token0.token1) + .log_err("failed to parse real number") + .or(Err(Error::FailedToDecode))?; + let f = fp * Fp::from_num(1_000_000_000_000_000_000u128); + Ok(f.to_num()) + } + + /// Feeds a price by a rollup transaction + #[ink(message)] + pub fn feed_price_from_coingecko( + &self, + trading_pair_id: TradingPairId, + token0: String, + token1: String, + ) -> Result>> { + let price = Self::fetch_coingecko_price(&token0, &token1)?; + debug!("price: {}", price); + self.feed_custom_price(trading_pair_id, price) + } + + /// Feeds a price data point to a customized rollup target. + /// + /// For dev purpose. + #[ink(message)] + pub fn feed_custom_price( + &self, + trading_pair_id: TradingPairId, + price: u128, + ) -> Result>> { + // Initialize a rollup client. The client tracks a "rollup transaction" that allows you + // to read, write, and execute actions on the target chain with atomicity. + let config = self.ensure_configured()?; + let mut client = connect(config)?; + + let payload = PriceResponseMessage { + resp_type: TYPE_FEED, + trading_pair_id, + price: Some(price), + err_no: None, + }; + + client.action(Action::Reply(payload.encode())); + + maybe_submit_tx(client, &self.attest_key, config.sender_key.as_ref()) + } + + /// Processes a price request by a rollup transaction + #[ink(message)] + pub fn answer_price(&self) -> Result>> { + let config = self.ensure_configured()?; + let mut client = connect(config)?; + + // Get a request if presents + let request: PriceRequestMessage = client + .pop() + .log_err("answer_price: failed to read queue")? + .ok_or(Error::NoRequestInQueue)?; + + let response = Self::handle_request(&request)?; + // Attach an action to the tx by: + client.action(Action::Reply(response.encode())); + + maybe_submit_tx(client, &self.attest_key, config.sender_key.as_ref()) + } + + /// Processes a price request by a rollup transaction + #[ink(message)] + pub fn answer_price_with_config( + &self, + rpc: String, + pallet_id: u8, + call_id: u8, + contract_id: Vec, + sender_key: Option>, + ) -> Result>> { + let config = &Config { + rpc, + pallet_id, + call_id, + contract_id: contract_id + .try_into() + .or(Err(Error::InvalidAddressLength))?, + sender_key: match sender_key { + Some(key) => Some(key.try_into().or(Err(Error::InvalidKeyLength))?), + None => None, + }, + }; + + let mut client = connect(config)?; + + // Get a request if presents + let request: PriceRequestMessage = client + .pop() + .log_err("answer_price: failed to read queue")? + .ok_or(Error::NoRequestInQueue)?; + + let response = Self::handle_request(&request)?; + // Attach an action to the tx by: + client.action(Action::Reply(response.encode())); + + maybe_submit_tx(client, &self.attest_key, config.sender_key.as_ref()) + } + + fn handle_request(request: &PriceRequestMessage) -> Result { + let trading_pair_id = request.trading_pair_id; + let token0 = request.token0.as_str(); + let token1 = request.token1.as_str(); + + info!("Request received: ({trading_pair_id}, {token0}, {token1})"); + // Get the price and respond as a rollup action. + match Self::fetch_coingecko_price(token0, token1) { + Ok(price) => { + // Respond + info!("Price: {price}"); + let response = PriceResponseMessage { + resp_type: TYPE_RESPONSE, + trading_pair_id, + price: Some(price), + err_no: None, + }; + Ok(response) + } + // Error when fetching the price. Could be + Err(Error::FailedToDecode) => { + warn!("Fail to decode the price"); + let response = PriceResponseMessage { + resp_type: TYPE_ERROR, + trading_pair_id, + price: None, + err_no: Some(0), + }; + Ok(response) + } + Err(e) => Err(e), + } + } + + /// Returns BadOrigin error if the caller is not the owner + fn ensure_owner(&self) -> Result<()> { + if self.env().caller() == self.owner { + Ok(()) + } else { + Err(Error::BadOrigin) + } + } + + /// Returns the config reference or raise the error `NotConfigured` + fn ensure_configured(&self) -> Result<&Config> { + self.config.as_ref().ok_or(Error::NotConfigured) + } + } + + fn connect(config: &Config) -> Result { + InkRollupClient::new( + &config.rpc, + config.pallet_id, + config.call_id, + &config.contract_id, + ) + .log_err("failed to create rollup client") + .or(Err(Error::FailedToCreateClient)) + } + + fn maybe_submit_tx( + client: InkRollupClient, + attest_key: &[u8; 32], + sender_key: Option<&[u8; 32]>, + ) -> Result>> { + let maybe_submittable = client + .commit() + .log_err("failed to commit") + .map_err(|_| Error::FailedToCommitTx)?; + + if let Some(submittable) = maybe_submittable { + let tx_id = if let Some(sender_key) = sender_key { + // Prefer to meta-tx + submittable + .submit_meta_tx(attest_key, sender_key) + .log_err("failed to submit rollup meta-tx")? + } else { + // Fallback to account-based authentication + submittable + .submit(attest_key) + .log_err("failed to submit rollup tx")? + }; + return Ok(Some(tx_id)); + } + Ok(None) + } + + // Define the structures to parse json like `{"token0":{"token1":1.23}}` + #[derive(Deserialize)] + struct PriceResponse<'a> { + #[serde(borrow)] + token0: PriceReponseInner<'a>, + } + #[derive(Deserialize)] + struct PriceReponseInner<'a> { + #[serde(borrow)] + token1: &'a str, + } + + #[cfg(test)] + mod tests { + use ink::env::debug_println; + use pink_extension::chain_extension::SigType; + + use super::*; + + struct EnvVars { + /// The RPC endpoint of the target blockchain + rpc: String, + pallet_id: u8, + call_id: u8, + /// The rollup anchor address on the target blockchain + contract_id: ContractId, + /// When we want to manually set the attestor key for signing the message (only dev purpose) + attest_key: Vec, + /// When we want to use meta tx + sender_key: Option>, + } + + fn get_env(key: &str) -> String { + std::env::var(key).expect("env not found") + } + + fn config() -> EnvVars { + dotenvy::dotenv().ok(); + let rpc = get_env("RPC"); + let pallet_id: u8 = get_env("PALLET_ID").parse().expect("u8 expected"); + let call_id: u8 = get_env("CALL_ID").parse().expect("u8 expected"); + let contract_id: ContractId = hex::decode(get_env("CONTRACT_ID")) + .expect("hex decode failed") + .try_into() + .expect("incorrect length"); + let attest_key = hex::decode(get_env("ATTEST_KEY")).expect("hex decode failed"); + let sender_key = std::env::var("SENDER_KEY") + .map(|s| hex::decode(s).expect("hex decode failed")) + .ok(); + + EnvVars { + rpc: rpc.to_string(), + pallet_id, + call_id, + contract_id: contract_id.into(), + attest_key, + sender_key, + } + } + + fn init_contract() -> InkPriceFeed { + let EnvVars { + rpc, + pallet_id, + call_id, + contract_id, + attest_key, + sender_key, + } = config(); + + let mut price_feed = InkPriceFeed::default(); + price_feed + .config(rpc, pallet_id, call_id, contract_id.into(), sender_key) + .unwrap(); + price_feed.set_attest_key(Some(attest_key)).unwrap(); + + price_feed + } + + #[ink::test] + fn test_update_attestor_key() { + let _ = env_logger::try_init(); + pink_extension_runtime::mock_ext::mock_all_ext(); + + let mut price_feed = InkPriceFeed::default(); + + // Secret key and address of Alice in localhost + let sk_alice: [u8; 32] = [0x01; 32]; + let address_alice = hex_literal::hex!( + "189dac29296d31814dc8c56cf3d36a0543372bba7538fa322a4aebfebc39e056" + ); + + let initial_attestor_address = price_feed.get_attest_address(); + assert_ne!(address_alice, initial_attestor_address.as_slice()); + + price_feed.set_attest_key(Some(sk_alice.into())).unwrap(); + + let attestor_address = price_feed.get_attest_address(); + assert_eq!(address_alice, attestor_address.as_slice()); + + price_feed.set_attest_key(None).unwrap(); + + let attestor_address = price_feed.get_attest_address(); + assert_eq!(initial_attestor_address, attestor_address); + } + + #[ink::test] + #[ignore = "the target contract must be deployed in local node or shibuya"] + fn feed_custom_price() { + let _ = env_logger::try_init(); + pink_extension_runtime::mock_ext::mock_all_ext(); + + let price_feed = init_contract(); + + let _token0 = "pha".to_string(); + let _token1 = "usd".to_string(); + let trading_pair_id: TradingPairId = 13; + let value: u128 = 1_500_000_000_000_000_000; + + price_feed + .feed_custom_price(trading_pair_id, value) + .unwrap(); + } + + #[ink::test] + fn fetch_coingecko_price() { + let _ = env_logger::try_init(); + pink_extension_runtime::mock_ext::mock_all_ext(); + + let token0 = "polkadot".to_string(); + let token1 = "usd".to_string(); + + let value = + InkPriceFeed::fetch_coingecko_price(token0.as_str(), token1.as_str()).unwrap(); + debug_println!("value {}/{} = {}", token0, token1, value); + } + + #[ink::test] + #[ignore = "the target contract must be deployed in local node or shibuya"] + fn feed_price_from_coingecko() { + let _ = env_logger::try_init(); + pink_extension_runtime::mock_ext::mock_all_ext(); + + let price_feed = init_contract(); + + let token0 = "polkadot".to_string(); + let token1 = "usd".to_string(); + let trading_pair_id: TradingPairId = 11; + + price_feed + .feed_price_from_coingecko(trading_pair_id, token0, token1) + .unwrap(); + } + + #[ink::test] + #[ignore = "the target contract must be deployed in local node or shibuya"] + fn answer_price_request() { + let _ = env_logger::try_init(); + pink_extension_runtime::mock_ext::mock_all_ext(); + + let price_feed = init_contract(); + + let r = price_feed.answer_price().expect("failed to answer price"); + debug_println!("answer price: {r:?}"); + } + + #[ink::test] + fn test_sign_and_ecdsa_recover() { + let _ = env_logger::try_init(); + pink_extension_runtime::mock_ext::mock_all_ext(); + + // Secret key of test account `//Alice` + let private_key = hex_literal::hex!( + "e5be9a5092b81bca64be81d212e7f2f9eba183bb7a90954f7b76361f6edb5c0a" + ); + + let message = hex_literal::hex!( + "01e552298e47454041ea31273b4b630c64c104e4514aa3643490b8aaca9cf8edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000405" + ); + debug_println!("message: {:02x?}", message); + + let hash = hex_literal::hex!( + "9eb948928cf669f05801b791e5770419f1184637cf2ff3e8124c92e44d45e76f" + ); + debug_println!("hash: {:02x?}", hash); + + let signature1 = signing::ecdsa_sign_prehashed(&private_key, hash); + debug_println!("signature1: {:02x?}", signature1); + + let signature2 = signing::sign(&message, &private_key, SigType::Ecdsa); + debug_println!("signature2: {:02x?}", signature2); + + assert_eq!(signature1.to_vec(), signature2); + + // at the moment we can only verify ecdsa signatures + let mut public_key = [0u8; 33]; + ink::env::ecdsa_recover(&signature1.try_into().unwrap(), &hash, &mut public_key) + .unwrap(); + debug_println!("public_key: {:02x?}", public_key); + + let ecdsa_public_key = signing::get_public_key(&private_key, SigType::Ecdsa); + debug_println!("public_key (ecdsa): {:02x?}", ecdsa_public_key); + + let ecdsa_public_key: [u8; 33] = ecdsa_public_key.try_into().unwrap(); + assert_eq!(public_key, ecdsa_public_key); + } + } +} diff --git a/phat/contracts/ink_price_feed/rust-toolchain.toml b/phat/contracts/ink_price_feed/rust-toolchain.toml new file mode 100644 index 0000000..fd0637d --- /dev/null +++ b/phat/contracts/ink_price_feed/rust-toolchain.toml @@ -0,0 +1,11 @@ +[toolchain] +channel = "1.72" +components = [ + "rustc", + "cargo", + "rustfmt", + "rust-src", + "clippy", +] +targets = ["wasm32-unknown-unknown"] +profile = "minimal" \ No newline at end of file diff --git a/phat/crates/rollup/Cargo.toml b/phat/crates/rollup/Cargo.toml index 1db302e..1d1682f 100644 --- a/phat/crates/rollup/Cargo.toml +++ b/phat/crates/rollup/Cargo.toml @@ -8,7 +8,7 @@ name = "phat_offchain_rollup" path = "src/lib.rs" [dependencies] -ink = { version = "4.0.1", default-features = false } +ink = { version = "4.3.0", default-features = false } scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] } scale-info = { version = "2", default-features = false, features = ["derive"], optional = true } @@ -25,8 +25,8 @@ ethabi = { version = "18.0.0", default-features = false, features = [ "rlp", ], optional = true } -# for Substrate rollup -subrpc = { package = "pink-subrpc", version = "0.4.2", default-features = false, optional = true } +# for Substrate and ink! rollup +subrpc = { package = "pink-subrpc", version = "0.4.3", default-features = false, optional = true } [dev-dependencies] hex-literal = "0.4.1" @@ -54,4 +54,8 @@ evm = [ "pink-web3", "ethabi", "pink-extension", +] +ink = [ + "subrpc", + "pink-extension", ] \ No newline at end of file diff --git a/phat/crates/rollup/src/clients/ink.rs b/phat/crates/rollup/src/clients/ink.rs new file mode 100644 index 0000000..7beac64 --- /dev/null +++ b/phat/crates/rollup/src/clients/ink.rs @@ -0,0 +1,421 @@ +use alloc::vec::Vec; + +use ink::primitives::Hash; +use kv_session::{ + rollup, + traits::{ + BumpVersion, Key, KvSession, KvSnapshot, QueueIndex, QueueIndexCodec, QueueSession, Value, + }, + RwTracker, Session, +}; +use pink_extension::chain_extension::signing; +use pink_extension::ResultExt; + +#[cfg(feature = "logging")] +use pink_extension::debug; + +use primitive_types::H256; +use scale::{Decode, Encode}; +use subrpc::contracts::*; + +pub use crate::{Action, Error, Result}; + +const DEFAULT_QUEUE_PREFIX: &[u8] = b"q/"; + +pub type ContractId = [u8; 32]; + +pub struct InkSnapshot<'a> { + rpc: &'a str, + pallet_id: u8, + call_id: u8, + contract_id: &'a ContractId, + at: H256, +} + +impl<'a> InkSnapshot<'a> { + pub fn new( + rpc: &'a str, + pallet_id: u8, + call_id: u8, + contract_id: &'a ContractId, + ) -> Result { + let hash = subrpc::get_block_hash(rpc, None).or(Err(Error::FailedToGetBlockHash))?; + Ok(InkSnapshot { + rpc, + pallet_id, + call_id, + contract_id, + at: hash, + }) + } +} + +impl<'a> KvSnapshot for InkSnapshot<'a> { + fn get(&self, key: &[u8]) -> kv_session::Result> { + let contract = InkContract::new(self.rpc, self.pallet_id, self.call_id, self.contract_id); + + // result of the query + type QueryResult = Option>; + // call the method + let value: QueryResult = contract + .query_at( + *self.contract_id, + ink::selector_bytes!("RollupAnchor::get_value"), + Some(&key), + 0, + Some(self.at), + ) + .log_err("Rollup snapshot: failed to get storage") + .map_err(|_| kv_session::Error::FailedToGetStorage)?; + + #[cfg(feature = "logging")] + debug!("Snapshot - key: {:02x?} - value: {:02x?}", &key, &value); + + Ok(value) + } + + fn snapshot_id(&self) -> kv_session::Result> { + Ok(self.at.encode()) + } +} + +impl<'a> BumpVersion for InkSnapshot<'a> { + fn bump_version(&self, version: Option>) -> kv_session::Result> { + match version { + Some(v) => { + let ver = u32::decode(&mut &v[..]).or(Err(kv_session::Error::FailedToDecode))?; + Ok((ver + 1).encode()) + } + None => Ok(1u32.encode()), + } + } +} + +pub struct ScaleCodec; +impl QueueIndexCodec for ScaleCodec { + fn encode(number: QueueIndex) -> Vec { + number.encode() + } + + fn decode(raw: impl AsRef<[u8]>) -> kv_session::Result { + // QueueIndex is stored as a value in the rollup kv store. When the value is empty, it's + // treated as the default value (0 for u32). However, this function only handles the + // non-empty case (empty value != zero length bytes). So here, `[]` is not considered. + QueueIndex::decode(&mut raw.as_ref()).or(Err(kv_session::Error::FailedToDecode)) + } +} + +pub struct InkRollupClient<'a> { + rpc: &'a str, + pallet_id: u8, + call_id: u8, + contract_id: &'a ContractId, + actions: Vec, + session: Session, RwTracker, ScaleCodec>, +} + +pub struct SubmittableRollupTx<'a> { + rpc: &'a str, + pallet_id: u8, + call_id: u8, + contract_id: &'a ContractId, + tx: InkRollupTx, +} + +#[derive(Debug, Default, PartialEq, Eq, Encode, Decode)] +#[cfg_attr(feature = "std", derive(scale_info::TypeInfo))] +pub struct InkRollupTx { + conditions: Vec<(Key, Option)>, + updates: Vec<(Key, Option)>, + actions: Vec, +} + +#[derive(Debug, PartialEq, Eq, Encode, Decode, Clone)] +#[cfg_attr(feature = "std", derive(scale_info::TypeInfo))] +pub enum HandleActionInput { + Reply(Vec), + SetQueueHead(QueueIndex), + GrantAttestor(ContractId), + RevokeAttestor(ContractId), +} + +impl Action { + fn encode_into_ink(self) -> HandleActionInput { + match self { + Action::Reply(data) => HandleActionInput::Reply(data), + Action::ProcessedTo(n) => HandleActionInput::SetQueueHead(n), + } + } +} + +impl<'a> InkRollupClient<'a> { + pub fn new( + rpc: &'a str, + pallet_id: u8, + call_id: u8, + contract_id: &'a ContractId, + ) -> Result { + let kvdb = InkSnapshot::new(rpc, pallet_id, call_id, contract_id)?; + let access_tracker = RwTracker::new(); + Ok(InkRollupClient { + rpc, + pallet_id, + call_id, + contract_id, + actions: Default::default(), + session: Session::new(kvdb, access_tracker, DEFAULT_QUEUE_PREFIX) + .map_err(Error::SessionError)?, + }) + } + + pub fn get(&mut self, key: &K) -> Result> { + let v = self.session.get(&key.encode())?; + + if let Some(v) = v { + let v = V::decode(&mut v.as_slice())?; + return Ok(Some(v)); + } + + Ok(None) + } + + pub fn put(&mut self, key: &K, value: &V) { + self.session.put(&key.encode(), value.encode()); + } + + pub fn delete(&mut self, key: K) { + self.session.delete(&key.encode()); + } + + pub fn pop(&mut self) -> Result> { + let v = self.session.pop().map_err(Self::convert_err)?; + + if let Some(v) = v { + let v = V::decode(&mut v.as_slice())?; + return Ok(Some(v)); + } + + Ok(None) + } + + pub fn action(&mut self, action: Action) -> &mut Self { + self.actions.push(action); + self + } + + pub fn commit(mut self) -> Result>> { + let (session_tx, kvdb) = self.session.commit(); + let raw_tx = rollup::rollup( + &kvdb, + session_tx, + rollup::VersionLayout::Standalone { + key_postfix: b":ver".to_vec(), + }, + ) + .map_err(Self::convert_err)?; + + if let Some(head_idx) = raw_tx.queue_head { + self.actions.push(Action::ProcessedTo(head_idx)); + } + + if raw_tx.updates.is_empty() && self.actions.is_empty() { + return Ok(None); + } + + let tx = InkRollupTx { + conditions: raw_tx.conditions, + updates: raw_tx.updates, + actions: self.actions, + }; + + Ok(Some(SubmittableRollupTx { + rpc: self.rpc, + pallet_id: self.pallet_id, + call_id: self.call_id, + contract_id: self.contract_id, + tx, + })) + } + + fn convert_err(err: kv_session::Error) -> Error { + match err { + kv_session::Error::FailedToDecode => Error::SessionFailedToDecode, + kv_session::Error::FailedToGetStorage => Error::SessionFailedToGetStorage, + } + } +} + +impl<'a> SubmittableRollupTx<'a> { + pub fn submit(self, secret_key: &[u8; 32]) -> Result> { + let params = self.tx.into_params(); + + let contract = InkContract::new(self.rpc, self.pallet_id, self.call_id, self.contract_id); + + let result = contract + .dry_run_and_send_transaction( + ink::selector_bytes!("RollupAnchor::rollup_cond_eq"), + Some(¶ms), + 0, + secret_key, + ) + .log_err("dry run and send transaction failed") + .map_err(Error::InkFailedToCallContract)?; + + #[cfg(feature = "logging")] + debug!("Sent = {}", hex::encode(&result)); + + Ok(result) + } + + pub fn submit_meta_tx(self, attestor_key: &[u8; 32], relay_key: &[u8; 32]) -> Result> { + let params = self.tx.into_params(); + + let public_key: [u8; 33] = signing::get_public_key(attestor_key, signing::SigType::Ecdsa) + .try_into() + .map_err(|_| Error::InvalidAddressLength)?; + + let origin: [u8; 32] = get_ecdsa_account_id(&public_key); + + let meta_params = (origin, params.encode()); + + #[cfg(feature = "logging")] + { + debug!("query method prepare"); + debug!("origin: {:?}", &origin); + debug!("encoded params {:02x?}", params.encode()); + } + + let contract = InkContract::new(self.rpc, self.pallet_id, self.call_id, self.contract_id); + + // result of the query + type PrepareResult = core::result::Result<(ForwardRequest, Hash), ContractError>; + // call the method + let result: PrepareResult = contract + .query( + origin, + ink::selector_bytes!("MetaTransaction::prepare"), + Some(&meta_params), + 0, + ) + .log_err("dry run and send transaction failed") + .map_err(Error::InkFailedToQueryContract)?; + + let (forward_request, hash) = result.map_err(|_| Error::InkFailedToPrepareMetaTx)?; + + #[cfg(feature = "logging")] + { + debug!("forwardRequest: {:02x?}", &forward_request); + debug!("hash: {:02x?}", &hash); + } + + // the attestor sign the hash + //let signature = signing::sign(hash.as_ref(), attestor_key, signing::SigType::Ecdsa); + let message: [u8; 32] = hash + .as_ref() + .to_vec() + .try_into() + .expect("Hash should be of length 32"); + let signature = signing::ecdsa_sign_prehashed(attestor_key, message); + + #[cfg(feature = "logging")] + debug!("signature: {:02x?}", signature); + + let params = (forward_request, signature); + + let result = contract + .dry_run_and_send_transaction( + ink::selector_bytes!("MetaTransaction::meta_tx_rollup_cond_eq"), + Some(¶ms), + 0, + relay_key, + ) + .log_err("dry run and send transaction failed") + .map_err(Error::InkFailedToCallContract)?; + + #[cfg(feature = "logging")] + debug!("Sent = {}", hex::encode(&result)); + + Ok(result) + } +} + +/// Converts a compressed ECDSA public key to AccountId +fn get_ecdsa_account_id(input: &[u8]) -> [u8; 32] { + use ink::env::hash; + let mut output = ::Type::default(); + ink::env::hash_bytes::(input, &mut output); + output +} + +/// +/// Struct use in the meta transactions +/// +#[derive(Debug, Eq, PartialEq, Clone, Encode, Decode)] +struct ForwardRequest { + from: ink::primitives::AccountId, + to: ink::primitives::AccountId, + nonce: u128, + data: Vec, +} + +type RollupParamsType = ( + Vec<(Vec, Option>)>, + Vec<(Vec, Option>)>, + Vec, +); + +trait IntoRollupParams { + /// Converts a RollupTx into the Ink contract arguments. + fn into_params(self) -> RollupParamsType; +} + +impl IntoRollupParams for InkRollupTx { + fn into_params(self) -> RollupParamsType { + #[cfg(feature = "logging")] + { + debug!("conditions ------"); + self.conditions.clone().into_iter().for_each(|(k, v)| { + debug!("k: {:02x?}", &k); + debug!("v: {:02x?}", &v); + }); + + debug!("updates ------"); + self.updates.clone().into_iter().for_each(|(k, v)| { + debug!("k: {:02x?}", &k); + debug!("v: {:02x?}", &v); + }); + + debug!("actions ------"); + } + + let actions: Vec = self + .actions + .into_iter() + .map(|action| { + #[cfg(feature = "logging")] + { + let a = action.encode_into_ink(); + debug!("action: {:02x?}", &a); + a + } + #[cfg(not(feature = "logging"))] + { + action.encode_into_ink() + } + }) + .collect(); + (self.conditions, self.updates, actions) + } +} + +/// convertor from scale::Error to Error +impl From for Error { + fn from(error: scale::Error) -> Self { + Error::InkFailedToDecode(error) + } +} +impl From for Error { + fn from(error: kv_session::Error) -> Self { + Error::KVError(error) + } +} diff --git a/phat/crates/rollup/src/clients/mod.rs b/phat/crates/rollup/src/clients/mod.rs index 25da87e..cf2d7ee 100644 --- a/phat/crates/rollup/src/clients/mod.rs +++ b/phat/crates/rollup/src/clients/mod.rs @@ -3,3 +3,6 @@ pub mod evm; #[cfg(feature = "substrate")] pub mod substrate; + +#[cfg(feature = "ink")] +pub mod ink; diff --git a/phat/crates/rollup/src/lib.rs b/phat/crates/rollup/src/lib.rs index 1e9cbba..24a1c0c 100644 --- a/phat/crates/rollup/src/lib.rs +++ b/phat/crates/rollup/src/lib.rs @@ -41,6 +41,25 @@ pub enum Error { QueueIndexOverflow, LockVersionOverflow, RpcNetworkError, + + #[cfg(feature = "ink")] + InkFailedToCallContract(subrpc::contracts::Error), + #[cfg(feature = "ink")] + InkFailedToQueryContract(subrpc::contracts::Error), + #[cfg(feature = "ink")] + InkFailedToDryRunContract(subrpc::traits::common::Error), + #[cfg(feature = "ink")] + InkFailedToCreateTransaction(subrpc::traits::common::Error), + #[cfg(feature = "ink")] + InkFailedToSendTransaction(subrpc::traits::common::Error), + #[cfg(feature = "ink")] + InkFailedToPrepareMetaTx, + #[cfg(feature = "ink")] + InkFailedToDecode(scale::Error), + #[cfg(feature = "ink")] + KVError(kv_session::Error), + #[cfg(feature = "ink")] + InvalidAddressLength, } pub type Result = core::result::Result;