From 2cf0f1b5f3a10fbddfe3649e6ba0442544edbb8e Mon Sep 17 00:00:00 2001 From: debris Date: Thu, 11 Feb 2016 14:35:03 +0100 Subject: [PATCH 01/73] moved chainfilter from util to ethcore, blockchain stores block blooms --- ethcore/src/blockchain.rs | 26 ++++++++++++++++---------- {util => ethcore}/src/chainfilter.rs | 15 ++++++++------- ethcore/src/client.rs | 2 +- ethcore/src/lib.rs | 1 + ethcore/src/tests/helpers.rs | 4 ++-- util/src/lib.rs | 2 -- 6 files changed, 28 insertions(+), 22 deletions(-) rename {util => ethcore}/src/chainfilter.rs (98%) diff --git a/ethcore/src/blockchain.rs b/ethcore/src/blockchain.rs index 9240ff800..270dfc459 100644 --- a/ethcore/src/blockchain.rs +++ b/ethcore/src/blockchain.rs @@ -22,6 +22,7 @@ use header::*; use extras::*; use transaction::*; use views::*; +use receipt::Receipt; /// Represents a tree route between `from` block and `to` block: pub struct TreeRoute { @@ -425,7 +426,7 @@ impl BlockChain { /// Inserts the block into backing cache database. /// Expects the block to be valid and already verified. /// If the block is already known, does nothing. - pub fn insert_block(&self, bytes: &[u8]) { + pub fn insert_block(&self, bytes: &[u8], receipts: &[Receipt]) { // create views onto rlp let block = BlockView::new(bytes); let header = block.header_view(); @@ -437,7 +438,7 @@ impl BlockChain { // store block in db self.blocks_db.put(&hash, &bytes).unwrap(); - let (batch, new_best, details) = self.block_to_extras_insert_batch(bytes); + let (batch, new_best, details) = self.block_to_extras_insert_batch(bytes, receipts); // update best block let mut best_block = self.best_block.write().unwrap(); @@ -457,7 +458,7 @@ impl BlockChain { /// Transforms block into WriteBatch that may be written into database /// Additionally, if it's new best block it returns new best block object. - fn block_to_extras_insert_batch(&self, bytes: &[u8]) -> (WriteBatch, Option, BlockDetails) { + fn block_to_extras_insert_batch(&self, bytes: &[u8], receipts: &[Receipt]) -> (WriteBatch, Option, BlockDetails) { // create views onto rlp let block = BlockView::new(bytes); let header = block.header_view(); @@ -495,6 +496,11 @@ impl BlockChain { }); } + // update block blooms + batch.put_extras(&hash, &BlockLogBlooms { + blooms: receipts.iter().map(|r| r.log_bloom.clone()).collect() + }); + // if it's not new best block, just return if !is_new_best { return (batch, None, details); @@ -682,7 +688,7 @@ mod tests { let first = "f90285f90219a03caa2203f3d7c136c0295ed128a7d31cea520b1ca5e27afe17d0853331798942a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0bac6177a79e910c98d86ec31a09ae37ac2de15b754fd7bed1ba52362c49416bfa0d45893a296c1490a978e0bd321b5f2635d8280365c1fe9f693d65f233e791344a0c7778a7376099ee2e5c455791c1885b5c361b95713fddcbe32d97fd01334d296b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b845627cb99a00102030405060708091011121314151617181920212223242526272829303132a08ccb2837fb2923bd97e8f2d08ea32012d6e34be018c73e49a0f98843e8f47d5d88e53be49fec01012ef866f864800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d8785012a05f200801ba0cb088b8d2ff76a7b2c6616c9d02fb6b7a501afbf8b69d7180b09928a1b80b5e4a06448fe7476c606582039bb72a9f6f4b4fad18507b8dfbd00eebbe151cc573cd2c0".from_hex().unwrap(); - bc.insert_block(&first); + bc.insert_block(&first, &[]); let first_hash = H256::from_str("a940e5af7d146b3b917c953a82e1966b906dace3a4e355b5b0a4560190357ea1").unwrap(); @@ -715,10 +721,10 @@ mod tests { let temp = RandomTempPath::new(); let bc = BlockChain::new(&genesis, temp.as_path()); - bc.insert_block(&b1); - bc.insert_block(&b2); - bc.insert_block(&b3a); - bc.insert_block(&b3b); + bc.insert_block(&b1, &[]); + bc.insert_block(&b2, &[]); + bc.insert_block(&b3a, &[]); + bc.insert_block(&b3b, &[]); assert_eq!(bc.best_block_hash(), best_block_hash); assert_eq!(bc.block_number(&genesis_hash).unwrap(), 0); @@ -795,7 +801,7 @@ mod tests { { let bc = BlockChain::new(&genesis, temp.as_path()); assert_eq!(bc.best_block_hash(), genesis_hash); - bc.insert_block(&b1); + bc.insert_block(&b1, &[]); assert_eq!(bc.best_block_hash(), b1_hash); } @@ -854,7 +860,7 @@ mod tests { let temp = RandomTempPath::new(); let bc = BlockChain::new(&genesis, temp.as_path()); - bc.insert_block(&b1); + bc.insert_block(&b1, &[]); let transactions = bc.transactions(&b1_hash).unwrap(); assert_eq!(transactions.len(), 7); diff --git a/util/src/chainfilter.rs b/ethcore/src/chainfilter.rs similarity index 98% rename from util/src/chainfilter.rs rename to ethcore/src/chainfilter.rs index 20462c698..4043a1fee 100644 --- a/util/src/chainfilter.rs +++ b/ethcore/src/chainfilter.rs @@ -16,12 +16,13 @@ //! Multilevel blockchain bloom filter. //! -//! ``` +//! ```not_run //! extern crate ethcore_util as util; +//! extern crate ethcore; //! use std::str::FromStr; -//! use util::chainfilter::*; //! use util::sha3::*; //! use util::hash::*; +//! use ethcore::chainfilter::*; //! //! fn main() { //! let (index_size, bloom_levels) = (16, 3); @@ -55,8 +56,8 @@ //! ``` //! use std::collections::{HashMap}; -use hash::*; -use sha3::*; +use util::hash::*; +use util::sha3::*; /// Represents bloom index in cache /// @@ -350,10 +351,10 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource #[cfg(test)] mod tests { - use hash::*; - use chainfilter::*; - use sha3::*; use std::str::FromStr; + use util::hash::*; + use chainfilter::*; + use util::sha3::*; #[test] fn test_level_size() { diff --git a/ethcore/src/client.rs b/ethcore/src/client.rs index 5d6537b24..d9e461024 100644 --- a/ethcore/src/client.rs +++ b/ethcore/src/client.rs @@ -304,7 +304,7 @@ impl Client { good_blocks.push(header.hash().clone()); - self.chain.write().unwrap().insert_block(&block.bytes); //TODO: err here? + self.chain.write().unwrap().insert_block(&block.bytes, result.block().receipts()); //TODO: err here? let ancient = if header.number() >= HISTORY { Some(header.number() - HISTORY) } else { None }; match result.drain().commit(header.number(), &header.hash(), ancient.map(|n|(n, self.chain.read().unwrap().block_hash(n).unwrap()))) { Ok(_) => (), diff --git a/ethcore/src/lib.rs b/ethcore/src/lib.rs index 6c4535339..4f283ef05 100644 --- a/ethcore/src/lib.rs +++ b/ethcore/src/lib.rs @@ -118,6 +118,7 @@ mod account_db; mod action_params; mod null_engine; mod builtin; +mod chainfilter; mod extras; mod substate; mod executive; diff --git a/ethcore/src/tests/helpers.rs b/ethcore/src/tests/helpers.rs index 93e3e0a0d..0a2b95e8d 100644 --- a/ethcore/src/tests/helpers.rs +++ b/ethcore/src/tests/helpers.rs @@ -224,7 +224,7 @@ pub fn generate_dummy_blockchain(block_number: u32) -> GuardedTempResult { @@ -237,7 +237,7 @@ pub fn generate_dummy_blockchain_with_extra(block_number: u32) -> GuardedTempRes let temp = RandomTempPath::new(); let bc = BlockChain::new(&create_unverifiable_block(0, H256::zero()), temp.as_path()); for block_order in 1..block_number { - bc.insert_block(&create_unverifiable_block_with_extra(block_order, bc.best_block_hash(), None)); + bc.insert_block(&create_unverifiable_block_with_extra(block_order, bc.best_block_hash(), None), &[]); } GuardedTempResult:: { diff --git a/util/src/lib.rs b/util/src/lib.rs index bdd595014..6d9991e1d 100644 --- a/util/src/lib.rs +++ b/util/src/lib.rs @@ -121,7 +121,6 @@ pub mod memorydb; pub mod overlaydb; pub mod journaldb; mod math; -pub mod chainfilter; pub mod crypto; pub mod triehash; pub mod trie; @@ -143,7 +142,6 @@ pub use memorydb::*; pub use overlaydb::*; pub use journaldb::*; pub use math::*; -pub use chainfilter::*; pub use crypto::*; pub use triehash::*; pub use trie::*; From 160c52a14bd19fb41d1f5093e8a17eb56524a637 Mon Sep 17 00:00:00 2001 From: debris Date: Fri, 12 Feb 2016 00:40:45 +0100 Subject: [PATCH 02/73] bloomfilters connected to blockchain (but without reversion) --- ethcore/src/blockchain.rs | 73 +++++++++++++++++++++++++++++++++---- ethcore/src/chainfilter.rs | 12 +++--- ethcore/src/extras.rs | 14 +++++++ ethcore/src/verification.rs | 4 ++ 4 files changed, 90 insertions(+), 13 deletions(-) diff --git a/ethcore/src/blockchain.rs b/ethcore/src/blockchain.rs index 270dfc459..3c2fe3a37 100644 --- a/ethcore/src/blockchain.rs +++ b/ethcore/src/blockchain.rs @@ -23,6 +23,10 @@ use extras::*; use transaction::*; use views::*; use receipt::Receipt; +use chainfilter::{ChainFilter, BloomIndex, FilterDataSource}; + +const BLOOM_INDEX_SIZE: usize = 16; +const BLOOM_LEVELS: u8 = 3; /// Represents a tree route between `from` block and `to` block: pub struct TreeRoute { @@ -131,6 +135,9 @@ pub trait BlockProvider { fn genesis_header(&self) -> Header { self.block_header(&self.genesis_hash()).unwrap() } + + /// Returns numbers of blocks containing given bloom. + fn blocks_with_bloom(&self, bloom: &H2048, from_block: BlockNumber, to_block: BlockNumber) -> Vec; } #[derive(Debug, Hash, Eq, PartialEq, Clone)] @@ -167,6 +174,17 @@ pub struct BlockChain { blocks_db: DB, cache_man: RwLock, + + // blooms config + bloom_index_size: usize, + bloom_levels: u8 +} + +impl FilterDataSource for BlockChain { + fn bloom_at_index(&self, bloom_index: &BloomIndex) -> Option { + let location = self.blocks_bloom_location(bloom_index); + self.blocks_blooms(&location.hash).and_then(|blooms| blooms.blooms.into_iter().nth(location.index).cloned()) + } } impl BlockProvider for BlockChain { @@ -215,6 +233,12 @@ impl BlockProvider for BlockChain { fn transaction_address(&self, hash: &H256) -> Option { self.query_extras(hash, &self.transaction_addresses) } + + /// Returns numbers of blocks containing given bloom. + fn blocks_with_bloom(&self, bloom: &H2048, from_block: BlockNumber, to_block: BlockNumber) -> Vec { + let filter = ChainFilter::new(self, self.bloom_index_size, self.bloom_levels); + filter.blocks_with_bloom(bloom, from_block as usize, to_block as usize).into_iter().map(|b| b as BlockNumber).collect() + } } const COLLECTION_QUEUE_SIZE: usize = 8; @@ -274,6 +298,8 @@ impl BlockChain { extras_db: extras_db, blocks_db: blocks_db, cache_man: RwLock::new(cache_man), + bloom_index_size: BLOOM_INDEX_SIZE, + bloom_levels: BLOOM_LEVELS }; // load best block @@ -497,8 +523,23 @@ impl BlockChain { } // update block blooms + let blooms: Vec = receipts.iter().map(|r| r.log_bloom.clone()).collect(); + + let modified_blooms = { + let filter = ChainFilter::new(self, self.bloom_index_size, self.bloom_levels); + let bloom = blooms.iter().fold(H2048::new(), | ref acc, b | acc | b); + filter.add_bloom(&bloom, header.number() as usize) + }; + + for (bloom_index, bloom) in modified_blooms.into_iter() { + let location = self.blocks_bloom_location(&bloom_index); + let mut blocks_blooms = self.blocks_blooms(&location.hash).unwrap_or_else(BlocksBlooms::new); + blocks_blooms.blooms[location.index] = bloom; + batch.put_extras(&location.hash, &blocks_blooms); + } + batch.put_extras(&hash, &BlockLogBlooms { - blooms: receipts.iter().map(|r| r.log_bloom.clone()).collect() + blooms: blooms }); // if it's not new best block, just return @@ -541,11 +582,6 @@ impl BlockChain { (batch, Some(best_block), details) } - /// Returns true if transaction is known. - pub fn is_known_transaction(&self, hash: &H256) -> bool { - self.query_extras_exist(hash, &self.transaction_addresses) - } - /// Get best block hash. pub fn best_block_hash(&self) -> H256 { self.best_block.read().unwrap().hash.clone() @@ -562,10 +598,32 @@ impl BlockChain { } /// Get the transactions' log blooms of a block. - pub fn log_blooms(&self, hash: &H256) -> Option { + fn log_blooms(&self, hash: &H256) -> Option { self.query_extras(hash, &self.block_logs) } + /// Get block blooms. + fn blocks_blooms(&self, hash: &H256) -> Option { + self.query_extras(hash, &self.blocks_blooms) + } + + /// Calculates bloom's position in database. + fn blocks_bloom_location(&self, bloom_index: &BloomIndex) -> BlocksBloomLocation { + use std::{mem, ptr}; + + let hash = unsafe { + let mut hash: H256 = mem::zeroed(); + ptr::copy(&[bloom_index.index / self.bloom_index_size] as *const usize as *const u8, hash.as_mut_ptr(), 8); + hash[8] = bloom_index.level; + hash + }; + + BlocksBloomLocation { + hash: hash, + index: bloom_index.index % self.bloom_index_size + } + } + fn query_extras(&self, hash: &K, cache: &RwLock>) -> Option where T: Clone + Decodable + ExtrasIndexable, K: ExtrasSliceConvertable + Eq + Hash + Clone { @@ -685,6 +743,7 @@ mod tests { assert_eq!(bc.best_block_hash(), genesis_hash.clone()); assert_eq!(bc.block_hash(0), Some(genesis_hash.clone())); assert_eq!(bc.block_hash(1), None); + assert_eq!(bc.block_details(&genesis_hash).unwrap().children, vec![]); let first = "f90285f90219a03caa2203f3d7c136c0295ed128a7d31cea520b1ca5e27afe17d0853331798942a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0bac6177a79e910c98d86ec31a09ae37ac2de15b754fd7bed1ba52362c49416bfa0d45893a296c1490a978e0bd321b5f2635d8280365c1fe9f693d65f233e791344a0c7778a7376099ee2e5c455791c1885b5c361b95713fddcbe32d97fd01334d296b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b845627cb99a00102030405060708091011121314151617181920212223242526272829303132a08ccb2837fb2923bd97e8f2d08ea32012d6e34be018c73e49a0f98843e8f47d5d88e53be49fec01012ef866f864800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d8785012a05f200801ba0cb088b8d2ff76a7b2c6616c9d02fb6b7a501afbf8b69d7180b09928a1b80b5e4a06448fe7476c606582039bb72a9f6f4b4fad18507b8dfbd00eebbe151cc573cd2c0".from_hex().unwrap(); diff --git a/ethcore/src/chainfilter.rs b/ethcore/src/chainfilter.rs index 4043a1fee..dde91e18e 100644 --- a/ethcore/src/chainfilter.rs +++ b/ethcore/src/chainfilter.rs @@ -85,7 +85,7 @@ impl BloomIndex { /// Types implementing this trait should provide read access for bloom filters database. pub trait FilterDataSource { /// returns reference to log at given position if it exists - fn bloom_at_index(&self, index: &BloomIndex) -> Option<&H2048>; + fn bloom_at_index(&self, index: &BloomIndex) -> Option; } /// In memory cache for blooms. @@ -110,8 +110,8 @@ impl MemoryCache { } impl FilterDataSource for MemoryCache { - fn bloom_at_index(&self, index: &BloomIndex) -> Option<&H2048> { - self.blooms.get(index) + fn bloom_at_index(&self, index: &BloomIndex) -> Option { + self.blooms.get(index).cloned() } } @@ -238,7 +238,7 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource for level in 0..self.levels() { let bloom_index = self.bloom_index(block_number, level); let new_bloom = match self.data_source.bloom_at_index(&bloom_index) { - Some(old_bloom) => old_bloom | bloom, + Some(old_bloom) => old_bloom | bloom.clone(), None => bloom.clone(), }; @@ -268,7 +268,7 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource // it hasn't been modified yet if is_new_bloom { let new_bloom = match self.data_source.bloom_at_index(&bloom_index) { - Some(old_bloom) => old_bloom | &blooms[i], + Some(ref old_bloom) => old_bloom | &blooms[i], None => blooms[i].clone(), }; result.insert(bloom_index, new_bloom); @@ -298,7 +298,7 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource // filter existing ones .filter_map(|b| b) // BitOr all of them - .fold(H2048::new(), |acc, bloom| &acc | bloom); + .fold(H2048::new(), |acc, bloom| acc | bloom); reset_index = index.clone(); result.insert(index, &new_bloom | bloom); diff --git a/ethcore/src/extras.rs b/ethcore/src/extras.rs index b65d4ed7a..305b7767e 100644 --- a/ethcore/src/extras.rs +++ b/ethcore/src/extras.rs @@ -213,6 +213,12 @@ pub struct BlocksBlooms { pub blooms: [H2048; 16] } +impl BlocksBlooms { + pub fn new() -> Self { + BlocksBlooms { blooms: unsafe { ::std::mem::zeroed() }} + } +} + impl ExtrasIndexable for BlocksBlooms { fn extras_index() -> ExtrasIndex { ExtrasIndex::BlocksBlooms @@ -254,6 +260,14 @@ impl Encodable for BlocksBlooms { } } +/// Represents location of bloom in database. +pub struct BlocksBloomLocation { + /// Unique hash of BlocksBloom + pub hash: H256, + /// Index within BlocksBloom + pub index: usize +} + /// Represents address of certain transaction within block #[derive(Clone)] pub struct TransactionAddress { diff --git a/ethcore/src/verification.rs b/ethcore/src/verification.rs index c7d5e265f..0b234b00d 100644 --- a/ethcore/src/verification.rs +++ b/ethcore/src/verification.rs @@ -302,6 +302,10 @@ mod tests { fn block_hash(&self, index: BlockNumber) -> Option { self.numbers.get(&index).cloned() } + + fn blocks_with_bloom(&self, bloom: &H2048, from_block: BlockNumber, to_block: BlockNumber) -> Vec { + unimplemented!() + } } fn basic_test(bytes: &[u8], engine: &Engine) -> Result<(), Error> { From b73d5283653a8bcec8558588dae005384b37b9e5 Mon Sep 17 00:00:00 2001 From: debris Date: Fri, 12 Feb 2016 02:03:04 +0100 Subject: [PATCH 03/73] bloomfilter reset_chain_head --- ethcore/src/blockchain.rs | 40 +++++++++++++++++++++----------------- ethcore/src/chainfilter.rs | 39 +++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 18 deletions(-) diff --git a/ethcore/src/blockchain.rs b/ethcore/src/blockchain.rs index 3c2fe3a37..26a8b4e98 100644 --- a/ethcore/src/blockchain.rs +++ b/ethcore/src/blockchain.rs @@ -522,25 +522,13 @@ impl BlockChain { }); } - // update block blooms - let blooms: Vec = receipts.iter().map(|r| r.log_bloom.clone()).collect(); - let modified_blooms = { - let filter = ChainFilter::new(self, self.bloom_index_size, self.bloom_levels); - let bloom = blooms.iter().fold(H2048::new(), | ref acc, b | acc | b); - filter.add_bloom(&bloom, header.number() as usize) - }; - for (bloom_index, bloom) in modified_blooms.into_iter() { - let location = self.blocks_bloom_location(&bloom_index); - let mut blocks_blooms = self.blocks_blooms(&location.hash).unwrap_or_else(BlocksBlooms::new); - blocks_blooms.blooms[location.index] = bloom; - batch.put_extras(&location.hash, &blocks_blooms); - } - - batch.put_extras(&hash, &BlockLogBlooms { - blooms: blooms - }); + // save blooms (is it really required?). maybe store receipt whole instead? + //let blooms: Vec = receipts.iter().map(|r| r.log_bloom.clone()).collect(); + //batch.put_extras(&hash, &BlockLogBlooms { + //blooms: blooms + //}); // if it's not new best block, just return if !is_new_best { @@ -556,7 +544,21 @@ impl BlockChain { match route.blocks.len() { // its our parent - 1 => batch.put_extras(&header.number(), &hash), + 1 => { + + // update block blooms + let modified_blooms = ChainFilter::new(self, self.bloom_index_size, self.bloom_levels) + .add_bloom(&header.log_bloom(), header.number() as usize); + + for (bloom_index, bloom) in modified_blooms.into_iter() { + let location = self.blocks_bloom_location(&bloom_index); + let mut blocks_blooms = self.blocks_blooms(&location.hash).unwrap_or_else(BlocksBlooms::new); + blocks_blooms.blooms[location.index] = bloom; + batch.put_extras(&location.hash, &blocks_blooms); + } + + batch.put_extras(&header.number(), &hash) + }, // it is a fork i if i > 1 => { let ancestor_number = self.block_number(&route.ancestor).unwrap(); @@ -564,6 +566,8 @@ impl BlockChain { for (index, hash) in route.blocks.iter().skip(route.index).enumerate() { batch.put_extras(&(start_number + index as BlockNumber), hash); } + + // TODO: replace blooms from start_number to current }, // route.blocks.len() could be 0 only if inserted block is best block, // and this is not possible at this stage diff --git a/ethcore/src/chainfilter.rs b/ethcore/src/chainfilter.rs index dde91e18e..95bac64e3 100644 --- a/ethcore/src/chainfilter.rs +++ b/ethcore/src/chainfilter.rs @@ -307,6 +307,45 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource result } + /// Resets blooms at level 0 and forces rebuild on higher levels. + pub fn reset_chain_head(&self, blooms: &[H2048], block_number: usize, old_highest_block: usize) -> HashMap { + let mut result: HashMap = HashMap::new(); + + // insert all new blooms at level 0 + for (i, bloom) in blooms.iter().enumerate() { + result.insert(self.bloom_index(block_number + i, 0), bloom.clone()); + } + + // reset the rest of blooms + for reset_number in block_number + blooms.len()..old_highest_block { + result.insert(self.bloom_index(reset_number, 0), H2048::new()); + } + + for level in 1..self.levels() { + for i in 0..blooms.len() { + + let index = self.bloom_index(block_number + i, level); + let new_bloom = { + // use new blooms before db blooms where necessary + let bloom_at = | index | { result.get(&index).cloned().or_else(|| self.data_source.bloom_at_index(&index)) }; + + self.lower_level_bloom_indexes(&index) + .into_iter() + // get blooms + .map(bloom_at) + // filter existing ones + .filter_map(|b| b) + // BitOr all of them + .fold(H2048::new(), |acc, bloom| acc | bloom) + }; + + result.insert(index, new_bloom); + } + } + + result + } + /// Sets lowest level bloom to 0 and forces rebuild on higher levels. pub fn clear_bloom(&self, block_number: usize) -> HashMap { self.reset_bloom(&H2048::new(), block_number) From c9e0071fdef387fd5c837501721c991a98870c7c Mon Sep 17 00:00:00 2001 From: debris Date: Fri, 12 Feb 2016 14:03:23 +0100 Subject: [PATCH 04/73] blockchain bloomfilter should be ok by now... --- ethcore/src/blockchain.rs | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/ethcore/src/blockchain.rs b/ethcore/src/blockchain.rs index 26a8b4e98..ef6090a53 100644 --- a/ethcore/src/blockchain.rs +++ b/ethcore/src/blockchain.rs @@ -542,22 +542,16 @@ impl BlockChain { let best_details = self.block_details(&best_hash).expect("best block hash is invalid!"); let route = self.tree_route_aux((&best_details, &best_hash), (&details, &hash)); + let modified_blooms; + match route.blocks.len() { // its our parent 1 => { + batch.put_extras(&header.number(), &hash); // update block blooms - let modified_blooms = ChainFilter::new(self, self.bloom_index_size, self.bloom_levels) + modified_blooms = ChainFilter::new(self, self.bloom_index_size, self.bloom_levels) .add_bloom(&header.log_bloom(), header.number() as usize); - - for (bloom_index, bloom) in modified_blooms.into_iter() { - let location = self.blocks_bloom_location(&bloom_index); - let mut blocks_blooms = self.blocks_blooms(&location.hash).unwrap_or_else(BlocksBlooms::new); - blocks_blooms.blooms[location.index] = bloom; - batch.put_extras(&location.hash, &blocks_blooms); - } - - batch.put_extras(&header.number(), &hash) }, // it is a fork i if i > 1 => { @@ -567,13 +561,34 @@ impl BlockChain { batch.put_extras(&(start_number + index as BlockNumber), hash); } - // TODO: replace blooms from start_number to current + // get all blocks that are not part of canon chain (TODO: optimize it to one query) + let blooms: Vec = route.blocks.iter() + .skip(route.index) + .map(|hash| self.block(hash).unwrap()) + .map(|bytes| BlockView::new(&bytes).header_view().log_bloom()) + .collect(); + + // reset blooms chain head + modified_blooms = ChainFilter::new(self, self.bloom_index_size, self.bloom_levels) + .reset_chain_head(&blooms, start_number as usize, self.best_block_number() as usize); }, // route.blocks.len() could be 0 only if inserted block is best block, // and this is not possible at this stage _ => { unreachable!(); } }; + for (hash, blocks_blooms) in modified_blooms.into_iter() + .fold(HashMap::new(), | mut acc, (bloom_index, bloom) | { + { + let location = self.blocks_bloom_location(&bloom_index); + let mut blocks_blooms = acc.entry(location.hash).or_insert_with(BlocksBlooms::new); + blocks_blooms.blooms[location.index] = bloom; + } + acc + }) { + batch.put_extras(&hash, &blocks_blooms); + } + // this is new best block batch.put(b"best", &hash).unwrap(); From 3fcade9f6d9fef6bc024d31bb17dc9ff371773f4 Mon Sep 17 00:00:00 2001 From: debris Date: Sat, 13 Feb 2016 13:05:28 +0100 Subject: [PATCH 05/73] bloom possibilities in progress --- ethcore/src/client.rs | 19 +++++++++ rpc/src/v1/types/filter.rs | 79 ++++++++++++++++++++++++++++++++------ 2 files changed, 86 insertions(+), 12 deletions(-) diff --git a/ethcore/src/client.rs b/ethcore/src/client.rs index d9e461024..c7a5ec268 100644 --- a/ethcore/src/client.rs +++ b/ethcore/src/client.rs @@ -144,6 +144,9 @@ pub trait BlockChainClient : Sync + Send { fn best_block_header(&self) -> Bytes { self.block_header(BlockId::Hash(self.chain_info().best_block_hash)).unwrap() } + + /// Returns numbers of blocks containing given bloom. + fn blocks_with_bloom(&self, bloom: &H2048, from_block: BlockId, to_block: BlockId) -> Option>; } #[derive(Default, Clone, Debug, Eq, PartialEq)] @@ -358,6 +361,15 @@ impl Client { BlockId::Latest => Some(self.chain.read().unwrap().best_block_hash()) } } + + fn block_number(&self, id: BlockId) -> Option { + match id { + BlockId::Number(number) => Some(number), + BlockId::Hash(ref hash) => self.chain.read().unwrap().block_number(hash), + BlockId::Earliest => Some(0), + BlockId::Latest => Some(self.chain.read().unwrap().best_block_number()) + } + } } impl BlockChainClient for Client { @@ -450,6 +462,13 @@ impl BlockChainClient for Client { best_block_number: From::from(chain.best_block_number()) } } + + fn blocks_with_bloom(&self, bloom: &H2048, from_block: BlockId, to_block: BlockId) -> Option> { + match (self.block_number(from_block), self.block_number(to_block)) { + (Some(from), Some(to)) => Some(self.chain.read().unwrap().blocks_with_bloom(bloom, from, to)), + _ => None + } + } } impl MayPanic for Client { diff --git a/rpc/src/v1/types/filter.rs b/rpc/src/v1/types/filter.rs index 9b21cf8e7..cac1f7ef9 100644 --- a/rpc/src/v1/types/filter.rs +++ b/rpc/src/v1/types/filter.rs @@ -18,40 +18,95 @@ use serde::{Deserialize, Deserializer, Error}; use serde_json::value; use jsonrpc_core::Value; use util::hash::*; +use util::sha3::*; use v1::types::BlockNumber; #[derive(Debug, PartialEq)] -pub enum Topic { - Single(H256), - Multiple(Vec), +pub enum VariadicValue where T: Deserialize { + Single(T), + Multiple(Vec), Null } -impl Deserialize for Topic { - fn deserialize(deserializer: &mut D) -> Result +impl Deserialize for VariadicValue where T: Deserialize { + fn deserialize(deserializer: &mut D) -> Result, D::Error> where D: Deserializer { let v = try!(Value::deserialize(deserializer)); if v.is_null() { - return Ok(Topic::Null); + return Ok(VariadicValue::Null); } - Deserialize::deserialize(&mut value::Deserializer::new(v.clone())).map(Topic::Single) - .or_else(|_| Deserialize::deserialize(&mut value::Deserializer::new(v.clone())).map(Topic::Multiple)) + Deserialize::deserialize(&mut value::Deserializer::new(v.clone())).map(VariadicValue::Single) + .or_else(|_| Deserialize::deserialize(&mut value::Deserializer::new(v.clone())).map(VariadicValue::Multiple)) .map_err(|_| Error::syntax("")) // unreachable, but types must match } } +pub type FilterAddress = VariadicValue
; +pub type Topic = VariadicValue; + #[derive(Debug, PartialEq, Deserialize)] pub struct Filter { #[serde(rename="fromBlock")] pub from_block: Option, #[serde(rename="toBlock")] pub to_block: Option, - pub address: Option
, + pub address: Option, pub topics: Option> } +impl Filter { + /// Returns combinations of each of address topic. + pub fn bloom_possibilities(&self) -> Vec { + let blooms = match self.address { + Some(VariadicValue::Single(ref address)) => { + let mut bloom = H2048::new(); + bloom.shift_bloomed(&address.sha3()); + vec![bloom] + }, + Some(VariadicValue::Multiple(ref addresses)) => { + addresses.iter().map(|ref address| { + let mut bloom = H2048::new(); + bloom.shift_bloomed(&address.sha3()); + bloom + }).collect() + }, + _ => vec![H2048::new()] + }; + + match self.topics { + None => blooms, + Some(ref topics) => blooms.into_iter().map(|bloom| { + //for topic in topics { + //match topic { + //VariadicValue::Single => { + //bloom.shift_bloomed(&topic.sha3()); + //bloom + //} + //} + //} + }).collect() + } + //self.address.as_ref().map(|a| match *a { + //VariadicValue::Single(ref address) => { + //let mut bloom = H2048::new(); + //bloom.shift_bloomed(&address.sha3()); + //vec![bloom] + //}, + //VariadicValue::Multiple(ref addresses) => { + //addresses.iter().map(|ref address| { + //let mut bloom = H2048::new(); + //bloom.shift_bloomed(&address.sha3()); + //bloom + //}).collect() + //}, + //VariadicValue::Null => vec![H2048::new()] + //}.into_iter().map(|bloom| match self. { + //}).unwrap_or_else(Vec::new) + } +} + #[cfg(test)] mod tests { use serde_json; @@ -65,9 +120,9 @@ mod tests { let s = r#"["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b", null, ["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b", "0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc"]]"#; let deserialized: Vec = serde_json::from_str(s).unwrap(); assert_eq!(deserialized, vec![ - Topic::Single(H256::from_str("000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b").unwrap()), - Topic::Null, - Topic::Multiple(vec![ + VariadicValue::Single(H256::from_str("000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b").unwrap()), + VariadicValue::Null, + VariadicValue::Multiple(vec![ H256::from_str("000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b").unwrap(), H256::from_str("0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc").unwrap() ]) From bae268251896a22696ad0a765e1ae02850b204df Mon Sep 17 00:00:00 2001 From: debris Date: Mon, 15 Feb 2016 11:47:51 +0100 Subject: [PATCH 06/73] bloom possibilities --- rpc/src/v1/types/filter.rs | 113 ++++++++++++++++++++++++++++--------- 1 file changed, 86 insertions(+), 27 deletions(-) diff --git a/rpc/src/v1/types/filter.rs b/rpc/src/v1/types/filter.rs index cac1f7ef9..62b865bee 100644 --- a/rpc/src/v1/types/filter.rs +++ b/rpc/src/v1/types/filter.rs @@ -57,7 +57,7 @@ pub struct Filter { } impl Filter { - /// Returns combinations of each of address topic. + /// Returns combinations of each address and topic. pub fn bloom_possibilities(&self) -> Vec { let blooms = match self.address { Some(VariadicValue::Single(ref address)) => { @@ -77,33 +77,21 @@ impl Filter { match self.topics { None => blooms, - Some(ref topics) => blooms.into_iter().map(|bloom| { - //for topic in topics { - //match topic { - //VariadicValue::Single => { - //bloom.shift_bloomed(&topic.sha3()); - //bloom - //} - //} - //} - }).collect() + Some(ref topics) => topics.iter().fold(blooms, | bs, topic | match *topic { + VariadicValue::Null => bs, + VariadicValue::Single(ref topic) => bs.into_iter().map(|mut bloom| { + bloom.shift_bloomed(&topic.sha3()); + bloom + }).collect(), + VariadicValue::Multiple(ref topics) => bs.into_iter().map(|bloom| { + topics.into_iter().map(|topic| { + let mut b = bloom.clone(); + b.shift_bloomed(&topic.sha3()); + b + }).collect::>() + }).flat_map(|m| m).collect::>() + }) } - //self.address.as_ref().map(|a| match *a { - //VariadicValue::Single(ref address) => { - //let mut bloom = H2048::new(); - //bloom.shift_bloomed(&address.sha3()); - //vec![bloom] - //}, - //VariadicValue::Multiple(ref addresses) => { - //addresses.iter().map(|ref address| { - //let mut bloom = H2048::new(); - //bloom.shift_bloomed(&address.sha3()); - //bloom - //}).collect() - //}, - //VariadicValue::Null => vec![H2048::new()] - //}.into_iter().map(|bloom| match self. { - //}).unwrap_or_else(Vec::new) } } @@ -140,4 +128,75 @@ mod tests { topics: None }); } + + #[test] + fn test_bloom_possibilities_none() { + let none_filter = Filter { + from_block: None, + to_block: None, + address: None, + topics: None + }; + + let possibilities = none_filter.bloom_possibilities(); + assert_eq!(possibilities, vec![H2048::new()]); + } + + // block 399849 + #[test] + fn test_bloom_possibilities_single_address_and_topic() { + let filter = Filter { + from_block: None, + to_block: None, + address: Some(VariadicValue::Single(Address::from_str("b372018f3be9e171df0581136b59d2faf73a7d5d").unwrap())), + topics: Some(vec![VariadicValue::Single(H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap())]) + }; + + let possibilities = filter.bloom_possibilities(); + assert_eq!(possibilities, vec![H2048::from_str("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000004000000004000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()]); + } + + #[test] + fn test_bloom_possibilities_single_address_and_many_topics() { + let filter = Filter { + from_block: None, + to_block: None, + address: Some(VariadicValue::Single(Address::from_str("b372018f3be9e171df0581136b59d2faf73a7d5d").unwrap())), + topics: Some(vec![ + VariadicValue::Single(H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap()), + VariadicValue::Single(H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap()) + ]) + }; + + let possibilities = filter.bloom_possibilities(); + assert_eq!(possibilities, vec![H2048::from_str("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000004000000004000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()]); + } + + #[test] + fn test_bloom_possibilites_multiple_addresses_and_topics() { + let filter = Filter { + from_block: None, + to_block: None, + address: Some(VariadicValue::Multiple(vec![ + Address::from_str("b372018f3be9e171df0581136b59d2faf73a7d5d").unwrap(), + Address::from_str("b372018f3be9e171df0581136b59d2faf73a7d5d").unwrap() + ])), + topics: Some(vec![ + VariadicValue::Multiple(vec![ + H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap(), + H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap() + ]), + VariadicValue::Multiple(vec![ + H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap(), + H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap() + ]), + VariadicValue::Single(H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap()) + ]) + }; + + // number of possibilites should be equal 2 * 2 * 2 * 1 = 8 + let possibilities = filter.bloom_possibilities(); + assert_eq!(possibilities.len(), 8); + assert_eq!(possibilities[0], H2048::from_str("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000004000000004000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()); + } } From fada9bb1baf3f63553535a4f5e96b1cf1a79c65e Mon Sep 17 00:00:00 2001 From: debris Date: Mon, 15 Feb 2016 13:18:26 +0100 Subject: [PATCH 07/73] eth_getLogs implementation --- rpc/src/v1/impls/eth.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/rpc/src/v1/impls/eth.rs b/rpc/src/v1/impls/eth.rs index b595139f9..85afdd612 100644 --- a/rpc/src/v1/impls/eth.rs +++ b/rpc/src/v1/impls/eth.rs @@ -15,6 +15,7 @@ // along with Parity. If not, see . //! Eth rpc implementation. +use std::collections::HashSet; use std::sync::Arc; use ethsync::{EthSync, SyncState}; use jsonrpc_core::*; @@ -25,7 +26,7 @@ use ethcore::client::*; use ethcore::views::*; use ethcore::ethereum::denominations::shannon; use v1::traits::{Eth, EthFilter}; -use v1::types::{Block, BlockTransactions, BlockNumber, Bytes, SyncStatus, SyncInfo, Transaction, OptionalValue, Index}; +use v1::types::{Block, BlockTransactions, BlockNumber, Bytes, SyncStatus, SyncInfo, Transaction, OptionalValue, Index, Filter}; /// Eth rpc implementation. pub struct EthClient { @@ -197,6 +198,21 @@ impl Eth for EthClient { from_params::<(BlockNumber, Index)>(params) .and_then(|(number, index)| self.transaction(TransactionId::Location(number.into(), index.value()))) } + + fn logs(&self, params: Params) -> Result { + from_params::<(Filter,)>(params) + .and_then(|(filter,)| { + let possibilities = filter.bloom_possibilities(); + let from = filter.from_block.map_or_else(|| BlockId::Earliest, Into::into); + let to = filter.to_block.map_or_else(|| BlockId::Latest, Into::into); + let blocks: HashSet = possibilities.iter() + .map(|bloom| self.client.blocks_with_bloom(bloom, from.clone(), to.clone())) + .filter_map(|m| m) + .flat_map(|m| m) + .collect(); + to_value(&blocks) + }) + } } From 8b28f627caebbc214363886b9e8f1315ea87f2ec Mon Sep 17 00:00:00 2001 From: debris Date: Mon, 15 Feb 2016 13:39:58 +0100 Subject: [PATCH 08/73] fixed order of eth_getLogs --- rpc/src/v1/impls/eth.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rpc/src/v1/impls/eth.rs b/rpc/src/v1/impls/eth.rs index 85afdd612..bbeb475dc 100644 --- a/rpc/src/v1/impls/eth.rs +++ b/rpc/src/v1/impls/eth.rs @@ -205,11 +205,14 @@ impl Eth for EthClient { let possibilities = filter.bloom_possibilities(); let from = filter.from_block.map_or_else(|| BlockId::Earliest, Into::into); let to = filter.to_block.map_or_else(|| BlockId::Latest, Into::into); - let blocks: HashSet = possibilities.iter() + let mut blocks: Vec = possibilities.iter() .map(|bloom| self.client.blocks_with_bloom(bloom, from.clone(), to.clone())) .filter_map(|m| m) .flat_map(|m| m) + .collect::>() + .into_iter() .collect(); + blocks.sort(); to_value(&blocks) }) } From 0fab166fbae75a46822e33f443810229313fd3cb Mon Sep 17 00:00:00 2001 From: debris Date: Mon, 15 Feb 2016 15:22:13 +0100 Subject: [PATCH 09/73] refactored chainfilter.rs, split out indexer --- ethcore/src/chainfilter/bloomindex.rs | 40 +++ ethcore/src/{ => chainfilter}/chainfilter.rs | 287 ++----------------- ethcore/src/chainfilter/indexer.rs | 154 ++++++++++ ethcore/src/chainfilter/mod.rs | 35 +++ ethcore/src/chainfilter/tests.rs | 95 ++++++ 5 files changed, 351 insertions(+), 260 deletions(-) create mode 100644 ethcore/src/chainfilter/bloomindex.rs rename ethcore/src/{ => chainfilter}/chainfilter.rs (51%) create mode 100644 ethcore/src/chainfilter/indexer.rs create mode 100644 ethcore/src/chainfilter/mod.rs create mode 100644 ethcore/src/chainfilter/tests.rs diff --git a/ethcore/src/chainfilter/bloomindex.rs b/ethcore/src/chainfilter/bloomindex.rs new file mode 100644 index 000000000..22785495e --- /dev/null +++ b/ethcore/src/chainfilter/bloomindex.rs @@ -0,0 +1,40 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Represents bloom index in cache + +/// Represents bloom index in cache +/// +/// On cache level 0, every block bloom is represented by different index. +/// On higher cache levels, multiple block blooms are represented by one +/// index. Their `BloomIndex` can be created from block number and given level. +#[derive(Eq, PartialEq, Hash, Clone, Debug)] +pub struct BloomIndex { + /// Bloom level + pub level: u8, + /// Filter Index + pub index: usize, +} + +impl BloomIndex { + /// Default constructor for `BloomIndex` + pub fn new(level: u8, index: usize) -> BloomIndex { + BloomIndex { + level: level, + index: index, + } + } +} diff --git a/ethcore/src/chainfilter.rs b/ethcore/src/chainfilter/chainfilter.rs similarity index 51% rename from ethcore/src/chainfilter.rs rename to ethcore/src/chainfilter/chainfilter.rs index 95bac64e3..edfe85d67 100644 --- a/ethcore/src/chainfilter.rs +++ b/ethcore/src/chainfilter/chainfilter.rs @@ -58,70 +58,15 @@ use std::collections::{HashMap}; use util::hash::*; use util::sha3::*; - -/// Represents bloom index in cache -/// -/// On cache level 0, every block bloom is represented by different index. -/// On higher cache levels, multiple block blooms are represented by one -/// index. Their `BloomIndex` can be created from block number and given level. -#[derive(Eq, PartialEq, Hash, Clone, Debug)] -pub struct BloomIndex { - /// Bloom level - pub level: u8, - /// Filter Index - pub index: usize, -} - -impl BloomIndex { - /// Default constructor for `BloomIndex` - pub fn new(level: u8, index: usize) -> BloomIndex { - BloomIndex { - level: level, - index: index, - } - } -} - -/// Types implementing this trait should provide read access for bloom filters database. -pub trait FilterDataSource { - /// returns reference to log at given position if it exists - fn bloom_at_index(&self, index: &BloomIndex) -> Option; -} - -/// In memory cache for blooms. -/// -/// Stores all blooms in HashMap, which indexes them by `BloomIndex`. -pub struct MemoryCache { - blooms: HashMap, -} - -impl MemoryCache { - /// Default constructor for MemoryCache - pub fn new() -> MemoryCache { - MemoryCache { blooms: HashMap::new() } - } - - /// inserts all blooms into cache - /// - /// if bloom at given index already exists, overwrites it - pub fn insert_blooms(&mut self, blooms: HashMap) { - self.blooms.extend(blooms); - } -} - -impl FilterDataSource for MemoryCache { - fn bloom_at_index(&self, index: &BloomIndex) -> Option { - self.blooms.get(index).cloned() - } -} +use chainfilter::{BloomIndex, FilterDataSource}; +use chainfilter::indexer::Indexer; /// Should be used for search operations on blockchain. pub struct ChainFilter<'a, D> where D: FilterDataSource + 'a { data_source: &'a D, - index_size: usize, - level_sizes: Vec, + indexer: Indexer } impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource @@ -130,73 +75,15 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource /// /// Borrows `FilterDataSource` for reading. pub fn new(data_source: &'a D, index_size: usize, levels: u8) -> Self { - if levels == 0 { - panic!("ChainFilter requires at least 1 level"); - } - - let mut filter = ChainFilter { + ChainFilter { data_source: data_source, - index_size: index_size, - // 0 level has always a size of 1 - level_sizes: vec![1] - }; - - // cache level sizes, so we do not have to calculate them all the time - // eg. if levels == 3, index_size = 16 - // level_sizes = [1, 16, 256] - let additional: Vec = (1..).into_iter() - .scan(1, |acc, _| { - *acc = *acc * index_size; - Some(*acc) - }) - .take(levels as usize - 1) - .collect(); - filter.level_sizes.extend(additional); - - filter - } - - /// unsafely get level size - fn level_size(&self, level: u8) -> usize { - self.level_sizes[level as usize] - } - - /// converts block number and level to `BloomIndex` - fn bloom_index(&self, block_number: usize, level: u8) -> BloomIndex { - BloomIndex { - level: level, - index: block_number / self.level_size(level), + indexer: Indexer::new(index_size, levels) } } - /// return bloom which are dependencies for given index - /// - /// bloom indexes are ordered from lowest to highest - fn lower_level_bloom_indexes(&self, index: &BloomIndex) -> Vec { - // this is the lowest level - if index.level == 0 { - return vec![]; - } - - let new_level = index.level - 1; - let offset = self.index_size * index.index; - - (0..self.index_size).map(|i| BloomIndex::new(new_level, offset + i)).collect() - } - - /// return number of levels - fn levels(&self) -> u8 { - self.level_sizes.len() as u8 - } - - /// returns max filter level - fn max_level(&self) -> u8 { - self.level_sizes.len() as u8 - 1 - } - /// internal function which does bloom search recursively fn blocks(&self, bloom: &H2048, from_block: usize, to_block: usize, level: u8, offset: usize) -> Option> { - let index = self.bloom_index(offset, level); + let index = self.indexer.bloom_index(offset, level); match self.data_source.bloom_at_index(&index) { None => return None, @@ -213,10 +100,10 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource } }; - let level_size = self.level_size(level - 1); - let from_index = self.bloom_index(from_block, level - 1); - let to_index = self.bloom_index(to_block, level - 1); - let res: Vec = self.lower_level_bloom_indexes(&index).into_iter() + let level_size = self.indexer.level_size(level - 1); + let from_index = self.indexer.bloom_index(from_block, level - 1); + let to_index = self.indexer.bloom_index(to_block, level - 1); + let res: Vec = self.indexer.lower_level_bloom_indexes(&index).into_iter() // chose only blooms in range .filter(|li| li.index >= from_index.index && li.index <= to_index.index) // map them to offsets @@ -235,8 +122,8 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource pub fn add_bloom(&self, bloom: &H2048, block_number: usize) -> HashMap { let mut result: HashMap = HashMap::new(); - for level in 0..self.levels() { - let bloom_index = self.bloom_index(block_number, level); + for level in 0..self.indexer.levels() { + let bloom_index = self.indexer.bloom_index(block_number, level); let new_bloom = match self.data_source.bloom_at_index(&bloom_index) { Some(old_bloom) => old_bloom | bloom.clone(), None => bloom.clone(), @@ -252,9 +139,9 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource pub fn add_blooms(&self, blooms: &[H2048], block_number: usize) -> HashMap { let mut result: HashMap = HashMap::new(); - for level in 0..self.levels() { + for level in 0..self.indexer.levels() { for i in 0..blooms.len() { - let bloom_index = self.bloom_index(block_number + i, level); + let bloom_index = self.indexer.bloom_index(block_number + i, level); let is_new_bloom = match result.get_mut(&bloom_index) { // it was already modified @@ -283,13 +170,13 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource pub fn reset_bloom(&self, bloom: &H2048, block_number: usize) -> HashMap { let mut result: HashMap = HashMap::new(); - let mut reset_index = self.bloom_index(block_number, 0); + let mut reset_index = self.indexer.bloom_index(block_number, 0); result.insert(reset_index.clone(), bloom.clone()); - for level in 1..self.levels() { - let index = self.bloom_index(block_number, level); + for level in 1..self.indexer.levels() { + let index = self.indexer.bloom_index(block_number, level); // get all bloom indexes that were used to construct this bloom - let lower_indexes = self.lower_level_bloom_indexes(&index); + let lower_indexes = self.indexer.lower_level_bloom_indexes(&index); let new_bloom = lower_indexes.into_iter() // skip reseted one .filter(|li| li != &reset_index) @@ -313,23 +200,23 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource // insert all new blooms at level 0 for (i, bloom) in blooms.iter().enumerate() { - result.insert(self.bloom_index(block_number + i, 0), bloom.clone()); + result.insert(self.indexer.bloom_index(block_number + i, 0), bloom.clone()); } // reset the rest of blooms for reset_number in block_number + blooms.len()..old_highest_block { - result.insert(self.bloom_index(reset_number, 0), H2048::new()); + result.insert(self.indexer.bloom_index(reset_number, 0), H2048::new()); } - for level in 1..self.levels() { + for level in 1..self.indexer.levels() { for i in 0..blooms.len() { - let index = self.bloom_index(block_number + i, level); + let index = self.indexer.bloom_index(block_number + i, level); let new_bloom = { // use new blooms before db blooms where necessary let bloom_at = | index | { result.get(&index).cloned().or_else(|| self.data_source.bloom_at_index(&index)) }; - self.lower_level_bloom_indexes(&index) + self.indexer.lower_level_bloom_indexes(&index) .into_iter() // get blooms .map(bloom_at) @@ -369,10 +256,10 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource pub fn blocks_with_bloom(&self, bloom: &H2048, from_block: usize, to_block: usize) -> Vec { let mut result = vec![]; // lets start from highest level - let max_level = self.max_level(); - let level_size = self.level_size(max_level); - let from_index = self.bloom_index(from_block, max_level); - let to_index = self.bloom_index(to_block, max_level); + let max_level = self.indexer.max_level(); + let level_size = self.indexer.level_size(max_level); + let from_index = self.indexer.bloom_index(from_block, max_level); + let to_index = self.indexer.bloom_index(to_block, max_level); for index in from_index.index..to_index.index + 1 { // offset will be used to calculate where we are right now @@ -387,123 +274,3 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource result } } - -#[cfg(test)] -mod tests { - use std::str::FromStr; - use util::hash::*; - use chainfilter::*; - use util::sha3::*; - - #[test] - fn test_level_size() { - let cache = MemoryCache::new(); - let filter = ChainFilter::new(&cache, 16, 3); - assert_eq!(filter.level_size(0), 1); - assert_eq!(filter.level_size(1), 16); - assert_eq!(filter.level_size(2), 256); - } - - #[test] - fn test_bloom_index() { - let cache = MemoryCache::new(); - let filter = ChainFilter::new(&cache, 16, 3); - - let bi0 = filter.bloom_index(0, 0); - assert_eq!(bi0.level, 0); - assert_eq!(bi0.index, 0); - - let bi1 = filter.bloom_index(1, 0); - assert_eq!(bi1.level, 0); - assert_eq!(bi1.index, 1); - - let bi2 = filter.bloom_index(2, 0); - assert_eq!(bi2.level, 0); - assert_eq!(bi2.index, 2); - - let bi3 = filter.bloom_index(3, 1); - assert_eq!(bi3.level, 1); - assert_eq!(bi3.index, 0); - - let bi4 = filter.bloom_index(15, 1); - assert_eq!(bi4.level, 1); - assert_eq!(bi4.index, 0); - - let bi5 = filter.bloom_index(16, 1); - assert_eq!(bi5.level, 1); - assert_eq!(bi5.index, 1); - - let bi6 = filter.bloom_index(255, 2); - assert_eq!(bi6.level, 2); - assert_eq!(bi6.index, 0); - - let bi7 = filter.bloom_index(256, 2); - assert_eq!(bi7.level, 2); - assert_eq!(bi7.index, 1); - } - - #[test] - fn test_lower_level_bloom_indexes() { - let cache = MemoryCache::new(); - let filter = ChainFilter::new(&cache, 16, 3); - - let bi = filter.bloom_index(256, 2); - assert_eq!(bi.level, 2); - assert_eq!(bi.index, 1); - - let mut ebis = vec![]; - for i in 16..32 { - ebis.push(BloomIndex::new(1, i)); - } - - let bis = filter.lower_level_bloom_indexes(&bi); - assert_eq!(ebis, bis); - } - - #[test] - fn test_topic_basic_search() { - let index_size = 16; - let bloom_levels = 3; - - let mut cache = MemoryCache::new(); - let topic = H256::from_str("8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dba").unwrap(); - - let modified_blooms = { - let filter = ChainFilter::new(&cache, index_size, bloom_levels); - let block_number = 23; - let mut bloom = H2048::new(); - bloom.shift_bloomed(&topic.sha3()); - filter.add_bloom(&bloom, block_number) - }; - - // number of modified blooms should always be equal number of levels - assert_eq!(modified_blooms.len(), bloom_levels as usize); - cache.insert_blooms(modified_blooms); - - { - let filter = ChainFilter::new(&cache, index_size, bloom_levels); - let blocks = filter.blocks_with_topic(&topic, 0, 100); - assert_eq!(blocks.len(), 1); - assert_eq!(blocks[0], 23); - } - - { - let filter = ChainFilter::new(&cache, index_size, bloom_levels); - let blocks = filter.blocks_with_topic(&topic, 0, 23); - assert_eq!(blocks.len(), 0); - } - - { - let filter = ChainFilter::new(&cache, index_size, bloom_levels); - let blocks = filter.blocks_with_topic(&topic, 23, 24); - assert_eq!(blocks.len(), 1); - assert_eq!(blocks[0], 23); - } - - { - let filter = ChainFilter::new(&cache, index_size, bloom_levels); - let blocks = filter.blocks_with_topic(&topic, 24, 100); - assert_eq!(blocks.len(), 0); - } - } -} diff --git a/ethcore/src/chainfilter/indexer.rs b/ethcore/src/chainfilter/indexer.rs new file mode 100644 index 000000000..141a4e7d3 --- /dev/null +++ b/ethcore/src/chainfilter/indexer.rs @@ -0,0 +1,154 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Simplifies working with bloom indexes. + +use chainfilter::BloomIndex; + +/// Simplifies working with bloom indexes. +pub struct Indexer { + index_size: usize, + level_sizes: Vec +} + +impl Indexer { + /// Creates new indexer. + pub fn new(index_size: usize, levels: u8) -> Self { + if levels == 0 { + panic!("Indexer requires at least 1 level."); + } + + let mut level_sizes = vec![1]; + level_sizes.extend_from_slice(&(1..).into_iter() + .scan(1, |acc, _| { + *acc = *acc * index_size; + Some(*acc) + }) + .take(levels as usize - 1) + .collect::>()); + + Indexer { + index_size: index_size, + level_sizes: level_sizes, + } + } + + /// unsafely get level size. + pub fn level_size(&self, level: u8) -> usize { + self.level_sizes[level as usize] + } + + /// Converts block number and level to `BloomIndex`. + pub fn bloom_index(&self, block_number: usize, level: u8) -> BloomIndex { + BloomIndex { + level: level, + index: block_number / self.level_size(level), + } + } + + /// Return bloom which are dependencies for given index. + /// + /// Bloom indexes are ordered from lowest to highest. + pub fn lower_level_bloom_indexes(&self, index: &BloomIndex) -> Vec { + // this is the lowest level + if index.level == 0 { + return vec![]; + } + + let new_level = index.level - 1; + let offset = self.index_size * index.index; + + (0..self.index_size).map(|i| BloomIndex::new(new_level, offset + i)).collect() + } + + /// Return number of levels. + pub fn levels(&self) -> u8 { + self.level_sizes.len() as u8 + } + + /// Returns max indexer level. + pub fn max_level(&self) -> u8 { + self.level_sizes.len() as u8 - 1 + } +} + +#[cfg(test)] +mod tests { + use chainfilter::BloomIndex; + use chainfilter::indexer::Indexer; + + #[test] + fn test_level_size() { + let indexer = Indexer::new(16, 3); + assert_eq!(indexer.level_size(0), 1); + assert_eq!(indexer.level_size(1), 16); + assert_eq!(indexer.level_size(2), 256); + } + + #[test] + fn test_bloom_index() { + let indexer = Indexer::new(16, 3); + + let bi0 = indexer.bloom_index(0, 0); + assert_eq!(bi0.level, 0); + assert_eq!(bi0.index, 0); + + let bi1 = indexer.bloom_index(1, 0); + assert_eq!(bi1.level, 0); + assert_eq!(bi1.index, 1); + + let bi2 = indexer.bloom_index(2, 0); + assert_eq!(bi2.level, 0); + assert_eq!(bi2.index, 2); + + let bi3 = indexer.bloom_index(3, 1); + assert_eq!(bi3.level, 1); + assert_eq!(bi3.index, 0); + + let bi4 = indexer.bloom_index(15, 1); + assert_eq!(bi4.level, 1); + assert_eq!(bi4.index, 0); + + let bi5 = indexer.bloom_index(16, 1); + assert_eq!(bi5.level, 1); + assert_eq!(bi5.index, 1); + + let bi6 = indexer.bloom_index(255, 2); + assert_eq!(bi6.level, 2); + assert_eq!(bi6.index, 0); + + let bi7 = indexer.bloom_index(256, 2); + assert_eq!(bi7.level, 2); + assert_eq!(bi7.index, 1); + } + + #[test] + fn test_lower_level_bloom_indexes() { + let indexer = Indexer::new(16, 3); + + let bi = indexer.bloom_index(256, 2); + assert_eq!(bi.level, 2); + assert_eq!(bi.index, 1); + + let mut ebis = vec![]; + for i in 16..32 { + ebis.push(BloomIndex::new(1, i)); + } + + let bis = indexer.lower_level_bloom_indexes(&bi); + assert_eq!(ebis, bis); + } +} diff --git a/ethcore/src/chainfilter/mod.rs b/ethcore/src/chainfilter/mod.rs new file mode 100644 index 000000000..d85fc20f9 --- /dev/null +++ b/ethcore/src/chainfilter/mod.rs @@ -0,0 +1,35 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Multilevel blockchain bloom filter. + +mod bloomindex; +mod chainfilter; +mod indexer; + +#[cfg(test)] +mod tests; + +pub use self::bloomindex::BloomIndex; +pub use self::chainfilter::ChainFilter; +use util::hash::H2048; + +/// Types implementing this trait provide read access for bloom filters database. +pub trait FilterDataSource { + /// returns reference to log at given position if it exists + fn bloom_at_index(&self, index: &BloomIndex) -> Option; +} + diff --git a/ethcore/src/chainfilter/tests.rs b/ethcore/src/chainfilter/tests.rs new file mode 100644 index 000000000..2c1f6e298 --- /dev/null +++ b/ethcore/src/chainfilter/tests.rs @@ -0,0 +1,95 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use std::collections::HashMap; +use std::str::FromStr; +use util::hash::*; +use util::sha3::*; +use chainfilter::{BloomIndex, FilterDataSource, ChainFilter}; + +/// In memory cache for blooms. +/// +/// Stores all blooms in HashMap, which indexes them by `BloomIndex`. +pub struct MemoryCache { + blooms: HashMap, +} + +impl MemoryCache { + /// Default constructor for MemoryCache + pub fn new() -> MemoryCache { + MemoryCache { blooms: HashMap::new() } + } + + /// inserts all blooms into cache + /// + /// if bloom at given index already exists, overwrites it + pub fn insert_blooms(&mut self, blooms: HashMap) { + self.blooms.extend(blooms); + } +} + +impl FilterDataSource for MemoryCache { + fn bloom_at_index(&self, index: &BloomIndex) -> Option { + self.blooms.get(index).cloned() + } +} + +#[test] +fn test_topic_basic_search() { + let index_size = 16; + let bloom_levels = 3; + + let mut cache = MemoryCache::new(); + let topic = H256::from_str("8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dba").unwrap(); + + let modified_blooms = { + let filter = ChainFilter::new(&cache, index_size, bloom_levels); + let block_number = 23; + let mut bloom = H2048::new(); + bloom.shift_bloomed(&topic.sha3()); + filter.add_bloom(&bloom, block_number) + }; + + // number of modified blooms should always be equal number of levels + assert_eq!(modified_blooms.len(), bloom_levels as usize); + cache.insert_blooms(modified_blooms); + + { + let filter = ChainFilter::new(&cache, index_size, bloom_levels); + let blocks = filter.blocks_with_topic(&topic, 0, 100); + assert_eq!(blocks.len(), 1); + assert_eq!(blocks[0], 23); + } + + { + let filter = ChainFilter::new(&cache, index_size, bloom_levels); + let blocks = filter.blocks_with_topic(&topic, 0, 23); + assert_eq!(blocks.len(), 0); + } + + { + let filter = ChainFilter::new(&cache, index_size, bloom_levels); + let blocks = filter.blocks_with_topic(&topic, 23, 24); + assert_eq!(blocks.len(), 1); + assert_eq!(blocks[0], 23); + } + + { + let filter = ChainFilter::new(&cache, index_size, bloom_levels); + let blocks = filter.blocks_with_topic(&topic, 24, 100); + assert_eq!(blocks.len(), 0); + } +} From 552fe1fb4b3cc80742e1cf01a77e12501d25ce57 Mon Sep 17 00:00:00 2001 From: debris Date: Mon, 15 Feb 2016 15:42:43 +0100 Subject: [PATCH 10/73] removed unused functions and warnings --- ethcore/src/blockchain.rs | 7 +- ethcore/src/chainfilter/chainfilter.rs | 89 ++------------------------ ethcore/src/chainfilter/tests.rs | 18 ++++-- ethcore/src/verification.rs | 2 +- 4 files changed, 19 insertions(+), 97 deletions(-) diff --git a/ethcore/src/blockchain.rs b/ethcore/src/blockchain.rs index ef6090a53..68d677703 100644 --- a/ethcore/src/blockchain.rs +++ b/ethcore/src/blockchain.rs @@ -484,7 +484,7 @@ impl BlockChain { /// Transforms block into WriteBatch that may be written into database /// Additionally, if it's new best block it returns new best block object. - fn block_to_extras_insert_batch(&self, bytes: &[u8], receipts: &[Receipt]) -> (WriteBatch, Option, BlockDetails) { + fn block_to_extras_insert_batch(&self, bytes: &[u8], _receipts: &[Receipt]) -> (WriteBatch, Option, BlockDetails) { // create views onto rlp let block = BlockView::new(bytes); let header = block.header_view(); @@ -616,11 +616,6 @@ impl BlockChain { self.best_block.read().unwrap().total_difficulty } - /// Get the transactions' log blooms of a block. - fn log_blooms(&self, hash: &H256) -> Option { - self.query_extras(hash, &self.block_logs) - } - /// Get block blooms. fn blocks_blooms(&self, hash: &H256) -> Option { self.query_extras(hash, &self.blocks_blooms) diff --git a/ethcore/src/chainfilter/chainfilter.rs b/ethcore/src/chainfilter/chainfilter.rs index edfe85d67..ab27f77ff 100644 --- a/ethcore/src/chainfilter/chainfilter.rs +++ b/ethcore/src/chainfilter/chainfilter.rs @@ -57,7 +57,6 @@ //! use std::collections::{HashMap}; use util::hash::*; -use util::sha3::*; use chainfilter::{BloomIndex, FilterDataSource}; use chainfilter::indexer::Indexer; @@ -89,10 +88,12 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource None => return None, Some(level_bloom) => match level { // if we are on the lowest level - // take the value, exclude to_block - 0 if offset < to_block => return Some(vec![offset]), - // return None if it is is equal to to_block - 0 => return None, + 0 => return match offset < to_block { + // take the value if its smaller than to_block + true => Some(vec![offset]), + // return None if it is is equal to to_block + false => None + }, // return None if current level doesnt contain given bloom _ if !level_bloom.contains(bloom) => return None, // continue processing && go down @@ -135,65 +136,6 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource result } - /// Adds new blooms starting from block number. - pub fn add_blooms(&self, blooms: &[H2048], block_number: usize) -> HashMap { - let mut result: HashMap = HashMap::new(); - - for level in 0..self.indexer.levels() { - for i in 0..blooms.len() { - let bloom_index = self.indexer.bloom_index(block_number + i, level); - let is_new_bloom = match result.get_mut(&bloom_index) { - - // it was already modified - Some(to_shift) => { - *to_shift = &blooms[i] | to_shift; - false - } - None => true, - }; - - // it hasn't been modified yet - if is_new_bloom { - let new_bloom = match self.data_source.bloom_at_index(&bloom_index) { - Some(ref old_bloom) => old_bloom | &blooms[i], - None => blooms[i].clone(), - }; - result.insert(bloom_index, new_bloom); - } - } - } - - result - } - - /// Resets bloom at level 0 and forces rebuild on higher levels. - pub fn reset_bloom(&self, bloom: &H2048, block_number: usize) -> HashMap { - let mut result: HashMap = HashMap::new(); - - let mut reset_index = self.indexer.bloom_index(block_number, 0); - result.insert(reset_index.clone(), bloom.clone()); - - for level in 1..self.indexer.levels() { - let index = self.indexer.bloom_index(block_number, level); - // get all bloom indexes that were used to construct this bloom - let lower_indexes = self.indexer.lower_level_bloom_indexes(&index); - let new_bloom = lower_indexes.into_iter() - // skip reseted one - .filter(|li| li != &reset_index) - // get blooms for these indexes - .map(|li| self.data_source.bloom_at_index(&li)) - // filter existing ones - .filter_map(|b| b) - // BitOr all of them - .fold(H2048::new(), |acc, bloom| acc | bloom); - - reset_index = index.clone(); - result.insert(index, &new_bloom | bloom); - } - - result - } - /// Resets blooms at level 0 and forces rebuild on higher levels. pub fn reset_chain_head(&self, blooms: &[H2048], block_number: usize, old_highest_block: usize) -> HashMap { let mut result: HashMap = HashMap::new(); @@ -233,25 +175,6 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource result } - /// Sets lowest level bloom to 0 and forces rebuild on higher levels. - pub fn clear_bloom(&self, block_number: usize) -> HashMap { - self.reset_bloom(&H2048::new(), block_number) - } - - /// Returns numbers of blocks that may contain Address. - pub fn blocks_with_address(&self, address: &Address, from_block: usize, to_block: usize) -> Vec { - let mut bloom = H2048::new(); - bloom.shift_bloomed(&address.sha3()); - self.blocks_with_bloom(&bloom, from_block, to_block) - } - - /// Returns numbers of blocks that may contain Topic. - pub fn blocks_with_topic(&self, topic: &H256, from_block: usize, to_block: usize) -> Vec { - let mut bloom = H2048::new(); - bloom.shift_bloomed(&topic.sha3()); - self.blocks_with_bloom(&bloom, from_block, to_block) - } - /// Returns numbers of blocks that may log bloom. pub fn blocks_with_bloom(&self, bloom: &H2048, from_block: usize, to_block: usize) -> Vec { let mut result = vec![]; diff --git a/ethcore/src/chainfilter/tests.rs b/ethcore/src/chainfilter/tests.rs index 2c1f6e298..b511365cf 100644 --- a/ethcore/src/chainfilter/tests.rs +++ b/ethcore/src/chainfilter/tests.rs @@ -47,6 +47,12 @@ impl FilterDataSource for MemoryCache { } } +fn topic_to_bloom(topic: &H256) -> H2048 { + let mut bloom = H2048::new(); + bloom.shift_bloomed(&topic.sha3()); + bloom +} + #[test] fn test_topic_basic_search() { let index_size = 16; @@ -58,9 +64,7 @@ fn test_topic_basic_search() { let modified_blooms = { let filter = ChainFilter::new(&cache, index_size, bloom_levels); let block_number = 23; - let mut bloom = H2048::new(); - bloom.shift_bloomed(&topic.sha3()); - filter.add_bloom(&bloom, block_number) + filter.add_bloom(&topic_to_bloom(&topic), block_number) }; // number of modified blooms should always be equal number of levels @@ -69,27 +73,27 @@ fn test_topic_basic_search() { { let filter = ChainFilter::new(&cache, index_size, bloom_levels); - let blocks = filter.blocks_with_topic(&topic, 0, 100); + let blocks = filter.blocks_with_bloom(&topic_to_bloom(&topic), 0, 100); assert_eq!(blocks.len(), 1); assert_eq!(blocks[0], 23); } { let filter = ChainFilter::new(&cache, index_size, bloom_levels); - let blocks = filter.blocks_with_topic(&topic, 0, 23); + let blocks = filter.blocks_with_bloom(&topic_to_bloom(&topic), 0, 23); assert_eq!(blocks.len(), 0); } { let filter = ChainFilter::new(&cache, index_size, bloom_levels); - let blocks = filter.blocks_with_topic(&topic, 23, 24); + let blocks = filter.blocks_with_bloom(&topic_to_bloom(&topic), 23, 24); assert_eq!(blocks.len(), 1); assert_eq!(blocks[0], 23); } { let filter = ChainFilter::new(&cache, index_size, bloom_levels); - let blocks = filter.blocks_with_topic(&topic, 24, 100); + let blocks = filter.blocks_with_bloom(&topic_to_bloom(&topic), 24, 100); assert_eq!(blocks.len(), 0); } } diff --git a/ethcore/src/verification.rs b/ethcore/src/verification.rs index 0b234b00d..548150f09 100644 --- a/ethcore/src/verification.rs +++ b/ethcore/src/verification.rs @@ -303,7 +303,7 @@ mod tests { self.numbers.get(&index).cloned() } - fn blocks_with_bloom(&self, bloom: &H2048, from_block: BlockNumber, to_block: BlockNumber) -> Vec { + fn blocks_with_bloom(&self, _bloom: &H2048, _from_block: BlockNumber, _to_block: BlockNumber) -> Vec { unimplemented!() } } From a9e387523028421af0ec1b39212caeb16d2cd394 Mon Sep 17 00:00:00 2001 From: debris Date: Mon, 15 Feb 2016 17:47:01 +0100 Subject: [PATCH 11/73] fixed ethsync tests --- sync/src/tests/helpers.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sync/src/tests/helpers.rs b/sync/src/tests/helpers.rs index c561b65a3..c4673e8e3 100644 --- a/sync/src/tests/helpers.rs +++ b/sync/src/tests/helpers.rs @@ -111,6 +111,10 @@ impl BlockChainClient for TestBlockChainClient { unimplemented!(); } + fn blocks_with_bloom(&self, _bloom: &H2048, _from_block: BlockId, _to_block: BlockId) -> Option> { + unimplemented!(); + } + fn block_header(&self, id: BlockId) -> Option { self.block_hash(id).and_then(|hash| self.blocks.read().unwrap().get(&hash).map(|r| Rlp::new(r).at(0).as_raw().to_vec())) } From 6d91852c5514b4dffaa84162340181b09736b405 Mon Sep 17 00:00:00 2001 From: debris Date: Mon, 15 Feb 2016 21:32:09 +0100 Subject: [PATCH 12/73] test chainfilter on realdata --- ethcore/src/chainfilter/blooms.txt | 739 ++++++++++++++++++++ ethcore/src/chainfilter/logs.txt | 1013 ++++++++++++++++++++++++++++ ethcore/src/chainfilter/tests.rs | 99 ++- 3 files changed, 1844 insertions(+), 7 deletions(-) create mode 100644 ethcore/src/chainfilter/blooms.txt create mode 100644 ethcore/src/chainfilter/logs.txt diff --git a/ethcore/src/chainfilter/blooms.txt b/ethcore/src/chainfilter/blooms.txt new file mode 100644 index 000000000..204186ec3 --- /dev/null +++ b/ethcore/src/chainfilter/blooms.txt @@ -0,0 +1,739 @@ +300054 0x00000000000000000000000000000000000000000000020000001000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +300059 0x00000020000000000000000000000000000000000000000002000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000000000000000002000 +300221 0x00000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002020000000000000000000000000000000000000000000008000000001000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +301826 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +303166 0x00000000000000000000000000000000000000001000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000808000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000020000000001000000000000000000000000000000000000000000000000000000000000000000 +303345 0x00000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002020000000000000000000000000000000000000000000008000000001000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +303379 0x00000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000800000000000000001000000000000000000000000000000000000000000000000000000000000000000020000000000000000000800000000000000000000000000000080000000006000008000000000000000000080000000000000000000000000000000000000000001000000000000000000000008000000000400000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000800000000000000000000000000000000000002004000000000000 +303388 0x00000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000800000040000000001000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000080000000006001008000000000000008000080000000000000000000000000000000000000000001000000000000000000000008000000000400000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000800000000000000040000000000000000000002004000000000000 +303621 0x00000000000000000000008000000000200000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000080000000000000000000000080000000001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000 +303670 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000400200000000000000 +303674 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000040000000000000000000000000000000000000000000000000000000000000000000000001000000000000200000000000000 +303683 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000400200000000000000 +303689 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000000400000000000000000000000000000000000000000000000000000000001000000000040200000000000000 +303692 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000000000000000000000000000000000000001000000000040200000000000000 +303716 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000040000000000000000000000000000000000000000000000000000000000000000000000001000000000000200000000000000 +303717 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000040000000000000000000000000000000000000000000000000000000000000000000000001000000000000200000000000000 +303748 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000400200000000000000 +303756 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000000400000000000000000000000000000000000000000000000000000000001000000000040200000000000000 +303758 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000000000000000000000000000000000000001000000000040200000000000000 +304090 0x00000000000000000000000000000000100000000000000000000000000000000000000000000000000200000000000000800000000000000000000000040000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000003000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000 +304095 0x04000000000000000000000000000000100000000000000000000000000000000000000000000000000200000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000008000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000 +304107 0x00000000000000000000000000000000100000000000000000000000000000000000000000000000000200000000000000800000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008800000000000000000400000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +304113 0x00000000000000000000000000000000100000000000000000000000000000000000000000000000000200000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000002000000000000000000000000000000000000000000000000003008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +304222 0x00000000000000000000000000000000100000000000000000000000000000000000000000000000000200000000000000800000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000800000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +304245 0x00000000000000000000000000000000100000000000000000000000000000000000000000000000000200000000000000800000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000080000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +304247 0x000000080000000000000000000000800000020000000000000000000000000000000000000000000202000000000000008000004004000000000000000000000000000000000000000000000200000000200000000080000000000000000000000004000000000000000000000000000000001040000000000000000000000000000004000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000c0002000000000000000000000000000000001000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +304312 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000020000000000002000000000000000000040000000000000200000000000000000000000000000000000000000000000000000000000000000000000000 +304319 0x00000000004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000100000000000020000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000080000000000000000000000000008000000000000000000000000000000000008000000000000000000000000000000000000020000000000002000000000000000000040000000000000200000000000000000000000000000000000000000000000000000000000000000000000000 +304367 0x00000000000000000000001000000000000000000400020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000100000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +304375 0x00000000004000000000001000000000000000000400020000000800000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000020000000000000000000000000000000000000000000000000008000000000000010000000008000000000000000000000000000000000008000800000000000000000000000100000000000000000000000000000000000000000100000000000000002000000000002000000040010010000000000000000000000000000000000000000000000000000000000000000000000000000000000 +304407 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000002000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +304431 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +304433 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +304608 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000400000000000000000000040000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000 +304609 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000400000000000000000000040000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000 +304788 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +304794 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +304819 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +304835 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000002000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +304849 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +304856 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000002000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +304862 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000002000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +304872 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +304881 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +304902 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +304996 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +304999 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000002000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305006 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +305010 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000002000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305425 0x00000000004000000000000000000001000000000000020000000000000000000000000000000000000000000000000000000000008000000080000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010400000048000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000400000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305445 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000080000100000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305448 0x00000000004000000000000000000000000000000000020000000000000000000004000008000000000000000000000000000000000000000000000000000800000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000080000100000000002000000000000000000040000000000000000000000100000000000000000000000000000000000000000000000000000000000000000 +305450 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000080000000000000000000000000000020000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000004000000000000000000000000000 +305452 0x00000000004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000002000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000080000000000000000000000000000020000000000000000000000000000000000000000000008002000000000000000000040000000000000000000000000400000000000000000000000000000000004000000000000000000000000000 +305454 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000001000000040000000000000000000000000000000000000000000000000000000000000000000000000840000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305457 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305463 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000200080000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305464 0x00000000004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000008000000000000000000000000000000000240000000200480000000000000000000000000000000000000000000000000000002000000000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305468 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008080000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000008800000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305488 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000002000000000000008000000000000010000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305492 0x00000000004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000008000000000000000000000000000000008040000000000000000000000000000002000000000001000000000000000000000000000400000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000200000000000000000000000000000000000000000000 +305501 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000008000000000000000000040000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000080000000000000 +305502 0x00000000004000000000000000000000000000000000020000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000008000000000000008000000000000000000040000000001000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000080000000000000000000000000000000000010000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000080000000000000 +305510 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000044000004000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305616 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305620 0x0000000000400000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000040000000000000080000000000000000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000040000000001000000000a000000000000000010000000000000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305622 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000080000000000000000000000000200000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000080000000000000 +305624 0x00000000004000000000000000000000000000000000020000000000000000000000000000000000001000000000000000080000000000000000000000000200000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000004000000000000000000000000004000000000000000000000000000000000000080000000000000 +305626 0x00000000004000000000100000000000000000000000020000000000000000000000000002000000000000000000000000000000200000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000004000000000002000000000000002000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305627 0x00000001000000000000000000000200000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000040000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305629 0x00000001004000000000000000000200000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000040000000002000000000000000000040000000000000000001040000000000000000000000000000000000000000000000000000000000000000000 +305634 0x00000000005080000000000000000000000000000000020000400000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008020000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000400000000000000000000000 +305826 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000400000000000000002000000000000000000840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305827 0x00000000004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000100000000000000000000000000040000000000000000000000000000000000000000000000000000000000000040000000000000000000000010000000008000000000000000000000000000000100008000000000000000000000000000000000000000000000000000000000000000000000400000000000000002004000000000000000840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305829 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000008000000000080000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000080000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305834 0x00000000004002000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000008000000000080000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000020000000000000000000000000000008000000000000000000000000000000000000000000000080000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +305839 0x00000000000000000000000000000000000010000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000080000000000000000000000000000000000000000000000000000000000000 +305841 0x40000000004000000000000000000000000010000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000008000000008000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000080000000000000000000000000000000000000000000008000000000000000 +306889 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +307290 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +307508 0x00000000000000000000000000000000000000000000020000000000000000000000200000000000400000000000000000000000000000000000000000000000002000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +307509 0x00000000004000000000000000000000000000000000020000000000000000000000200000000000400000000000000000000000000000000000000000000000002000000000000000008000000000000000000000000000000000040000000000040000000000000000000000000000000000000000000000000000000000000000000000000010000000008000010000004000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +307513 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000004000000000000000000000000010000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000200000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +307519 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000001000000000000002000000000000000000040000000000000000000000000000000000000000000080000000000000000000000000000000000000000000 +307528 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000020000000000000000000000000000000000000000000000000000000000000000100000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +308010 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002020000000000080000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000 +308115 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000040000000000000000000000000000000000000000000000000000000000000000000000001000000000000200000000000000 +308124 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000400200000000000000 +308127 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000040000000000000000000000000000000000000000000000000000000000000000000000001000000000000200000000000000 +308157 0x00000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000000000000000000020000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000 +308183 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000002020000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +308190 0x00000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000000000000000000020000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000 +308216 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000002020000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000 +308224 0x00000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000000000000000000020000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000 +308257 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +308265 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +308267 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +308268 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +308285 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +308599 0x00000000000000000000000000000000000000000000080000000000000800000000000000000010000000000000000000200002000000000000000000000000000000000000000000020000001000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004010010000002000000000000000400000000000000000000000000000000000000000000040000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +309175 0x00000000002000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +309177 0x00000000002000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +309184 0x00000000002000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +309186 0x00000000002000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +309190 0x00000000002000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +309194 0x00000000002000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +309198 0x00000000002000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +309417 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +309881 0x00400000000000000000000000000000000000000000004000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000 +309883 0x00400000000000000000000000000000000000000000004000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000 +309892 0x00400000000000000000000000000000000000000000004000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000 +310069 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000002000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +310114 0x00400000000000000000000000000000000000000000004000000000000000000000000000100000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +310116 0x00400000000000000000000000000000000000000000004000000000000000000000000000100000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +310177 0x00400000000000000000000000000000000000000000004000000000000000000000000000100000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +310533 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000002000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +310589 0x00000000000008000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +310592 0x00000000000008000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +310599 0x00000000000008000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +310601 0x00000000000008000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +310604 0x00000000000008000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +311317 0x00000000002000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +311758 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +311858 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +311859 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +311865 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +311888 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +312096 0x00400000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000200000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +312124 0x00400000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000200000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +312367 0x00400000000000000000000000000000000400000000004000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +312371 0x00400000000000000000000000000000000400000000004000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +312383 0x00400000000000000000000000000000000400000000004000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +313355 0x00000000000008000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +313368 0x00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000002000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +313507 0x00000000000000000000000000000000000000000200000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +313526 0x00000000000000000000000000000000000000000200000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +313724 0x00000000000008000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +313789 0x00000000000008000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +314190 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +314375 0x00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000008000000000000000008000400000000000000000000000000 +315698 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +315705 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +315780 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +316726 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000400000000000000000000000020000000000000000000000000000000000000000000040000000000000000 +316747 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +317179 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000040000000000000000000000000000000000000000000000000000000000000000000000001000000000000200000000000000 +317522 0x04000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000800000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000006001008000000000000008000080000000000000000000000000000000000000000001000000000100000000000008000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000040000000000000008000002004000000000000 +317526 0x00000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +317536 0x00000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000020000000000800000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000006000008000000000000000000080000000000000000000000000000000000000000001000000000000000000000008000000800400000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000002004000000000000 +317567 0x00000000000000200000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000001004000000000000000004000000020000000000000000000000000000000000000000000000000000000000000000000000000000000001000040000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +317588 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +317597 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000400000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000040000000000000000 +317606 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +317610 0x00000000000000200000000000000000000000000000000000020000000000000000000000000000000000400000000000000000000800000080000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000001044000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000400000000000000000000000000000000000000000000000000000000000000000000440000000000000000 +317643 0x00000000000000200000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000010000000000000000000000000000004000000000020000000000000000000000000000000000000000000001004000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000040000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +317646 0x00000000000000000000000000000000000000000000000000004000000000000000000000000000000000400000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000010000000000000000000000000000004000000000020000000000000000000000000000000000000000000001000000000000000000004000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +317660 0x00000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000800000000000000001000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000080000000006000008000000000000000000080000000000000000000000000000000000000000001000000000000000000000008000000000400002000000000000000000000000000000000000000000000000000008000000000000000000000000000000000800000000000000000000000000000000000002004000000000000 +317957 0x00000000000000000000000000000000000000000200000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +318030 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +318032 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +318033 0x00000000001000000000000000000000000000000000000000000000000000000000000800000008000000000000000000000000000000000000800000000000000001000000000000000000000000000000000000000000000000000000000000000000020000000000000000000800000000000004000000000000000080000000006000000000000000000000000080000000000000000000000000000000000000000005000000000000000000000000000000008400000000000000000000000000000000000000000000000000008000000000000000000000000020000000000000800000000000000000000000000000000000002004000000000000 +318034 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +318036 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +318063 0x00000000001000000000000000000000000000000000000000000000000000000000000800000008000000000000000000000000000000000000800000040000000001000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000080000000006000000000000000000000000080000000000000000000000000000000000000000005000000000000000000000000000000008400000000000000000000000000000000000000000000000000008000000000000000000000000040000000000000800000000000000000000000000000000000002004000000000000 +318074 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000100000010020000000000000000000200000000000000000080000000020000000000000000000800000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000008000000000000000000000000000000000000000000000000000008000000000000000000000000020000000000000000000000000000000000000000000000000102000000000000000 +318096 0x04000000001000000000000000000000000000000000000000000000000000000000000800000008000000000000000000000000000000000000800000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000080000000006000000000000000000000000080000000000000000000000000000000000000000005000000000100000000000000000000008400000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000800000000000000000000000000000008000002004000000000000 +318137 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +318528 0x00000000001000000000000000000000000000000000000000000000000000000000000800000008000000000000000000000000020000000000800000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000080000000006000000000000000000000000080000000000000000000000000000000000000000005000000000000000000000000000000808400000000000000400000000000000000000000000000000000008000000000000000000000000000000000000000800000000000000000000000000000000000002004000000000000 +318627 0x00000000001000000000000000000000000000000000000000000000000000000000000800000008000000000000000000000000000000000000800000000000000001000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000004000000000000000080000000006000000000000000000000000080000000000000000000000000000000000000000005000000000000000000000000000000008400002000000000000000000000000000000000000000000000008000008000000000000000000000000000000000800000000000000000000000000000000000002004000000000000 +318639 0x00000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000800000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000002000000000000000000000010000000000000004800000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000080000000000000000000000000 +318650 0x00000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000800000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000010000000000000004000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000 +318653 0x00000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000004000000000000000000000000080000000000000000000000000000000000000000000000000000000200000000000000000000000000800000000000000000000000000000000000000000000000000000000000010000000000000000000000000800000000000000000000000000000000000000000000000000000 +318904 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +319523 0x00000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000400000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +321346 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +321884 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +321900 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000400000000000000000000000020000000000000000000000000000000000000000000040000000000000000 +322038 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +322041 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +322043 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +322047 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +322048 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +322056 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +322059 0x00000000001000000000000000000000000000000000000000000000000000000000000800000008000000000000000000000000000000000000800000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000080000000006000000000000000000000001080000800000000000000000000000000000000000005000000000000000000000000000000008400000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000800000000000000000000000000000000000002004000000000000 +322083 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +322090 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +322108 0x04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000010020000000000000000000200000000000000000080000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000080000000000000000000000000000000000000000004000000000100000000000000000000008000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000800000000000000000000000000000008000100000000000000000 +322121 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000010000000000100000010020000000000000000000200000000000000000080000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000001080000800000000000000000000000000000000000004000000000000000000000000000000808000000000000000400000000000000000000000000000000000008000000000000000000000000000000000000000800000000000000000000000000000000000100000000000000000 +322122 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000100000010020000000000000000040200000000000000000080000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000080000000000000000000000000000000000000000004000000000000000000000000000000008000000000000000000000000000000000000000000000000000008000000000000000000000000040000000000000800000000000000000000000000000000000100000000000000000 +322128 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000010020000000000000000000200000000000000000088000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000080000000000000000000000000000000000000000004000000000000000000000000000000008000002000000000000000000000000000000000000000000000008000008000000000000000000000000000000000800000000000000000000000000000000000100000000000000000 +322454 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008010000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000010000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000080000000000000000000000000000000000000000000000000000000000000000000000000 +322509 0x00000000004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008010000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000080000000000000000000000000000008000000000200000000000000000010000000000000000000000000000000000000000000000000000000002000000000200000000040000000000000080000000000000000000000000000000000000000000000000000000000000000000000000 +322550 0x00000000000000000000000000000000000000000200000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +322749 0x00000000001000000000000000000000000000000000000000000000000000000000000800000008000000000000000000000000000400000000800000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000080000000006400000000000000000000000080000000000000000000000000000000000000000005000000000000000000000000000000008400000000080000000000000000000000000000000000000000008000000000000000000000000000000000000000800000000000000000000000000000000000002004000000000000 +322750 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000080000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000020000000000000040000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +322752 0x00000000004000000000000000000000000000000000020000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000008000000000000000000080000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000080000020000000000000040000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000080000000000000000000000 +322758 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +322760 0x00000004004000000000000000000000000000000000020000000000000000000000100000000000000000000000000000000000000000000000000000000000010000000000000000008000000000000000000000000000000000040000000000002000000000000000000000000000000000000000000004000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +322764 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000001000000000000000000000000000000000000000000000000000000000000001000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000020000000000000000000000000000000 +322765 0x00000000004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000400000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000001000000000000000000000000000000000000000000000000000000000000001000000000000000002000000000200000000040000000000000000000000000000000000000000000000000000000020000000000000000000000000000000 +322767 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000000000000000040000000000000000000000000000000000000000000002000000000000000000000000000000000000000000 +322768 0x00000000004000000000000000000000000000000000120000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000400000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080004000000000000040000000000000000000000000000000000000000000002000000000000000000000000000000000000000000 +322774 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009000000000000000008000000000000000000000000000000000000000000000000000000000000000000002001000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +322776 0x00000000004000000000000000000000000000000000020000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000010000000000000000000000000040000000000000000000000000000000010000000008000000000000000000000000000000000009000000000000000008000000000000000000000000000000000000000000000000000000000000000000002001000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +322777 0x00000000004000000000008000100000000000000000020000000000000002000000000000000000000000000000000000000004000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000020000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000001000000000000000000000000000000000000000000000000 +324029 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +324316 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000004000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +324318 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000 +324322 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000400000000000000000000000000000000000000000000000000000008000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +325807 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +326760 0x00000000000000000000000000000000000000000000000000000040000000000000001000000000000000000000000000008000000000000000000000000000000000008000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000002000000000000008000000000000000 +327103 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +327105 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +327227 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000400000000000000000000000020000000000000000000000000000000000000000000040000000000000000 +327399 0x00000000000000000000000000000000000000000000000000000000001000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000080000000000000000000800008000000000000000 +327544 0x00000000000000000000000000000000000000000000000000000000001000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000080000000000000000000800008000000000000000 +327690 0x00000000000000000000000000000100000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +328002 0x00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000040000000000000010000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000000000200000000000 +328269 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +328529 0x00000000000000000000000000000000000000000000000000000000001000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000080000000000000000000800008000000000000000 +328585 0x20000000000000000000100000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +328870 0x00000000000000000000000000000000000000000000000000000000001000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000080000000000000000000800008000000000000000 +329480 0x00000000000000000000000000000000000000000000020000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000200000000000000000000000020000000000000000000000000000000000000000000 +329484 0x00000000004000000000000008000000000000000000020000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000800000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000000000040000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000200000000000000000000000020000000000000000000000000000000000000000000 +329485 0x00000000000000000000000000000000001000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +329491 0x00000000000000000000000000000000001000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +329513 0x00000000000000000000000000000000001000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +329519 0x00000000000000000000000000000000001000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +329659 0x00000000004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000020000000000000000000000000000000000000000000000000000000000020000000010000000008000000000000000000000000000000000008000000400000000000000000000000000000000000000000000000000000000000000000000000000000002000000080000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000020000000 +329667 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000100000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000002000000000000000000000000000000000000000000 +329668 0x0000000000400000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000004000000000000010000000000000000000000000000000000000000000000000001000000000000000000001000000000c000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000002000000000000000000800000000000000000000000 +329673 0x00000000004000001000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000004000000000000000000000000000000000000000000000000004000000000000000000010000000008000000000000000000000000000002000008000000000000000000000000000000000000000000000000000000000000000000000400400000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +329740 0x00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000000010000000000000 +329749 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000008000000000000000000000000000000000000000002000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +329750 0x00000000004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000008000000000000000000000000000000000040000000040000000000000000000000010000000000000000000000000000000000000000000000000000010000000008000000000000000000000080000000000008000000000000000000000000000000000000000002000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000400000000000000000000000000000000000000000000 +329824 0x00000000000000000000000000000000000000000000200000000000000000000000001000000000000000000000000000008000000008000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +329964 0x00000000000000000000000000000000000000000000000000000000100000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +330023 0x00000000000000000000000000000000000000000000000000000000100000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +330207 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000004000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000200000000000000000000000008000000000000000 +330473 0x00000000000400000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000001000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +330511 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000002000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000400000000000000000000000020000000000000000000000000000000000000000000040000000000000000 +330579 0x00000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000001000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +330683 0x00000000000000000000000000000000000000000000080000000000004000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +330919 0x00020000000000000000000000000000000000000000000000000000000000000008001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +331009 0x00000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +331542 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000100000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000004000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +332007 0x00000000000000000000000000000000000000000000000000000200000080000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +333256 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000400000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000010000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +333294 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +333583 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000200000000000000000000000000000000000000000000000000010008000000000000000 +333640 0x80000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000004000000008000000000000000000000000000000000000010000000000000000000000000000000000008000000000000000 +334263 0x00000000000000080000000000000000000000000000000000000000000000000100001000000000000010000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +334279 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000040000020000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000 +334883 0x00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000000000000000000000 +334915 0x00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000004000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000040000000000000010000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000000000000000000000 +334919 0x00000020000000000000000000000000000000000000000000000000000000000000001000000000000020000000000000008000000000000000000000000000000000000020000000000000020000812000002000000000000000000000000001000000000000000000000000000000400000000000000000000000000000000000000000000000040000800000000010000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000008000400000000008000000000000000 +335076 0x00000000000000001000000000000000000000000000000000000000000000000000001000000000000000000100000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +335348 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000080000000008000000000000000000000040000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000008000000000 +335643 0x00000000000008000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +335649 0x00000000000008000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +335652 0x00000000000008000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +335684 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000002000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000 +336089 0x0000000000000000000000000000000000000000000000000000000000020000000000100000000000000000000000000000800000000000000000000000000000000000000000000000000000000080200000a000000000000000000000000001000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +336231 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336234 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336242 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336243 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336244 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336245 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336247 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336248 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336255 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336260 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336263 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336264 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336266 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336334 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336336 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336337 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336338 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336439 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336451 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336452 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336453 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336461 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336495 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336497 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336507 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336508 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336509 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336510 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336518 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336520 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336521 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336522 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336526 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336527 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336528 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +336543 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000040000000000000000000200000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000 +337012 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000001000000000000000000000000400000000000000802000002000000200000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +337642 0x00000000004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000408000000000000000000000000000000000040000080000000000000000080000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000020000000000000000002000000000000000000040000000000000001000000000000000000000000000000000000000000000000000000000000000000000000 +337647 0x00000000000000000000000000000000000000000000020000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000800000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +337649 0x00000000004000000000000000000000000000000000020000000000000080000000100000000000000000000000000000000000000000000000000000000000000000000000000000008002000000000000000000000000000000040000000000000000000000000000000800000000000000000000000000000000000000000000000002000010000000008000000000000000000000000000000000008000000000000000000000000000000000200000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +337653 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000040000000000000000000040000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +337654 0x00000000004000000000008000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000002000000000000002000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000000020000040000000000000000000040000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +337655 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000040000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000400000000040000000000000000000000000000000000000000000000000000000000000000000000 +337656 0x00000000004000000000000000000000000400000000020000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000008000040000000000000000000000000000040000000000000000000000000000000000000000000000000000004000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000400000000040000000000000000000000000000000000000000000000000000000000000000000000 +337663 0x00000000004000000000000000000000080000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000001000000000000000000000000000050000000000000000000000000040000000000000000000000000000000000000000004000000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000080000000000000000000000000000000000000 +337664 0x00000000000000000000000000000000000000000000020000000010000000000000000000000000001000000000000000000000000000000000000000000000000200000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +337669 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000020000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000008000000000 +337672 0x40000000004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000020000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000020000000000000010000000008000000000000000000000000008000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000008000008000000000 +337731 0x00000000000000000000000020000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000800000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +338275 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010004000200000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +338281 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010004000200000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +338336 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +338424 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008004000000000000000000000000000000000000100000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +338435 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000008000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000004000000000000000000000000010000000000000000000000000000000000000 +338439 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000010802000002000000000000000000000000001000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000040000000000000000000000000000000000000000000000008000000000000000 +338661 0x00000000000000000000000000000000000000000000000000000000001000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000080000000000000000000800008000000000000000 +338991 0x00000000000000000000000000200000000000000008000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000400800000000000000000000000000000010000000000000000000000000000000000000000000000000 +339173 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002400000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000002000000000000000000000000000000088000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +339369 0x00000020000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000000000000000000000 +339427 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000020000000000000000000001000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +340633 0x00000000000000000000000000000000000000000000020000000004000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000008000000000000001000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +340635 0x00000000004000000000000000000000000000000000020000000004000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000008000000000000001000000000000200000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000001000000000200000000000000000000000000000000000000000000000000000000000000000000 +340653 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000001000000002000000000000000000040000000000000000000000000000000000000000000000000000000010000000000000000000000000000000 +340658 0x0000000000400000000000000000000400000000000002000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000001000000000800000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000100000000a000000000000000000040000000000000000000000000000000000000000000000000000000010000000000000000000000000000000 +340674 0x00000000000800000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000100000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040080000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +340675 0x00000000004800000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000100000000000000000000000000000000000000000000000000000000000000000000000000000002000010000000000000040080000000000000000000000000000000000002000000000000000000080000000000000000000000000000 +340685 0x00000000000000000000000000000000000000000000020010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000008000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +340686 0x00004000004000000000000000000000000000000000820010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000010000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000008000000000000040000000000000000000000000000000000000000000000000002000000000000000000000000000000000000 +340700 0x00000000004000000000000000000000000000000000020001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000080000000000000000000000000000000000008000000000000000000000000000000000000000000002004200000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000001000 +340708 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000008000000000000000000000000000040000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000080000000000000000000000000000000000000 +340710 0x00000000004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000008000000000000000000000000000040000000000000100000000000000000800000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000400000000000000000000000000000000000000000000000000002000002000000000000040000000000000000000000000000000000000000000000000080000000000000000000000000000000000000 +340712 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000080040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000008000000000200000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +340713 0x00000000004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000080840000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000028000000100000000000000000000000000008000000000200000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000001000000000000000000000 +340718 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000100000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000002000000000000 +340719 0x00000000004000000000000000000000000000000000020000000040000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000008000000000000080000002000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000100000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000002000000000000 +340727 0x00000000004000000000040000002000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000200000000000080000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000002000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000001000000000000000000000000000000 +340728 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000002000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000100000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +340835 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +340988 0x00000000000000000010000000000000000000000010000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000010000000000008000000000000000 +341695 0x00000000000000000000000010000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000001000000000000000000000000000000000000000000000000000000000008000000000000000 +341985 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000100000000000004000000000000001000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +341997 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104000000000004000000000000001000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +342001 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000100000000000004000000000000001000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +342004 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000100000000000004000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000040000000000000000 +342007 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000004000000000000001000000040000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000040000000000000000 +342008 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000004000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000040000000000000000 +342026 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000002000000004000000000000000000000000000000000000000000000000000000001000000000000000000004000000020000080000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000004000000000000000000000000000000000000000000000000000400000000000000000 +342027 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000400000000000000000 +342033 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000400000000000000000 +342035 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000400000000000000000 +342036 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000400000000000000000 +342041 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000 +342047 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000100000000000000000000000000000000002000000104000000000044100000000000001000002000000000000000000000001000000000000000000004000000000000080000000000000000000000000000000000000002000000000000000000000000020000000000000040000000000000000000000000000004000000000000000000000000000000000000000000000000000400000000000000000 +342053 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000004000000000000000000000000000000000000000000000000000040000000000000000 +342080 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000400000002000000000000000000000000000000000000000000040000000000000000000001040000000000000000000000000000000080000000010000000000000000000000000000000000000000000000000000000020000000000000000000000000000400000000000000004000000000000000000000000000000000000000000000000000440000000000000000 +342101 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000 +342107 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000004000000000000000000000000000000000000000000000000000040000000000000000 +342111 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000040000000000000000000000040000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000004000000000000000000000000000000000000000000000000000040000000000000000 +342115 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000 +342118 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000400000002000000004000000000000000000000000000000000000000000000000000000001000000000000000000004000000000000080000000010000000000000000000000000000000000000000000000000000000020000000000000040000000000000000000000000000004000000000000000000000000000000000000000000000000000400000000000000000 +342125 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000004000000000000000000000000000000000000000000000000000040000000000000000 +342140 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000008000000000000000000080000000000000000800000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000 +342141 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000004000000000000000000000000000000000000000000000000000040000000000000000 +342145 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000400000002000000000000000000000000000000000000000000040000000000000000000001040000000000000000000000000000000080000000010000000000000000000000000000000000000000000000000000000020000000000000000000000000000400000000000000004000000000000000000000000000000000000000000000000000440000000000000000 +342162 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000004000000000000000000000000000000000000000000000000000040000000000000000 +342173 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000004000000000000000000000000000000000000000000000000000040000000000000000 +342188 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000004000000000000000000000000000000000000000000000000000040000000000000000 +342272 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000400000000000000000 +342386 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000008000000000000000000000000000000000000000000000000000004000000000000000000000000000008000000000000000000000000001000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000010000000004000000000000000000000000010000000000000000000400000000000000000 +342399 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000 +342466 0x00000000000000000000000000000000000000000000000000002000000000000000001000000000080000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +342601 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000040000000000000000000000040000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000004000000000000000000000000000000000000000000000000000040000000000000000 +342616 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000008000000000000000000080000000000000000800000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000 +342618 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000008000000000000000000080000000000000000800000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000 +342924 0x00000000000000000000000000000000000010000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +342964 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000000000000002000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +343006 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000080000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000 +343021 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000004000000000000000000000000000000000000000000000000080000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000 +343059 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000008000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +343079 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000200000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000040000000000000000 +343083 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000040000000000000802000002000000000000000000000000001000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +343133 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +343162 0x00000020000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000100000000000000000000000000008000400000000000000000000000000 +343185 0x00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000010000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000008000400000000000000000000000000 +343339 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000080000000000000000802000002000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +343946 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +343966 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +343971 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +344121 0x00000000000000000000000000000000000000000000000000000040000000000000001000000000000000000000000000008000000000000000000000000000000000008000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000002000000000000008000000000000000 +344164 0x00000000000000000000000000000000000000000000000000000040000000000000001000000000000000000000000000008000000000000000000000000000000000008000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000002000000000000008000000000000000 +344839 0x00000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000008000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +345506 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +346112 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +346392 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +346395 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +346398 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +346425 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +346448 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +346451 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +346454 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +346464 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +346466 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +347014 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000400000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +347301 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000200000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000002000000000000000000000000000000000000000000000000000000000000000008000000000000000 +347333 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000200000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000002000000000000000000000000000000000000000000000000000000000000000008000000000000000 +347613 0x00000000000000000000000000000000000000000800000000000000000000000000000000000000000001000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010004000000002000000000000000000000000000000000000000000000000000000001000000040000000000000000000000800000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000001000000000000000000000 +347700 0x00000000000000000000000000000000000000000000000000000000002000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400010000000000000 +347705 0x00000000000000000000000000000000000000000000000000000000002000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400010000000000000 +347711 0x00000000000000000000000000000000000000004000000000020000002000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000040010000000000000 +347853 0x00000000000000000000000000000000000000000000000000000000002000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000 +347953 0x00000000000000000000000000000000000000000000000000000000002000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000080000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000 +347958 0x00000000000000000000000000000000000000004000000000020000002000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000040010000000000000 +347960 0x00000000000000000000000000000000000000000000000000020000002000000001000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000040010000000000000 +348019 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +348244 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000004000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +348443 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000400000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +348675 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000080000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000400100000000000000000000000000000000000000000000000008000000000000000 +348743 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +348936 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000100000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000002000000000000000000000000000000000000000008000000000000000 +350544 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +351473 0x00000000000000000000000000000000000000000000000000000000002000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000 +353157 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +353181 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000004000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000400000000000000000 +353196 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000004000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000000000000000000080000000000000000000000000000000000000040000000000000000 +353273 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000080000000000000000800000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000 +353276 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000080000000000000000000000000000000000000040000000000000000 +353359 0x00000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000200000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000100000040 +353360 0x00000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000040 +353361 0x00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008002400000000000000000000000000 +353367 0x00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000080000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000008000000000000000 +353370 0x02000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000000000000000000000 +353438 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000004000000000000000000000000000000080000000000000000000000000000000000000000000000000002000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000040 +353443 0x0000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000a000400000000000000000000000000 +353447 0x00000028000000000000000000000080000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000000000000000000000 +353479 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000002000001000000000000000000000000100000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +354071 0x02000000000000000000000000000000000000000000020000000000000000000000000040000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000001000000000020000000000000000000000200000000000000020000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000 +354151 0x00000000000000000000000000000000000000000000002000000000000000000000400000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000080000000400000000000000000000000000000000000000000000000000000000000000000000000000000 +354162 0x00000000000000000000000000004000000000000000000000000000000000000000410000000000200000000000000002000000000002000000000040000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000 +354233 0x00000000000000000000000000000000000000000000000000000000000000000000400040000004000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024040000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000400000000000000000000000040000000000000000000000000000000000100000000000000000 +354585 0x00000000000000000000000000000000000000000000000000100000000000000000400000000000200000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004001000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000 +354866 0x00000000000000000000000000000000000000000000000000001000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000001 +356461 0x00000000000000000000000000200000000000000000000000000000010000000000000000000000000000000000000000202000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +356488 0x00000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000200000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000020000000000000080000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000 +356513 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000100001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000080000000000000a00000000000000000000000 +356526 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +356535 0x00000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000 +356543 0x00000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000800080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000 +357195 0x00000000000000000000000000000000000000000000000000000000001000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000080000000000000000000800008000000000000000 +357579 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +357588 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +357590 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000200000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000040000000000000000 +357592 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +357600 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +357622 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +357630 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +358290 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000400000002000000004000000000000000000000000000000000000000000000000000000001000000000000000000004000000000000080000000010000000000000000000000000000000000000000000000000000000020000000000000040000000000000000000000000000004000000000000000000000000000000000000000000000000000400000000000000000 +358426 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000 +358556 0x00000000000000000000000000000000000000000000000000000000001000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000080000000000000000000800008000000000000000 +358811 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000400000000000000000000000000000000002000000000008000000000000000 +359114 0x00000000000000000000000000000000000000000000000000000000001000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000080000000000000000000800008000000000000000 +359375 0x00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000100000000000000000 +359378 0x00000020000000000010000000000000000004000000000000000200400000000000000000000000000000000002000000000000000000020000000000000000000000000000000000000000000000010000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000040000000000040010000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000000000400000000000 +359538 0x00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000008000400000000000000000000000000 +361585 0x00000000000000000000000000000000000000000000000000000000001000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000080000000000000000000800008000000000000000 +361588 0x00000000000000000000000000000000000000000000000000000000001000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000080000000000000000000800008000000000000000 +361732 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000842000002000000000000000000000000001000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000080000000000000000000000000000000000000000000000000000008000000000000000 +361757 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000040000000000000000000000040000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000040000000000000000 +361775 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000008000000000000000000080000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +362002 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000010000000000000000000000000802000002000000000000000000000400001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +365791 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000040 +365793 0x00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000010000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000400010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000000000000000000000 +369141 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000200000000000000000000000000000000000000000000000000000000000000000008000000000010000 +369239 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +369249 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +369253 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +369259 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +369261 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +369263 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +369274 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +369426 0x00000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000200000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000100000040 +369428 0x20000020000000000000000000800000000004000000000000000200400000000000000040000000000000000000000000000000000000020000000000000000000000000000000000000000000000010000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000040000000000000010000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000008000400800000000000000000000000 +369431 0x00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018000400000000000100000000000040 +369538 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000040 +369540 0x00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000008000400000000000000000000000000 +370399 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000001000000000000802000002000000000000000000000000001000000100000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +370517 0x00000000000000000000000000000080200000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000080004000000000000000000000000002000000000000000000400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +370545 0x00000000000000000000000000000080200000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000080004000000000000000000000000002000000000000000000400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +371190 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +371280 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +371286 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +371288 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +371299 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +371307 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +371327 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +371329 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +371352 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +371360 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +371362 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +371369 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +371378 0x00000000000000000000000000000080200000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000080004000000000000000000000000002000000000000000000400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +371450 0x00000000000000000000000000000080200000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000080004000000000000000000000000002000000000000000000400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +371489 0x00000000000000000000000000000080000080004000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000004000000000000000000000000002000000000000000000400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +371509 0x00000000000000000000000000000080000080004000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000004000000000000000000000000002000000000000000000400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +371532 0x00000000000000000000000000000080000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +371658 0x00000000000000000000000000000080000080004000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000004000000000000000000000000002000000000000000000400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +371660 0x00000000000000000000000000000080000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +371876 0x00000000000000000000000000000080000080004000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000004000000000000000000000000002000000000000000000400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +371904 0x00000000000000000000000000000080000080004000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000004000000000000000000000000002000000000000000000400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +371906 0x00000000000000000000000000000080000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +371912 0x00000000000000000000000000000080000080004000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000004000000000000000000000000002000000000000000000400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +371914 0x00000000000000000000000000000080000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +371918 0x00000000000000000000000000000080000080004000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000004000000000000000000000000002000000000000000000400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +371931 0x00000000000000000000000000000080000080004000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000004000000000000000000000000002000000000000000000400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +371933 0x00000000000000000000000000000080000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +371938 0x00000000000000000000000000000080000080004000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000004000000000000000000000000002000000000000000000400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +371940 0x00000000000000000000000000000080000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +371973 0x00000000000000000000000000000080000080004000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000004000000000000000000000000002000000000000000000400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +372006 0x00000000000000000000000000000080000080004000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000004000000000000000000000000002000000000000000000400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +372014 0x00000000000000000000000000000080000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +372847 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +374209 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +374225 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +374365 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000010000000000000000000000000000000000000000000000000000000020000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +374388 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020001000000000000000000000200000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +375079 0x00000000000000000000000000000080000080004000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000004000000000000000000000000002000000000000000000400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +375093 0x00000000000000000000000000000080000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +375401 0x00000000000000000000000000000000000400000400000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +375440 0x00000000000000000000000000000000000400000400000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +375447 0x00000000000000000000000000000000000400000400000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +376493 0x00000000000000000000000000000080000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +376573 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +376588 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +376644 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +376650 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +376668 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +376906 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +377026 0x00000000000000000000000000000000000000000000000000000000001000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000080000000000000000000800008000000000000000 +377139 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000001000000000000080000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000080000000000000000000000000000000000000040000000000000000 +377506 0x00000000000000000000000000000080000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +377523 0x00000000000000000000000000000080000080004000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000004000000000000000000000000002000000000000000000400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +377525 0x00000000000000000000000000000080000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +377581 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000040 +377586 0x00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000010000000000000000000000000000000000000000000000040000000000000000000000100000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000000000000000000000 +377608 0x00000000000000000000000000000000000000000200000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +377627 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000004000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000000000000000000080000000000000000000000000000000000000040000000000000000 +377629 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000004000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000000000000000000080000000000000000000000000000000000000040000000000000000 +377703 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000001000000000000080000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000080000000000000000000000000000000000000040000000000000000 +377730 0x00000000000000000000000000000000000000000000000000000000001000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000080000000000000000000800008000000000000000 +377746 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000004000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000400000000000000000 +377877 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000400000002000000004000000000000000000000000000000000000000000000000000000001000000000000000000004000000000000080000000010000000000000000000000000000000000000000000000000000000020000000000000040000000000000000000000000000004000000000000000000000000000000000000000000000000000400000000000000000 +377894 0x00000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +377905 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000400000002000000004000000000000000000000000000000000000000000000000000000001000000000000000000004000000000000080000000010000000000000000000000000000000000000000000000000000000020000000000000040000000000000000000000000000004000000000000000000000000000000000000000000000000000400000000000000000 +377917 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000004000000000000000000000000000000000000000000000000000040000000000000000 +377922 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000040000000000000000000000040000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000004000000000000000000000000000000000000000000000000000040000000000000000 +377925 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +378345 0x00000000000000000000000000000000000000000000000000000000001000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000080000000000000000000800008000000000000000 +378347 0x00000000000000000000000000000000000000000000000000000000001000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000080000000000000000000800008000000000000000 +379027 0x00000020000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000008000400000000000000000000000000 +379032 0x00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000008000400000000000000000000000000 +379039 0x08000020000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000000000000000000000 +379158 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000400000000000000000002000040000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +379161 0x00000400004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000040000000000000000000000000000000000000000000010000000008000000000000000000000000000000020008000000000000000000000000000000000000000000000000000000000000000000400000000000000000002000040000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +379163 0x00000000000000000000000000000000000000000000020000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000008000010000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000080000000000000000000000000000000000000000 +379164 0x00000000004000000000000000000000000000100000020000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000008000010000000000000000000000000000040000000000001000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000100000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000080000000000000000000000000000000000000000 +379167 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000004 +379170 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +379171 0x00000000004000000000000000800000000000000000020000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000008000000000000000000000000000002000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000004 +379172 0x00000000000000000010000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000200000000000000000000000000000000000000000000000000000000000000000000000 +379176 0x00000000004000000010000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000100000000000000000000000000000000000000000200000000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000000040000000000000000000000000000000002000000000000000000040000000000000000200000000000000000000000000000000000001000000000000000000000000000000000 +379180 0x00000000000080000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000800000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +379182 0x00000000004080000000000002000000000000000800020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000800000000000000000000050000000008000000000000000000000000800000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +379210 0x00000000000000040000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000004000000000000000000000400000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +379212 0x00000000004000040000000000000000000000000000020000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000200000000000008000000000000000000000000000000000000000004000000000000000000000400000000000000000000002000000000000000000040002000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +379214 0x00000001000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000080000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +379216 0x00000001004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000008000000000000008000000000000000000000000000000000040000000000000000000000000000000000020000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000000000080000000000000000000000000000000000000000020002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +379217 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000800000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000020000000000000000000000000000000000000000000000000000000000000000 +379219 0x00000000004000000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000008000000000000000000000000010000000000000000010000000008800000000000000000000000000000000008000020000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000020000000000000000000000000000000000000000000000000000000000000000 +379220 0x00000000000000000000000000200000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000100000000000100002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +379224 0x00000000004000000000000000200000000000000000020000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000008000000000000000040000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000100000000000100002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000400000000000000 +379235 0x00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000080000000000000000000000000000000000000000800000000000000000000000000000 +379237 0x00000000004000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000100000000008000000000000000000000000000000000000010000000008008000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000080000000000000040000000000000000080000000000000000000000000000000000000000800000000000000000000000000000 +381271 0x00000000000000000000000000000080000080004000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000004000000000000000000000000002000000000000000000400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +381276 0x00000000000000000000000000000080000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +381689 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +382200 0x00000020000000000000000008000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000000000000000000000 +382217 0x00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000400000010000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000008000400000000000000000000000000 +382644 0x00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000200000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000002000000000000000000000000000000000000000000000000000000000000000008000000000000000 +383284 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +383337 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +383354 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +383361 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +383427 0x00000000000000000000000000000000000004000800000000000000000000000000000000000000000001000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000800000001000000000008000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000040000000000000000000 +383466 0x00000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +383469 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000001000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +383515 0x00000000000000000000000000000000000004000800000000000000000000000000000000000000000001000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000800000001000000000008000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000040000000000000000000 +383519 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000010000000800000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000002000000000000000000000000000 +383630 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000400000000000000000 +383760 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000010000000000000000000000000000000000000000000000000000000020000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +383802 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000080000000000400000000000000000 +383815 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000400000000000000004000000000000000000000000000000000000000000000000000000001000000000000000000004000000000000000000000010000000000000000000000040000000000000000000000000000000020000000100000040000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +383844 0x00000000000000000000000000000000100000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +383852 0x00000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000002000000000000000000000000000400000000000000004000000000000000080000000000000000000000000000000000000001000000000000000000004000000000000000000000010000000000000000000000000000000000000000000000000000000020000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +383859 0x00000000000000000000000000000000000000804000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000002000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000040000000000000000 +383864 0x00000000000000000000000000000000000000800000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000080000000000000000040000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000040000000000000000 +383968 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000001000000000000080000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000080000000000000000000000000000000000000040000000000000000 +383973 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000 +384127 0x00000000000000000000000000000000000004000800000000000000000000000000000000000000000001000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000800000001000000000008000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000040000000000000000000 +384138 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +384149 0x00000000000000000000000000000000100000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +384173 0x00000000000000000000000000000000100000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000400000000000000000000080000000000000000000000000000000000008000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000001000000000000000000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000800000000000000000000000000000400000000000000000 +384301 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000040000000000000000000000000000000000000000400000000000000000 +384422 0x00000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000400000000000000000 +384506 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000400000000000000000 +384511 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000400000000000000000 +384546 0x00000000000000000000000000000000000004000800000000000000000000000000000000000000000001000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000800000001000000000008000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000040000000000000000000 +384771 0x00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000800000 +384825 0x00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000 +384861 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000100000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +384917 0x00000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000400000000000000000 +384923 0x00002000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000001000000 +384965 0x00000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +385067 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000008000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000400000000000000000 +385073 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000008000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000400000000000000000 +385356 0x00002000000000000000000000000000000000010000000000000000000000000000000400000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000004000000000000000000000000000000004000000000000000000000000000000000000000000000000000000001000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000001000000 +386571 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +386620 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000 +386736 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000040000000000000000000000000000010000000020000000000000000000000000000000000000000000000000000000000000000010 +386786 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000280000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000040000000000000000000000000000010000000040000000000000000000000000000000000000000000000000000000000000000010 +386795 0x04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000040000000000000000000000000000000000040000000000000000000000000000010000000000000000000000000000000000000000000000000000008000000000000000000010 +386804 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000040000000000400000000000000000000000040000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000010 +386812 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000040000000000000000008000000000010000000000000000000000000000000000000000000000000000000000000000000000000010 +386818 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000800000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000040000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000010 +386899 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000080000000000000000000000000000040000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000010 +386939 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000002000000000000000000000000000000000000000200000000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000010000000020000000000000000000000000000000000000000000000000000000000000000000 +386945 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000020000000000000000000800000000000000000000000000000000000000000200000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000 +386975 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000100000000000000000020000000000000000000000000000000000000000000000000000000000000000000 +387011 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000010000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000 +387014 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000001000000000000000000000040000000000000000000000000000000000000000000000040000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000 +387016 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000400000000800000000 +387032 0x04000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000 +387044 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000020000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000020000000000000000000000000000000000000000000080000000000000000000000 +387045 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000400000000800000000 +387206 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +387225 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +387241 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +387276 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000008000000000000000004000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000021000000000000000000004000000000000000000000400000000000000000000000000000000080000000000000000000000000000000000000040000000000001000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +387284 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000040000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +387365 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000 +387615 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000800008000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +387627 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000800000000000000000400000000000000000 +387641 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800008000000000000000000000001000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +387648 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000800008000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +387654 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000800008000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000040000000000000000 +387658 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000800008000000000000000000000001000000000000000000000000000000000000000000000000040000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000040000000000000000 +387683 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000800008000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +387688 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000800008000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000040000000000000000 +387690 0x00000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000800008000000000000000000000001000000000000000000000000000000000000000000000000040000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000040000000000000000 +387761 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000 +388108 0x00000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +388111 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000800000000 +388150 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000800000000 +388246 0x00000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000001000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000 +388285 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +388296 0x00000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000001000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000 +388516 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +388860 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000020000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000 +388893 0x00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000008000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000001000000000000000000000000000008000000000000000020000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000400000000000000000 +388894 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000020000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000 +388907 0x00000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000104000000000004000000000000001000000000000000000000000000001000000000000000000004080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000004000000000000000400000000000000000 +388909 0x00000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000400000000000000000 +388912 0x00000000000000000000000000000000000000004000000000020000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000000000000000000000000000000000000000004000000000000000040000000000000000 +388918 0x00000000000000000000000000000000000000000000000000020000002000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000040000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000004000000000000000040000000000000000 +388923 0x00000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000008000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000001000000000000000000000080000000000000000000000000000000000000000000000000000000000008000000000000000020000000000000000000000000000000001000000000000000000000000000000000000000000000004000000000000000400000000000000000 +388940 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000020000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000 +388971 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000004000000000000000000000000000000000000000800000000000000000000000000000000000 +388990 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000 +389012 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000 +389158 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000 +389206 0x00000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000400000000000000000 +389238 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000 +389277 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000100000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000400000000000000000 +389292 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000800000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +389301 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000020000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000040000000000000000 +389309 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000020000000000000000000000000000000000000000000000000000000008000000000000000000080000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +389324 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000008000000000000000000000000004000000000000000000000000004000000000000000000000000000000000000000000000000000000001000000000000800000024000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000 +389328 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000 +389343 0x00000000000000000000000000000000000000004000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000020000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000040000000000000000 +390001 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000001000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +390004 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000200000000000000000000000000000000000000020000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +390024 0x00000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +390042 0x00000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +390236 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +390306 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000001000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +390867 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +391685 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000010000000800000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000002000000000000000000000000000 +391690 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000010000000800000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000002000000000000000000000000000 +391691 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000010000000800000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000002000000000000000000000000000 +391697 0x00000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000040000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000 +391713 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000 +391849 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000100000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000400000000000000000 +392002 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000 +392097 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000020000000000000000000000000000000000000000000000000000000008000000000000000000080000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +392104 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000010000000000000000000000000000000000000000000000000000000020000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +392110 0x00000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000 +392294 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000004000000000000000000000000000000000000000000000000000000000 +392697 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000010000000000000000000000000000400000000000000000 +392960 0x00000000000000200000400000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000002000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +392970 0x00000000000000200000400000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000002000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +392990 0x00000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000002000000000000000000000000000000100000000000000000100000000000000000000000000000000000000000000000000000000000002000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +393302 0x00000010000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000400000000000000000 +393370 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +393752 0x00000000000000000000000000000000001000000000000000000000000000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 +394354 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000800000024000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +394389 0x00000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000002000000000000000000000000000000100000000000000000100000000000000000000000000000000000000000000000000000000000002000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +394390 0x00000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000002000000000000000000000000000000100000000000000000100000000000000000000000000000000000000000000000000000000000002000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +394391 0x00000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000002000000000000000000000000000000100000000000000000100000000000000000000000000000000000000000000000000000000000002000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +394393 0x00000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000002000000000000000000000000000000100000000000000000100000000000000000000000000000000000000000000000000000000000002000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +394394 0x00000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000002000000000000000000000000000000100000000000000000100000000000000000000000000000000000000000000000000000000000002000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +394395 0x00000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000002000000000000000000000000000000100000000000000000100000000000000000000000000000000000000000000000000000000000002000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +394426 0x00000000000000200000400000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000200000000000000000000000000000000000000000000000000000000000000000000000008000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +394800 0x00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000100000010000000000000000000000000000000000000000000000000000000000020000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000000000000000000000 +395595 0x00000000000000000000000000000000000000000000000000000000000100000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000800000000000000000000000000000000000000000000000000000000000000000008000000000000000 +395969 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +396348 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000010000000000000000000000000000400000000000000000 +397108 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000004000000004000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000 +397588 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000004000000004000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000 +397591 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000004000000004000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000 +398412 0x00000000000000000000000000000000000000000000000000000000001000000000001000000000000000000000000000008000000000000000000000000000000000000000000000000000000000802000002000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000008000000000000000000000000000000000000000000000000080000000000000000000800008000000000000000 +398456 0x00000020000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 +398477 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +398679 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040100000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +398968 0x00000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020200000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000 +398972 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000400000000000000000 +399058 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000200000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 +399804 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000010000000000000000000000000000400000000000000000 +399849 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000004000000004000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000 diff --git a/ethcore/src/chainfilter/logs.txt b/ethcore/src/chainfilter/logs.txt new file mode 100644 index 000000000..2127af242 --- /dev/null +++ b/ethcore/src/chainfilter/logs.txt @@ -0,0 +1,1013 @@ +300054 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4d617274696e0000000000000000000000000000000000000000000000000000 +300059 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x0000000000000000000000000000000000000000000000000000000000000059 +300221 0xef2d6d194084c2de36e0dabfce45d046b37d1106 0x02c69be41d0b7e40352fc85be1cd65eb03d40ef8427a0ca4596b1ead9a00e9fc +301826 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +303166 0xef2d6d194084c2de36e0dabfce45d046b37d1106 0x6c692d39f4045f32ff9259df5b527f0ebf04abdbbb44231574a0e5398ff21fae 0x0000000000000000000000000000000000000000000000000000000000000738 +303345 0xef2d6d194084c2de36e0dabfce45d046b37d1106 0x02c69be41d0b7e40352fc85be1cd65eb03d40ef8427a0ca4596b1ead9a00e9fc +303379 0xe881af13bf55c97562fe8d2da2f6ea8e3ff66f98 0x1250e52636eed438f884679df55d2911cf41764cf8b2da1bd22d29b0eb14f80e 0x0000000000000000000000001db3439a222c519ab44bb1144fc28167b4fa6ee6 0x0000000000000000000000000000000000000000000000000000000000000000 +303379 0xe881af13bf55c97562fe8d2da2f6ea8e3ff66f98 0x8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dba 0x0000000000000000000000001db3439a222c519ab44bb1144fc28167b4fa6ee6 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 0x0000000000000000000000000000000000000000000000000000000000000000 +303388 0xe881af13bf55c97562fe8d2da2f6ea8e3ff66f98 0x1250e52636eed438f884679df55d2911cf41764cf8b2da1bd22d29b0eb14f80e 0x000000000000000000000000abad6ec946eff02b22e4050b3209da87380b3cbd 0x0000000000000000000000000000000000000000000000000000000000000001 +303388 0xe881af13bf55c97562fe8d2da2f6ea8e3ff66f98 0x8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dba 0x0000000000000000000000001db3439a222c519ab44bb1144fc28167b4fa6ee6 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 0x0000000000000000000000000000000000000000000000000000000000000001 +303621 0x584aeb8bcb61e5c1a84d167c2511abf581713495 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 0x00000000000000000000000071353366b3ca768968ea084167655e1cc09938f2 0x000000000000000000000000302f330f8fb5f122b388acb8d85ccb0e712bb5ff +303670 0x035e62c27a2338d6ed147ec45d2779990a4c3b00 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +303674 0x035e62c27a2338d6ed147ec45d2779990a4c3b00 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +303683 0x035e62c27a2338d6ed147ec45d2779990a4c3b00 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +303689 0x035e62c27a2338d6ed147ec45d2779990a4c3b00 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +303689 0x035e62c27a2338d6ed147ec45d2779990a4c3b00 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +303692 0x035e62c27a2338d6ed147ec45d2779990a4c3b00 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +303692 0x035e62c27a2338d6ed147ec45d2779990a4c3b00 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +303716 0x035e62c27a2338d6ed147ec45d2779990a4c3b00 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +303717 0x035e62c27a2338d6ed147ec45d2779990a4c3b00 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +303748 0x035e62c27a2338d6ed147ec45d2779990a4c3b00 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +303756 0x035e62c27a2338d6ed147ec45d2779990a4c3b00 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +303756 0x035e62c27a2338d6ed147ec45d2779990a4c3b00 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +303758 0x035e62c27a2338d6ed147ec45d2779990a4c3b00 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +303758 0x035e62c27a2338d6ed147ec45d2779990a4c3b00 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +304090 0x9c667b7ea8ac2a0cc7e73544625d692f72175489 0x17eed4a0a175f46e59877d4b2bd56f2ed7d59d3d1b2dfa7b0867183c528423f8 0x0000000000000000000000000000000000000000000000000000000000000001 +304095 0x9c667b7ea8ac2a0cc7e73544625d692f72175489 0x17eed4a0a175f46e59877d4b2bd56f2ed7d59d3d1b2dfa7b0867183c528423f8 0x0000000000000000000000000000000000000000000000000000000000000002 +304107 0x9c667b7ea8ac2a0cc7e73544625d692f72175489 0x17eed4a0a175f46e59877d4b2bd56f2ed7d59d3d1b2dfa7b0867183c528423f8 0x0000000000000000000000000000000000000000000000000000000000000003 +304113 0x9c667b7ea8ac2a0cc7e73544625d692f72175489 0x17eed4a0a175f46e59877d4b2bd56f2ed7d59d3d1b2dfa7b0867183c528423f8 0x0000000000000000000000000000000000000000000000000000000000000004 +304222 0x9c667b7ea8ac2a0cc7e73544625d692f72175489 0x17eed4a0a175f46e59877d4b2bd56f2ed7d59d3d1b2dfa7b0867183c528423f8 0x0000000000000000000000000000000000000000000000000000000000000005 +304245 0x9c667b7ea8ac2a0cc7e73544625d692f72175489 0x17eed4a0a175f46e59877d4b2bd56f2ed7d59d3d1b2dfa7b0867183c528423f8 0x0000000000000000000000000000000000000000000000000000000000000006 +304247 0x4d498b18abcf83a15d3364d7419a4ef382982c7d 0x7d596234f9de8bba372a6b76656b35620eb6a5211bb764a81b1891567aed662a 0x0000000000000000000000000000000000000000000000000000000000000067 +304247 0x9c667b7ea8ac2a0cc7e73544625d692f72175489 0xe1a3670bcee4a697f1f4341b87487549f80e87998434bb9c2c08c73966d0766d 0x0000000000000000000000000000000000000000000000000000000000000006 0x0000000000000000000000000000000000000000000000000000000000000067 0x0000000000000000000000004d498b18abcf83a15d3364d7419a4ef382982c7d +304312 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x506c616e657468657265756d0000000000000000000000000000000000000000 +304319 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x506c616e657468657265756d0000000000000000000000000000000000000000 0x0000000000000000000000008394a052eb6c32fb9defcaabc12fcbd8fea0b8a8 +304319 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x506c616e657468657265756d0000000000000000000000000000000000000000 +304367 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x7261626269740000000000000000000000000000000000000000000000000000 +304375 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xc86aa3e5b1bc5a674de25655f9a3ccf734594e22d008e71d7ede3fe5c93e1384 +304375 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x7261626269740000000000000000000000000000000000000000000000000000 0x000000000000000000000000f50466e3f27955334fff159e9d6e325c11eb85d6 +304375 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x7261626269740000000000000000000000000000000000000000000000000000 +304407 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xc86aa3e5b1bc5a674de25655f9a3ccf734594e22d008e71d7ede3fe5c93e1384 +304431 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +304433 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +304608 0x7d00703c96bcd2b2af420cf165241396528b5e99 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +304609 0x7d00703c96bcd2b2af420cf165241396528b5e99 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +304788 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +304794 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +304819 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +304835 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xc86aa3e5b1bc5a674de25655f9a3ccf734594e22d008e71d7ede3fe5c93e1384 +304849 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +304856 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xc86aa3e5b1bc5a674de25655f9a3ccf734594e22d008e71d7ede3fe5c93e1384 +304862 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xc86aa3e5b1bc5a674de25655f9a3ccf734594e22d008e71d7ede3fe5c93e1384 +304872 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +304881 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +304902 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +304996 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +304999 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xc86aa3e5b1bc5a674de25655f9a3ccf734594e22d008e71d7ede3fe5c93e1384 +305006 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +305010 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xc86aa3e5b1bc5a674de25655f9a3ccf734594e22d008e71d7ede3fe5c93e1384 +305425 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x427573696e657373000000000000000000000000000000000000000000000000 +305425 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x427573696e657373000000000000000000000000000000000000000000000000 0x000000000000000000000000b48dafc23dc5f232f2e7a35a2d2bb1b4ab02c48a +305425 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x427573696e657373000000000000000000000000000000000000000000000000 +305445 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4574686572000000000000000000000000000000000000000000000000000000 +305448 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x4574686572000000000000000000000000000000000000000000000000000000 0x000000000000000000000000b56aea97a14a10f536fa4f770b900e12231a018e +305448 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4574686572000000000000000000000000000000000000000000000000000000 +305450 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x46756e64696e6700000000000000000000000000000000000000000000000000 +305452 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x46756e64696e6700000000000000000000000000000000000000000000000000 0x000000000000000000000000ace8a25b438c0d8c16cf578ddeb015fd1f714896 +305452 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x46756e64696e6700000000000000000000000000000000000000000000000000 +305454 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x436f696e00000000000000000000000000000000000000000000000000000000 +305457 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x7266696b6b690000000000000000000000000000000000000000000000000000 +305463 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x6461690000000000000000000000000000000000000000000000000000000000 +305464 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x6461690000000000000000000000000000000000000000000000000000000000 0x000000000000000000000000968ea5eed1d40486a7f87991c3299d383a8e85d2 +305464 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x6461690000000000000000000000000000000000000000000000000000000000 +305468 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x77656966756e6400000000000000000000000000000000000000000000000000 +305488 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x5265776172647300000000000000000000000000000000000000000000000000 +305492 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x5553440000000000000000000000000000000000000000000000000000000000 +305492 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x5553440000000000000000000000000000000000000000000000000000000000 0x000000000000000000000000b52f670a662fc87e9a976f50f7ed7c056b369684 +305492 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x5553440000000000000000000000000000000000000000000000000000000000 +305501 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x496e737572616e63650000000000000000000000000000000000000000000000 +305502 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x496e737572616e63650000000000000000000000000000000000000000000000 0x0000000000000000000000004db56c006f6d9e2edf742438c7a7dc032a5c3025 +305502 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x496e737572616e63650000000000000000000000000000000000000000000000 +305510 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x5365780000000000000000000000000000000000000000000000000000000000 +305616 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x43616d706169676e000000000000000000000000000000000000000000000000 +305620 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x43616d706169676e000000000000000000000000000000000000000000000000 0x00000000000000000000000076ff1940d6c15ae2ef8436de7564485770356076 +305620 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x43616d706169676e000000000000000000000000000000000000000000000000 +305622 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4769667463617264000000000000000000000000000000000000000000000000 +305624 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x4769667463617264000000000000000000000000000000000000000000000000 0x000000000000000000000000f8aaa4ccb80d0e047e9293619b47160e2c3b82d8 +305624 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4769667463617264000000000000000000000000000000000000000000000000 +305626 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4c6f616e73000000000000000000000000000000000000000000000000000000 +305626 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x4c6f616e73000000000000000000000000000000000000000000000000000000 0x000000000000000000000000569a16c067a308a5ea90b15a7caeae8705500569 +305626 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4c6f616e73000000000000000000000000000000000000000000000000000000 +305627 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x53686f7070696e67000000000000000000000000000000000000000000000000 +305629 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x53686f7070696e67000000000000000000000000000000000000000000000000 0x00000000000000000000000068057d1adb313d52890691adf051df3000a3d57d +305629 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x53686f7070696e67000000000000000000000000000000000000000000000000 +305634 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4164647265737300000000000000000000000000000000000000000000000000 +305634 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x4164647265737300000000000000000000000000000000000000000000000000 0x000000000000000000000000ea5511d3653d36fb55b53948d23e55a23c4fead7 +305634 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4164647265737300000000000000000000000000000000000000000000000000 +305826 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4d6f6e6579000000000000000000000000000000000000000000000000000000 +305827 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x4d6f6e6579000000000000000000000000000000000000000000000000000000 0x000000000000000000000000ef15babca7a972f141556571e5b08e3175cf97b2 +305827 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4d6f6e6579000000000000000000000000000000000000000000000000000000 +305829 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x436f75706f6e7300000000000000000000000000000000000000000000000000 +305834 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x436f75706f6e7300000000000000000000000000000000000000000000000000 0x000000000000000000000000a6cee167a6c4a531c6d16fdff7aa2de9f861cb07 +305834 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x436f75706f6e7300000000000000000000000000000000000000000000000000 +305839 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4163636f756e7400000000000000000000000000000000000000000000000000 +305841 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x4163636f756e7400000000000000000000000000000000000000000000000000 0x0000000000000000000000000ec0d6547c59c38a9105525f0c10ec4d4a0b1afb +305841 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4163636f756e7400000000000000000000000000000000000000000000000000 +306889 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +307290 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +307508 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x5858580000000000000000000000000000000000000000000000000000000000 +307509 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x5858580000000000000000000000000000000000000000000000000000000000 0x000000000000000000000000a61bfbbe1af5fde18193ffeffe9254b939d6de96 +307509 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x5858580000000000000000000000000000000000000000000000000000000000 +307513 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x537572696e616d65000000000000000000000000000000000000000000000000 +307519 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x546f797300000000000000000000000000000000000000000000000000000000 +307528 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x5757570000000000000000000000000000000000000000000000000000000000 +308010 0x37c8f253d780913bc2b2d63c4f13f991a9ce7880 0x02c69be41d0b7e40352fc85be1cd65eb03d40ef8427a0ca4596b1ead9a00e9fc +308115 0x035e62c27a2338d6ed147ec45d2779990a4c3b00 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +308124 0x035e62c27a2338d6ed147ec45d2779990a4c3b00 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +308127 0x035e62c27a2338d6ed147ec45d2779990a4c3b00 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +308157 0xd202f28e78e9802a95fe5b3d26785257fcf8493b 0xfb989cb0d132b51483b9258c1befbe92caa5f5b046af3dfdcc617dcf425af493 +308183 0x58db357c28947271c883b11bab4caaa445e0ebc0 0x02c69be41d0b7e40352fc85be1cd65eb03d40ef8427a0ca4596b1ead9a00e9fc +308190 0xd202f28e78e9802a95fe5b3d26785257fcf8493b 0xfb989cb0d132b51483b9258c1befbe92caa5f5b046af3dfdcc617dcf425af493 +308216 0x59a964f830b3593af88b3d5b2835938d7985fbae 0x02c69be41d0b7e40352fc85be1cd65eb03d40ef8427a0ca4596b1ead9a00e9fc +308224 0xd202f28e78e9802a95fe5b3d26785257fcf8493b 0xfb989cb0d132b51483b9258c1befbe92caa5f5b046af3dfdcc617dcf425af493 +308257 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +308265 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +308267 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +308268 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +308285 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +308599 0xc699608dd050d140e37cd402efe8343abcce6cd3 0x9ce147531995c591b0b50012b20f7f6d0dea75281159a58b8637542388f14626 0x00000000000000000000000048175da4c20313bcb6b62d74937d3ff985885701 0x00000000000000000000000023b666fd0ef4778c7557c3e33b126c1f10211941 0xffffffffffffffffffffffffffffffffa0e7153557ae4b988c928492845e7919 +309175 0xfae0d03c4e98022a8c5f35843925d36baf0e51b3 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +309177 0xfae0d03c4e98022a8c5f35843925d36baf0e51b3 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +309184 0xfae0d03c4e98022a8c5f35843925d36baf0e51b3 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +309186 0xfae0d03c4e98022a8c5f35843925d36baf0e51b3 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +309190 0xfae0d03c4e98022a8c5f35843925d36baf0e51b3 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +309194 0xfae0d03c4e98022a8c5f35843925d36baf0e51b3 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +309198 0xfae0d03c4e98022a8c5f35843925d36baf0e51b3 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +309417 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +309881 0x80603decb9f6326b05fec23c9a830d6cf506aa88 0xe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6 +309883 0x80603decb9f6326b05fec23c9a830d6cf506aa88 0xe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6 +309892 0x80603decb9f6326b05fec23c9a830d6cf506aa88 0xe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6 +310069 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xc86aa3e5b1bc5a674de25655f9a3ccf734594e22d008e71d7ede3fe5c93e1384 +310114 0x89c7776f8ae736ce12a0b3309bcea8b4d24bfb12 0xe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6 +310116 0x89c7776f8ae736ce12a0b3309bcea8b4d24bfb12 0xe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6 +310177 0x89c7776f8ae736ce12a0b3309bcea8b4d24bfb12 0xe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6 +310177 0x89c7776f8ae736ce12a0b3309bcea8b4d24bfb12 0xe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6 +310177 0x89c7776f8ae736ce12a0b3309bcea8b4d24bfb12 0xe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6 +310533 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xc86aa3e5b1bc5a674de25655f9a3ccf734594e22d008e71d7ede3fe5c93e1384 +310589 0x5f4c010748a890c8a28a4858fe7b07048d194380 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +310592 0x5f4c010748a890c8a28a4858fe7b07048d194380 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +310599 0x5f4c010748a890c8a28a4858fe7b07048d194380 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +310601 0x5f4c010748a890c8a28a4858fe7b07048d194380 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +310604 0x5f4c010748a890c8a28a4858fe7b07048d194380 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +311317 0xfae0d03c4e98022a8c5f35843925d36baf0e51b3 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +311758 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +311858 0xb912acab51206235b6082bcbd2cb88a5fb485a8f 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +311859 0xb912acab51206235b6082bcbd2cb88a5fb485a8f 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +311865 0xb912acab51206235b6082bcbd2cb88a5fb485a8f 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +311888 0xb912acab51206235b6082bcbd2cb88a5fb485a8f 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +312096 0xb7871c70fcba963f502f5b25ca39932820f23206 0xe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6 +312124 0xb7871c70fcba963f502f5b25ca39932820f23206 0xe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6 +312124 0xb7871c70fcba963f502f5b25ca39932820f23206 0xe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6 +312367 0x5e50225b8dccefd89dcbae96e73f71e59a4e2529 0xe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6 +312371 0x5e50225b8dccefd89dcbae96e73f71e59a4e2529 0xe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6 +312383 0x5e50225b8dccefd89dcbae96e73f71e59a4e2529 0xe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6 +313355 0x5f4c010748a890c8a28a4858fe7b07048d194380 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +313368 0xb70ca79ffad5f6ddff259bd07089a9c771e32711 0xc86aa3e5b1bc5a674de25655f9a3ccf734594e22d008e71d7ede3fe5c93e1384 +313507 0x8465dac1172b6abe303bead4d06125aed72ea01c 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +313526 0x8465dac1172b6abe303bead4d06125aed72ea01c 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +313724 0x5f4c010748a890c8a28a4858fe7b07048d194380 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +313789 0x5f4c010748a890c8a28a4858fe7b07048d194380 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +314190 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +314375 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x000000000000000000000000000000000000000000000000000000000000005a +315698 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +315705 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +315780 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +316726 0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +316726 0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +316747 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +317179 0x035e62c27a2338d6ed147ec45d2779990a4c3b00 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +317522 0xe881af13bf55c97562fe8d2da2f6ea8e3ff66f98 0x1250e52636eed438f884679df55d2911cf41764cf8b2da1bd22d29b0eb14f80e 0x000000000000000000000000abad6ec946eff02b22e4050b3209da87380b3cbd 0x0000000000000000000000000000000000000000000000000000000000000002 +317522 0xe881af13bf55c97562fe8d2da2f6ea8e3ff66f98 0x8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dba 0x0000000000000000000000001db3439a222c519ab44bb1144fc28167b4fa6ee6 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 0x0000000000000000000000000000000000000000000000000000000000000002 +317526 0xb4a953f12f7418ed498a782ba47e5a7f5967091c 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +317536 0xe881af13bf55c97562fe8d2da2f6ea8e3ff66f98 0x1250e52636eed438f884679df55d2911cf41764cf8b2da1bd22d29b0eb14f80e 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 0x0000000000000000000000000000000000000000000000000000000000000003 +317536 0xe881af13bf55c97562fe8d2da2f6ea8e3ff66f98 0x8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dba 0x0000000000000000000000001db3439a222c519ab44bb1144fc28167b4fa6ee6 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 0x0000000000000000000000000000000000000000000000000000000000000003 +317567 0xb4a953f12f7418ed498a782ba47e5a7f5967091c 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +317567 0xc630a71b2dfbcc621affd33257132b50adbe1cd0 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +317588 0xc630a71b2dfbcc621affd33257132b50adbe1cd0 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +317597 0xc630a71b2dfbcc621affd33257132b50adbe1cd0 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +317597 0xc630a71b2dfbcc621affd33257132b50adbe1cd0 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +317606 0xc630a71b2dfbcc621affd33257132b50adbe1cd0 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +317610 0xc630a71b2dfbcc621affd33257132b50adbe1cd0 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +317610 0xb4a953f12f7418ed498a782ba47e5a7f5967091c 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +317610 0xc630a71b2dfbcc621affd33257132b50adbe1cd0 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +317643 0xb4a953f12f7418ed498a782ba47e5a7f5967091c 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +317643 0x1c776e19850998177a7e33f6496c368bcabdce54 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +317646 0x1c776e19850998177a7e33f6496c368bcabdce54 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +317646 0xc630a71b2dfbcc621affd33257132b50adbe1cd0 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +317660 0xe881af13bf55c97562fe8d2da2f6ea8e3ff66f98 0x1250e52636eed438f884679df55d2911cf41764cf8b2da1bd22d29b0eb14f80e 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 0x0000000000000000000000000000000000000000000000000000000000000004 +317660 0xe881af13bf55c97562fe8d2da2f6ea8e3ff66f98 0x8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dba 0x0000000000000000000000001db3439a222c519ab44bb1144fc28167b4fa6ee6 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 0x0000000000000000000000000000000000000000000000000000000000000004 +317957 0x8465dac1172b6abe303bead4d06125aed72ea01c 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +318030 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +318032 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +318033 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0x1250e52636eed438f884679df55d2911cf41764cf8b2da1bd22d29b0eb14f80e 0x0000000000000000000000000000000000000000000000000000000000000000 0x0000000000000000000000005ed8cee6b63b1c6afce3ad7c92f4fd7e1b8fad9f +318033 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0x8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dba 0x0000000000000000000000001db3439a222c519ab44bb1144fc28167b4fa6ee6 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 0x0000000000000000000000000000000000000000000000000000000000000000 +318034 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +318036 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +318036 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +318063 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0x1250e52636eed438f884679df55d2911cf41764cf8b2da1bd22d29b0eb14f80e 0x0000000000000000000000000000000000000000000000000000000000000001 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 +318063 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0x8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dba 0x0000000000000000000000001db3439a222c519ab44bb1144fc28167b4fa6ee6 0x0000000000000000000000005ed8cee6b63b1c6afce3ad7c92f4fd7e1b8fad9f 0x0000000000000000000000000000000000000000000000000000000000000001 +318074 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0xcfa82ef0390c8f3e57ebe6c0665352a383667e792af012d350d9786ee5173d26 0x0000000000000000000000000000000000000000000000000000000000000000 0x0000000000000000000000001db3439a222c519ab44bb1144fc28167b4fa6ee6 +318074 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0xd73429fe3d5eae9e487e60af3e9befceddbdbd53695543a735e2d8face8269d3 0x0000000000000000000000000000000000000000000000000000000000000000 +318096 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0x1250e52636eed438f884679df55d2911cf41764cf8b2da1bd22d29b0eb14f80e 0x0000000000000000000000000000000000000000000000000000000000000002 0x0000000000000000000000005ed8cee6b63b1c6afce3ad7c92f4fd7e1b8fad9f +318096 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0x8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dba 0x0000000000000000000000001db3439a222c519ab44bb1144fc28167b4fa6ee6 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 0x0000000000000000000000000000000000000000000000000000000000000002 +318137 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +318528 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0x1250e52636eed438f884679df55d2911cf41764cf8b2da1bd22d29b0eb14f80e 0x0000000000000000000000000000000000000000000000000000000000000003 0x0000000000000000000000001db3439a222c519ab44bb1144fc28167b4fa6ee6 +318528 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0x8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dba 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 0x0000000000000000000000005ed8cee6b63b1c6afce3ad7c92f4fd7e1b8fad9f 0x0000000000000000000000000000000000000000000000000000000000000003 +318627 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0x1250e52636eed438f884679df55d2911cf41764cf8b2da1bd22d29b0eb14f80e 0x0000000000000000000000000000000000000000000000000000000000000004 0x0000000000000000000000005ed8cee6b63b1c6afce3ad7c92f4fd7e1b8fad9f +318627 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0x8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dba 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 0x0000000000000000000000001db3439a222c519ab44bb1144fc28167b4fa6ee6 0x0000000000000000000000000000000000000000000000000000000000000004 +318639 0x82afa2c4a686af9344e929f9821f3e8c6e9293ab 0x17af63cbc1fd2f415358d4edda52ede90159c09397285dcedaecb33c5a6d5e02 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 +318639 0x82afa2c4a686af9344e929f9821f3e8c6e9293ab 0x82add6dcb5f515082d024c78eb6496fd6d7e1a037e33403f23188b6c568336e8 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 +318650 0x82afa2c4a686af9344e929f9821f3e8c6e9293ab 0x82add6dcb5f515082d024c78eb6496fd6d7e1a037e33403f23188b6c568336e8 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 +318653 0x82afa2c4a686af9344e929f9821f3e8c6e9293ab 0xc0c8fdc5261cd471b4cf986e1dc55c83e67bab22ff35c3a1e32ab700b8b7eef7 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 +318904 0xc630a71b2dfbcc621affd33257132b50adbe1cd0 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +319523 0x7b6556b40a5a4d40118387495314f4445986239c 0x6c2b4666ba8da5a95717621d879a77de725f3d816709b9cbe9f059b8f875e284 +321346 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +321884 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +321900 0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +322038 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +322041 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +322043 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +322047 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +322048 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +322056 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +322059 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0x1250e52636eed438f884679df55d2911cf41764cf8b2da1bd22d29b0eb14f80e 0x0000000000000000000000000000000000000000000000000000000000000005 0x0000000000000000000000005ed8cee6b63b1c6afce3ad7c92f4fd7e1b8fad9f +322059 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0x8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dba 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 0x0000000000000000000000001db3439a222c519ab44bb1144fc28167b4fa6ee6 0x0000000000000000000000000000000000000000000000000000000000000005 +322083 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +322090 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +322108 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0xcfa82ef0390c8f3e57ebe6c0665352a383667e792af012d350d9786ee5173d26 0x0000000000000000000000000000000000000000000000000000000000000002 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 +322108 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0xd73429fe3d5eae9e487e60af3e9befceddbdbd53695543a735e2d8face8269d3 0x0000000000000000000000000000000000000000000000000000000000000002 +322121 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0xcfa82ef0390c8f3e57ebe6c0665352a383667e792af012d350d9786ee5173d26 0x0000000000000000000000000000000000000000000000000000000000000003 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 +322121 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0xd73429fe3d5eae9e487e60af3e9befceddbdbd53695543a735e2d8face8269d3 0x0000000000000000000000000000000000000000000000000000000000000003 +322121 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0xcfa82ef0390c8f3e57ebe6c0665352a383667e792af012d350d9786ee5173d26 0x0000000000000000000000000000000000000000000000000000000000000005 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 +322121 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0xd73429fe3d5eae9e487e60af3e9befceddbdbd53695543a735e2d8face8269d3 0x0000000000000000000000000000000000000000000000000000000000000005 +322122 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0xcfa82ef0390c8f3e57ebe6c0665352a383667e792af012d350d9786ee5173d26 0x0000000000000000000000000000000000000000000000000000000000000001 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 +322122 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0xd73429fe3d5eae9e487e60af3e9befceddbdbd53695543a735e2d8face8269d3 0x0000000000000000000000000000000000000000000000000000000000000001 +322128 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0xcfa82ef0390c8f3e57ebe6c0665352a383667e792af012d350d9786ee5173d26 0x0000000000000000000000000000000000000000000000000000000000000004 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 +322128 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0xd73429fe3d5eae9e487e60af3e9befceddbdbd53695543a735e2d8face8269d3 0x0000000000000000000000000000000000000000000000000000000000000004 +322454 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x63726f0000000000000000000000000000000000000000000000000000000000 +322509 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x63726f0000000000000000000000000000000000000000000000000000000000 0x000000000000000000000000d388d8671ac6edb904d91c1585dedbd6895b9ef8 +322509 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x63726f0000000000000000000000000000000000000000000000000000000000 +322550 0x8465dac1172b6abe303bead4d06125aed72ea01c 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +322749 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0x1250e52636eed438f884679df55d2911cf41764cf8b2da1bd22d29b0eb14f80e 0x0000000000000000000000000000000000000000000000000000000000000006 0x0000000000000000000000005ed8cee6b63b1c6afce3ad7c92f4fd7e1b8fad9f +322749 0x7e2d0fe0ffdd78c264f8d40d19acb7d04390c6e8 0x8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dba 0x000000000000000000000000d8da6bf26964af9d7eed9e03e53415d37aa96045 0x0000000000000000000000001db3439a222c519ab44bb1144fc28167b4fa6ee6 0x0000000000000000000000000000000000000000000000000000000000000006 +322750 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x41756374696f6e00000000000000000000000000000000000000000000000000 +322752 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x41756374696f6e00000000000000000000000000000000000000000000000000 0x000000000000000000000000fd5c601a0d48ad075724af920a83b907d24620dd +322752 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x41756374696f6e00000000000000000000000000000000000000000000000000 +322758 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4d6f727467616765000000000000000000000000000000000000000000000000 +322760 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x4d6f727467616765000000000000000000000000000000000000000000000000 0x000000000000000000000000f32d6e7a9ae9c3d59b642fcfa95c0f03c0706561 +322760 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4d6f727467616765000000000000000000000000000000000000000000000000 +322764 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x457363726f770000000000000000000000000000000000000000000000000000 +322765 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x457363726f770000000000000000000000000000000000000000000000000000 0x000000000000000000000000091a096c2c75cd3bd6a80a8104a4c71a6f028483 +322765 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x457363726f770000000000000000000000000000000000000000000000000000 +322767 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x47756172616e7465650000000000000000000000000000000000000000000000 +322768 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x47756172616e7465650000000000000000000000000000000000000000000000 0x000000000000000000000000439061363c1502dcb8ce7b08dab39b5aa321adf2 +322768 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x47756172616e7465650000000000000000000000000000000000000000000000 +322774 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x53616665436f6e74726163747300000000000000000000000000000000000000 +322776 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x53616665436f6e74726163747300000000000000000000000000000000000000 0x0000000000000000000000002e6bfa82463744c2b1254f119fa101bc924f6f0b +322776 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x53616665436f6e74726163747300000000000000000000000000000000000000 +322777 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x53616665436f6e74726163740000000000000000000000000000000000000000 +322777 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x53616665436f6e74726163740000000000000000000000000000000000000000 0x0000000000000000000000009a5cb02980fbae601ed890f01d38be76a47d8eeb +322777 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x53616665436f6e74726163740000000000000000000000000000000000000000 +324029 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +324316 0x4d8875b5058c6bf9db0fba172114299eaa476a9d 0x8f38ec1c60ec4afc7e3dd2c41a94c0983104d82de715c0212bbfe4aca17ea3fb +324318 0x4d8875b5058c6bf9db0fba172114299eaa476a9d 0x5b6450564c0cb96f02986ab222d919319391faea73418fec4158904af177cdeb +324322 0x4d8875b5058c6bf9db0fba172114299eaa476a9d 0x80bb6e5f203cdbe2810b6446806301f07413ca83c2a9c7b0c1cc5b89853a55dd +325807 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +326760 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x0000000000000000000000002b051365221244a2baefb07e7ac1a291893e0867 +326760 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x0000000000000000000000002b051365221244a2baefb07e7ac1a291893e0867 +327103 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +327105 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +327227 0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +327399 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +327399 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +327544 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +327544 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +327690 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x00000000000000000000000041c32b2f3c0e04b20d2c4f1605f0abc33c3cad67 +327690 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x00000000000000000000000041c32b2f3c0e04b20d2c4f1605f0abc33c3cad67 +328002 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x000000000000000000000000000000000000000000000000000000000000005b +328269 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +328529 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +328529 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +328585 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000d51059a3dedfa8032a64361a883a53e26ed6941c +328585 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000d51059a3dedfa8032a64361a883a53e26ed6941c +328870 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +328870 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +329480 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4368696e61000000000000000000000000000000000000000000000000000000 +329484 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x4368696e61000000000000000000000000000000000000000000000000000000 0x00000000000000000000000080f3a701a57961f57752397d24a45f87127c361a +329484 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4368696e61000000000000000000000000000000000000000000000000000000 +329485 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x00000000000000000000000076b0f6b32c66c317699067f2d938bcf669f380ce +329485 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x00000000000000000000000076b0f6b32c66c317699067f2d938bcf669f380ce +329491 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x00000000000000000000000076b0f6b32c66c317699067f2d938bcf669f380ce +329491 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x00000000000000000000000076b0f6b32c66c317699067f2d938bcf669f380ce +329513 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x00000000000000000000000076b0f6b32c66c317699067f2d938bcf669f380ce +329513 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x00000000000000000000000076b0f6b32c66c317699067f2d938bcf669f380ce +329519 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x00000000000000000000000076b0f6b32c66c317699067f2d938bcf669f380ce +329519 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x00000000000000000000000076b0f6b32c66c317699067f2d938bcf669f380ce +329659 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x5469636b65740000000000000000000000000000000000000000000000000000 +329659 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x5469636b65740000000000000000000000000000000000000000000000000000 0x0000000000000000000000009f26df964012d16fdea7485bd4b7042b3007e217 +329659 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x5469636b65740000000000000000000000000000000000000000000000000000 +329667 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x446174696e670000000000000000000000000000000000000000000000000000 +329668 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x446174696e670000000000000000000000000000000000000000000000000000 0x000000000000000000000000f5f5d1595aa8eca29cfdc9b62357f01c33d9bf20 +329668 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x446174696e670000000000000000000000000000000000000000000000000000 +329673 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x43616e6479000000000000000000000000000000000000000000000000000000 +329673 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x43616e6479000000000000000000000000000000000000000000000000000000 0x000000000000000000000000f41830acc2a73021ff1c3381ac570b95d79d21d0 +329673 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x43616e6479000000000000000000000000000000000000000000000000000000 +329740 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x000000000000000000000000000000000000000000000000000000000000005c +329749 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x57616c6c73747265657400000000000000000000000000000000000000000000 +329750 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x57616c6c73747265657400000000000000000000000000000000000000000000 0x0000000000000000000000002fed81f556a6f7478249fadbb68621467e21d38c +329750 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x57616c6c73747265657400000000000000000000000000000000000000000000 +329824 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x0000000000000000000000005c08761401d1a0904897c978787aa615a96e955c +329824 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x0000000000000000000000005c08761401d1a0904897c978787aa615a96e955c +329964 0xb8af70f84bfda39ccb2858f4fc54eca1b63dd519 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +330023 0xb8af70f84bfda39ccb2858f4fc54eca1b63dd519 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +330207 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000e0ed85f0cab17dba645bf4fe745ca29359c2c21b +330207 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000e0ed85f0cab17dba645bf4fe745ca29359c2c21b +330473 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x00000000000000000000000042244ccb6c7c889901960e60125ead7c2af685f8 +330473 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x00000000000000000000000042244ccb6c7c889901960e60125ead7c2af685f8 +330511 0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +330511 0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +330579 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000c550f754865b1ad138b660c9802ee8b039abb05b +330579 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000c550f754865b1ad138b660c9802ee8b039abb05b +330683 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000cffa3a1af763ccb260f4bf081f8a1bfddfdb89e0 +330683 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000cffa3a1af763ccb260f4bf081f8a1bfddfdb89e0 +330919 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000a4145a98b12b717078b96821124d781c563511ca +330919 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000a4145a98b12b717078b96821124d781c563511ca +331009 0x53bccda5dcacc0b10b7c4145b0aa6581330b8635 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +331542 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x0000000000000000000000003090aef28f1a9a4d1d9f9b8fc26d28ad1240214f +331542 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x0000000000000000000000003090aef28f1a9a4d1d9f9b8fc26d28ad1240214f +332007 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000aa3e4fd68c8fabd386fc571f9656e50dba5dd384 +332007 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000aa3e4fd68c8fabd386fc571f9656e50dba5dd384 +333256 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x0000000000000000000000009dca2265990b7ad9ac5c3a55157f1fc9d18381bc +333256 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x0000000000000000000000009dca2265990b7ad9ac5c3a55157f1fc9d18381bc +333294 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +333583 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000ff6c2227335eb7d5b29d86a8f78f35d4b9bafd3a +333583 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000ff6c2227335eb7d5b29d86a8f78f35d4b9bafd3a +333640 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000601ee21411eba5a5bc9d1c6298822a1a7b9e2286 +333640 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000601ee21411eba5a5bc9d1c6298822a1a7b9e2286 +334263 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000691ee952cf68d9abc488e42f5c1f95c020651333 +334263 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000691ee952cf68d9abc488e42f5c1f95c020651333 +334279 0xbd0edfbac386c9964f8f013d65d7dad5382d9cd7 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +334883 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x000000000000000000000000000000000000000000000000000000000000005d +334915 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x000000000000000000000000000000000000000000000000000000000000005e +334919 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x000000000000000000000000000000000000000000000000000000000000005f +334919 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x0000000000000000000000007d1ecf34b360f75280b83abc04f654ac99c7bd9c +334919 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x0000000000000000000000007d1ecf34b360f75280b83abc04f654ac99c7bd9c +335076 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000367a3da4c3aa4c4b9de2c01bdca8075593c7ff1e +335076 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000367a3da4c3aa4c4b9de2c01bdca8075593c7ff1e +335348 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x0000000000000000000000009d8048c450677dcd0b6c37c6a989a54a2a506a27 +335348 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x0000000000000000000000009d8048c450677dcd0b6c37c6a989a54a2a506a27 +335643 0x5f4c010748a890c8a28a4858fe7b07048d194380 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +335649 0x5f4c010748a890c8a28a4858fe7b07048d194380 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +335649 0x5f4c010748a890c8a28a4858fe7b07048d194380 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +335652 0x5f4c010748a890c8a28a4858fe7b07048d194380 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +335684 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000d80b5d0763ceaf00e3c457c54acc880a6317d057 +335684 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000d80b5d0763ceaf00e3c457c54acc880a6317d057 +336089 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000866d22bf02ad128c2e015a27ed39c7f5f0bd65f3 +336089 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000866d22bf02ad128c2e015a27ed39c7f5f0bd65f3 +336231 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336234 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336242 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336243 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336244 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336245 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336245 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336247 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336248 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336255 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336260 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336263 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336264 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336266 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336266 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336334 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336336 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336337 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336338 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336439 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336451 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336452 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336453 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336453 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336461 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336495 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336497 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336497 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336497 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336507 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336508 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336508 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336508 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336508 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336508 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336509 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336510 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336510 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336510 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336518 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336520 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336521 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336522 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336526 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336527 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336528 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336528 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336543 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +336543 0x5dc2e401e29ea16e51ebcecaef129c15fed5a5e8 0xd456720fd185d4060f5cea4d82775d2af95048c1e10f227ec35bae950a4be2a8 0x0000000000000000000000008674c218f0351a62c3ba78c34fd2182a93da94e2 +337012 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000f2c453692a6f46cffd30943fe9bee65cac3622d7 +337012 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000f2c453692a6f46cffd30943fe9bee65cac3622d7 +337642 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x456475636174696f6e0000000000000000000000000000000000000000000000 +337642 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x456475636174696f6e0000000000000000000000000000000000000000000000 0x00000000000000000000000002ef13dd4479f121b4636bc3d7ea9da774b3ed74 +337642 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x456475636174696f6e0000000000000000000000000000000000000000000000 +337647 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x50686f6e65000000000000000000000000000000000000000000000000000000 +337649 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x50686f6e65000000000000000000000000000000000000000000000000000000 0x0000000000000000000000003210743d3b82ec01338c50d64ce97de5e8ec94bb +337649 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x50686f6e65000000000000000000000000000000000000000000000000000000 +337653 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x506f6b6572000000000000000000000000000000000000000000000000000000 +337654 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x506f6b6572000000000000000000000000000000000000000000000000000000 0x000000000000000000000000d0dc4dac9c29cacd9dcd6d7f7ca97e04b0ba6e09 +337654 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x506f6b6572000000000000000000000000000000000000000000000000000000 +337655 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x50726f7065727479000000000000000000000000000000000000000000000000 +337656 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x50726f7065727479000000000000000000000000000000000000000000000000 0x00000000000000000000000097eb80f6d0777baa9bbcc8722b43e3e88d00efaf +337656 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x50726f7065727479000000000000000000000000000000000000000000000000 +337663 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x53616c6573000000000000000000000000000000000000000000000000000000 +337663 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x53616c6573000000000000000000000000000000000000000000000000000000 0x0000000000000000000000004ad03d890ef08dbae952527c829d0dde8d31c3b7 +337663 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x53616c6573000000000000000000000000000000000000000000000000000000 +337664 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4d61726b65740000000000000000000000000000000000000000000000000000 +337669 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x486f757365000000000000000000000000000000000000000000000000000000 +337672 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x486f757365000000000000000000000000000000000000000000000000000000 0x0000000000000000000000000ec0d6547c59c38a9105525f0c10ec4d4a0b1afb +337672 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x486f757365000000000000000000000000000000000000000000000000000000 +337731 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000f80675f372ff20d0a5f3bc82a51c8fb9fb5022cd +337731 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000f80675f372ff20d0a5f3bc82a51c8fb9fb5022cd +338275 0x9f918d46c929f12a229b6084566384ee26805b4d 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +338281 0x9f918d46c929f12a229b6084566384ee26805b4d 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +338336 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +338424 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x00000000000000000000000008a66d1381b139ec676e522aeab6fd82cc78567d +338424 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x00000000000000000000000008a66d1381b139ec676e522aeab6fd82cc78567d +338435 0x8056338e73fde306bb5d9aedec7f4a7b8637c9e7 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +338439 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x00000000000000000000000065e9201879e2a6ff7da133f0c573a8fe5d9da7ca +338439 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x00000000000000000000000065e9201879e2a6ff7da133f0c573a8fe5d9da7ca +338661 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +338661 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +338991 0x0e5e2b9341341ade98f510ad9a744e01f3b29f03 0x1cf7652f1f9289dc41763c5bd36534c9772d48aa26021274d212f227d4b69765 0x0000000000000000000000000000000000000000000000000000000000000060 +339173 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x00000000000000000000000049f47bc027e273e21f46000c49971919b3e15773 +339173 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x00000000000000000000000049f47bc027e273e21f46000c49971919b3e15773 +339369 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x0000000000000000000000000000000000000000000000000000000000000060 +339427 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000f3b83292f3e56f4aec1e3c44128d0f1a9d824559 +339427 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000f3b83292f3e56f4aec1e3c44128d0f1a9d824559 +340633 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x42697447656d7300000000000000000000000000000000000000000000000000 +340635 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x42697447656d7300000000000000000000000000000000000000000000000000 0x000000000000000000000000c34f6222062c65e35d4b0fc26d718738582118a6 +340635 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x42697447656d7300000000000000000000000000000000000000000000000000 +340653 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4469616d6f6e6473000000000000000000000000000000000000000000000000 +340658 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x4469616d6f6e6473000000000000000000000000000000000000000000000000 0x0000000000000000000000004e971507462271eadb8aac0d20312099f6d52947 +340658 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4469616d6f6e6473000000000000000000000000000000000000000000000000 +340674 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x476f6c6400000000000000000000000000000000000000000000000000000000 +340675 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x476f6c6400000000000000000000000000000000000000000000000000000000 0x000000000000000000000000eb26edf39a4ad0a3b8d6a9804b4e2a7b47d3017b +340675 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x476f6c6400000000000000000000000000000000000000000000000000000000 +340685 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4469676978000000000000000000000000000000000000000000000000000000 +340686 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x4469676978000000000000000000000000000000000000000000000000000000 0x0000000000000000000000000b3765d911cbf67fd92f4d3e5cc25211ddc743de +340686 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4469676978000000000000000000000000000000000000000000000000000000 +340700 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x426f617264726f6f6d0000000000000000000000000000000000000000000000 +340700 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x426f617264726f6f6d0000000000000000000000000000000000000000000000 0x000000000000000000000000c8cfec0ee1d4802daaae1bebb07aa7c44931e633 +340700 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x426f617264726f6f6d0000000000000000000000000000000000000000000000 +340708 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x45786368616e6765000000000000000000000000000000000000000000000000 +340710 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x45786368616e6765000000000000000000000000000000000000000000000000 0x0000000000000000000000005492f79ca66506bc751862ba35a9121d8b28532d +340710 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x45786368616e6765000000000000000000000000000000000000000000000000 +340712 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x426974636f696e00000000000000000000000000000000000000000000000000 +340713 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x426974636f696e00000000000000000000000000000000000000000000000000 0x000000000000000000000000a9033165b71f08ac82c53d5f982b463ca5301c15 +340713 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x426974636f696e00000000000000000000000000000000000000000000000000 +340718 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x426974636f696e73000000000000000000000000000000000000000000000000 +340719 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x426974636f696e73000000000000000000000000000000000000000000000000 0x000000000000000000000000f301f8e2cc1bab42ced9902f1fcd1a25303823db +340719 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x426974636f696e73000000000000000000000000000000000000000000000000 +340727 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4d61696c00000000000000000000000000000000000000000000000000000000 +340727 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x4d61696c00000000000000000000000000000000000000000000000000000000 0x0000000000000000000000004143c2f1563da14b2c09559ef5144b4c6ca268fe +340727 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x4d61696c00000000000000000000000000000000000000000000000000000000 +340728 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x456d61696c000000000000000000000000000000000000000000000000000000 +340835 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +340988 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x0000000000000000000000008db600d7c92b0182ec527d8972d9e4d67d82e62a +340988 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x0000000000000000000000008db600d7c92b0182ec527d8972d9e4d67d82e62a +341695 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000351be7a8b083e7e3e3c16744a1fea3420064f60a +341695 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000351be7a8b083e7e3e3c16744a1fea3420064f60a +341985 0xbda7aeb6d2002efe360b6467275ef01e77d15497 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +341997 0xbda7aeb6d2002efe360b6467275ef01e77d15497 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +342001 0xbda7aeb6d2002efe360b6467275ef01e77d15497 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +342004 0xbda7aeb6d2002efe360b6467275ef01e77d15497 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +342004 0xbda7aeb6d2002efe360b6467275ef01e77d15497 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +342007 0xbda7aeb6d2002efe360b6467275ef01e77d15497 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +342007 0xbda7aeb6d2002efe360b6467275ef01e77d15497 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +342008 0xbda7aeb6d2002efe360b6467275ef01e77d15497 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +342026 0xc630a71b2dfbcc621affd33257132b50adbe1cd0 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +342026 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +342027 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +342027 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +342033 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +342035 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +342036 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +342041 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +342047 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +342047 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +342047 0xbda7aeb6d2002efe360b6467275ef01e77d15497 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +342053 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +342053 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +342080 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +342080 0xfe8ad7dd2f564a877cc23feea6c0a9cc2e783715 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +342080 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +342101 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +342107 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +342107 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +342111 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +342111 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +342115 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +342118 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +342118 0xfe8ad7dd2f564a877cc23feea6c0a9cc2e783715 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +342125 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +342125 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +342140 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b +342141 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +342145 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +342145 0xfe8ad7dd2f564a877cc23feea6c0a9cc2e783715 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +342145 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +342162 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +342162 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +342173 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +342173 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +342188 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +342188 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +342272 0x65eb93c4e0854e3b00a64cd18c176a7fd54dc50f 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +342386 0x65eb93c4e0854e3b00a64cd18c176a7fd54dc50f 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +342386 0x8056338e73fde306bb5d9aedec7f4a7b8637c9e7 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +342399 0x65eb93c4e0854e3b00a64cd18c176a7fd54dc50f 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +342466 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x00000000000000000000000014a986e0b8943efe13e2f3514878dcd1fe08a677 +342466 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x00000000000000000000000014a986e0b8943efe13e2f3514878dcd1fe08a677 +342601 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +342601 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +342616 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b +342618 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b +342924 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000144c12d635ded35f0e0576564b95cf08045cb3ee +342924 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000144c12d635ded35f0e0576564b95cf08045cb3ee +342964 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000c36d3ccea8fb30b8f2c66af05bc3b5433d59168d +342964 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000c36d3ccea8fb30b8f2c66af05bc3b5433d59168d +343006 0x4bcd0591897025a0c42d500b4c37b11de6d96a3c 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +343021 0x4bcd0591897025a0c42d500b4c37b11de6d96a3c 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +343059 0xcf8470d3388a198418e02aaf8e37392cfbc18867 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +343079 0xcf8470d3388a198418e02aaf8e37392cfbc18867 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +343079 0xcf8470d3388a198418e02aaf8e37392cfbc18867 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +343083 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x0000000000000000000000006fa4aa0d8ce57b5325b1d04708db281bbe95b23b +343083 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x0000000000000000000000006fa4aa0d8ce57b5325b1d04708db281bbe95b23b +343133 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +343162 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x0000000000000000000000000000000000000000000000000000000000000061 +343185 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x0000000000000000000000000000000000000000000000000000000000000062 +343339 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000b9e893dc7da0b5b3eb9678d4860fb885f92be9cf +343339 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000b9e893dc7da0b5b3eb9678d4860fb885f92be9cf +343946 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +343966 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +343971 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +344121 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x0000000000000000000000002b051365221244a2baefb07e7ac1a291893e0867 +344121 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x0000000000000000000000002b051365221244a2baefb07e7ac1a291893e0867 +344164 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x0000000000000000000000002b051365221244a2baefb07e7ac1a291893e0867 +344164 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x0000000000000000000000002b051365221244a2baefb07e7ac1a291893e0867 +344839 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x0000000000000000000000001c3b909facd70e74c5697f1329c2d0cc0dd5ac3e +344839 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x0000000000000000000000001c3b909facd70e74c5697f1329c2d0cc0dd5ac3e +345506 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +346112 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +346112 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +346392 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +346395 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +346398 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +346425 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +346448 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +346451 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +346454 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +346464 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +346466 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +347014 0xd2d8d510980ef02fb2c3b79479d9b57d3bc7e2e7 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +347301 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000848e4dc353b9962471cd6506adc206f001e15fec +347301 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000848e4dc353b9962471cd6506adc206f001e15fec +347333 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000848e4dc353b9962471cd6506adc206f001e15fec +347333 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000848e4dc353b9962471cd6506adc206f001e15fec +347613 0xad8d3a5d2d92eb14bb56ca9f380be35b8efe0c04 0x4c13017ee95afc4bbd8a701dd9fbc9733f1f09f5a1b5438b5b9abd48e4c92d78 0x5858585858585858580000000000000000000000000000000000000000000000 0x0000000000000000000000000075f6703dad72b3e89f3243b2666a7f1bd815c0 +347700 0xebd81a08ded0efaba8ef51924fb967b64aa85399 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +347705 0xebd81a08ded0efaba8ef51924fb967b64aa85399 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +347711 0xebd81a08ded0efaba8ef51924fb967b64aa85399 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +347711 0xebd81a08ded0efaba8ef51924fb967b64aa85399 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +347853 0xebd81a08ded0efaba8ef51924fb967b64aa85399 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +347953 0xebd81a08ded0efaba8ef51924fb967b64aa85399 0xc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b +347958 0xebd81a08ded0efaba8ef51924fb967b64aa85399 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +347958 0xebd81a08ded0efaba8ef51924fb967b64aa85399 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +347960 0xebd81a08ded0efaba8ef51924fb967b64aa85399 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +347960 0xebd81a08ded0efaba8ef51924fb967b64aa85399 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +348019 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +348244 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000fae49cd796d28e8eca3fd701f86864940270a6fe +348244 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000fae49cd796d28e8eca3fd701f86864940270a6fe +348443 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x0000000000000000000000001819c2a9ff0b2ebdc677b6e8f4ee5c2bd6b73dae +348443 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x0000000000000000000000001819c2a9ff0b2ebdc677b6e8f4ee5c2bd6b73dae +348675 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000fc039dc8cdba96ab8ceb01c972375b71ddcc6b2e +348675 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000fc039dc8cdba96ab8ceb01c972375b71ddcc6b2e +348743 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +348936 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000b3303a4f7ef21aed2325856caa14417e91ee5404 +348936 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000b3303a4f7ef21aed2325856caa14417e91ee5404 +350544 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +351473 0xebd81a08ded0efaba8ef51924fb967b64aa85399 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +353157 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +353181 0xf01d37496e1ad7f30bdc17f0dd55b7b19e53f767 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +353196 0xf01d37496e1ad7f30bdc17f0dd55b7b19e53f767 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +353196 0xf01d37496e1ad7f30bdc17f0dd55b7b19e53f767 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +353273 0xf01d37496e1ad7f30bdc17f0dd55b7b19e53f767 0xc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b +353276 0xf01d37496e1ad7f30bdc17f0dd55b7b19e53f767 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +353359 0xe2d560cc321a4e09e182693d45a3836ffd27a1bd 0x302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c +353359 0xfd5ff05cb15b2e8cddd0e96912a5dee8044b9374 0x302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c +353360 0x991c5b56fffb2e45444b5fc5be9304ac9576849b 0x302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c +353361 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x0000000000000000000000000000000000000000000000000000000000000063 +353367 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x0000000000000000000000000000000000000000000000000000000000000064 +353370 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x0000000000000000000000000000000000000000000000000000000000000065 +353438 0x52c6b42c37818ee7d562b52396685710b19801ec 0x302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c +353438 0xf9da1908cc2280578b2639e3a4576dc77624868b 0x302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c +353443 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x0000000000000000000000000000000000000000000000000000000000000066 +353447 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x0000000000000000000000000000000000000000000000000000000000000067 +353479 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000aadd74f71770fbef7325860bce13cff05e3ad1c9 +353479 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000aadd74f71770fbef7325860bce13cff05e3ad1c9 +354071 0x36290e3f7c0e074a9e80cd6eb2f36b77411c19d7 0xa192e48a82f18ef1c93e722713426e5733e98d5b2858ba5c7457faf4a8297dab 0x000000000000000000000000b834e3edfc1a927bdcecb67a9d0eccbd752a5bb3 0x0000000000000000000000000000000000000000000000000000000000056917 +354151 0xdb15058402c241b04a03846f6fb104b1fbeea10b 0x5ca1bad5a7f3ee229aa045a13d9936a9a5f7f70067a0e39bdb8a6c0086b1544c 0xb56c4a1a61178e44bb3c424e54fccd7a48926c8ee43735cfa297f51c116344f1 +354162 0xdb15058402c241b04a03846f6fb104b1fbeea10b 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62 0x000000000000000000000000d3cda913deb6f67967b99d67acdfa1712c293601 0x000000000000000000000000afbc7cedd81c694e8033b101a0b49bfc1e5176e2 +354233 0xdb15058402c241b04a03846f6fb104b1fbeea10b 0xed1062ba7ed13514b41ef115d3c324f50dcd644da75ee5659e9ae97071774f1e 0x000000000000000000000000b834e3edfc1a927bdcecb67a9d0eccbd752a5bb3 0xb56c4a1a61178e44bb3c424e54fccd7a48926c8ee43735cfa297f51c116344f1 +354585 0xdb15058402c241b04a03846f6fb104b1fbeea10b 0x884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364 0x000000000000000000000000afbc7cedd81c694e8033b101a0b49bfc1e5176e2 +354866 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x0000000000000000000000009b75587d8d49477de8b6e845ccb40d970bf8701a +354866 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x0000000000000000000000009b75587d8d49477de8b6e845ccb40d970bf8701a +356461 0x84be9f9c3e3dc0721d628a3b8ef55fbe096c0495 0x0000000000000000000000000000000000000000000000000000000000000060 +356488 0xf0ea74d3e2743e880dcf12e731d6bdd5788a548c 0xf2fb068683a2e3c90600f0aab753f44a2340e65156afd0f69518d72b55354ece 0x0000000000000000000000000000000000000000000000000000000000000060 +356513 0x69e3eab0a888f72c161d1f2e4e97eb8f0089af88 0x3fbfa2086703ed2c0e6065c0a6d81aa1ffdf01229d542d9f132b6696db6c66f1 0x9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658 +356526 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +356535 0xaf40044f727b3975174ed30d21a850b2f8619f11 0x7465737400000000000000000000000000000000000000000000000000000000 +356543 0xaf40044f727b3975174ed30d21a850b2f8619f11 0x3963323266663566323166306238316231313365363366376462366461393466 +357195 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +357195 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +357579 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +357588 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +357590 0xcf8470d3388a198418e02aaf8e37392cfbc18867 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +357590 0xcf8470d3388a198418e02aaf8e37392cfbc18867 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +357592 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +357600 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +357622 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +357630 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +358290 0xfe8ad7dd2f564a877cc23feea6c0a9cc2e783715 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +358290 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +358426 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +358556 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +358556 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +358811 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000b76246acebd335e1af9e2073f684ff6c555816c6 +358811 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000b76246acebd335e1af9e2073f684ff6c555816c6 +359114 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +359114 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +359375 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x0000000000000000000000000000000000000000000000000000000000000068 +359378 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x0000000000000000000000000000000000000000000000000000000000000069 +359378 0x4d6387f3b967da39b11de111158d49754c31985d 0x2dba1d9e78f3192742fc9d510383d669fe8a4fa03d039bd7382ef67119078af7 0x0000000000000000000000000000000000000000000000000000000000000012 +359538 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x000000000000000000000000000000000000000000000000000000000000006a +361585 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +361585 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +361588 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +361588 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +361732 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x00000000000000000000000030d9803d6754bd9ad6d3a9990ca7a07af8745d5a +361732 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x00000000000000000000000030d9803d6754bd9ad6d3a9990ca7a07af8745d5a +361757 0xcf8470d3388a198418e02aaf8e37392cfbc18867 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +361757 0xcf8470d3388a198418e02aaf8e37392cfbc18867 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +361775 0xcf8470d3388a198418e02aaf8e37392cfbc18867 0xc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b +362002 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x00000000000000000000000013a85703f391b8c9abb8068be03ff4d6aebd11eb +362002 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x00000000000000000000000013a85703f391b8c9abb8068be03ff4d6aebd11eb +365791 0xfd5ff05cb15b2e8cddd0e96912a5dee8044b9374 0x302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c +365793 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x000000000000000000000000000000000000000000000000000000000000006b +369141 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x0000000000000000000000006407c4286dc1c84aab28720eea596212c026450e +369141 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x0000000000000000000000006407c4286dc1c84aab28720eea596212c026450e +369239 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +369249 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +369253 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +369259 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +369261 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +369263 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +369274 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +369426 0xe2d560cc321a4e09e182693d45a3836ffd27a1bd 0x302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c +369426 0xfd5ff05cb15b2e8cddd0e96912a5dee8044b9374 0x302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c +369428 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x000000000000000000000000000000000000000000000000000000000000006c +369428 0x4d6387f3b967da39b11de111158d49754c31985d 0x2dba1d9e78f3192742fc9d510383d669fe8a4fa03d039bd7382ef67119078af7 0x0000000000000000000000000000000000000000000000000000000000000013 +369431 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x000000000000000000000000000000000000000000000000000000000000006d +369538 0xfd5ff05cb15b2e8cddd0e96912a5dee8044b9374 0x302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c +369540 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x000000000000000000000000000000000000000000000000000000000000006e +370399 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x00000000000000000000000071dcbc554dada022fdd31333f8883e953240f0b0 +370399 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x00000000000000000000000071dcbc554dada022fdd31333f8883e953240f0b0 +370517 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +370517 0x36517ccf7a16266de8b7cbd60db1f45a23f1eaf1 0x0cee94601ab1f1d758b126c873d5328735356f811c80bdf6af62fe2534db51b6 +370545 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +370545 0x36517ccf7a16266de8b7cbd60db1f45a23f1eaf1 0x0cee94601ab1f1d758b126c873d5328735356f811c80bdf6af62fe2534db51b6 +371190 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +371280 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +371286 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +371288 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +371299 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +371307 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +371327 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +371327 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +371329 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +371352 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +371360 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +371362 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +371369 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +371378 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +371378 0x36517ccf7a16266de8b7cbd60db1f45a23f1eaf1 0x0cee94601ab1f1d758b126c873d5328735356f811c80bdf6af62fe2534db51b6 +371450 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +371450 0x36517ccf7a16266de8b7cbd60db1f45a23f1eaf1 0x0cee94601ab1f1d758b126c873d5328735356f811c80bdf6af62fe2534db51b6 +371489 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +371489 0xd53096b3cf64d4739bb774e0f055653e7f2cd710 0x0cee94601ab1f1d758b126c873d5328735356f811c80bdf6af62fe2534db51b6 +371509 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +371509 0xd53096b3cf64d4739bb774e0f055653e7f2cd710 0x0cee94601ab1f1d758b126c873d5328735356f811c80bdf6af62fe2534db51b6 +371532 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +371658 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +371658 0xd53096b3cf64d4739bb774e0f055653e7f2cd710 0x0cee94601ab1f1d758b126c873d5328735356f811c80bdf6af62fe2534db51b6 +371660 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +371876 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +371876 0xd53096b3cf64d4739bb774e0f055653e7f2cd710 0x0cee94601ab1f1d758b126c873d5328735356f811c80bdf6af62fe2534db51b6 +371904 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +371904 0xd53096b3cf64d4739bb774e0f055653e7f2cd710 0x0cee94601ab1f1d758b126c873d5328735356f811c80bdf6af62fe2534db51b6 +371906 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +371912 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +371912 0xd53096b3cf64d4739bb774e0f055653e7f2cd710 0x0cee94601ab1f1d758b126c873d5328735356f811c80bdf6af62fe2534db51b6 +371914 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +371918 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +371918 0xd53096b3cf64d4739bb774e0f055653e7f2cd710 0x0cee94601ab1f1d758b126c873d5328735356f811c80bdf6af62fe2534db51b6 +371931 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +371931 0xd53096b3cf64d4739bb774e0f055653e7f2cd710 0x0cee94601ab1f1d758b126c873d5328735356f811c80bdf6af62fe2534db51b6 +371933 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +371938 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +371938 0xd53096b3cf64d4739bb774e0f055653e7f2cd710 0x0cee94601ab1f1d758b126c873d5328735356f811c80bdf6af62fe2534db51b6 +371940 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +371973 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +371973 0xd53096b3cf64d4739bb774e0f055653e7f2cd710 0x0cee94601ab1f1d758b126c873d5328735356f811c80bdf6af62fe2534db51b6 +372006 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +372006 0xd53096b3cf64d4739bb774e0f055653e7f2cd710 0x0cee94601ab1f1d758b126c873d5328735356f811c80bdf6af62fe2534db51b6 +372014 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +372847 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +374209 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +374225 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +374365 0xfe8ad7dd2f564a877cc23feea6c0a9cc2e783715 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +374388 0x7fb091d48426f54f6fb8d1a43f8e33f80454f4e3 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +375079 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +375079 0xd53096b3cf64d4739bb774e0f055653e7f2cd710 0x0cee94601ab1f1d758b126c873d5328735356f811c80bdf6af62fe2534db51b6 +375093 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +375401 0x4bca74810cc4917a7dee954d21221b72fd87d3d7 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +375440 0x4bca74810cc4917a7dee954d21221b72fd87d3d7 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +375447 0x4bca74810cc4917a7dee954d21221b72fd87d3d7 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +376493 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +376573 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +376588 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +376644 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +376650 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +376668 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +376906 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +377026 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +377026 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +377139 0xf01d37496e1ad7f30bdc17f0dd55b7b19e53f767 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +377139 0xf01d37496e1ad7f30bdc17f0dd55b7b19e53f767 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +377506 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +377523 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +377523 0xd53096b3cf64d4739bb774e0f055653e7f2cd710 0x0cee94601ab1f1d758b126c873d5328735356f811c80bdf6af62fe2534db51b6 +377525 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +377581 0xfd5ff05cb15b2e8cddd0e96912a5dee8044b9374 0x302777af5d26fab9dd5120c5f1307c65193ebc51daf33244ada4365fab10602c +377586 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x000000000000000000000000000000000000000000000000000000000000006f +377608 0x8465dac1172b6abe303bead4d06125aed72ea01c 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +377627 0xf01d37496e1ad7f30bdc17f0dd55b7b19e53f767 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +377627 0xf01d37496e1ad7f30bdc17f0dd55b7b19e53f767 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +377629 0xf01d37496e1ad7f30bdc17f0dd55b7b19e53f767 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +377629 0xf01d37496e1ad7f30bdc17f0dd55b7b19e53f767 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +377703 0xf01d37496e1ad7f30bdc17f0dd55b7b19e53f767 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +377703 0xf01d37496e1ad7f30bdc17f0dd55b7b19e53f767 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +377730 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +377730 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +377746 0xf01d37496e1ad7f30bdc17f0dd55b7b19e53f767 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +377877 0xfe8ad7dd2f564a877cc23feea6c0a9cc2e783715 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +377877 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +377894 0xb4a953f12f7418ed498a782ba47e5a7f5967091c 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +377905 0xfe8ad7dd2f564a877cc23feea6c0a9cc2e783715 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +377905 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +377917 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +377917 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +377922 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +377922 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +377925 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +378345 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +378345 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +378347 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +378347 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +379027 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x0000000000000000000000000000000000000000000000000000000000000070 +379032 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x0000000000000000000000000000000000000000000000000000000000000071 +379039 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x0000000000000000000000000000000000000000000000000000000000000072 +379158 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x77656c6661726500000000000000000000000000000000000000000000000000 +379161 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x77656c6661726500000000000000000000000000000000000000000000000000 0x000000000000000000000000266d8a3bfa7536f3f921da30824e47c561dd66cc +379161 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x77656c6661726500000000000000000000000000000000000000000000000000 +379163 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x736f636965747900000000000000000000000000000000000000000000000000 +379164 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x736f636965747900000000000000000000000000000000000000000000000000 0x000000000000000000000000435a8f8bbed708ca75aa1c8ca7091fa1a3c03782 +379164 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x736f636965747900000000000000000000000000000000000000000000000000 +379167 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x6461707000000000000000000000000000000000000000000000000000000000 +379170 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +379171 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x6461707000000000000000000000000000000000000000000000000000000000 0x000000000000000000000000f81f0d1f4cacb0a419dba6fa897a121f61347c84 +379171 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x6461707000000000000000000000000000000000000000000000000000000000 +379172 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x6e6574776f726b00000000000000000000000000000000000000000000000000 +379176 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x6e6574776f726b00000000000000000000000000000000000000000000000000 0x00000000000000000000000030ce983f55cfa6742a1270e263ff33010fb82790 +379176 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x6e6574776f726b00000000000000000000000000000000000000000000000000 +379180 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x7765697472616465720000000000000000000000000000000000000000000000 +379182 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x7765697472616465720000000000000000000000000000000000000000000000 0x00000000000000000000000003477c75a6b22c58f8e65ecfb97219541c16aacf +379182 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x7765697472616465720000000000000000000000000000000000000000000000 +379210 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x7065657200000000000000000000000000000000000000000000000000000000 +379212 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x7065657200000000000000000000000000000000000000000000000000000000 0x000000000000000000000000a5fcbfe7e0fe1a8f97772e3ff2433df651c3cd40 +379212 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x7065657200000000000000000000000000000000000000000000000000000000 +379214 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x6c65646765720000000000000000000000000000000000000000000000000000 +379216 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x6c65646765720000000000000000000000000000000000000000000000000000 0x0000000000000000000000001bfa9c5206cf2f2d6218468200da6a6b2488f5f1 +379216 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x6c65646765720000000000000000000000000000000000000000000000000000 +379217 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x6964656e74697479000000000000000000000000000000000000000000000000 +379219 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x6964656e74697479000000000000000000000000000000000000000000000000 0x000000000000000000000000420ec54a21967d9813cd184fa32783b61897b097 +379219 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x6964656e74697479000000000000000000000000000000000000000000000000 +379220 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x72657075746174696f6e00000000000000000000000000000000000000000000 +379224 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x72657075746174696f6e00000000000000000000000000000000000000000000 0x000000000000000000000000d9b2f59f3b5c7b3c67047d2f03c3e8052470be92 +379224 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x72657075746174696f6e00000000000000000000000000000000000000000000 +379235 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x6c6f747465727900000000000000000000000000000000000000000000000000 +379237 0x33990122638b9132ca29c723bdf037f1a891a70c 0xf63780e752c6a54a94fc52715dbc5518a3b4c3c2833d301a204226548a2a8545 0x6c6f747465727900000000000000000000000000000000000000000000000000 0x0000000000000000000000001f6cc3f7c927e1196c03ac49c5aff0d39c9d103d +379237 0x33990122638b9132ca29c723bdf037f1a891a70c 0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc 0x6c6f747465727900000000000000000000000000000000000000000000000000 +381271 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +381271 0xd53096b3cf64d4739bb774e0f055653e7f2cd710 0x0cee94601ab1f1d758b126c873d5328735356f811c80bdf6af62fe2534db51b6 +381276 0x6acc9a6876739e9190d06463196e27b6d37405c6 0xf7eba460ce397de720ba4749bd9c125fec27d45ef68e15fffe706e8c211a7f5c +381689 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +382200 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x0000000000000000000000000000000000000000000000000000000000000073 +382217 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x0000000000000000000000000000000000000000000000000000000000000074 +382644 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000848e4dc353b9962471cd6506adc206f001e15fec +382644 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000848e4dc353b9962471cd6506adc206f001e15fec +383284 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +383337 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +383354 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +383361 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +383427 0xad8d3a5d2d92eb14bb56ca9f380be35b8efe0c04 0x19dacbf83c5de6658e14cbf7bcae5c15eca2eedecf1c66fbca928e4d351bea0f 0x000000000000000000000000f44058ffe3b8e3a6344e95a7dba8929d5b94bae2 0x4141414141494948490000000000000000000000000000000000000000000000 +383466 0x7f1d234e281ff8421b2b0650a9b8f85b5d73bd59 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +383469 0x51b6b4f5b270fa093198a984c3fce5ea607a94e7 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +383515 0xad8d3a5d2d92eb14bb56ca9f380be35b8efe0c04 0x19dacbf83c5de6658e14cbf7bcae5c15eca2eedecf1c66fbca928e4d351bea0f 0x000000000000000000000000f44058ffe3b8e3a6344e95a7dba8929d5b94bae2 0x4141414141494948490000000000000000000000000000000000000000000000 +383519 0x5067247f2214dca445bfb213277b5f19711e309f 0x6e7287b110b0d2f738952766cb4d4281ce49164b34e66493ebaf76c6c75c0adf +383630 0x513d9cfdf8c3f7c08006a4828e9319bafff2e556 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +383760 0xfe8ad7dd2f564a877cc23feea6c0a9cc2e783715 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +383802 0x04a163c9e3cadc6341ac0340403b42c83e384832 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +383815 0xfe8ad7dd2f564a877cc23feea6c0a9cc2e783715 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +383815 0xce4484b6d988a27ec9da967f84320c89194dd56b 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +383844 0x285b28d0c11c5bd3a039f3c26c887e2f8f177dc6 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +383852 0xfe8ad7dd2f564a877cc23feea6c0a9cc2e783715 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +383852 0xbf871ee17553ca56382a0dda5256760a0a979e62 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +383859 0xbf871ee17553ca56382a0dda5256760a0a979e62 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +383859 0xbf871ee17553ca56382a0dda5256760a0a979e62 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +383864 0xbf871ee17553ca56382a0dda5256760a0a979e62 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +383864 0xbf871ee17553ca56382a0dda5256760a0a979e62 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +383968 0xf01d37496e1ad7f30bdc17f0dd55b7b19e53f767 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +383968 0xf01d37496e1ad7f30bdc17f0dd55b7b19e53f767 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +383973 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +384127 0xad8d3a5d2d92eb14bb56ca9f380be35b8efe0c04 0x19dacbf83c5de6658e14cbf7bcae5c15eca2eedecf1c66fbca928e4d351bea0f 0x000000000000000000000000f44058ffe3b8e3a6344e95a7dba8929d5b94bae2 0x4141414141494948490000000000000000000000000000000000000000000000 +384138 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +384149 0x285b28d0c11c5bd3a039f3c26c887e2f8f177dc6 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +384173 0x285b28d0c11c5bd3a039f3c26c887e2f8f177dc6 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +384173 0x81e4c09f8d140521e2265b42d99fc2fb868a5b14 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +384301 0x03131e9dc0d42f57c92c3ae39e79a9abac75d9bb 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +384422 0x4e96c7985c2f260ae9fdd12fd7f78364f16af2ce 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +384506 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +384511 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +384546 0xad8d3a5d2d92eb14bb56ca9f380be35b8efe0c04 0x19dacbf83c5de6658e14cbf7bcae5c15eca2eedecf1c66fbca928e4d351bea0f 0x000000000000000000000000f44058ffe3b8e3a6344e95a7dba8929d5b94bae2 0x4141414141494948490000000000000000000000000000000000000000000000 +384771 0xac4df82fe37ea2187bc8c011a23d743b4f39019a 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +384825 0xac4df82fe37ea2187bc8c011a23d743b4f39019a 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +384861 0x9dfb24cf9ef6b885a7d130b5a92002985954b8e6 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +384917 0x4e96c7985c2f260ae9fdd12fd7f78364f16af2ce 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +384923 0xe291a9e17fd310b860f665dbdd8375144bdd6ecd 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +384965 0xc833e49ac9d0315778d616cbb583a8b1b3bf2d73 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +385067 0x3a360d9e2919714547623e4bc9504242b816d2d8 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +385073 0x3a360d9e2919714547623e4bc9504242b816d2d8 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +385356 0xe291a9e17fd310b860f665dbdd8375144bdd6ecd 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +385356 0xc833e49ac9d0315778d616cbb583a8b1b3bf2d73 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +386571 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +386620 0xdcf421d093428b096ca501a7cd1a740855a7976f +386736 0xa8637b2df8ca339818314b7def756ed19ae4d5e3 0x722f20d265a4f5c6387c6ce92203442cdcb6d30b5e188f3649f0d5cbdf9d87fb 0x0000000000000000000000000000000000000000000000000000000000000000 +386786 0xa8637b2df8ca339818314b7def756ed19ae4d5e3 0x722f20d265a4f5c6387c6ce92203442cdcb6d30b5e188f3649f0d5cbdf9d87fb 0x0000000000000000000000000000000000000000000000000000000000000001 +386795 0xa8637b2df8ca339818314b7def756ed19ae4d5e3 0x722f20d265a4f5c6387c6ce92203442cdcb6d30b5e188f3649f0d5cbdf9d87fb 0x0000000000000000000000000000000000000000000000000000000000000002 +386804 0xa8637b2df8ca339818314b7def756ed19ae4d5e3 0x722f20d265a4f5c6387c6ce92203442cdcb6d30b5e188f3649f0d5cbdf9d87fb 0x0000000000000000000000000000000000000000000000000000000000000003 +386812 0xa8637b2df8ca339818314b7def756ed19ae4d5e3 0x722f20d265a4f5c6387c6ce92203442cdcb6d30b5e188f3649f0d5cbdf9d87fb 0x0000000000000000000000000000000000000000000000000000000000000004 +386818 0xa8637b2df8ca339818314b7def756ed19ae4d5e3 0x722f20d265a4f5c6387c6ce92203442cdcb6d30b5e188f3649f0d5cbdf9d87fb 0x0000000000000000000000000000000000000000000000000000000000000005 +386899 0xa8637b2df8ca339818314b7def756ed19ae4d5e3 0x722f20d265a4f5c6387c6ce92203442cdcb6d30b5e188f3649f0d5cbdf9d87fb 0x0000000000000000000000000000000000000000000000000000000000000006 +386939 0x523c43c44671e34c1e7a9a619420b191fb009db1 0x722f20d265a4f5c6387c6ce92203442cdcb6d30b5e188f3649f0d5cbdf9d87fb 0x0000000000000000000000000000000000000000000000000000000000000000 +386945 0x7ff1fa4c4bb95760dda000b5856bc22db681e989 0x0000000000000000000000000000000000000000000000000000000000000000 +386975 0xc48d9595221e591bf7a785591f928b6df08fee7a 0x0000000000000000000000000000000000000000000000000000000000000000 +387011 0x07f1d608c18dc12e6ee4487be4d01571315dbef1 0x0000000000000000000000000000000000000000000000000000000000000000 +387014 0x07f1d608c18dc12e6ee4487be4d01571315dbef1 0x0000000000000000000000000000000000000000000000000000000000000001 +387016 0xa72cd306bd6bc58922dcfed48cb1474f323860a9 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +387032 0x07f1d608c18dc12e6ee4487be4d01571315dbef1 0x0000000000000000000000000000000000000000000000000000000000000002 +387044 0x91b876c8614495fb9272a95edecc92938e5e2da6 0x0000000000000000000000000000000000000000000000000000000000000000 +387045 0xa72cd306bd6bc58922dcfed48cb1474f323860a9 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +387206 0x680a79579b69df391a4d23a7ba219b4d020736dc 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +387225 0x680a79579b69df391a4d23a7ba219b4d020736dc 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +387241 0x680a79579b69df391a4d23a7ba219b4d020736dc 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +387276 0x680a79579b69df391a4d23a7ba219b4d020736dc 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +387276 0x4b94fb373ec3a87f79f6de32ad730806020c94f1 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +387284 0x680a79579b69df391a4d23a7ba219b4d020736dc 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +387365 0x72c39a1286deaffbc3058cea4f9598bf0f2f6cf6 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +387615 0xf75e354c5edc8efed9b59ee9f67a80845ade7d0c 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +387627 0x2a31114378a3093d29aa387bfe3829d9f1f4c2a8 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +387641 0xf75e354c5edc8efed9b59ee9f67a80845ade7d0c 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +387648 0xf75e354c5edc8efed9b59ee9f67a80845ade7d0c 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +387654 0xf75e354c5edc8efed9b59ee9f67a80845ade7d0c 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +387654 0xf75e354c5edc8efed9b59ee9f67a80845ade7d0c 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +387658 0xf75e354c5edc8efed9b59ee9f67a80845ade7d0c 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +387658 0xf75e354c5edc8efed9b59ee9f67a80845ade7d0c 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +387683 0xf75e354c5edc8efed9b59ee9f67a80845ade7d0c 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +387688 0xf75e354c5edc8efed9b59ee9f67a80845ade7d0c 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +387688 0xf75e354c5edc8efed9b59ee9f67a80845ade7d0c 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +387690 0xf75e354c5edc8efed9b59ee9f67a80845ade7d0c 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +387690 0xf75e354c5edc8efed9b59ee9f67a80845ade7d0c 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +387761 0x97e58c7d37cba1a1e2ecbb2a5b23f8d127b6892d 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +388108 0x33921ef3eeffb23d68802e43e8110ab6c2fff774 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +388111 0xbec795614eda3b5ccd2e32070b4ace745ce801c4 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +388150 0xbec795614eda3b5ccd2e32070b4ace745ce801c4 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +388246 0xed6523382d41982604b845e5b94dd7fa0060198d 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +388285 0x329e2382db65ef312ca68a6c8ef549e68d051e06 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +388296 0xed6523382d41982604b845e5b94dd7fa0060198d 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +388516 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +388860 0xa36dcbd8877c08dc245ca08577368ef87a0c917e 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +388893 0xa36dcbd8877c08dc245ca08577368ef87a0c917e 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +388893 0xf2d850b176ddf0b6c1411d68ef96d2d8b7b0b480 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +388894 0xa36dcbd8877c08dc245ca08577368ef87a0c917e 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +388907 0xbda7aeb6d2002efe360b6467275ef01e77d15497 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +388907 0x2caa3e6931413fba516a377a43cadd94e197bbfa 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +388909 0x2caa3e6931413fba516a377a43cadd94e197bbfa 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +388912 0x2caa3e6931413fba516a377a43cadd94e197bbfa 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +388912 0x2caa3e6931413fba516a377a43cadd94e197bbfa 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +388918 0x2caa3e6931413fba516a377a43cadd94e197bbfa 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +388918 0x2caa3e6931413fba516a377a43cadd94e197bbfa 0xe7c957c06e9a662c1a6c77366179f5b702b97651dc28eee7d5bf1dff6e40bb4a +388923 0xa36dcbd8877c08dc245ca08577368ef87a0c917e 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +388923 0x2caa3e6931413fba516a377a43cadd94e197bbfa 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +388940 0xa36dcbd8877c08dc245ca08577368ef87a0c917e 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +388971 0x2a31114378a3093d29aa387bfe3829d9f1f4c2a8 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +388990 0x892140413344e49d9eaf54db38126d973fa167f6 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +389012 0x892140413344e49d9eaf54db38126d973fa167f6 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +389158 0x892140413344e49d9eaf54db38126d973fa167f6 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +389206 0xe358b3b9f29c67cb810c5184e6fde27d66ce036c 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +389238 0x72c39a1286deaffbc3058cea4f9598bf0f2f6cf6 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +389277 0x534c5a8c34ad4e150581c50ded1bbfa5f22b1800 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +389292 0xcab01dedaa9e87d03e5eff6dedab9ad98298ccc6 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +389301 0xcab01dedaa9e87d03e5eff6dedab9ad98298ccc6 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +389301 0xcab01dedaa9e87d03e5eff6dedab9ad98298ccc6 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +389309 0xcab01dedaa9e87d03e5eff6dedab9ad98298ccc6 0xc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b +389324 0xcab01dedaa9e87d03e5eff6dedab9ad98298ccc6 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +389324 0x72c39a1286deaffbc3058cea4f9598bf0f2f6cf6 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +389328 0x72c39a1286deaffbc3058cea4f9598bf0f2f6cf6 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +389343 0xcab01dedaa9e87d03e5eff6dedab9ad98298ccc6 0xe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda +389343 0xcab01dedaa9e87d03e5eff6dedab9ad98298ccc6 0x1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32 +390001 0xecc72aac2791ee973bf607781a33a341b41e58c0 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +390004 0xecc72aac2791ee973bf607781a33a341b41e58c0 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +390024 0xd5babb9f28a9e7c78735c9c955d5626159f1be70 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +390042 0xd5babb9f28a9e7c78735c9c955d5626159f1be70 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +390236 0x54dcd97a77d12fb42a9ef839a3cdba0c1e92841a 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +390306 0xecc72aac2791ee973bf607781a33a341b41e58c0 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +390867 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +391685 0x5067247f2214dca445bfb213277b5f19711e309f 0x6e7287b110b0d2f738952766cb4d4281ce49164b34e66493ebaf76c6c75c0adf +391690 0x5067247f2214dca445bfb213277b5f19711e309f 0x6e7287b110b0d2f738952766cb4d4281ce49164b34e66493ebaf76c6c75c0adf +391691 0x5067247f2214dca445bfb213277b5f19711e309f 0x6e7287b110b0d2f738952766cb4d4281ce49164b34e66493ebaf76c6c75c0adf +391697 0xe358b3b9f29c67cb810c5184e6fde27d66ce036c 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +391713 0x534c5a8c34ad4e150581c50ded1bbfa5f22b1800 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +391849 0x534c5a8c34ad4e150581c50ded1bbfa5f22b1800 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +392002 0x81e4c09f8d140521e2265b42d99fc2fb868a5b14 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +392097 0xcab01dedaa9e87d03e5eff6dedab9ad98298ccc6 0xc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b +392104 0xfe8ad7dd2f564a877cc23feea6c0a9cc2e783715 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +392110 0xa076155806214a73f37f5fcd8025036d92f6a3fb +392294 0xac9560da030bc57c70c90274d8ffe4ba6aea1846 0x0000000000000000000000000000000000000000000000000000000000000000 +392697 0xc4395759e26469baa0e6421bdc1d0232c6f4b6c3 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +392960 0x6466e3c6157ba0724234f8a09c77ac08fff8828c 0xd4665e3049283582ba6f9eba07a5b3e12dab49e02da99e8927a47af5d134bea5 0x00000000000000000000000016893e10b99a59afd2c60331e0b49241d4d4d7cc +392970 0x6466e3c6157ba0724234f8a09c77ac08fff8828c 0xd4665e3049283582ba6f9eba07a5b3e12dab49e02da99e8927a47af5d134bea5 0x00000000000000000000000016893e10b99a59afd2c60331e0b49241d4d4d7cc +392990 0x6466e3c6157ba0724234f8a09c77ac08fff8828c 0xadec52fcd1408589179b85e44b434374db078b4eaf793e7d1a1bb0ae4ecfeee5 0x00000000000000000000000016893e10b99a59afd2c60331e0b49241d4d4d7cc +393302 0x8ec0d0bbce4349e2d34586e2de392caa73532d3f 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +393370 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +393752 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x00000000000000000000000076b0f6b32c66c317699067f2d938bcf669f380ce +393752 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x00000000000000000000000076b0f6b32c66c317699067f2d938bcf669f380ce +394354 0xcab01dedaa9e87d03e5eff6dedab9ad98298ccc6 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +394389 0x6466e3c6157ba0724234f8a09c77ac08fff8828c 0xadec52fcd1408589179b85e44b434374db078b4eaf793e7d1a1bb0ae4ecfeee5 0x00000000000000000000000016893e10b99a59afd2c60331e0b49241d4d4d7cc +394389 0x6466e3c6157ba0724234f8a09c77ac08fff8828c 0xadec52fcd1408589179b85e44b434374db078b4eaf793e7d1a1bb0ae4ecfeee5 0x00000000000000000000000016893e10b99a59afd2c60331e0b49241d4d4d7cc +394390 0x6466e3c6157ba0724234f8a09c77ac08fff8828c 0xadec52fcd1408589179b85e44b434374db078b4eaf793e7d1a1bb0ae4ecfeee5 0x00000000000000000000000016893e10b99a59afd2c60331e0b49241d4d4d7cc +394390 0x6466e3c6157ba0724234f8a09c77ac08fff8828c 0xadec52fcd1408589179b85e44b434374db078b4eaf793e7d1a1bb0ae4ecfeee5 0x00000000000000000000000016893e10b99a59afd2c60331e0b49241d4d4d7cc +394390 0x6466e3c6157ba0724234f8a09c77ac08fff8828c 0xadec52fcd1408589179b85e44b434374db078b4eaf793e7d1a1bb0ae4ecfeee5 0x00000000000000000000000016893e10b99a59afd2c60331e0b49241d4d4d7cc +394391 0x6466e3c6157ba0724234f8a09c77ac08fff8828c 0xadec52fcd1408589179b85e44b434374db078b4eaf793e7d1a1bb0ae4ecfeee5 0x00000000000000000000000016893e10b99a59afd2c60331e0b49241d4d4d7cc +394393 0x6466e3c6157ba0724234f8a09c77ac08fff8828c 0xadec52fcd1408589179b85e44b434374db078b4eaf793e7d1a1bb0ae4ecfeee5 0x00000000000000000000000016893e10b99a59afd2c60331e0b49241d4d4d7cc +394393 0x6466e3c6157ba0724234f8a09c77ac08fff8828c 0xadec52fcd1408589179b85e44b434374db078b4eaf793e7d1a1bb0ae4ecfeee5 0x00000000000000000000000016893e10b99a59afd2c60331e0b49241d4d4d7cc +394394 0x6466e3c6157ba0724234f8a09c77ac08fff8828c 0xadec52fcd1408589179b85e44b434374db078b4eaf793e7d1a1bb0ae4ecfeee5 0x00000000000000000000000016893e10b99a59afd2c60331e0b49241d4d4d7cc +394395 0x6466e3c6157ba0724234f8a09c77ac08fff8828c 0xadec52fcd1408589179b85e44b434374db078b4eaf793e7d1a1bb0ae4ecfeee5 0x00000000000000000000000016893e10b99a59afd2c60331e0b49241d4d4d7cc +394426 0xdb30622d51e8d6221f0b1cbde57d4734387d7ca1 0xd4665e3049283582ba6f9eba07a5b3e12dab49e02da99e8927a47af5d134bea5 0x00000000000000000000000016893e10b99a59afd2c60331e0b49241d4d4d7cc +394800 0x7011f3edc7fa43c81440f9f43a6458174113b162 0x66d0ee9ee580464eb06bb7adef164c593ad3173da5b9937511307bb4646d392e 0x0000000000000000000000000000000000000000000000000000000000000075 +395595 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000d1f35f7250a922150c0e879eaf0cb5f0f7dd47c3 +395595 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000d1f35f7250a922150c0e879eaf0cb5f0f7dd47c3 +395969 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +396348 0xc4395759e26469baa0e6421bdc1d0232c6f4b6c3 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +397108 0xb372018f3be9e171df0581136b59d2faf73a7d5d 0xff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9 +397588 0xb372018f3be9e171df0581136b59d2faf73a7d5d 0xff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9 +397591 0xb372018f3be9e171df0581136b59d2faf73a7d5d 0xff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9 +398412 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x39d732521214059f57de4c0f92879304394ef7c5e530a8708b7113a42f9f0878 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +398412 0xc7696b27830dd8aa4823a1cba8440c27c36adec4 0x44bbf497379e88194e67c38a8b2e628ef3803579306f3fd2177ce81afb3d743f 0x000000000000000000000000a2792b9f27a466a635649f551a4109a179b00fbf +398456 0xfadd0c5d206310344a31711da36ac89a7baeb388 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +398477 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +398679 0xfa15b8c872f533cd40abfd055507f2907bcf1581 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +398968 0xe82f5f7db7bf9bad426505c654e8d13b609f527c 0x16cdf1707799c6655baac6e210f52b94b7cec08adcaf9ede7dfe8649da926146 +398972 0x6f7ff1690f64973fffc848f5cf101b446acb1c27 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +399058 0x6f7ff1690f64973fffc848f5cf101b446acb1c27 0x92ca3a80853e6663fa31fa10b99225f18d4902939b4c53a9caae9043f6efd004 +399804 0xc4395759e26469baa0e6421bdc1d0232c6f4b6c3 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c +399849 0xb372018f3be9e171df0581136b59d2faf73a7d5d 0xff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9 diff --git a/ethcore/src/chainfilter/tests.rs b/ethcore/src/chainfilter/tests.rs index b511365cf..ec78ce48e 100644 --- a/ethcore/src/chainfilter/tests.rs +++ b/ethcore/src/chainfilter/tests.rs @@ -15,6 +15,7 @@ // along with Parity. If not, see . use std::collections::HashMap; +use std::io::{BufRead, BufReader, Read}; use std::str::FromStr; use util::hash::*; use util::sha3::*; @@ -47,9 +48,9 @@ impl FilterDataSource for MemoryCache { } } -fn topic_to_bloom(topic: &H256) -> H2048 { +fn to_bloom(hashable: &T) -> H2048 where T: Hashable { let mut bloom = H2048::new(); - bloom.shift_bloomed(&topic.sha3()); + bloom.shift_bloomed(&hashable.sha3()); bloom } @@ -64,7 +65,7 @@ fn test_topic_basic_search() { let modified_blooms = { let filter = ChainFilter::new(&cache, index_size, bloom_levels); let block_number = 23; - filter.add_bloom(&topic_to_bloom(&topic), block_number) + filter.add_bloom(&to_bloom(&topic), block_number) }; // number of modified blooms should always be equal number of levels @@ -73,27 +74,111 @@ fn test_topic_basic_search() { { let filter = ChainFilter::new(&cache, index_size, bloom_levels); - let blocks = filter.blocks_with_bloom(&topic_to_bloom(&topic), 0, 100); + let blocks = filter.blocks_with_bloom(&to_bloom(&topic), 0, 100); assert_eq!(blocks.len(), 1); assert_eq!(blocks[0], 23); } { let filter = ChainFilter::new(&cache, index_size, bloom_levels); - let blocks = filter.blocks_with_bloom(&topic_to_bloom(&topic), 0, 23); + let blocks = filter.blocks_with_bloom(&to_bloom(&topic), 0, 23); assert_eq!(blocks.len(), 0); } { let filter = ChainFilter::new(&cache, index_size, bloom_levels); - let blocks = filter.blocks_with_bloom(&topic_to_bloom(&topic), 23, 24); + let blocks = filter.blocks_with_bloom(&to_bloom(&topic), 23, 24); assert_eq!(blocks.len(), 1); assert_eq!(blocks[0], 23); } { let filter = ChainFilter::new(&cache, index_size, bloom_levels); - let blocks = filter.blocks_with_bloom(&topic_to_bloom(&topic), 24, 100); + let blocks = filter.blocks_with_bloom(&to_bloom(&topic), 24, 100); assert_eq!(blocks.len(), 0); } } + +fn for_each_bloom(bytes: &[u8], mut f: F) where F: FnMut(usize, &H2048) { + let mut reader = BufReader::new(bytes); + let mut line = String::new(); + while reader.read_line(&mut line).unwrap() > 0 { + { + let mut number_bytes = vec![]; + let mut bloom_bytes = [0; 512]; + + let mut line_reader = BufReader::new(line.as_ref() as &[u8]); + line_reader.read_until(b' ', &mut number_bytes).unwrap(); + line_reader.consume(2); + line_reader.read_exact(&mut bloom_bytes).unwrap(); + + let number = String::from_utf8(number_bytes).map(|s| s[..s.len() -1].to_owned()).unwrap().parse::().unwrap(); + let bloom = H2048::from_str(&String::from_utf8(bloom_bytes.to_vec()).unwrap()).unwrap(); + f(number, &bloom); + } + line.clear(); + } +} + +fn for_each_log(bytes: &[u8], mut f: F) where F: FnMut(usize, &Address, &[H256]) { + let mut reader = BufReader::new(bytes); + let mut line = String::new(); + while reader.read_line(&mut line).unwrap() > 0 { + { + let mut number_bytes = vec![]; + let mut address_bytes = [0;42]; + let mut topic = [0;66]; + let mut topics_bytes = vec![]; + + let mut line_reader = BufReader::new(line.as_ref() as &[u8]); + line_reader.read_until(b' ', &mut number_bytes).unwrap(); + line_reader.read_exact(&mut address_bytes).unwrap(); + line_reader.consume(1); + while let Ok(_) = line_reader.read_exact(&mut topic) { + line_reader.consume(1); + topics_bytes.push(topic.to_vec()); + } + + let number = String::from_utf8(number_bytes).map(|s| s[..s.len() -1].to_owned()).unwrap().parse::().unwrap(); + let address = Address::from_str(&String::from_utf8(address_bytes.to_vec()).map(|a| a[2..].to_owned()).unwrap()).unwrap(); + let topics: Vec = topics_bytes + .into_iter() + .map(|t| H256::from_str(&String::from_utf8(t).map(|t| t[2..].to_owned()).unwrap()).unwrap()) + .collect(); + f(number, &address, &topics); + } + line.clear(); + } +} + +// tests chain filter on real data between blocks 300_000 and 400_000 +#[test] +fn test_chainfilter_real_data() { + let index_size = 16; + let bloom_levels = 3; + + let mut cache = MemoryCache::new(); + + for_each_bloom(include_bytes!("blooms.txt"), | block_number, bloom | { + let modified_blooms = { + let filter = ChainFilter::new(&cache, index_size, bloom_levels); + filter.add_bloom(bloom, block_number) + }; + + // number of modified blooms should always be equal number of levels + assert_eq!(modified_blooms.len(), bloom_levels as usize); + cache.insert_blooms(modified_blooms); + }); + + for_each_log(include_bytes!("logs.txt"), | block_number, address, topics | { + println!("block_number: {:?}", block_number); + let filter = ChainFilter::new(&cache, index_size, bloom_levels); + let blocks = filter.blocks_with_bloom(&to_bloom(address), block_number, block_number + 1); + assert_eq!(blocks.len(), 1); + for (i, topic) in topics.iter().enumerate() { + println!("topic: {:?}", i); + let blocks = filter.blocks_with_bloom(&to_bloom(topic), block_number, block_number + 1); + assert_eq!(blocks.len(), 1); + } + }); +} From 0a3e8a0fdbbed91b52fc239ec7668f614fc1c17f Mon Sep 17 00:00:00 2001 From: debris Date: Mon, 15 Feb 2016 21:56:33 +0100 Subject: [PATCH 13/73] more tests for bloomfilter --- ethcore/src/chainfilter/tests.rs | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/ethcore/src/chainfilter/tests.rs b/ethcore/src/chainfilter/tests.rs index ec78ce48e..2eb6275ea 100644 --- a/ethcore/src/chainfilter/tests.rs +++ b/ethcore/src/chainfilter/tests.rs @@ -153,7 +153,7 @@ fn for_each_log(bytes: &[u8], mut f: F) where F: FnMut(usize, &Address, &[H25 // tests chain filter on real data between blocks 300_000 and 400_000 #[test] -fn test_chainfilter_real_data() { +fn test_chainfilter_real_data_short_searches() { let index_size = 16; let bloom_levels = 3; @@ -182,3 +182,32 @@ fn test_chainfilter_real_data() { } }); } + +// tests chain filter on real data between blocks 300_000 and 400_000 +#[test] +fn test_chainfilter_real_data_single_search() { + let index_size = 16; + let bloom_levels = 3; + + let mut cache = MemoryCache::new(); + + for_each_bloom(include_bytes!("blooms.txt"), | block_number, bloom | { + let modified_blooms = { + let filter = ChainFilter::new(&cache, index_size, bloom_levels); + filter.add_bloom(bloom, block_number) + }; + + // number of modified blooms should always be equal number of levels + assert_eq!(modified_blooms.len(), bloom_levels as usize); + cache.insert_blooms(modified_blooms); + }); + + let address = Address::from_str("c4395759e26469baa0e6421bdc1d0232c6f4b6c3").unwrap(); + let filter = ChainFilter::new(&cache, index_size, bloom_levels); + let blocks = filter.blocks_with_bloom(&to_bloom(&address), 300_000, 400_000); + // bloom may return more blocks, but our log density is low, so it should be fine + assert_eq!(blocks.len(), 3); + assert_eq!(blocks[0], 392697); + assert_eq!(blocks[1], 396348); + assert_eq!(blocks[2], 399804); +} From 0699cdd5d02d07e0eba76aec9d2b7fb96e6bd980 Mon Sep 17 00:00:00 2001 From: debris Date: Tue, 16 Feb 2016 11:41:34 +0100 Subject: [PATCH 14/73] tests for blockchain bloomfilters --- ethcore/src/blockchain.rs | 16 ++++++++++++++++ ethcore/src/chainfilter/chainfilter.rs | 4 ++-- ethcore/src/extras.rs | 1 + 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/ethcore/src/blockchain.rs b/ethcore/src/blockchain.rs index 68d677703..28a401e55 100644 --- a/ethcore/src/blockchain.rs +++ b/ethcore/src/blockchain.rs @@ -941,4 +941,20 @@ mod tests { assert_eq!(bc.transaction(&bc.transaction_address(&t.hash()).unwrap()).unwrap(), t); } } + + #[test] + fn test_bloom_filter_simple() { + let genesis = "f901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a059262c330941f3fe2a34d16d6e3c7b30d2ceb37c6a0e9a994c494ee1a61d2410885aa4c8bf8e56e264c0c0".from_hex().unwrap(); + + // bloom filter flow block 300054 + let b1 = "f90261f901f9a05716670833ec874362d65fea27a7cd35af5897d275b31a44944113111e4e96d2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a0e78628dd45a1f8dc495594d83b76c588a3ee67463260f8b7d4a42f574aeab29aa0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000200000010000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000080000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd882520884562791e580a051b3ecba4e3f2b49c11d42dd0851ec514b1be3138080f72a2b6e83868275d98f8877671f479c414b47f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca09e2709d7ec9bbe6b1bbbf0b2088828d14cd5e8642a1fee22dc74bfa89761a7f9a04bd8813dee4be989accdb708b1c2e325a7e9c695a8024e30e89d6c644e424747c0".from_hex().unwrap(); + + let bloom = H2048::from_str("00000000000000000000000000000000000000000000020000001000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap(); + + let temp = RandomTempPath::new(); + let bc = BlockChain::new(&genesis, temp.as_path()); + bc.insert_block(&b1, &[]); + let blocks = bc.blocks_with_bloom(&bloom, 0, 2); + assert_eq!(blocks, vec![1]); + } } diff --git a/ethcore/src/chainfilter/chainfilter.rs b/ethcore/src/chainfilter/chainfilter.rs index ab27f77ff..4f7f30928 100644 --- a/ethcore/src/chainfilter/chainfilter.rs +++ b/ethcore/src/chainfilter/chainfilter.rs @@ -90,9 +90,9 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource // if we are on the lowest level 0 => return match offset < to_block { // take the value if its smaller than to_block - true => Some(vec![offset]), + true if level_bloom.contains(bloom) => Some(vec![offset]), // return None if it is is equal to to_block - false => None + _ => None }, // return None if current level doesnt contain given bloom _ if !level_bloom.contains(bloom) => return None, diff --git a/ethcore/src/extras.rs b/ethcore/src/extras.rs index 305b7767e..1ad4c8e7b 100644 --- a/ethcore/src/extras.rs +++ b/ethcore/src/extras.rs @@ -261,6 +261,7 @@ impl Encodable for BlocksBlooms { } /// Represents location of bloom in database. +#[derive(Debug)] pub struct BlocksBloomLocation { /// Unique hash of BlocksBloom pub hash: H256, From d000ad2441126893d1d14c97ccf60fb90a7ef3a8 Mon Sep 17 00:00:00 2001 From: debris Date: Tue, 16 Feb 2016 14:46:21 +0100 Subject: [PATCH 15/73] more tests and fixes for blockchains bloom filters --- ethcore/src/blockchain.rs | 183 +++++++++++++++++++++++++++++--------- ethcore/src/extras.rs | 2 +- 2 files changed, 141 insertions(+), 44 deletions(-) diff --git a/ethcore/src/blockchain.rs b/ethcore/src/blockchain.rs index 28a401e55..91c803b1f 100644 --- a/ethcore/src/blockchain.rs +++ b/ethcore/src/blockchain.rs @@ -53,6 +53,60 @@ pub struct CacheSize { pub blocks_blooms: usize } +struct BloomIndexer { + index_size: usize, + levels: u8 +} + +impl BloomIndexer { + fn new(index_size: usize, levels: u8) -> Self { + BloomIndexer { + index_size: index_size, + levels: levels + } + } + + /// Calculates bloom's position in database. + fn location(&self, bloom_index: &BloomIndex) -> BlocksBloomLocation { + use std::{mem, ptr}; + + let hash = unsafe { + let mut hash: H256 = mem::zeroed(); + ptr::copy(&[bloom_index.index / self.index_size] as *const usize as *const u8, hash.as_mut_ptr(), 8); + hash[8] = bloom_index.level; + hash.reverse(); + hash + }; + + BlocksBloomLocation { + hash: hash, + index: bloom_index.index % self.index_size + } + } + + fn index_size(&self) -> usize { + self.index_size + } + + fn levels(&self) -> u8 { + self.levels + } +} + +/// Blockchain update info. +struct ExtrasUpdate { + /// Block hash. + hash: H256, + /// DB update batch. + batch: WriteBatch, + /// Inserted block familial details. + details: BlockDetails, + /// New best block (if it has changed). + new_best: Option, + /// Changed blocks bloom location hashes. + bloom_hashes: HashSet +} + impl CacheSize { /// Total amount used by the cache. fn total(&self) -> usize { self.blocks + self.block_details + self.transaction_addresses + self.block_logs + self.blocks_blooms } @@ -175,14 +229,13 @@ pub struct BlockChain { cache_man: RwLock, - // blooms config - bloom_index_size: usize, - bloom_levels: u8 + // blooms indexing + bloom_indexer: BloomIndexer } impl FilterDataSource for BlockChain { fn bloom_at_index(&self, bloom_index: &BloomIndex) -> Option { - let location = self.blocks_bloom_location(bloom_index); + let location = self.bloom_indexer.location(bloom_index); self.blocks_blooms(&location.hash).and_then(|blooms| blooms.blooms.into_iter().nth(location.index).cloned()) } } @@ -236,7 +289,7 @@ impl BlockProvider for BlockChain { /// Returns numbers of blocks containing given bloom. fn blocks_with_bloom(&self, bloom: &H2048, from_block: BlockNumber, to_block: BlockNumber) -> Vec { - let filter = ChainFilter::new(self, self.bloom_index_size, self.bloom_levels); + let filter = ChainFilter::new(self, self.bloom_indexer.index_size(), self.bloom_indexer.levels()); filter.blocks_with_bloom(bloom, from_block as usize, to_block as usize).into_iter().map(|b| b as BlockNumber).collect() } } @@ -298,8 +351,7 @@ impl BlockChain { extras_db: extras_db, blocks_db: blocks_db, cache_man: RwLock::new(cache_man), - bloom_index_size: BLOOM_INDEX_SIZE, - bloom_levels: BLOOM_LEVELS + bloom_indexer: BloomIndexer::new(BLOOM_INDEX_SIZE, BLOOM_LEVELS) }; // load best block @@ -464,27 +516,38 @@ impl BlockChain { // store block in db self.blocks_db.put(&hash, &bytes).unwrap(); - let (batch, new_best, details) = self.block_to_extras_insert_batch(bytes, receipts); + let update = self.block_to_extras_update(bytes, receipts); + self.apply_update(update); + } + /// Applies extras update. + fn apply_update(&self, update: ExtrasUpdate) { // update best block let mut best_block = self.best_block.write().unwrap(); - if let Some(b) = new_best { + if let Some(b) = update.new_best { *best_block = b; } - // update caches - let mut write = self.block_details.write().unwrap(); - write.remove(&header.parent_hash()); - write.insert(hash.clone(), details); - self.note_used(CacheID::Block(hash)); + // update details cache + let mut write_details = self.block_details.write().unwrap(); + write_details.remove(&update.details.parent); + write_details.insert(update.hash.clone(), update.details); + self.note_used(CacheID::Block(update.hash)); + + // update blocks blooms cache + let mut write_blocks_blooms = self.blocks_blooms.write().unwrap(); + for bloom_hash in &update.bloom_hashes { + write_blocks_blooms.remove(bloom_hash); + } // update extras database - self.extras_db.write(batch).unwrap(); + self.extras_db.write(update.batch).unwrap(); } /// Transforms block into WriteBatch that may be written into database /// Additionally, if it's new best block it returns new best block object. - fn block_to_extras_insert_batch(&self, bytes: &[u8], _receipts: &[Receipt]) -> (WriteBatch, Option, BlockDetails) { + //fn block_to_extras_insert_batch(&self, bytes: &[u8], _receipts: &[Receipt]) -> (WriteBatch, Option, BlockDetails) { + fn block_to_extras_update(&self, bytes: &[u8], _receipts: &[Receipt]) -> ExtrasUpdate { // create views onto rlp let block = BlockView::new(bytes); let header = block.header_view(); @@ -522,8 +585,6 @@ impl BlockChain { }); } - - // save blooms (is it really required?). maybe store receipt whole instead? //let blooms: Vec = receipts.iter().map(|r| r.log_bloom.clone()).collect(); //batch.put_extras(&hash, &BlockLogBlooms { @@ -532,7 +593,13 @@ impl BlockChain { // if it's not new best block, just return if !is_new_best { - return (batch, None, details); + return ExtrasUpdate { + hash: hash.clone(), + batch: batch, + details: details, + new_best: None, + bloom_hashes: HashSet::new() + }; } // if its new best block we need to make sure that all ancestors @@ -550,7 +617,7 @@ impl BlockChain { batch.put_extras(&header.number(), &hash); // update block blooms - modified_blooms = ChainFilter::new(self, self.bloom_index_size, self.bloom_levels) + modified_blooms = ChainFilter::new(self, self.bloom_indexer.index_size(), self.bloom_indexer.levels()) .add_bloom(&header.log_bloom(), header.number() as usize); }, // it is a fork @@ -569,7 +636,7 @@ impl BlockChain { .collect(); // reset blooms chain head - modified_blooms = ChainFilter::new(self, self.bloom_index_size, self.bloom_levels) + modified_blooms = ChainFilter::new(self, self.bloom_indexer.index_size(), self.bloom_indexer.levels()) .reset_chain_head(&blooms, start_number as usize, self.best_block_number() as usize); }, // route.blocks.len() could be 0 only if inserted block is best block, @@ -577,10 +644,14 @@ impl BlockChain { _ => { unreachable!(); } }; + let bloom_hashes = modified_blooms.iter() + .map(|(bloom_index, _)| self.bloom_indexer.location(&bloom_index).hash) + .collect(); + for (hash, blocks_blooms) in modified_blooms.into_iter() .fold(HashMap::new(), | mut acc, (bloom_index, bloom) | { { - let location = self.blocks_bloom_location(&bloom_index); + let location = self.bloom_indexer.location(&bloom_index); let mut blocks_blooms = acc.entry(location.hash).or_insert_with(BlocksBlooms::new); blocks_blooms.blooms[location.index] = bloom; } @@ -593,12 +664,18 @@ impl BlockChain { batch.put(b"best", &hash).unwrap(); let best_block = BestBlock { - hash: hash, + hash: hash.clone(), number: header.number(), total_difficulty: total_difficulty }; - (batch, Some(best_block), details) + ExtrasUpdate { + hash: hash, + batch: batch, + new_best: Some(best_block), + details: details, + bloom_hashes: bloom_hashes + } } /// Get best block hash. @@ -621,22 +698,7 @@ impl BlockChain { self.query_extras(hash, &self.blocks_blooms) } - /// Calculates bloom's position in database. - fn blocks_bloom_location(&self, bloom_index: &BloomIndex) -> BlocksBloomLocation { - use std::{mem, ptr}; - - let hash = unsafe { - let mut hash: H256 = mem::zeroed(); - ptr::copy(&[bloom_index.index / self.bloom_index_size] as *const usize as *const u8, hash.as_mut_ptr(), 8); - hash[8] = bloom_index.level; - hash - }; - BlocksBloomLocation { - hash: hash, - index: bloom_index.index % self.bloom_index_size - } - } fn query_extras(&self, hash: &K, cache: &RwLock>) -> Option where T: Clone + Decodable + ExtrasIndexable, @@ -740,7 +802,7 @@ mod tests { use std::str::FromStr; use rustc_serialize::hex::FromHex; use util::hash::*; - use blockchain::*; + use blockchain::{BlockProvider, BlockChain}; use tests::helpers::*; #[test] @@ -946,15 +1008,50 @@ mod tests { fn test_bloom_filter_simple() { let genesis = "f901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a059262c330941f3fe2a34d16d6e3c7b30d2ceb37c6a0e9a994c494ee1a61d2410885aa4c8bf8e56e264c0c0".from_hex().unwrap(); + let b1 = "f90261f901f9a05716670833ec874362d65fea27a7cd35af5897d275b31a44944113111e4e96d2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a0e78628dd45a1f8dc495594d83b76c588a3ee67463260f8b7d4a42f574aeab29aa0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd882520884562791e580a051b3ecba4e3f2b49c11d42dd0851ec514b1be3138080f72a2b6e83868275d98f8877671f479c414b47f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca09e2709d7ec9bbe6b1bbbf0b2088828d14cd5e8642a1fee22dc74bfa89761a7f9a04bd8813dee4be989accdb708b1c2e325a7e9c695a8024e30e89d6c644e424747c0".from_hex().unwrap(); + // bloom filter flow block 300054 - let b1 = "f90261f901f9a05716670833ec874362d65fea27a7cd35af5897d275b31a44944113111e4e96d2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a0e78628dd45a1f8dc495594d83b76c588a3ee67463260f8b7d4a42f574aeab29aa0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000200000010000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000080000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd882520884562791e580a051b3ecba4e3f2b49c11d42dd0851ec514b1be3138080f72a2b6e83868275d98f8877671f479c414b47f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca09e2709d7ec9bbe6b1bbbf0b2088828d14cd5e8642a1fee22dc74bfa89761a7f9a04bd8813dee4be989accdb708b1c2e325a7e9c695a8024e30e89d6c644e424747c0".from_hex().unwrap(); + let b2 = "f902ccf901f9a0437e51676ff10756fcfee5edd9159fa41dbcb1b2c592850450371cbecd54ee4fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0c70a5dc56146e5ef025e4e5726a6373c6f12fd2f6784093a19ead0a7d17fb292a040645cbce4fd399e7bb9160b4c30c40d7ee616a030d4e18ef0ed3b02bdb65911a086e608555f63628417032a011d107b36427af37d153f0da02ce3f90fdd5e8c08b90100000000000000000000000000000000000000000000000200000010000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000080000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd882c0e384562791e880a0e3cc39ff775cc0a32f175995b92e84b729e5c9a3563ff899e3555b908bc21d75887c3cde283f4846a6f8cdf8cb01018304cb2f8080b87e6060604052606e8060106000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063c0406226146037576035565b005b60406004506056565b6040518082815260200191505060405180910390f35b6000600560006000508190555060059050606b565b90561ba05258615c63503c0a600d6994b12ea5750d45b3c69668e2a371b4fbfb9eeff6b8a0a11be762bc90491231274a2945be35a43f23c27775b1ff24dd521702fe15f73ec0".from_hex().unwrap(); let bloom = H2048::from_str("00000000000000000000000000000000000000000000020000001000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap(); let temp = RandomTempPath::new(); let bc = BlockChain::new(&genesis, temp.as_path()); + let blocks = bc.blocks_with_bloom(&bloom, 0, 50); + assert_eq!(blocks, vec![]); + bc.insert_block(&b1, &[]); - let blocks = bc.blocks_with_bloom(&bloom, 0, 2); - assert_eq!(blocks, vec![1]); + assert_eq!(blocks, vec![]); + + bc.insert_block(&b2, &[]); + let blocks = bc.blocks_with_bloom(&bloom, 0, 50); + assert_eq!(blocks, vec![2]); + } + + #[test] + fn test_bloom_indexer() { + use chainfilter::BloomIndex; + use blockchain::BloomIndexer; + use extras::BlocksBloomLocation; + + let bi = BloomIndexer::new(16, 3); + + let index = BloomIndex::new(0, 0); + assert_eq!(bi.location(&index), BlocksBloomLocation { + hash: H256::new(), + index: 0 + }); + + let index = BloomIndex::new(1, 0); + assert_eq!(bi.location(&index), BlocksBloomLocation { + hash: H256::from_str("0000000000000000000000000000000000000000000000010000000000000000").unwrap(), + index: 0 + }); + + let index = BloomIndex::new(0, 299_999); + assert_eq!(bi.location(&index), BlocksBloomLocation { + hash: H256::from_str("000000000000000000000000000000000000000000000000000000000000493d").unwrap(), + index: 15 + }); } } diff --git a/ethcore/src/extras.rs b/ethcore/src/extras.rs index 1ad4c8e7b..66e734582 100644 --- a/ethcore/src/extras.rs +++ b/ethcore/src/extras.rs @@ -261,7 +261,7 @@ impl Encodable for BlocksBlooms { } /// Represents location of bloom in database. -#[derive(Debug)] +#[derive(Debug, PartialEq)] pub struct BlocksBloomLocation { /// Unique hash of BlocksBloom pub hash: H256, From 7e5e56de404af46d518ae2be4cf9a931c874ec34 Mon Sep 17 00:00:00 2001 From: debris Date: Tue, 16 Feb 2016 16:54:58 +0100 Subject: [PATCH 16/73] bloom_filters finally working --- ethcore/src/blockchain.rs | 41 +++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/ethcore/src/blockchain.rs b/ethcore/src/blockchain.rs index 91c803b1f..1a329610c 100644 --- a/ethcore/src/blockchain.rs +++ b/ethcore/src/blockchain.rs @@ -554,7 +554,7 @@ impl BlockChain { // prepare variables let hash = block.sha3(); - let mut parent_details = self.block_details(&header.parent_hash()).expect("Invalid parent hash."); + let mut parent_details = self.block_details(&header.parent_hash()).expect(format!("Invalid parent hash: {:?}", header.parent_hash()).as_ref()); let total_difficulty = parent_details.total_difficulty + header.difficulty(); let is_new_best = total_difficulty > self.best_block_total_difficulty(); let parent_hash = header.parent_hash(); @@ -648,16 +648,18 @@ impl BlockChain { .map(|(bloom_index, _)| self.bloom_indexer.location(&bloom_index).hash) .collect(); - for (hash, blocks_blooms) in modified_blooms.into_iter() + for (bloom_hash, blocks_blooms) in modified_blooms.into_iter() .fold(HashMap::new(), | mut acc, (bloom_index, bloom) | { { let location = self.bloom_indexer.location(&bloom_index); - let mut blocks_blooms = acc.entry(location.hash).or_insert_with(BlocksBlooms::new); + let mut blocks_blooms = acc + .entry(location.hash.clone()) + .or_insert_with(|| self.blocks_blooms(&location.hash).unwrap_or_else(BlocksBlooms::new)); blocks_blooms.blooms[location.index] = bloom; } acc }) { - batch.put_extras(&hash, &blocks_blooms); + batch.put_extras(&bloom_hash, &blocks_blooms); } // this is new best block @@ -698,8 +700,6 @@ impl BlockChain { self.query_extras(hash, &self.blocks_blooms) } - - fn query_extras(&self, hash: &K, cache: &RwLock>) -> Option where T: Clone + Decodable + ExtrasIndexable, K: ExtrasSliceConvertable + Eq + Hash + Clone { @@ -1008,24 +1008,35 @@ mod tests { fn test_bloom_filter_simple() { let genesis = "f901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a059262c330941f3fe2a34d16d6e3c7b30d2ceb37c6a0e9a994c494ee1a61d2410885aa4c8bf8e56e264c0c0".from_hex().unwrap(); - let b1 = "f90261f901f9a05716670833ec874362d65fea27a7cd35af5897d275b31a44944113111e4e96d2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a0e78628dd45a1f8dc495594d83b76c588a3ee67463260f8b7d4a42f574aeab29aa0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd882520884562791e580a051b3ecba4e3f2b49c11d42dd0851ec514b1be3138080f72a2b6e83868275d98f8877671f479c414b47f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca09e2709d7ec9bbe6b1bbbf0b2088828d14cd5e8642a1fee22dc74bfa89761a7f9a04bd8813dee4be989accdb708b1c2e325a7e9c695a8024e30e89d6c644e424747c0".from_hex().unwrap(); + // bloom filter from block 300059 + let b1 = "f90261f901f9a05716670833ec874362d65fea27a7cd35af5897d275b31a44944113111e4e96d2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a0e78628dd45a1f8dc495594d83b76c588a3ee67463260f8b7d4a42f574aeab29aa0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000200000000000000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080004000000000000000000000020008302000001832fefd882520884562791e580a051b3ecba4e3f2b49c11d42dd0851ec514b1be3138080f72a2b6e83868275d98f8877671f479c414b47f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca09e2709d7ec9bbe6b1bbbf0b2088828d14cd5e8642a1fee22dc74bfa89761a7f9a04bd8813dee4be989accdb708b1c2e325a7e9c695a8024e30e89d6c644e424747c0".from_hex().unwrap(); - // bloom filter flow block 300054 - let b2 = "f902ccf901f9a0437e51676ff10756fcfee5edd9159fa41dbcb1b2c592850450371cbecd54ee4fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0c70a5dc56146e5ef025e4e5726a6373c6f12fd2f6784093a19ead0a7d17fb292a040645cbce4fd399e7bb9160b4c30c40d7ee616a030d4e18ef0ed3b02bdb65911a086e608555f63628417032a011d107b36427af37d153f0da02ce3f90fdd5e8c08b90100000000000000000000000000000000000000000000000200000010000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000080000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd882c0e384562791e880a0e3cc39ff775cc0a32f175995b92e84b729e5c9a3563ff899e3555b908bc21d75887c3cde283f4846a6f8cdf8cb01018304cb2f8080b87e6060604052606e8060106000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063c0406226146037576035565b005b60406004506056565b6040518082815260200191505060405180910390f35b6000600560006000508190555060059050606b565b90561ba05258615c63503c0a600d6994b12ea5750d45b3c69668e2a371b4fbfb9eeff6b8a0a11be762bc90491231274a2945be35a43f23c27775b1ff24dd521702fe15f73ec0".from_hex().unwrap(); + // bloom filter from block 300054 + let b2 = "f902ccf901f9a04ef46c05763fffc5f7e59f92a7ef438ffccbb578e6e5d0f04e3df8a7fa6c02f6a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0c70a5dc56146e5ef025e4e5726a6373c6f12fd2f6784093a19ead0a7d17fb292a040645cbce4fd399e7bb9160b4c30c40d7ee616a030d4e18ef0ed3b02bdb65911a086e608555f63628417032a011d107b36427af37d153f0da02ce3f90fdd5e8c08b90100000000000000000000000000000000000000000000000200000010000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000080000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd882c0e384562791e880a0e3cc39ff775cc0a32f175995b92e84b729e5c9a3563ff899e3555b908bc21d75887c3cde283f4846a6f8cdf8cb01018304cb2f8080b87e6060604052606e8060106000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063c0406226146037576035565b005b60406004506056565b6040518082815260200191505060405180910390f35b6000600560006000508190555060059050606b565b90561ba05258615c63503c0a600d6994b12ea5750d45b3c69668e2a371b4fbfb9eeff6b8a0a11be762bc90491231274a2945be35a43f23c27775b1ff24dd521702fe15f73ec0".from_hex().unwrap(); - let bloom = H2048::from_str("00000000000000000000000000000000000000000000020000001000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap(); + let bloom_b1 = H2048::from_str("00000020000000000000000000000000000000000000000002000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000000000000000002000").unwrap(); + + let bloom_b2 = H2048::from_str("00000000000000000000000000000000000000000000020000001000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap(); let temp = RandomTempPath::new(); let bc = BlockChain::new(&genesis, temp.as_path()); - let blocks = bc.blocks_with_bloom(&bloom, 0, 50); - assert_eq!(blocks, vec![]); + + let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 3); + let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 3); + assert_eq!(blocks_b1, vec![]); + assert_eq!(blocks_b2, vec![]); bc.insert_block(&b1, &[]); - assert_eq!(blocks, vec![]); + let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 3); + let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 3); + assert_eq!(blocks_b1, vec![1]); + assert_eq!(blocks_b2, vec![]); bc.insert_block(&b2, &[]); - let blocks = bc.blocks_with_bloom(&bloom, 0, 50); - assert_eq!(blocks, vec![2]); + let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 3); + let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 3); + assert_eq!(blocks_b1, vec![1]); + assert_eq!(blocks_b2, vec![2]); } #[test] From b01652f3e7a0bde9f28c7c236174fbe466b819a5 Mon Sep 17 00:00:00 2001 From: debris Date: Tue, 16 Feb 2016 18:21:45 +0100 Subject: [PATCH 17/73] LocalizedLogEntry and Filter in ethcore module --- ethcore/src/externalities.rs | 6 +- ethcore/src/filter.rs | 152 +++++++++++++++++++++++++++++++++++ ethcore/src/lib.rs | 1 + ethcore/src/log_entry.rs | 40 ++++++--- ethcore/src/receipt.rs | 10 +-- ethcore/src/substate.rs | 12 ++- 6 files changed, 203 insertions(+), 18 deletions(-) create mode 100644 ethcore/src/filter.rs diff --git a/ethcore/src/externalities.rs b/ethcore/src/externalities.rs index 360bd9738..5205c67cb 100644 --- a/ethcore/src/externalities.rs +++ b/ethcore/src/externalities.rs @@ -226,7 +226,11 @@ impl<'a> Ext for Externalities<'a> { fn log(&mut self, topics: Vec, data: &[u8]) { let address = self.origin_info.address.clone(); - self.substate.logs.push(LogEntry::new(address, topics, data.to_vec())); + self.substate.logs.push(LogEntry { + address: address, + topics: topics, + data: data.to_vec() + }); } fn suicide(&mut self, refund_address: &Address) { diff --git a/ethcore/src/filter.rs b/ethcore/src/filter.rs new file mode 100644 index 000000000..718656191 --- /dev/null +++ b/ethcore/src/filter.rs @@ -0,0 +1,152 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use util::hash::*; +use util::sha3::*; +use client::BlockId; + +/// Blockchain log filter data. +pub struct Filter { + /// Blockchain will be searched from this block. + from_block: BlockId, + + /// Till this block. + to_block: BlockId, + + /// Search addresses. + /// + /// If None, match all. + /// If specified, log must be produced by one of these addresses. + address: Option>, + + /// Search topics. + /// + /// If None, match all. + /// If specified, log must contain one of these topics. + topics: [Option>; 4] +} + +impl Filter { + /// Returns combinations of each address and topic. + pub fn bloom_possibilities(&self) -> Vec { + let blooms = match self.address { + Some(ref addresses) if !addresses.is_empty() => + addresses.iter().map(|ref address| { + let mut bloom = H2048::new(); + bloom.shift_bloomed(&address.sha3()); + bloom + }).collect(), + _ => vec![H2048::new()] + }; + + self.topics.iter().fold(blooms, | bs, topic | match *topic { + None => bs, + Some(ref topics) => bs.into_iter().map(|bloom| { + topics.into_iter().map(|topic| { + let mut b = bloom.clone(); + b.shift_bloomed(&topic.sha3()); + b + }).collect::>() + }).flat_map(|m| m).collect() + }) + } +} + +#[cfg(test)] +mod tests { + use std::str::FromStr; + use util::hash::*; + use filter::Filter; + use client::BlockId; + + #[test] + fn test_bloom_possibilities_none() { + let none_filter = Filter { + from_block: BlockId::Earliest, + to_block: BlockId::Latest, + address: None, + topics: [None, None, None, None] + }; + + let possibilities = none_filter.bloom_possibilities(); + assert_eq!(possibilities.len(), 1); + assert!(possibilities[0].is_zero()) + } + + // block 399849 + #[test] + fn test_bloom_possibilities_single_address_and_topic() { + let filter = Filter { + from_block: BlockId::Earliest, + to_block: BlockId::Latest, + address: Some(vec![Address::from_str("b372018f3be9e171df0581136b59d2faf73a7d5d").unwrap()]), + topics: [ + Some(vec![H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap()]), + None, None, None + ] + }; + + let possibilities = filter.bloom_possibilities(); + assert_eq!(possibilities, vec![H2048::from_str("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000004000000004000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()]); + } + + #[test] + fn test_bloom_possibilities_single_address_and_many_topics() { + let filter = Filter { + from_block: BlockId::Earliest, + to_block: BlockId::Latest, + address: Some(vec![Address::from_str("b372018f3be9e171df0581136b59d2faf73a7d5d").unwrap()]), + topics: [ + Some(vec![H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap()]), + Some(vec![H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap()]), + None, None + ] + }; + + let possibilities = filter.bloom_possibilities(); + assert_eq!(possibilities, vec![H2048::from_str("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000004000000004000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()]); + } + + #[test] + fn test_bloom_possibilites_multiple_addresses_and_topics() { + let filter = Filter { + from_block: BlockId::Earliest, + to_block: BlockId::Latest, + address: Some(vec![ + Address::from_str("b372018f3be9e171df0581136b59d2faf73a7d5d").unwrap(), + Address::from_str("b372018f3be9e171df0581136b59d2faf73a7d5d").unwrap(), + ]), + topics: [ + Some(vec![ + H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap(), + H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap() + ]), + Some(vec![ + H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap(), + H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap() + ]), + Some(vec![H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap()]), + None + ] + }; + + // number of possibilites should be equal 2 * 2 * 2 * 1 = 8 + let possibilities = filter.bloom_possibilities(); + assert_eq!(possibilities.len(), 8); + assert_eq!(possibilities[0], H2048::from_str("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000004000000004000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()); + } + +} diff --git a/ethcore/src/lib.rs b/ethcore/src/lib.rs index 689b1be6a..38f961d10 100644 --- a/ethcore/src/lib.rs +++ b/ethcore/src/lib.rs @@ -131,6 +131,7 @@ mod substate; mod executive; mod externalities; mod verification; +mod filter; #[cfg(test)] mod tests; diff --git a/ethcore/src/log_entry.rs b/ethcore/src/log_entry.rs index ee73b1ad1..304fae9d0 100644 --- a/ethcore/src/log_entry.rs +++ b/ethcore/src/log_entry.rs @@ -38,15 +38,6 @@ impl Encodable for LogEntry { } impl LogEntry { - /// Create a new log entry. - pub fn new(address: Address, topics: Vec, data: Bytes) -> LogEntry { - LogEntry { - address: address, - topics: topics, - data: data - } - } - /// Calculates the bloom of this log entry. pub fn bloom(&self) -> LogBloom { self.topics.iter().fold(LogBloom::from_bloomed(&self.address.sha3()), |b, t| b.with_bloomed(&t.sha3())) @@ -65,6 +56,31 @@ impl FromJson for LogEntry { } } +/// Log localized in a blockchain. +#[derive(Default, Debug, PartialEq)] +pub struct LocalizedLogEntry { + /// Plain log entry. + pub entry: LogEntry, + /// Block in which this log was created. + pub block_hash: H256, + /// Block number. + pub block_number: usize, + /// Hash of transaction in which this log was created. + pub transaction_hash: H256, + /// Index of transaction within block. + pub transaction_index: usize, + /// Log position in the block. + pub log_index: usize +} + +impl Deref for LocalizedLogEntry { + type Target = LogEntry; + + fn deref(&self) -> &Self::Target { + &self.entry + } +} + #[cfg(test)] mod tests { use util::*; @@ -74,7 +90,11 @@ mod tests { fn test_empty_log_bloom() { let bloom = H2048::from_str("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap(); let address = Address::from_str("0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6").unwrap(); - let log = LogEntry::new(address, vec![], vec![]); + let log = LogEntry { + address: address, + topics: vec![], + data: vec![] + }; assert_eq!(log.bloom(), bloom); } } diff --git a/ethcore/src/receipt.rs b/ethcore/src/receipt.rs index 5fc1a318b..f43b58224 100644 --- a/ethcore/src/receipt.rs +++ b/ethcore/src/receipt.rs @@ -62,11 +62,11 @@ fn test_basic() { let r = Receipt::new( x!("2f697d671e9ae4ee24a43c4b0d7e15f1cb4ba6de1561120d43b9a4e8c4a8a6ee"), x!(0x40cae), - vec![LogEntry::new( - x!("dcf421d093428b096ca501a7cd1a740855a7976f"), - vec![], - vec![0u8; 32] - )] + vec![LogEntry { + address: x!("dcf421d093428b096ca501a7cd1a740855a7976f"), + topics: vec![], + data: vec![0u8; 32] + }] ); assert_eq!(&encode(&r)[..], &expected[..]); } diff --git a/ethcore/src/substate.rs b/ethcore/src/substate.rs index 235ce2e97..374397ca7 100644 --- a/ethcore/src/substate.rs +++ b/ethcore/src/substate.rs @@ -66,13 +66,21 @@ mod tests { fn accrue() { let mut sub_state = Substate::new(); sub_state.contracts_created.push(address_from_u64(1u64)); - sub_state.logs.push(LogEntry::new(address_from_u64(1u64), vec![], vec![])); + sub_state.logs.push(LogEntry { + address: address_from_u64(1u64), + topics: vec![], + data: vec![] + }); sub_state.sstore_clears_count = x!(5); sub_state.suicides.insert(address_from_u64(10u64)); let mut sub_state_2 = Substate::new(); sub_state_2.contracts_created.push(address_from_u64(2u64)); - sub_state_2.logs.push(LogEntry::new(address_from_u64(1u64), vec![], vec![])); + sub_state_2.logs.push(LogEntry { + address: address_from_u64(1u64), + topics: vec![], + data: vec![] + }); sub_state_2.sstore_clears_count = x!(7); sub_state.accrue(sub_state_2); From 5826a34ebb28cc914cf568d9a23995550ec95c43 Mon Sep 17 00:00:00 2001 From: debris Date: Wed, 17 Feb 2016 12:35:37 +0100 Subject: [PATCH 18/73] storing block receitps in db, client logs method implementation --- ethcore/src/blockchain.rs | 49 ++++++++++++++---------- ethcore/src/client.rs | 53 +++++++++++++++++++++++++- ethcore/src/extras.rs | 47 ++++++++++++++++++++++- ethcore/src/filter.rs | 72 ++++++++++++++++++++++++++++++++++-- ethcore/src/log_entry.rs | 18 +++++++++ ethcore/src/receipt.rs | 18 +++++++++ ethcore/src/tests/helpers.rs | 4 +- ethcore/src/verification.rs | 4 ++ 8 files changed, 236 insertions(+), 29 deletions(-) diff --git a/ethcore/src/blockchain.rs b/ethcore/src/blockchain.rs index 1a329610c..052e64d4c 100644 --- a/ethcore/src/blockchain.rs +++ b/ethcore/src/blockchain.rs @@ -50,7 +50,9 @@ pub struct CacheSize { /// Logs cache size. pub block_logs: usize, /// Blooms cache size. - pub blocks_blooms: usize + pub blocks_blooms: usize, + /// Block receipts size. + pub block_receipts: usize } struct BloomIndexer { @@ -147,6 +149,9 @@ pub trait BlockProvider { /// Get the address of transaction with given hash. fn transaction_address(&self, hash: &H256) -> Option; + /// Get receipts of block with given hash. + fn block_receipts(&self, hash: &H256) -> Option; + /// Get the partial-header of a block. fn block_header(&self, hash: &H256) -> Option
{ self.block(hash).map(|bytes| BlockView::new(&bytes).header()) @@ -223,6 +228,7 @@ pub struct BlockChain { transaction_addresses: RwLock>, block_logs: RwLock>, blocks_blooms: RwLock>, + block_receipts: RwLock>, extras_db: DB, blocks_db: DB, @@ -287,6 +293,11 @@ impl BlockProvider for BlockChain { self.query_extras(hash, &self.transaction_addresses) } + /// Get receipts of block with given hash. + fn block_receipts(&self, hash: &H256) -> Option { + self.query_extras(hash, &self.block_receipts) + } + /// Returns numbers of blocks containing given bloom. fn blocks_with_bloom(&self, bloom: &H2048, from_block: BlockNumber, to_block: BlockNumber) -> Vec { let filter = ChainFilter::new(self, self.bloom_indexer.index_size(), self.bloom_indexer.levels()); @@ -348,6 +359,7 @@ impl BlockChain { transaction_addresses: RwLock::new(HashMap::new()), block_logs: RwLock::new(HashMap::new()), blocks_blooms: RwLock::new(HashMap::new()), + block_receipts: RwLock::new(HashMap::new()), extras_db: extras_db, blocks_db: blocks_db, cache_man: RwLock::new(cache_man), @@ -504,7 +516,7 @@ impl BlockChain { /// Inserts the block into backing cache database. /// Expects the block to be valid and already verified. /// If the block is already known, does nothing. - pub fn insert_block(&self, bytes: &[u8], receipts: &[Receipt]) { + pub fn insert_block(&self, bytes: &[u8], receipts: Vec) { // create views onto rlp let block = BlockView::new(bytes); let header = block.header_view(); @@ -546,8 +558,7 @@ impl BlockChain { /// Transforms block into WriteBatch that may be written into database /// Additionally, if it's new best block it returns new best block object. - //fn block_to_extras_insert_batch(&self, bytes: &[u8], _receipts: &[Receipt]) -> (WriteBatch, Option, BlockDetails) { - fn block_to_extras_update(&self, bytes: &[u8], _receipts: &[Receipt]) -> ExtrasUpdate { + fn block_to_extras_update(&self, bytes: &[u8], receipts: Vec) -> ExtrasUpdate { // create views onto rlp let block = BlockView::new(bytes); let header = block.header_view(); @@ -585,11 +596,8 @@ impl BlockChain { }); } - // save blooms (is it really required?). maybe store receipt whole instead? - //let blooms: Vec = receipts.iter().map(|r| r.log_bloom.clone()).collect(); - //batch.put_extras(&hash, &BlockLogBlooms { - //blooms: blooms - //}); + // update block receipts + batch.put_extras(&hash, &BlockReceipts::new(receipts)); // if it's not new best block, just return if !is_new_best { @@ -741,7 +749,8 @@ impl BlockChain { block_details: self.block_details.read().unwrap().heap_size_of_children(), transaction_addresses: self.transaction_addresses.read().unwrap().heap_size_of_children(), block_logs: self.block_logs.read().unwrap().heap_size_of_children(), - blocks_blooms: self.blocks_blooms.read().unwrap().heap_size_of_children() + blocks_blooms: self.blocks_blooms.read().unwrap().heap_size_of_children(), + block_receipts: self.block_receipts.read().unwrap().heap_size_of_children() } } @@ -773,6 +782,7 @@ impl BlockChain { let mut transaction_addresses = self.transaction_addresses.write().unwrap(); let mut block_logs = self.block_logs.write().unwrap(); let mut blocks_blooms = self.blocks_blooms.write().unwrap(); + let mut block_receipts = self.block_receipts.write().unwrap(); for id in cache_man.cache_usage.pop_back().unwrap().into_iter() { cache_man.in_use.remove(&id); @@ -782,6 +792,7 @@ impl BlockChain { CacheID::Extras(ExtrasIndex::TransactionAddress, h) => { transaction_addresses.remove(&h); }, CacheID::Extras(ExtrasIndex::BlockLogBlooms, h) => { block_logs.remove(&h); }, CacheID::Extras(ExtrasIndex::BlocksBlooms, h) => { blocks_blooms.remove(&h); }, + CacheID::Extras(ExtrasIndex::BlockReceipts, h) => { block_receipts.remove(&h); }, _ => panic!(), } } @@ -823,7 +834,7 @@ mod tests { let first = "f90285f90219a03caa2203f3d7c136c0295ed128a7d31cea520b1ca5e27afe17d0853331798942a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0bac6177a79e910c98d86ec31a09ae37ac2de15b754fd7bed1ba52362c49416bfa0d45893a296c1490a978e0bd321b5f2635d8280365c1fe9f693d65f233e791344a0c7778a7376099ee2e5c455791c1885b5c361b95713fddcbe32d97fd01334d296b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b845627cb99a00102030405060708091011121314151617181920212223242526272829303132a08ccb2837fb2923bd97e8f2d08ea32012d6e34be018c73e49a0f98843e8f47d5d88e53be49fec01012ef866f864800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d8785012a05f200801ba0cb088b8d2ff76a7b2c6616c9d02fb6b7a501afbf8b69d7180b09928a1b80b5e4a06448fe7476c606582039bb72a9f6f4b4fad18507b8dfbd00eebbe151cc573cd2c0".from_hex().unwrap(); - bc.insert_block(&first, &[]); + bc.insert_block(&first, vec![]); let first_hash = H256::from_str("a940e5af7d146b3b917c953a82e1966b906dace3a4e355b5b0a4560190357ea1").unwrap(); @@ -856,10 +867,10 @@ mod tests { let temp = RandomTempPath::new(); let bc = BlockChain::new(&genesis, temp.as_path()); - bc.insert_block(&b1, &[]); - bc.insert_block(&b2, &[]); - bc.insert_block(&b3a, &[]); - bc.insert_block(&b3b, &[]); + bc.insert_block(&b1, vec![]); + bc.insert_block(&b2, vec![]); + bc.insert_block(&b3a, vec![]); + bc.insert_block(&b3b, vec![]); assert_eq!(bc.best_block_hash(), best_block_hash); assert_eq!(bc.block_number(&genesis_hash).unwrap(), 0); @@ -936,7 +947,7 @@ mod tests { { let bc = BlockChain::new(&genesis, temp.as_path()); assert_eq!(bc.best_block_hash(), genesis_hash); - bc.insert_block(&b1, &[]); + bc.insert_block(&b1, vec![]); assert_eq!(bc.best_block_hash(), b1_hash); } @@ -995,7 +1006,7 @@ mod tests { let temp = RandomTempPath::new(); let bc = BlockChain::new(&genesis, temp.as_path()); - bc.insert_block(&b1, &[]); + bc.insert_block(&b1, vec![]); let transactions = bc.transactions(&b1_hash).unwrap(); assert_eq!(transactions.len(), 7); @@ -1026,13 +1037,13 @@ mod tests { assert_eq!(blocks_b1, vec![]); assert_eq!(blocks_b2, vec![]); - bc.insert_block(&b1, &[]); + bc.insert_block(&b1, vec![]); let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 3); let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 3); assert_eq!(blocks_b1, vec![1]); assert_eq!(blocks_b2, vec![]); - bc.insert_block(&b2, &[]); + bc.insert_block(&b2, vec![]); let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 3); let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 3); assert_eq!(blocks_b1, vec![1]); diff --git a/ethcore/src/client.rs b/ethcore/src/client.rs index d7fcdbc30..7fe3fe836 100644 --- a/ethcore/src/client.rs +++ b/ethcore/src/client.rs @@ -33,7 +33,9 @@ use env_info::LastHashes; use verification::*; use block::*; use transaction::LocalizedTransaction; -use extras::TransactionAddress; +use extras::{TransactionAddress, BlockReceipts}; +use filter::Filter; +use log_entry::LocalizedLogEntry; pub use blockchain::TreeRoute; /// Uniquely identifies block. @@ -147,6 +149,9 @@ pub trait BlockChainClient : Sync + Send { /// Returns numbers of blocks containing given bloom. fn blocks_with_bloom(&self, bloom: &H2048, from_block: BlockId, to_block: BlockId) -> Option>; + + /// Returns logs matching given filter. + fn logs(&self, filter: Filter) -> Vec; } #[derive(Default, Clone, Debug, Eq, PartialEq)] @@ -307,7 +312,7 @@ impl Client { good_blocks.push(header.hash().clone()); - self.chain.write().unwrap().insert_block(&block.bytes, result.block().receipts()); //TODO: err here? + self.chain.write().unwrap().insert_block(&block.bytes, result.block().receipts().clone()); //TODO: err here? let ancient = if header.number() >= HISTORY { Some(header.number() - HISTORY) } else { None }; match result.drain().commit(header.number(), &header.hash(), ancient.map(|n|(n, self.chain.read().unwrap().block_hash(n).unwrap()))) { Ok(_) => (), @@ -474,6 +479,50 @@ impl BlockChainClient for Client { _ => None } } + + fn logs(&self, filter: Filter) -> Vec { + let mut blocks = filter.bloom_possibilities().iter() + .map(|bloom| self.blocks_with_bloom(bloom, filter.from_block.clone(), filter.to_block.clone())) + .filter_map(|m| m) + .flat_map(|m| m) + // remove duplicate elements + .collect::>() + .into_iter() + .collect::>(); + + blocks.sort(); + + blocks.into_iter() + .map(|number| self.chain.read().unwrap().block_hash(number).map(|hash| (number, hash))) + .filter_map(|m| m) + .map(|(number, hash)| self.chain.read().unwrap().block_receipts(&hash).map(|r| (number, hash, r.receipts))) + .filter_map(|m| m) + .map(|(number, hash, receipts)| { + let mut log_index = 0; + receipts.into_iter() + .enumerate() + .map(|(index, receipt)| { + log_index += receipt.logs.len(); + receipt.logs.into_iter() + .enumerate() + .filter(|tuple| filter.matches(&tuple.1)) + .map(|(i, log)| LocalizedLogEntry { + entry: log, + block_hash: hash.clone(), + block_number: number as usize, + transaction_hash: H256::new(), + transaction_index: index, + log_index: log_index + }) + .collect::>() + }) + .flat_map(|m| m) + .collect::>() + + }) + .flat_map(|m| m) + .collect() + } } impl MayPanic for Client { diff --git a/ethcore/src/extras.rs b/ethcore/src/extras.rs index 66e734582..50d3a21bf 100644 --- a/ethcore/src/extras.rs +++ b/ethcore/src/extras.rs @@ -16,9 +16,10 @@ //! Blockchain DB extras. +use rocksdb::{DB, Writable}; use util::*; use header::BlockNumber; -use rocksdb::{DB, Writable}; +use receipt::Receipt; /// Represents index of extra data in database #[derive(Copy, Debug, Hash, Eq, PartialEq, Clone)] @@ -32,7 +33,9 @@ pub enum ExtrasIndex { /// Block log blooms index BlockLogBlooms = 3, /// Block blooms index - BlocksBlooms = 4 + BlocksBlooms = 4, + /// Block receipts index + BlockReceipts } /// trait used to write Extras data to db @@ -307,3 +310,43 @@ impl Encodable for TransactionAddress { s.append(&self.index); } } + +/// Contains all block receipts. +#[derive(Clone)] +pub struct BlockReceipts { + pub receipts: Vec +} + +impl BlockReceipts { + pub fn new(receipts: Vec) -> Self { + BlockReceipts { + receipts: receipts + } + } +} + +impl Decodable for BlockReceipts { + fn decode(decoder: &D) -> Result where D: Decoder { + Ok(BlockReceipts { + receipts: try!(Decodable::decode(decoder)) + }) + } +} + +impl Encodable for BlockReceipts { + fn rlp_append(&self, s: &mut RlpStream) { + s.append(&self.receipts); + } +} + +impl HeapSizeOf for BlockReceipts { + fn heap_size_of_children(&self) -> usize { + self.receipts.heap_size_of_children() + } +} + +impl ExtrasIndexable for BlockReceipts { + fn extras_index() -> ExtrasIndex { + ExtrasIndex::BlockReceipts + } +} diff --git a/ethcore/src/filter.rs b/ethcore/src/filter.rs index 718656191..89295b9c2 100644 --- a/ethcore/src/filter.rs +++ b/ethcore/src/filter.rs @@ -17,26 +17,27 @@ use util::hash::*; use util::sha3::*; use client::BlockId; +use log_entry::LogEntry; /// Blockchain log filter data. pub struct Filter { /// Blockchain will be searched from this block. - from_block: BlockId, + pub from_block: BlockId, /// Till this block. - to_block: BlockId, + pub to_block: BlockId, /// Search addresses. /// /// If None, match all. /// If specified, log must be produced by one of these addresses. - address: Option>, + pub address: Option>, /// Search topics. /// /// If None, match all. /// If specified, log must contain one of these topics. - topics: [Option>; 4] + pub topics: [Option>; 4] } impl Filter { @@ -63,6 +64,23 @@ impl Filter { }).flat_map(|m| m).collect() }) } + + /// Returns true if given log entry matches filter. + pub fn matches(&self, log: &LogEntry) -> bool { + let matches = match self.address { + Some(ref addresses) if !addresses.is_empty() => addresses.iter().fold(false, |res, address| { + res || &log.address == address + }), + _ => true + }; + + matches && self.topics.iter().enumerate().fold(true, |res, (i, topic)| match *topic { + Some(ref topics) if !topics.is_empty() => res && topics.iter().fold(false, | acc, topic | { + acc || log.topics.get(i) == Some(topic) + }), + _ => res, + }) + } } #[cfg(test)] @@ -71,6 +89,7 @@ mod tests { use util::hash::*; use filter::Filter; use client::BlockId; + use log_entry::LogEntry; #[test] fn test_bloom_possibilities_none() { @@ -149,4 +168,49 @@ mod tests { assert_eq!(possibilities[0], H2048::from_str("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000004000000004000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()); } + #[test] + fn test_filter_matches() { + let filter = Filter { + from_block: BlockId::Earliest, + to_block: BlockId::Latest, + address: Some(vec![Address::from_str("b372018f3be9e171df0581136b59d2faf73a7d5d").unwrap()]), + topics: [ + Some(vec![H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap()]), + Some(vec![H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23fa").unwrap()]), + None, None + ] + }; + + let entry0 = LogEntry { + address: Address::from_str("b372018f3be9e171df0581136b59d2faf73a7d5d").unwrap(), + topics: vec![ + H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap(), + H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23fa").unwrap(), + H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap(), + ], + data: vec![] + }; + + let entry1 = LogEntry { + address: Address::from_str("b372018f3be9e171df0581136b59d2faf73a7d5e").unwrap(), + topics: vec![ + H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap(), + H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23fa").unwrap(), + H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap(), + ], + data: vec![] + }; + + let entry2 = LogEntry { + address: Address::from_str("b372018f3be9e171df0581136b59d2faf73a7d5d").unwrap(), + topics: vec![ + H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap(), + ], + data: vec![] + }; + + assert_eq!(filter.matches(&entry0), true); + assert_eq!(filter.matches(&entry1), false); + assert_eq!(filter.matches(&entry2), false); + } } diff --git a/ethcore/src/log_entry.rs b/ethcore/src/log_entry.rs index 304fae9d0..24f449dce 100644 --- a/ethcore/src/log_entry.rs +++ b/ethcore/src/log_entry.rs @@ -37,6 +37,24 @@ impl Encodable for LogEntry { } } +impl Decodable for LogEntry { + fn decode(decoder: &D) -> Result where D: Decoder { + let d = decoder.as_rlp(); + let entry = LogEntry { + address: try!(d.val_at(0)), + topics: try!(d.val_at(1)), + data: try!(d.val_at(2)), + }; + Ok(entry) + } +} + +impl HeapSizeOf for LogEntry { + fn heap_size_of_children(&self) -> usize { + self.topics.heap_size_of_children() + self.data.heap_size_of_children() + } +} + impl LogEntry { /// Calculates the bloom of this log entry. pub fn bloom(&self) -> LogBloom { diff --git a/ethcore/src/receipt.rs b/ethcore/src/receipt.rs index f43b58224..1ec52c592 100644 --- a/ethcore/src/receipt.rs +++ b/ethcore/src/receipt.rs @@ -55,6 +55,24 @@ impl Encodable for Receipt { } } +impl Decodable for Receipt { + fn decode(decoder: &D) -> Result where D: Decoder { + let d = decoder.as_rlp(); + let receipt = Receipt { + state_root: try!(d.val_at(0)), + gas_used: try!(d.val_at(1)), + log_bloom: try!(d.val_at(2)), + logs: try!(d.val_at(3)), + }; + Ok(receipt) + } +} + +impl HeapSizeOf for Receipt { + fn heap_size_of_children(&self) -> usize { + self.logs.heap_size_of_children() + } +} #[test] fn test_basic() { diff --git a/ethcore/src/tests/helpers.rs b/ethcore/src/tests/helpers.rs index 0a2b95e8d..38cd48f32 100644 --- a/ethcore/src/tests/helpers.rs +++ b/ethcore/src/tests/helpers.rs @@ -224,7 +224,7 @@ pub fn generate_dummy_blockchain(block_number: u32) -> GuardedTempResult { @@ -237,7 +237,7 @@ pub fn generate_dummy_blockchain_with_extra(block_number: u32) -> GuardedTempRes let temp = RandomTempPath::new(); let bc = BlockChain::new(&create_unverifiable_block(0, H256::zero()), temp.as_path()); for block_order in 1..block_number { - bc.insert_block(&create_unverifiable_block_with_extra(block_order, bc.best_block_hash(), None), &[]); + bc.insert_block(&create_unverifiable_block_with_extra(block_order, bc.best_block_hash(), None), vec![]); } GuardedTempResult:: { diff --git a/ethcore/src/verification.rs b/ethcore/src/verification.rs index 548150f09..ad5efd24a 100644 --- a/ethcore/src/verification.rs +++ b/ethcore/src/verification.rs @@ -306,6 +306,10 @@ mod tests { fn blocks_with_bloom(&self, _bloom: &H2048, _from_block: BlockNumber, _to_block: BlockNumber) -> Vec { unimplemented!() } + + fn block_receipts(&self, _hash: &H256) -> Option { + unimplemented!() + } } fn basic_test(bytes: &[u8], engine: &Engine) -> Result<(), Error> { From c74c016ce2c175651b82f1fd53bced81a4b8b904 Mon Sep 17 00:00:00 2001 From: debris Date: Wed, 17 Feb 2016 14:13:51 +0100 Subject: [PATCH 19/73] moved filter logic from rpc module to ethcore --- ethcore/src/client.rs | 4 +- ethcore/src/filter.rs | 4 +- ethcore/src/lib.rs | 4 +- ethcore/src/log_entry.rs | 2 + rpc/src/v1/impls/eth.rs | 18 ++---- rpc/src/v1/types/filter.rs | 127 ++++++------------------------------- rpc/src/v1/types/log.rs | 52 +++++++++++++++ rpc/src/v1/types/mod.rs | 2 + 8 files changed, 88 insertions(+), 125 deletions(-) create mode 100644 rpc/src/v1/types/log.rs diff --git a/ethcore/src/client.rs b/ethcore/src/client.rs index 7fe3fe836..ba3c97422 100644 --- a/ethcore/src/client.rs +++ b/ethcore/src/client.rs @@ -33,7 +33,7 @@ use env_info::LastHashes; use verification::*; use block::*; use transaction::LocalizedTransaction; -use extras::{TransactionAddress, BlockReceipts}; +use extras::TransactionAddress; use filter::Filter; use log_entry::LocalizedLogEntry; pub use blockchain::TreeRoute; @@ -512,7 +512,7 @@ impl BlockChainClient for Client { block_number: number as usize, transaction_hash: H256::new(), transaction_index: index, - log_index: log_index + log_index: log_index + i }) .collect::>() }) diff --git a/ethcore/src/filter.rs b/ethcore/src/filter.rs index 89295b9c2..5daecebd3 100644 --- a/ethcore/src/filter.rs +++ b/ethcore/src/filter.rs @@ -14,12 +14,14 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . +//! Blockchain filter + use util::hash::*; use util::sha3::*; use client::BlockId; use log_entry::LogEntry; -/// Blockchain log filter data. +/// Blockchain Filter. pub struct Filter { /// Blockchain will be searched from this block. pub from_block: BlockId, diff --git a/ethcore/src/lib.rs b/ethcore/src/lib.rs index 38f961d10..ab3378d7f 100644 --- a/ethcore/src/lib.rs +++ b/ethcore/src/lib.rs @@ -102,8 +102,10 @@ pub mod block_queue; pub mod client; pub mod error; pub mod ethereum; +pub mod filter; pub mod header; pub mod service; +pub mod log_entry; pub mod spec; pub mod transaction; pub mod views; @@ -112,7 +114,6 @@ pub mod receipt; mod common; mod basic_types; #[macro_use] mod evm; -mod log_entry; mod env_info; mod pod_account; mod pod_state; @@ -131,7 +132,6 @@ mod substate; mod executive; mod externalities; mod verification; -mod filter; #[cfg(test)] mod tests; diff --git a/ethcore/src/log_entry.rs b/ethcore/src/log_entry.rs index 24f449dce..a7d409833 100644 --- a/ethcore/src/log_entry.rs +++ b/ethcore/src/log_entry.rs @@ -14,6 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . +//! Block log. + use util::*; use basic_types::LogBloom; diff --git a/rpc/src/v1/impls/eth.rs b/rpc/src/v1/impls/eth.rs index bbeb475dc..42e58493a 100644 --- a/rpc/src/v1/impls/eth.rs +++ b/rpc/src/v1/impls/eth.rs @@ -15,7 +15,6 @@ // along with Parity. If not, see . //! Eth rpc implementation. -use std::collections::HashSet; use std::sync::Arc; use ethsync::{EthSync, SyncState}; use jsonrpc_core::*; @@ -26,7 +25,7 @@ use ethcore::client::*; use ethcore::views::*; use ethcore::ethereum::denominations::shannon; use v1::traits::{Eth, EthFilter}; -use v1::types::{Block, BlockTransactions, BlockNumber, Bytes, SyncStatus, SyncInfo, Transaction, OptionalValue, Index, Filter}; +use v1::types::{Block, BlockTransactions, BlockNumber, Bytes, SyncStatus, SyncInfo, Transaction, OptionalValue, Index, Filter, Log}; /// Eth rpc implementation. pub struct EthClient { @@ -202,18 +201,11 @@ impl Eth for EthClient { fn logs(&self, params: Params) -> Result { from_params::<(Filter,)>(params) .and_then(|(filter,)| { - let possibilities = filter.bloom_possibilities(); - let from = filter.from_block.map_or_else(|| BlockId::Earliest, Into::into); - let to = filter.to_block.map_or_else(|| BlockId::Latest, Into::into); - let mut blocks: Vec = possibilities.iter() - .map(|bloom| self.client.blocks_with_bloom(bloom, from.clone(), to.clone())) - .filter_map(|m| m) - .flat_map(|m| m) - .collect::>() + let logs = self.client.logs(filter.into()) .into_iter() - .collect(); - blocks.sort(); - to_value(&blocks) + .map(From::from) + .collect::>(); + to_value(&logs) }) } } diff --git a/rpc/src/v1/types/filter.rs b/rpc/src/v1/types/filter.rs index 62b865bee..bb932f349 100644 --- a/rpc/src/v1/types/filter.rs +++ b/rpc/src/v1/types/filter.rs @@ -18,8 +18,9 @@ use serde::{Deserialize, Deserializer, Error}; use serde_json::value; use jsonrpc_core::Value; use util::hash::*; -use util::sha3::*; use v1::types::BlockNumber; +use ethcore::filter::Filter as EthFilter; +use ethcore::client::BlockId; #[derive(Debug, PartialEq)] pub enum VariadicValue where T: Deserialize { @@ -56,41 +57,24 @@ pub struct Filter { pub topics: Option> } -impl Filter { - /// Returns combinations of each address and topic. - pub fn bloom_possibilities(&self) -> Vec { - let blooms = match self.address { - Some(VariadicValue::Single(ref address)) => { - let mut bloom = H2048::new(); - bloom.shift_bloomed(&address.sha3()); - vec![bloom] - }, - Some(VariadicValue::Multiple(ref addresses)) => { - addresses.iter().map(|ref address| { - let mut bloom = H2048::new(); - bloom.shift_bloomed(&address.sha3()); - bloom - }).collect() - }, - _ => vec![H2048::new()] - }; - - match self.topics { - None => blooms, - Some(ref topics) => topics.iter().fold(blooms, | bs, topic | match *topic { - VariadicValue::Null => bs, - VariadicValue::Single(ref topic) => bs.into_iter().map(|mut bloom| { - bloom.shift_bloomed(&topic.sha3()); - bloom - }).collect(), - VariadicValue::Multiple(ref topics) => bs.into_iter().map(|bloom| { - topics.into_iter().map(|topic| { - let mut b = bloom.clone(); - b.shift_bloomed(&topic.sha3()); - b - }).collect::>() - }).flat_map(|m| m).collect::>() - }) +impl Into for Filter { + fn into(self) -> EthFilter { + EthFilter { + from_block: self.from_block.map_or_else(|| BlockId::Earliest, Into::into), + to_block: self.to_block.map_or_else(|| BlockId::Latest, Into::into), + address: self.address.and_then(|address| match address { + VariadicValue::Null => None, + VariadicValue::Single(a) => Some(vec![a]), + VariadicValue::Multiple(a) => Some(a) + }), + topics: { + let mut iter = self.topics.map_or_else(Vec::new, |topics| topics.into_iter().take(4).map(|topic| match topic { + VariadicValue::Null => None, + VariadicValue::Single(t) => Some(vec![t]), + VariadicValue::Multiple(t) => Some(t) + }).filter_map(|m| m).collect()).into_iter(); + [iter.next(), iter.next(), iter.next(), iter.next()] + } } } } @@ -128,75 +112,4 @@ mod tests { topics: None }); } - - #[test] - fn test_bloom_possibilities_none() { - let none_filter = Filter { - from_block: None, - to_block: None, - address: None, - topics: None - }; - - let possibilities = none_filter.bloom_possibilities(); - assert_eq!(possibilities, vec![H2048::new()]); - } - - // block 399849 - #[test] - fn test_bloom_possibilities_single_address_and_topic() { - let filter = Filter { - from_block: None, - to_block: None, - address: Some(VariadicValue::Single(Address::from_str("b372018f3be9e171df0581136b59d2faf73a7d5d").unwrap())), - topics: Some(vec![VariadicValue::Single(H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap())]) - }; - - let possibilities = filter.bloom_possibilities(); - assert_eq!(possibilities, vec![H2048::from_str("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000004000000004000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()]); - } - - #[test] - fn test_bloom_possibilities_single_address_and_many_topics() { - let filter = Filter { - from_block: None, - to_block: None, - address: Some(VariadicValue::Single(Address::from_str("b372018f3be9e171df0581136b59d2faf73a7d5d").unwrap())), - topics: Some(vec![ - VariadicValue::Single(H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap()), - VariadicValue::Single(H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap()) - ]) - }; - - let possibilities = filter.bloom_possibilities(); - assert_eq!(possibilities, vec![H2048::from_str("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000004000000004000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()]); - } - - #[test] - fn test_bloom_possibilites_multiple_addresses_and_topics() { - let filter = Filter { - from_block: None, - to_block: None, - address: Some(VariadicValue::Multiple(vec![ - Address::from_str("b372018f3be9e171df0581136b59d2faf73a7d5d").unwrap(), - Address::from_str("b372018f3be9e171df0581136b59d2faf73a7d5d").unwrap() - ])), - topics: Some(vec![ - VariadicValue::Multiple(vec![ - H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap(), - H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap() - ]), - VariadicValue::Multiple(vec![ - H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap(), - H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap() - ]), - VariadicValue::Single(H256::from_str("ff74e91598aed6ae5d2fdcf8b24cd2c7be49a0808112a305069355b7160f23f9").unwrap()) - ]) - }; - - // number of possibilites should be equal 2 * 2 * 2 * 1 = 8 - let possibilities = filter.bloom_possibilities(); - assert_eq!(possibilities.len(), 8); - assert_eq!(possibilities[0], H2048::from_str("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000004000000004000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()); - } } diff --git a/rpc/src/v1/types/log.rs b/rpc/src/v1/types/log.rs new file mode 100644 index 000000000..4b8661075 --- /dev/null +++ b/rpc/src/v1/types/log.rs @@ -0,0 +1,52 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use util::hash::*; +use util::uint::*; +use ethcore::log_entry::LocalizedLogEntry; +use v1::types::Bytes; + +#[derive(Debug, Serialize)] +pub struct Log { + address: Address, + topics: Vec, + data: Bytes, + #[serde(rename="blockHash")] + block_hash: H256, + #[serde(rename="blockNumber")] + block_number: U256, + #[serde(rename="transactionHash")] + transaction_hash: H256, + #[serde(rename="transactionIndex")] + transaction_index: U256, + #[serde(rename="logIndex")] + log_index: U256 +} + +impl From for Log { + fn from(e: LocalizedLogEntry) -> Log { + Log { + address: e.entry.address, + topics: e.entry.topics, + data: Bytes::new(e.entry.data), + block_hash: e.block_hash, + block_number: From::from(e.block_number), + transaction_hash: e.transaction_hash, + transaction_index: From::from(e.transaction_index), + log_index: From::from(e.log_index) + } + } +} diff --git a/rpc/src/v1/types/mod.rs b/rpc/src/v1/types/mod.rs index c4c6e8295..34c1f1cff 100644 --- a/rpc/src/v1/types/mod.rs +++ b/rpc/src/v1/types/mod.rs @@ -19,6 +19,7 @@ mod block_number; mod bytes; mod filter; mod index; +mod log; mod optionals; mod sync; mod transaction; @@ -28,6 +29,7 @@ pub use self::block_number::BlockNumber; pub use self::bytes::Bytes; pub use self::filter::Filter; pub use self::index::Index; +pub use self::log::Log; pub use self::optionals::OptionalValue; pub use self::sync::{SyncStatus, SyncInfo}; pub use self::transaction::Transaction; From 68d546ce02cb00ad3dea1b789b4888a5d978d186 Mon Sep 17 00:00:00 2001 From: debris Date: Wed, 17 Feb 2016 14:45:25 +0100 Subject: [PATCH 20/73] tests for log serialization --- rpc/src/v1/impls/eth.rs | 1 - rpc/src/v1/types/log.rs | 31 +++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/rpc/src/v1/impls/eth.rs b/rpc/src/v1/impls/eth.rs index 42e58493a..689afd019 100644 --- a/rpc/src/v1/impls/eth.rs +++ b/rpc/src/v1/impls/eth.rs @@ -210,7 +210,6 @@ impl Eth for EthClient { } } - /// Eth filter rpc implementation. pub struct EthFilterClient { client: Arc diff --git a/rpc/src/v1/types/log.rs b/rpc/src/v1/types/log.rs index 4b8661075..83880a222 100644 --- a/rpc/src/v1/types/log.rs +++ b/rpc/src/v1/types/log.rs @@ -50,3 +50,34 @@ impl From for Log { } } } + +#[cfg(test)] +mod tests { + use serde_json; + use std::str::FromStr; + use util::hash::*; + use util::uint::*; + use v1::types::{Bytes, Log}; + + #[test] + fn log_serialization() { + let s = r#"{"address":"0x33990122638b9132ca29c723bdf037f1a891a70c","topics":["0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc","0x4861736852656700000000000000000000000000000000000000000000000000"],"data":"0x","blockHash":"0xed76641c68a1c641aee09a94b3b471f4dc0316efe5ac19cf488e2674cf8d05b5","blockNumber":"0x04510c","transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x00","logIndex":"0x01"}"#; + + let log = Log { + address: Address::from_str("33990122638b9132ca29c723bdf037f1a891a70c").unwrap(), + topics: vec![ + H256::from_str("a6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc").unwrap(), + H256::from_str("4861736852656700000000000000000000000000000000000000000000000000").unwrap() + ], + data: Bytes::new(vec![]), + block_hash: H256::from_str("ed76641c68a1c641aee09a94b3b471f4dc0316efe5ac19cf488e2674cf8d05b5").unwrap(), + block_number: U256::from(0x4510c), + transaction_hash: H256::new(), + transaction_index: U256::zero(), + log_index: U256::one() + }; + + let serialized = serde_json::to_string(&log).unwrap(); + assert_eq!(serialized, s); + } +} From 49027c529a37aee13c6488fb898f9650dc45e854 Mon Sep 17 00:00:00 2001 From: debris Date: Wed, 17 Feb 2016 14:46:23 +0100 Subject: [PATCH 21/73] increase db version --- ethcore/src/client.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethcore/src/client.rs b/ethcore/src/client.rs index ba3c97422..8e49d28bf 100644 --- a/ethcore/src/client.rs +++ b/ethcore/src/client.rs @@ -187,7 +187,7 @@ pub struct Client { } const HISTORY: u64 = 1000; -const CLIENT_DB_VER_STR: &'static str = "2.1"; +const CLIENT_DB_VER_STR: &'static str = "3"; impl Client { /// Create a new client with given spec and DB path. From 046984f7e84b22253c370010b1effa16572b261e Mon Sep 17 00:00:00 2001 From: debris Date: Wed, 17 Feb 2016 14:57:54 +0100 Subject: [PATCH 22/73] fixed log transaction hashes --- ethcore/src/client.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ethcore/src/client.rs b/ethcore/src/client.rs index 8e49d28bf..ba34d9a5e 100644 --- a/ethcore/src/client.rs +++ b/ethcore/src/client.rs @@ -497,7 +497,9 @@ impl BlockChainClient for Client { .filter_map(|m| m) .map(|(number, hash)| self.chain.read().unwrap().block_receipts(&hash).map(|r| (number, hash, r.receipts))) .filter_map(|m| m) - .map(|(number, hash, receipts)| { + .map(|(number, hash, receipts)| self.chain.read().unwrap().block(&hash).map(|ref b| (number, hash, receipts, BlockView::new(b).transaction_hashes()))) + .filter_map(|m| m) + .map(|(number, hash, receipts, hashes)| { let mut log_index = 0; receipts.into_iter() .enumerate() @@ -510,7 +512,7 @@ impl BlockChainClient for Client { entry: log, block_hash: hash.clone(), block_number: number as usize, - transaction_hash: H256::new(), + transaction_hash: hashes.get(index).cloned().unwrap_or_else(H256::new), transaction_index: index, log_index: log_index + i }) From 68d606b5f0ce3835c8962cacd52a134c64d4d2c3 Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 18 Feb 2016 03:46:24 +0100 Subject: [PATCH 23/73] rocksdb abstraction layer --- Cargo.lock | 22 +++++++++++--- ethcore/Cargo.toml | 1 - ethcore/src/blockchain.rs | 15 +++++----- ethcore/src/client.rs | 28 ++---------------- ethcore/src/extras.rs | 5 ++-- ethcore/src/lib.rs | 1 - ethcore/src/tests/helpers.rs | 7 ++--- util/Cargo.toml | 2 +- util/src/journaldb.rs | 56 ++++++++++++++++++++---------------- util/src/lib.rs | 2 ++ util/src/overlaydb.rs | 14 ++++----- 11 files changed, 72 insertions(+), 81 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1e9f57900..1ee6e116c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -176,7 +176,6 @@ dependencies = [ "lazy_static 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "rocksdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "rust-crypto 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)", @@ -217,7 +216,7 @@ dependencies = [ "log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "rocksdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rocksdb 0.3.0 (git+https://github.com/arkpar/rust-rocksdb.git)", "rust-crypto 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", "serde 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", @@ -397,6 +396,15 @@ name = "libc" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "librocksdb-sys" +version = "0.1.0" +source = "git+https://github.com/arkpar/rust-rocksdb.git#e7f79d31e467c405a12db629daf5a86f81ed3e60" +dependencies = [ + "libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "linked-hash-map" version = "0.0.8" @@ -525,6 +533,11 @@ name = "odds" version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "pkg-config" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "quasi" version = "0.6.0" @@ -573,9 +586,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "rocksdb" version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" +source = "git+https://github.com/arkpar/rust-rocksdb.git#e7f79d31e467c405a12db629daf5a86f81ed3e60" dependencies = [ - "libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "librocksdb-sys 0.1.0 (git+https://github.com/arkpar/rust-rocksdb.git)", ] [[package]] diff --git a/ethcore/Cargo.toml b/ethcore/Cargo.toml index 3d4d27520..97d93f3b8 100644 --- a/ethcore/Cargo.toml +++ b/ethcore/Cargo.toml @@ -10,7 +10,6 @@ authors = ["Ethcore "] log = "0.3" env_logger = "0.3" rustc-serialize = "0.3" -rocksdb = "0.3" heapsize = "0.2.0" rust-crypto = "0.2.34" time = "0.1" diff --git a/ethcore/src/blockchain.rs b/ethcore/src/blockchain.rs index 9240ff800..8518ef121 100644 --- a/ethcore/src/blockchain.rs +++ b/ethcore/src/blockchain.rs @@ -17,7 +17,6 @@ //! Blockchain database. use util::*; -use rocksdb::{DB, WriteBatch, Writable}; use header::*; use extras::*; use transaction::*; @@ -162,8 +161,8 @@ pub struct BlockChain { block_logs: RwLock>, blocks_blooms: RwLock>, - extras_db: DB, - blocks_db: DB, + extras_db: Database, + blocks_db: Database, cache_man: RwLock, } @@ -250,12 +249,12 @@ impl BlockChain { // open extras db let mut extras_path = path.to_path_buf(); extras_path.push("extras"); - let extras_db = DB::open_default(extras_path.to_str().unwrap()).unwrap(); + let extras_db = Database::open_default(extras_path.to_str().unwrap()).unwrap(); // open blocks db let mut blocks_path = path.to_path_buf(); blocks_path.push("blocks"); - let blocks_db = DB::open_default(blocks_path.to_str().unwrap()).unwrap(); + let blocks_db = Database::open_default(blocks_path.to_str().unwrap()).unwrap(); let mut cache_man = CacheManager{cache_usage: VecDeque::new(), in_use: HashSet::new()}; (0..COLLECTION_QUEUE_SIZE).foreach(|_| cache_man.cache_usage.push_back(HashSet::new())); @@ -294,7 +293,7 @@ impl BlockChain { bc.blocks_db.put(&hash, genesis).unwrap(); - let batch = WriteBatch::new(); + let batch = DBTransaction::new(); batch.put_extras(&hash, &details); batch.put_extras(&header.number(), &hash); batch.put(b"best", &hash).unwrap(); @@ -457,7 +456,7 @@ impl BlockChain { /// Transforms block into WriteBatch that may be written into database /// Additionally, if it's new best block it returns new best block object. - fn block_to_extras_insert_batch(&self, bytes: &[u8]) -> (WriteBatch, Option, BlockDetails) { + fn block_to_extras_insert_batch(&self, bytes: &[u8]) -> (DBTransaction, Option, BlockDetails) { // create views onto rlp let block = BlockView::new(bytes); let header = block.header_view(); @@ -478,7 +477,7 @@ impl BlockChain { }; // prepare the batch - let batch = WriteBatch::new(); + let batch = DBTransaction::new(); // insert new block details batch.put_extras(&hash, &details); diff --git a/ethcore/src/client.rs b/ethcore/src/client.rs index 09f7417e8..762adc113 100644 --- a/ethcore/src/client.rs +++ b/ethcore/src/client.rs @@ -18,7 +18,6 @@ use util::*; use util::panics::*; -use rocksdb::{Options, DB, DBCompactionStyle}; use blockchain::{BlockChain, BlockProvider, CacheSize}; use views::BlockView; use error::*; @@ -179,7 +178,7 @@ pub struct Client { } const HISTORY: u64 = 1000; -const CLIENT_DB_VER_STR: &'static str = "2.1"; +const CLIENT_DB_VER_STR: &'static str = "3.0"; impl Client { /// Create a new client with given spec and DB path. @@ -191,34 +190,11 @@ impl Client { let path = dir.as_path(); let gb = spec.genesis_block(); let chain = Arc::new(RwLock::new(BlockChain::new(&gb, path))); - let mut opts = Options::new(); - opts.set_max_open_files(256); - opts.create_if_missing(true); - opts.set_use_fsync(false); - opts.set_compaction_style(DBCompactionStyle::DBUniversalCompaction); - /* - opts.set_bytes_per_sync(8388608); - opts.set_disable_data_sync(false); - opts.set_block_cache_size_mb(1024); - opts.set_table_cache_num_shard_bits(6); - opts.set_max_write_buffer_number(32); - opts.set_write_buffer_size(536870912); - opts.set_target_file_size_base(1073741824); - opts.set_min_write_buffer_number_to_merge(4); - opts.set_level_zero_stop_writes_trigger(2000); - opts.set_level_zero_slowdown_writes_trigger(0); - opts.set_compaction_style(DBUniversalCompaction); - opts.set_max_background_compactions(4); - opts.set_max_background_flushes(4); - opts.set_filter_deletes(false); - opts.set_disable_auto_compactions(false);*/ - let mut state_path = path.to_path_buf(); state_path.push("state"); - let db = Arc::new(DB::open(&opts, state_path.to_str().unwrap()).unwrap()); let engine = Arc::new(try!(spec.to_engine())); - let mut state_db = JournalDB::new_with_arc(db.clone()); + let mut state_db = JournalDB::new(state_path.to_str().unwrap()); if state_db.is_empty() && engine.spec().ensure_db_good(&mut state_db) { state_db.commit(0, &engine.spec().genesis_header().hash(), None).expect("Error commiting genesis state to state DB"); } diff --git a/ethcore/src/extras.rs b/ethcore/src/extras.rs index b65d4ed7a..3188378fc 100644 --- a/ethcore/src/extras.rs +++ b/ethcore/src/extras.rs @@ -18,7 +18,6 @@ use util::*; use header::BlockNumber; -use rocksdb::{DB, Writable}; /// Represents index of extra data in database #[derive(Copy, Debug, Hash, Eq, PartialEq, Clone)] @@ -56,7 +55,7 @@ pub trait ExtrasReadable { K: ExtrasSliceConvertable; } -impl ExtrasWritable for W where W: Writable { +impl ExtrasWritable for DBTransaction { fn put_extras(&self, hash: &K, value: &T) where T: ExtrasIndexable + Encodable, K: ExtrasSliceConvertable { @@ -65,7 +64,7 @@ impl ExtrasWritable for W where W: Writable { } } -impl ExtrasReadable for DB { +impl ExtrasReadable for Database { fn get_extras(&self, hash: &K) -> Option where T: ExtrasIndexable + Decodable, K: ExtrasSliceConvertable { diff --git a/ethcore/src/lib.rs b/ethcore/src/lib.rs index 4cca74319..1b4d4e6ca 100644 --- a/ethcore/src/lib.rs +++ b/ethcore/src/lib.rs @@ -86,7 +86,6 @@ #[macro_use] extern crate ethcore_util as util; #[macro_use] extern crate lazy_static; extern crate rustc_serialize; -extern crate rocksdb; extern crate heapsize; extern crate crypto; extern crate time; diff --git a/ethcore/src/tests/helpers.rs b/ethcore/src/tests/helpers.rs index 93e3e0a0d..550fc8937 100644 --- a/ethcore/src/tests/helpers.rs +++ b/ethcore/src/tests/helpers.rs @@ -22,7 +22,6 @@ use spec::*; use std::fs::{remove_dir_all}; use blockchain::{BlockChain}; use state::*; -use rocksdb::*; use evm::{Schedule, Factory}; use engine::*; use ethereum; @@ -258,8 +257,7 @@ pub fn generate_dummy_empty_blockchain() -> GuardedTempResult { pub fn get_temp_journal_db() -> GuardedTempResult { let temp = RandomTempPath::new(); - let db = DB::open_default(temp.as_str()).unwrap(); - let journal_db = JournalDB::new(db); + let journal_db = JournalDB::new(temp.as_str()); GuardedTempResult { _temp: temp, result: Some(journal_db) @@ -276,8 +274,7 @@ pub fn get_temp_state() -> GuardedTempResult { } pub fn get_temp_journal_db_in(path: &Path) -> JournalDB { - let db = DB::open_default(path.to_str().unwrap()).unwrap(); - JournalDB::new(db) + JournalDB::new(path.to_str().unwrap()) } pub fn get_temp_state_in(path: &Path) -> State { diff --git a/util/Cargo.toml b/util/Cargo.toml index 9ead8ccf6..67ac2a0bb 100644 --- a/util/Cargo.toml +++ b/util/Cargo.toml @@ -15,7 +15,7 @@ mio = "0.5.0" rand = "0.3.12" time = "0.1.34" tiny-keccak = "1.0" -rocksdb = "0.3" +rocksdb = { git = "https://github.com/arkpar/rust-rocksdb.git" } lazy_static = "0.1" eth-secp256k1 = { git = "https://github.com/arkpar/rust-secp256k1.git" } rust-crypto = "0.2.34" diff --git a/util/src/journaldb.rs b/util/src/journaldb.rs index 7b810639b..8d31f50eb 100644 --- a/util/src/journaldb.rs +++ b/util/src/journaldb.rs @@ -20,7 +20,7 @@ use common::*; use rlp::*; use hashdb::*; use memorydb::*; -use rocksdb::{DB, Writable, WriteBatch, IteratorMode}; +use kvdb::{Database, DBTransaction, DatabaseConfig}; #[cfg(test)] use std::env; @@ -33,7 +33,7 @@ use std::env; /// the removals actually take effect. pub struct JournalDB { overlay: MemoryDB, - backing: Arc, + backing: Arc, counters: Arc>>, } @@ -47,21 +47,25 @@ impl Clone for JournalDB { } } -const LATEST_ERA_KEY : [u8; 4] = [ b'l', b'a', b's', b't' ]; -const VERSION_KEY : [u8; 4] = [ b'j', b'v', b'e', b'r' ]; +// all keys must be at least 12 bytes +const LATEST_ERA_KEY : [u8; 12] = [ b'l', b'a', b's', b't', 0, 0, 0, 0, 0, 0, 0, 0 ]; +const VERSION_KEY : [u8; 12] = [ b'j', b'v', b'e', b'r', 0, 0, 0, 0, 0, 0, 0, 0 ]; -const DB_VERSION: u32 = 2; +const DB_VERSION: u32 = 3; + +const PADDING : [u8; 10] = [ 0u8; 10 ]; impl JournalDB { - /// Create a new instance given a `backing` database. - pub fn new(backing: DB) -> JournalDB { - let db = Arc::new(backing); - JournalDB::new_with_arc(db) - } - /// Create a new instance given a shared `backing` database. - pub fn new_with_arc(backing: Arc) -> JournalDB { - if backing.iterator(IteratorMode::Start).next().is_some() { + /// Create a new instance from file + pub fn new(path: &str) -> JournalDB { + let opts = DatabaseConfig { + prefix_size: Some(12) //use 12 bytes as prefix, this must match account_db prefix + }; + let backing = Database::open(opts, path).unwrap_or_else(|e| { + panic!("Error opening state db: {}", e); + }); + if !backing.is_empty() { match backing.get(&VERSION_KEY).map(|d| d.map(|v| decode::(&v))) { Ok(Some(DB_VERSION)) => {}, v => panic!("Incompatible DB version, expected {}, got {:?}", DB_VERSION, v) @@ -72,7 +76,7 @@ impl JournalDB { let counters = JournalDB::read_counters(&backing); JournalDB { overlay: MemoryDB::new(), - backing: backing, + backing: Arc::new(backing), counters: Arc::new(RwLock::new(counters)), } } @@ -82,7 +86,7 @@ impl JournalDB { pub fn new_temp() -> JournalDB { let mut dir = env::temp_dir(); dir.push(H32::random().hex()); - Self::new(DB::open_default(dir.to_str().unwrap()).unwrap()) + Self::new(dir.to_str().unwrap()) } /// Check if this database has any commits @@ -117,16 +121,17 @@ impl JournalDB { // and the key is safe to delete. // record new commit's details. - let batch = WriteBatch::new(); + let batch = DBTransaction::new(); let mut counters = self.counters.write().unwrap(); { let mut index = 0usize; let mut last; while try!(self.backing.get({ - let mut r = RlpStream::new_list(2); + let mut r = RlpStream::new_list(3); r.append(&now); r.append(&index); + r.append(&&PADDING[..]); last = r.drain(); &last })).is_some() { @@ -154,9 +159,10 @@ impl JournalDB { let mut to_remove: Vec = Vec::new(); let mut canon_inserts: Vec = Vec::new(); while let Some(rlp_data) = try!(self.backing.get({ - let mut r = RlpStream::new_list(2); + let mut r = RlpStream::new_list(3); r.append(&end_era); r.append(&index); + r.append(&&PADDING[..]); last = r.drain(); &last })) { @@ -226,16 +232,17 @@ impl JournalDB { self.backing.get(&key.bytes()).expect("Low-level database error. Some issue with your hard disk?").map(|v| v.to_vec()) } - fn read_counters(db: &DB) -> HashMap { + fn read_counters(db: &Database) -> HashMap { let mut res = HashMap::new(); if let Some(val) = db.get(&LATEST_ERA_KEY).expect("Low-level database error.") { let mut era = decode::(&val); loop { let mut index = 0usize; while let Some(rlp_data) = db.get({ - let mut r = RlpStream::new_list(2); + let mut r = RlpStream::new_list(3); r.append(&era); r.append(&index); + r.append(&&PADDING[..]); &r.drain() }).expect("Low-level database error.") { let rlp = Rlp::new(&rlp_data); @@ -259,7 +266,7 @@ impl JournalDB { impl HashDB for JournalDB { fn keys(&self) -> HashMap { let mut ret: HashMap = HashMap::new(); - for (key, _) in self.backing.iterator(IteratorMode::Start) { + for (key, _) in self.backing.iter() { let h = H256::from_slice(key.deref()); ret.insert(h, 1); } @@ -429,12 +436,11 @@ mod tests { #[test] fn reopen() { - use rocksdb::DB; let mut dir = ::std::env::temp_dir(); dir.push(H32::random().hex()); let foo = { - let mut jdb = JournalDB::new(DB::open_default(dir.to_str().unwrap()).unwrap()); + let mut jdb = JournalDB::new(dir.to_str().unwrap()); // history is 1 let foo = jdb.insert(b"foo"); jdb.commit(0, &b"0".sha3(), None).unwrap(); @@ -442,13 +448,13 @@ mod tests { }; { - let mut jdb = JournalDB::new(DB::open_default(dir.to_str().unwrap()).unwrap()); + let mut jdb = JournalDB::new(dir.to_str().unwrap()); jdb.remove(&foo); jdb.commit(1, &b"1".sha3(), Some((0, b"0".sha3()))).unwrap(); } { - let mut jdb = JournalDB::new(DB::open_default(dir.to_str().unwrap()).unwrap()); + let mut jdb = JournalDB::new(dir.to_str().unwrap()); assert!(jdb.exists(&foo)); jdb.commit(2, &b"2".sha3(), Some((1, b"1".sha3()))).unwrap(); assert!(!jdb.exists(&foo)); diff --git a/util/src/lib.rs b/util/src/lib.rs index d4f972800..41d0ebe00 100644 --- a/util/src/lib.rs +++ b/util/src/lib.rs @@ -128,6 +128,7 @@ pub mod hashdb; pub mod memorydb; pub mod overlaydb; pub mod journaldb; +pub mod kvdb; mod math; pub mod chainfilter; pub mod crypto; @@ -162,6 +163,7 @@ pub use semantic_version::*; pub use network::*; pub use io::*; pub use log::*; +pub use kvdb::*; #[cfg(test)] mod tests; diff --git a/util/src/overlaydb.rs b/util/src/overlaydb.rs index f8e9c3eee..f4ed2d5d6 100644 --- a/util/src/overlaydb.rs +++ b/util/src/overlaydb.rs @@ -26,7 +26,7 @@ use std::ops::*; use std::sync::*; use std::env; use std::collections::HashMap; -use rocksdb::{DB, Writable, IteratorMode}; +use kvdb::{Database}; /// Implementation of the HashDB trait for a disk-backed database with a memory overlay. /// @@ -38,15 +38,15 @@ use rocksdb::{DB, Writable, IteratorMode}; /// queries have an immediate effect in terms of these functions. pub struct OverlayDB { overlay: MemoryDB, - backing: Arc, + backing: Arc, } impl OverlayDB { /// Create a new instance of OverlayDB given a `backing` database. - pub fn new(backing: DB) -> OverlayDB { Self::new_with_arc(Arc::new(backing)) } + pub fn new(backing: Database) -> OverlayDB { Self::new_with_arc(Arc::new(backing)) } /// Create a new instance of OverlayDB given a `backing` database. - pub fn new_with_arc(backing: Arc) -> OverlayDB { + pub fn new_with_arc(backing: Arc) -> OverlayDB { OverlayDB{ overlay: MemoryDB::new(), backing: backing } } @@ -54,7 +54,7 @@ impl OverlayDB { pub fn new_temp() -> OverlayDB { let mut dir = env::temp_dir(); dir.push(H32::random().hex()); - Self::new(DB::open_default(dir.to_str().unwrap()).unwrap()) + Self::new(Database::open_default(dir.to_str().unwrap()).unwrap()) } /// Commit all memory operations to the backing database. @@ -164,7 +164,7 @@ impl OverlayDB { impl HashDB for OverlayDB { fn keys(&self) -> HashMap { let mut ret: HashMap = HashMap::new(); - for (key, _) in self.backing.iterator(IteratorMode::Start) { + for (key, _) in self.backing.iter() { let h = H256::from_slice(key.deref()); let r = self.payload(&h).unwrap().1; ret.insert(h, r as i32); @@ -318,7 +318,7 @@ fn overlaydb_complex() { fn playpen() { use std::fs; { - let db: DB = DB::open_default("/tmp/test").unwrap(); + let db: Database = Database::open_default("/tmp/test").unwrap(); db.put(b"test", b"test2").unwrap(); match db.get(b"test") { Ok(Some(value)) => println!("Got value {:?}", value.deref()), From e99f604133ceb19383aefb88d4a4ff72578e5eb4 Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 18 Feb 2016 03:46:34 +0100 Subject: [PATCH 24/73] rocksdb abstraction layer --- util/src/kvdb.rs | 150 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 util/src/kvdb.rs diff --git a/util/src/kvdb.rs b/util/src/kvdb.rs new file mode 100644 index 000000000..a5691bcba --- /dev/null +++ b/util/src/kvdb.rs @@ -0,0 +1,150 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Key-Value store abstraction with rocksb backend. + +use rocksdb::{DB, Writable, WriteBatch, IteratorMode, DBVector, DBIterator, + IndexType, Options, DBCompactionStyle, BlockBasedOptions, Direction}; + +/// Write transaction. Batches a sequence of put/delete operations for efficiency. +pub struct DBTransaction { + batch: WriteBatch, +} + +impl DBTransaction { + /// Create new transaction. + pub fn new() -> DBTransaction { + DBTransaction { batch: WriteBatch::new() } + } + + /// Insert a ket-value pair in the transaction. Any existing value value will be overwritten upon write. + pub fn put(&self, key: &[u8], value: &[u8]) -> Result<(), String> { + self.batch.put(key, value) + } + + /// Delete value by key. + pub fn delete(&self, key: &[u8]) -> Result<(), String> { + self.batch.delete(key) + } +} + +/// Database configuration +pub struct DatabaseConfig { + /// Optional prefix size in bytes. Allows lookup by partial key. + pub prefix_size: Option +} + +/// Database iterator +pub struct DatabaseIterator<'a> { + iter: DBIterator<'a>, +} + +impl<'a> Iterator for DatabaseIterator<'a> { + type Item = (Box<[u8]>, Box<[u8]>); + + #[allow(type_complexity)] + fn next(&mut self) -> Option<(Box<[u8]>, Box<[u8]>)> { + self.iter.next() + } +} + +/// Key-Value database. +pub struct Database { + db: DB, +} + +impl Database { + /// Open database with default settings. + pub fn open_default(path: &str) -> Result { + Database::open(DatabaseConfig { prefix_size: None }, path) + } + + /// Open database file. Creates if it does not exist. + pub fn open(config: DatabaseConfig, path: &str) -> Result { + let mut opts = Options::new(); + opts.set_max_open_files(256); + opts.create_if_missing(true); + opts.set_use_fsync(false); + opts.set_compaction_style(DBCompactionStyle::DBUniversalCompaction); + /* + opts.set_bytes_per_sync(8388608); + opts.set_disable_data_sync(false); + opts.set_block_cache_size_mb(1024); + opts.set_table_cache_num_shard_bits(6); + opts.set_max_write_buffer_number(32); + opts.set_write_buffer_size(536870912); + opts.set_target_file_size_base(1073741824); + opts.set_min_write_buffer_number_to_merge(4); + opts.set_level_zero_stop_writes_trigger(2000); + opts.set_level_zero_slowdown_writes_trigger(0); + opts.set_compaction_style(DBUniversalCompaction); + opts.set_max_background_compactions(4); + opts.set_max_background_flushes(4); + opts.set_filter_deletes(false); + opts.set_disable_auto_compactions(false);*/ + + if let Some(size) = config.prefix_size { + let mut block_opts = BlockBasedOptions::new(); + block_opts.set_index_type(IndexType::HashSearch); + opts.set_block_based_table_factory(&block_opts); + opts.set_prefix_extractor_fixed_size(size); + } + let db = try!(DB::open(&opts, path)); + Ok(Database { db: db }) + } + + /// Insert a ket-value pair in the transaction. Any existing value value will be overwritten. + pub fn put(&self, key: &[u8], value: &[u8]) -> Result<(), String> { + self.db.put(key, value) + } + + /// Delete value by key. + pub fn delete(&self, key: &[u8]) -> Result<(), String> { + self.db.delete(key) + } + + /// Commit transaction to database. + pub fn write(&self, tr: DBTransaction) -> Result<(), String> { + self.db.write(tr.batch) + } + + /// Get value by key. + pub fn get(&self, key: &[u8]) -> Result, String> { + self.db.get(key) + } + + /// Get value by partial key. Prefix size should match configured prefix size. + pub fn get_by_prefix(&self, prefix: &[u8]) -> Option> { + let mut iter = self.db.iterator(IteratorMode::From(prefix, Direction::forward)); + match iter.next() { + // TODO: use prefix_same_as_start read option (not availabele in C API currently) + Some((k, v)) => if k[0 .. prefix.len()] == prefix[..] { Some(v) } else { None }, + _ => None + } + } + + /// Check if there is anything in the database. + pub fn is_empty(&self) -> bool { + self.db.iterator(IteratorMode::Start).next().is_none() + } + + /// Check if there is anything in the database. + pub fn iter(&self) -> DatabaseIterator { + DatabaseIterator { iter: self.db.iterator(IteratorMode::Start) } + } +} + + From 99600ba370680851519950058c22f594812a6849 Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 18 Feb 2016 21:15:56 +0100 Subject: [PATCH 25/73] DB Test --- util/src/journaldb.rs | 2 +- util/src/kvdb.rs | 60 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/util/src/journaldb.rs b/util/src/journaldb.rs index 8d31f50eb..cfcff6ea4 100644 --- a/util/src/journaldb.rs +++ b/util/src/journaldb.rs @@ -62,7 +62,7 @@ impl JournalDB { let opts = DatabaseConfig { prefix_size: Some(12) //use 12 bytes as prefix, this must match account_db prefix }; - let backing = Database::open(opts, path).unwrap_or_else(|e| { + let backing = Database::open(&opts, path).unwrap_or_else(|e| { panic!("Error opening state db: {}", e); }); if !backing.is_empty() { diff --git a/util/src/kvdb.rs b/util/src/kvdb.rs index a5691bcba..ac6a45a4e 100644 --- a/util/src/kvdb.rs +++ b/util/src/kvdb.rs @@ -69,11 +69,11 @@ pub struct Database { impl Database { /// Open database with default settings. pub fn open_default(path: &str) -> Result { - Database::open(DatabaseConfig { prefix_size: None }, path) + Database::open(&DatabaseConfig { prefix_size: None }, path) } /// Open database file. Creates if it does not exist. - pub fn open(config: DatabaseConfig, path: &str) -> Result { + pub fn open(config: &DatabaseConfig, path: &str) -> Result { let mut opts = Options::new(); opts.set_max_open_files(256); opts.create_if_missing(true); @@ -148,3 +148,59 @@ impl Database { } +#[cfg(test)] +mod tests { + use hash::*; + use super::*; + use tests::helpers::RandomTempPath; + use std::str::FromStr; + use std::ops::Deref; + + fn test_db(config: &DatabaseConfig) { + let path = RandomTempPath::create_dir(); + let db = Database::open(config, path.as_path().to_str().unwrap()).unwrap(); + let key1 = H256::from_str("02c69be41d0b7e40352fc85be1cd65eb03d40ef8427a0ca4596b1ead9a00e9fc").unwrap(); + let key2 = H256::from_str("03c69be41d0b7e40352fc85be1cd65eb03d40ef8427a0ca4596b1ead9a00e9fc").unwrap(); + let key3 = H256::from_str("01c69be41d0b7e40352fc85be1cd65eb03d40ef8427a0ca4596b1ead9a00e9fc").unwrap(); + + db.put(&key1, b"cat").unwrap(); + db.put(&key2, b"dog").unwrap(); + + assert_eq!(db.get(&key1).unwrap().unwrap().deref(), b"cat"); + + let contents: Vec<_> = db.iter().collect(); + assert_eq!(contents.len(), 2); + assert_eq!(&*contents[0].0, key1.deref()); + assert_eq!(&*contents[0].1, b"cat"); + assert_eq!(&*contents[1].0, key2.deref()); + assert_eq!(&*contents[1].1, b"dog"); + + db.delete(&key1).unwrap(); + assert!(db.get(&key1).unwrap().is_none()); + db.put(&key1, b"cat").unwrap(); + + let transaction = DBTransaction::new(); + transaction.put(&key3, b"elephant").unwrap(); + transaction.delete(&key1).unwrap(); + db.write(transaction).unwrap(); + assert!(db.get(&key1).unwrap().is_none()); + assert_eq!(db.get(&key3).unwrap().unwrap().deref(), b"elephant"); + + if config.prefix_size.is_some() { + assert_eq!(db.get_by_prefix(&key3).unwrap().deref(), b"elephant"); + assert_eq!(db.get_by_prefix(&key2).unwrap().deref(), b"dog"); + } + } + + #[test] + fn kvdb() { + let path = RandomTempPath::create_dir(); + let smoke = Database::open_default(path.as_path().to_str().unwrap()).unwrap(); + assert!(smoke.is_empty()); + test_db(&DatabaseConfig { prefix_size: None }); + test_db(&DatabaseConfig { prefix_size: Some(1) }); + test_db(&DatabaseConfig { prefix_size: Some(8) }); + test_db(&DatabaseConfig { prefix_size: Some(32) }); + } +} + From 68795ea031fefff148c011a58d9f5407f47e7889 Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 18 Feb 2016 21:40:17 +0100 Subject: [PATCH 26/73] Fixed typos --- util/src/kvdb.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/util/src/kvdb.rs b/util/src/kvdb.rs index ac6a45a4e..fa74553fb 100644 --- a/util/src/kvdb.rs +++ b/util/src/kvdb.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -//! Key-Value store abstraction with rocksb backend. +//! Key-Value store abstraction with RocksDB backend. use rocksdb::{DB, Writable, WriteBatch, IteratorMode, DBVector, DBIterator, IndexType, Options, DBCompactionStyle, BlockBasedOptions, Direction}; @@ -30,7 +30,7 @@ impl DBTransaction { DBTransaction { batch: WriteBatch::new() } } - /// Insert a ket-value pair in the transaction. Any existing value value will be overwritten upon write. + /// Insert a key-value pair in the transaction. Any existing value value will be overwritten upon write. pub fn put(&self, key: &[u8], value: &[u8]) -> Result<(), String> { self.batch.put(key, value) } @@ -106,7 +106,7 @@ impl Database { Ok(Database { db: db }) } - /// Insert a ket-value pair in the transaction. Any existing value value will be overwritten. + /// Insert a key-value pair in the transaction. Any existing value value will be overwritten. pub fn put(&self, key: &[u8], value: &[u8]) -> Result<(), String> { self.db.put(key, value) } From 0e10efc727de63d6c0c5ccad4b3c032f9d909b8d Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 19 Feb 2016 11:33:46 +0100 Subject: [PATCH 27/73] Update blockchain.rs --- ethcore/src/blockchain.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethcore/src/blockchain.rs b/ethcore/src/blockchain.rs index 052e64d4c..cfb057b19 100644 --- a/ethcore/src/blockchain.rs +++ b/ethcore/src/blockchain.rs @@ -35,7 +35,7 @@ pub struct TreeRoute { /// Best common ancestor of these blocks. pub ancestor: H256, /// An index where best common ancestor would be. - pub index: usize + pub index: usize, } /// Represents blockchain's in-memory cache size in bytes. From ec428c070bc27925265c568f129a7a7dc92e0a24 Mon Sep 17 00:00:00 2001 From: debris Date: Fri, 19 Feb 2016 14:17:04 +0100 Subject: [PATCH 28/73] added trailing , --- ethcore/src/extras.rs | 6 +++--- ethcore/src/filter.rs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ethcore/src/extras.rs b/ethcore/src/extras.rs index 50d3a21bf..c7102dba9 100644 --- a/ethcore/src/extras.rs +++ b/ethcore/src/extras.rs @@ -35,7 +35,7 @@ pub enum ExtrasIndex { /// Block blooms index BlocksBlooms = 4, /// Block receipts index - BlockReceipts + BlockReceipts = 5, } /// trait used to write Extras data to db @@ -213,7 +213,7 @@ impl Encodable for BlockLogBlooms { /// Neighboring log blooms on certain level pub struct BlocksBlooms { /// List of block blooms. - pub blooms: [H2048; 16] + pub blooms: [H2048; 16], } impl BlocksBlooms { @@ -269,7 +269,7 @@ pub struct BlocksBloomLocation { /// Unique hash of BlocksBloom pub hash: H256, /// Index within BlocksBloom - pub index: usize + pub index: usize, } /// Represents address of certain transaction within block diff --git a/ethcore/src/filter.rs b/ethcore/src/filter.rs index 5daecebd3..f5f9135d6 100644 --- a/ethcore/src/filter.rs +++ b/ethcore/src/filter.rs @@ -39,7 +39,7 @@ pub struct Filter { /// /// If None, match all. /// If specified, log must contain one of these topics. - pub topics: [Option>; 4] + pub topics: [Option>; 4], } impl Filter { From 2f62994f61247c4a94f70b1c9a908e9fbd67860a Mon Sep 17 00:00:00 2001 From: arkpar Date: Fri, 19 Feb 2016 15:17:31 +0100 Subject: [PATCH 29/73] Updated cargo.lock --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8d0a31352..97ec5f386 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -400,7 +400,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "librocksdb-sys" version = "0.1.0" -source = "git+https://github.com/arkpar/rust-rocksdb.git#31d2761f5132222f5277c8c0c31b0b55b65e0bee" +source = "git+https://github.com/arkpar/rust-rocksdb.git#a745277de9848a1ce374fee037a3cf3cacdf9b67" dependencies = [ "libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -571,7 +571,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "rocksdb" version = "0.3.0" -source = "git+https://github.com/arkpar/rust-rocksdb.git#31d2761f5132222f5277c8c0c31b0b55b65e0bee" +source = "git+https://github.com/arkpar/rust-rocksdb.git#a745277de9848a1ce374fee037a3cf3cacdf9b67" dependencies = [ "libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "librocksdb-sys 0.1.0 (git+https://github.com/arkpar/rust-rocksdb.git)", From 3253d2a17b5f6e4fda28a043f74cb1d40c1adbd8 Mon Sep 17 00:00:00 2001 From: debris Date: Fri, 19 Feb 2016 15:34:12 +0100 Subject: [PATCH 30/73] fixed ethsync tests compile errors and warnings --- sync/src/range_collection.rs | 2 +- sync/src/tests/helpers.rs | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/sync/src/range_collection.rs b/sync/src/range_collection.rs index c3333ab63..dc2f4e446 100644 --- a/sync/src/range_collection.rs +++ b/sync/src/range_collection.rs @@ -207,7 +207,7 @@ impl RangeCollection for Vec<(K, Vec)> where K: Ord + PartialEq + } #[test] -#[allow(cyclomatic_complexity)] +#[cfg_attr(feature="dev", allow(cyclomatic_complexity))] fn test_range() { use std::cmp::{Ordering}; diff --git a/sync/src/tests/helpers.rs b/sync/src/tests/helpers.rs index ca6d79814..7f2928ccd 100644 --- a/sync/src/tests/helpers.rs +++ b/sync/src/tests/helpers.rs @@ -23,6 +23,8 @@ use io::SyncIo; use chain::{ChainSync}; use ethcore::receipt::Receipt; use ethcore::transaction::LocalizedTransaction; +use ethcore::filter::Filter; +use ethcore::log_entry::LocalizedLogEntry; pub struct TestBlockChainClient { pub blocks: RwLock>, @@ -115,6 +117,10 @@ impl BlockChainClient for TestBlockChainClient { unimplemented!(); } + fn logs(&self, filter: Filter) -> Vec { + unimplemented!(); + } + fn block_header(&self, id: BlockId) -> Option { self.block_hash(id).and_then(|hash| self.blocks.read().unwrap().get(&hash).map(|r| Rlp::new(r).at(0).as_raw().to_vec())) } From 9648081abe1492629e0b2c15d7edb7e5c0c790c2 Mon Sep 17 00:00:00 2001 From: arkpar Date: Fri, 19 Feb 2016 16:14:17 +0100 Subject: [PATCH 31/73] exclude common headers from coverage --- .travis.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6ab9a08b9..a6dadbf04 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,11 +44,11 @@ after_success: | wget https://github.com/SimonKagstrom/kcov/archive/master.tar.gz && tar xzf master.tar.gz && mkdir kcov-master/build && cd kcov-master/build && cmake .. && make && make install DESTDIR=../tmp && cd ../.. && cargo test --no-run ${KCOV_FEATURES} ${TARGETS} && - ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore_util-* && - ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethash-* && - ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore-* && - ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethsync-* && - ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore_rpc-* && + ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore_util-* && + ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethash-* && + ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore-* && + ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethsync-* && + ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore_rpc-* && ./kcov-master/tmp/usr/local/bin/kcov --coveralls-id=${TRAVIS_JOB_ID} --exclude-pattern /.cargo,/root/.multirust target/kcov target/debug/parity-* && [ $TRAVIS_BRANCH = master ] && [ $TRAVIS_PULL_REQUEST = false ] && From 2a1d984bf1053e97f24e5af5fa04d83b6dc54f59 Mon Sep 17 00:00:00 2001 From: arkpar Date: Fri, 19 Feb 2016 16:41:05 +0100 Subject: [PATCH 32/73] exclude common headers from coverage --- .travis.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index a6dadbf04..ddddca3b8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,11 +44,11 @@ after_success: | wget https://github.com/SimonKagstrom/kcov/archive/master.tar.gz && tar xzf master.tar.gz && mkdir kcov-master/build && cd kcov-master/build && cmake .. && make && make install DESTDIR=../tmp && cd ../.. && cargo test --no-run ${KCOV_FEATURES} ${TARGETS} && - ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore_util-* && - ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethash-* && - ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore-* && - ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethsync-* && - ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore_rpc-* && + ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern usr/include,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore_util-* && + ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern usr/include,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethash-* && + ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern usr/include,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore-* && + ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern usr/include,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethsync-* && + ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern usr/include,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore_rpc-* && ./kcov-master/tmp/usr/local/bin/kcov --coveralls-id=${TRAVIS_JOB_ID} --exclude-pattern /.cargo,/root/.multirust target/kcov target/debug/parity-* && [ $TRAVIS_BRANCH = master ] && [ $TRAVIS_PULL_REQUEST = false ] && From e64d3daa068e50afa6b3902965c7ebf54256d131 Mon Sep 17 00:00:00 2001 From: arkpar Date: Fri, 19 Feb 2016 20:14:28 +0100 Subject: [PATCH 33/73] exclude common headers from coverage --- .travis.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index ddddca3b8..c4776679e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,12 +44,12 @@ after_success: | wget https://github.com/SimonKagstrom/kcov/archive/master.tar.gz && tar xzf master.tar.gz && mkdir kcov-master/build && cd kcov-master/build && cmake .. && make && make install DESTDIR=../tmp && cd ../.. && cargo test --no-run ${KCOV_FEATURES} ${TARGETS} && - ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern usr/include,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore_util-* && - ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern usr/include,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethash-* && - ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern usr/include,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore-* && - ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern usr/include,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethsync-* && - ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern usr/include,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore_rpc-* && - ./kcov-master/tmp/usr/local/bin/kcov --coveralls-id=${TRAVIS_JOB_ID} --exclude-pattern /.cargo,/root/.multirust target/kcov target/debug/parity-* && + ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore_util-* && + ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethash-* && + ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore-* && + ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethsync-* && + ./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore_rpc-* && + ./kcov-master/tmp/usr/local/bin/kcov --coveralls-id=${TRAVIS_JOB_ID} --exclude-pattern /usr/,/.cargo,/root/.multirust target/kcov target/debug/parity-* && [ $TRAVIS_BRANCH = master ] && [ $TRAVIS_PULL_REQUEST = false ] && [ $TRAVIS_RUST_VERSION = beta ] && From bcc4ca48ab11da19627673b7d1fbb7fb1dff33b6 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Sun, 21 Feb 2016 15:19:08 +0300 Subject: [PATCH 34/73] to new namespace --- util/src/kvdb.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/util/src/kvdb.rs b/util/src/kvdb.rs index fa74553fb..921e8b3c4 100644 --- a/util/src/kvdb.rs +++ b/util/src/kvdb.rs @@ -69,7 +69,7 @@ pub struct Database { impl Database { /// Open database with default settings. pub fn open_default(path: &str) -> Result { - Database::open(&DatabaseConfig { prefix_size: None }, path) + Database::open(&DatabaseConfig { prefix_size: None }, path) } /// Open database file. Creates if it does not exist. @@ -120,7 +120,7 @@ impl Database { pub fn write(&self, tr: DBTransaction) -> Result<(), String> { self.db.write(tr.batch) } - + /// Get value by key. pub fn get(&self, key: &[u8]) -> Result, String> { self.db.get(key) @@ -152,7 +152,7 @@ impl Database { mod tests { use hash::*; use super::*; - use tests::helpers::RandomTempPath; + use devtools::*; use std::str::FromStr; use std::ops::Deref; @@ -185,7 +185,7 @@ mod tests { db.write(transaction).unwrap(); assert!(db.get(&key1).unwrap().is_none()); assert_eq!(db.get(&key3).unwrap().unwrap().deref(), b"elephant"); - + if config.prefix_size.is_some() { assert_eq!(db.get_by_prefix(&key3).unwrap().deref(), b"elephant"); assert_eq!(db.get_by_prefix(&key2).unwrap().deref(), b"dog"); From 67cd29f4e14c7877c1af0341025322e3e047a0ca Mon Sep 17 00:00:00 2001 From: arkpar Date: Sun, 21 Feb 2016 16:58:56 +0100 Subject: [PATCH 35/73] Whitespaces --- util/src/kvdb.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/util/src/kvdb.rs b/util/src/kvdb.rs index 921e8b3c4..23784c200 100644 --- a/util/src/kvdb.rs +++ b/util/src/kvdb.rs @@ -31,12 +31,12 @@ impl DBTransaction { } /// Insert a key-value pair in the transaction. Any existing value value will be overwritten upon write. - pub fn put(&self, key: &[u8], value: &[u8]) -> Result<(), String> { + pub fn put(&self, key: &[u8], value: &[u8]) -> Result<(), String> { self.batch.put(key, value) } /// Delete value by key. - pub fn delete(&self, key: &[u8]) -> Result<(), String> { + pub fn delete(&self, key: &[u8]) -> Result<(), String> { self.batch.delete(key) } } @@ -49,14 +49,14 @@ pub struct DatabaseConfig { /// Database iterator pub struct DatabaseIterator<'a> { - iter: DBIterator<'a>, + iter: DBIterator<'a>, } impl<'a> Iterator for DatabaseIterator<'a> { - type Item = (Box<[u8]>, Box<[u8]>); + type Item = (Box<[u8]>, Box<[u8]>); #[allow(type_complexity)] - fn next(&mut self) -> Option<(Box<[u8]>, Box<[u8]>)> { + fn next(&mut self) -> Option<(Box<[u8]>, Box<[u8]>)> { self.iter.next() } } @@ -94,7 +94,8 @@ impl Database { opts.set_max_background_compactions(4); opts.set_max_background_flushes(4); opts.set_filter_deletes(false); - opts.set_disable_auto_compactions(false);*/ + opts.set_disable_auto_compactions(false); + */ if let Some(size) = config.prefix_size { let mut block_opts = BlockBasedOptions::new(); @@ -107,27 +108,27 @@ impl Database { } /// Insert a key-value pair in the transaction. Any existing value value will be overwritten. - pub fn put(&self, key: &[u8], value: &[u8]) -> Result<(), String> { + pub fn put(&self, key: &[u8], value: &[u8]) -> Result<(), String> { self.db.put(key, value) } /// Delete value by key. - pub fn delete(&self, key: &[u8]) -> Result<(), String> { + pub fn delete(&self, key: &[u8]) -> Result<(), String> { self.db.delete(key) } /// Commit transaction to database. - pub fn write(&self, tr: DBTransaction) -> Result<(), String> { + pub fn write(&self, tr: DBTransaction) -> Result<(), String> { self.db.write(tr.batch) } /// Get value by key. - pub fn get(&self, key: &[u8]) -> Result, String> { + pub fn get(&self, key: &[u8]) -> Result, String> { self.db.get(key) } /// Get value by partial key. Prefix size should match configured prefix size. - pub fn get_by_prefix(&self, prefix: &[u8]) -> Option> { + pub fn get_by_prefix(&self, prefix: &[u8]) -> Option> { let mut iter = self.db.iterator(IteratorMode::From(prefix, Direction::forward)); match iter.next() { // TODO: use prefix_same_as_start read option (not availabele in C API currently) @@ -147,7 +148,6 @@ impl Database { } } - #[cfg(test)] mod tests { use hash::*; From 8db8e5b5f81bd750cd56bd28614e3ce7227de9c0 Mon Sep 17 00:00:00 2001 From: debris Date: Mon, 22 Feb 2016 08:46:47 +0100 Subject: [PATCH 36/73] unit tests for reset chain head --- ethcore/src/chainfilter/chainfilter.rs | 2 +- ethcore/src/chainfilter/tests.rs | 64 ++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/ethcore/src/chainfilter/chainfilter.rs b/ethcore/src/chainfilter/chainfilter.rs index 4f7f30928..6b30066f7 100644 --- a/ethcore/src/chainfilter/chainfilter.rs +++ b/ethcore/src/chainfilter/chainfilter.rs @@ -146,7 +146,7 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource } // reset the rest of blooms - for reset_number in block_number + blooms.len()..old_highest_block { + for reset_number in block_number + blooms.len()..(old_highest_block + 1) { result.insert(self.indexer.bloom_index(reset_number, 0), H2048::new()); } diff --git a/ethcore/src/chainfilter/tests.rs b/ethcore/src/chainfilter/tests.rs index 2eb6275ea..2baa93e55 100644 --- a/ethcore/src/chainfilter/tests.rs +++ b/ethcore/src/chainfilter/tests.rs @@ -99,6 +99,68 @@ fn test_topic_basic_search() { } } +#[test] +fn test_reset_chain_head_simple() { + let index_size = 16; + let bloom_levels = 3; + + let mut cache = MemoryCache::new(); + let topic_0 = H256::from_str("8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dba").unwrap(); + let topic_1 = H256::from_str("8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dbb").unwrap(); + let topic_2 = H256::from_str("8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dbc").unwrap(); + let topic_3 = H256::from_str("8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dbd").unwrap(); + let topic_4 = H256::from_str("8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dbe").unwrap(); + let topic_5 = H256::from_str("8d936b1bd3fc635710969ccfba471fb17d598d9d1971b538dd712e1e4b4f4dbf").unwrap(); + + let modified_blooms_0 = { + let filter = ChainFilter::new(&cache, index_size, bloom_levels); + let block_number = 14; + filter.add_bloom(&to_bloom(&topic_0), block_number) + }; + + cache.insert_blooms(modified_blooms_0); + + let modified_blooms_1 = { + let filter = ChainFilter::new(&cache, index_size, bloom_levels); + let block_number = 15; + filter.add_bloom(&to_bloom(&topic_1), block_number) + }; + + cache.insert_blooms(modified_blooms_1); + + let modified_blooms_2 = { + let filter = ChainFilter::new(&cache, index_size, bloom_levels); + let block_number = 16; + filter.add_bloom(&to_bloom(&topic_2), block_number) + }; + + cache.insert_blooms(modified_blooms_2); + + let modified_blooms_3 = { + let filter = ChainFilter::new(&cache, index_size, bloom_levels); + let block_number = 17; + filter.add_bloom(&to_bloom(&topic_3), block_number) + }; + + cache.insert_blooms(modified_blooms_3); + + + let reset_modified_blooms = { + let filter = ChainFilter::new(&cache, index_size, bloom_levels); + filter.reset_chain_head(&[to_bloom(&topic_4), to_bloom(&topic_5)], 15, 17) + }; + + cache.insert_blooms(reset_modified_blooms); + + let filter = ChainFilter::new(&cache, index_size, bloom_levels); + assert_eq!(filter.blocks_with_bloom(&to_bloom(&topic_0), 0, 100), vec![14]); + assert_eq!(filter.blocks_with_bloom(&to_bloom(&topic_1), 0, 100), vec![]); + assert_eq!(filter.blocks_with_bloom(&to_bloom(&topic_2), 0, 100), vec![]); + assert_eq!(filter.blocks_with_bloom(&to_bloom(&topic_3), 0, 100), vec![]); + assert_eq!(filter.blocks_with_bloom(&to_bloom(&topic_4), 0, 100), vec![15]); + assert_eq!(filter.blocks_with_bloom(&to_bloom(&topic_5), 0, 100), vec![16]); +} + fn for_each_bloom(bytes: &[u8], mut f: F) where F: FnMut(usize, &H2048) { let mut reader = BufReader::new(bytes); let mut line = String::new(); @@ -211,3 +273,5 @@ fn test_chainfilter_real_data_single_search() { assert_eq!(blocks[1], 396348); assert_eq!(blocks[2], 399804); } + + From 4adb7ee969c7badb765099d41c8af2a8e867a10f Mon Sep 17 00:00:00 2001 From: debris Date: Mon, 22 Feb 2016 09:12:15 +0100 Subject: [PATCH 37/73] tests for blockchain reseting chain head and rebuilding blooms --- ethcore/src/blockchain.rs | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/ethcore/src/blockchain.rs b/ethcore/src/blockchain.rs index 1809debaf..2faf1bd30 100644 --- a/ethcore/src/blockchain.rs +++ b/ethcore/src/blockchain.rs @@ -1020,16 +1020,24 @@ mod tests { fn test_bloom_filter_simple() { let genesis = "f901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a059262c330941f3fe2a34d16d6e3c7b30d2ceb37c6a0e9a994c494ee1a61d2410885aa4c8bf8e56e264c0c0".from_hex().unwrap(); - // bloom filter from block 300059 + // block b1 (child of genesis) let b1 = "f90261f901f9a05716670833ec874362d65fea27a7cd35af5897d275b31a44944113111e4e96d2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a0e78628dd45a1f8dc495594d83b76c588a3ee67463260f8b7d4a42f574aeab29aa0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000200000000000000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080004000000000000000000000020008302000001832fefd882520884562791e580a051b3ecba4e3f2b49c11d42dd0851ec514b1be3138080f72a2b6e83868275d98f8877671f479c414b47f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca09e2709d7ec9bbe6b1bbbf0b2088828d14cd5e8642a1fee22dc74bfa89761a7f9a04bd8813dee4be989accdb708b1c2e325a7e9c695a8024e30e89d6c644e424747c0".from_hex().unwrap(); - // bloom filter from block 300054 + // block b2 (child of b1) let b2 = "f902ccf901f9a04ef46c05763fffc5f7e59f92a7ef438ffccbb578e6e5d0f04e3df8a7fa6c02f6a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0c70a5dc56146e5ef025e4e5726a6373c6f12fd2f6784093a19ead0a7d17fb292a040645cbce4fd399e7bb9160b4c30c40d7ee616a030d4e18ef0ed3b02bdb65911a086e608555f63628417032a011d107b36427af37d153f0da02ce3f90fdd5e8c08b90100000000000000000000000000000000000000000000000200000010000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000080000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd882c0e384562791e880a0e3cc39ff775cc0a32f175995b92e84b729e5c9a3563ff899e3555b908bc21d75887c3cde283f4846a6f8cdf8cb01018304cb2f8080b87e6060604052606e8060106000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063c0406226146037576035565b005b60406004506056565b6040518082815260200191505060405180910390f35b6000600560006000508190555060059050606b565b90561ba05258615c63503c0a600d6994b12ea5750d45b3c69668e2a371b4fbfb9eeff6b8a0a11be762bc90491231274a2945be35a43f23c27775b1ff24dd521702fe15f73ec0".from_hex().unwrap(); + // prepare for fork (b1a, child of genesis) + let b1a = "f902ccf901f9a05716670833ec874362d65fea27a7cd35af5897d275b31a44944113111e4e96d2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0c70a5dc56146e5ef025e4e5726a6373c6f12fd2f6784093a19ead0a7d17fb292a040645cbce4fd399e7bb9160b4c30c40d7ee616a030d4e18ef0ed3b02bdb65911a086e608555f63628417032a011d107b36427af37d153f0da02ce3f90fdd5e8c08b90100000000000000000000000000000000000000000000000200000008000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000080000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd882c0e384562791e880a0e3cc39ff775cc0a32f175995b92e84b729e5c9a3563ff899e3555b908bc21d75887c3cde283f4846a6f8cdf8cb01018304cb2f8080b87e6060604052606e8060106000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063c0406226146037576035565b005b60406004506056565b6040518082815260200191505060405180910390f35b6000600560006000508190555060059050606b565b90561ba05258615c63503c0a600d6994b12ea5750d45b3c69668e2a371b4fbfb9eeff6b8a0a11be762bc90491231274a2945be35a43f23c27775b1ff24dd521702fe15f73ec0".from_hex().unwrap(); + + // fork (b2a, child of b1a, with higher total difficulty) + let b2a = "f902ccf901f9a0d6e45b8289d8a18aed656ef9e8477ea385aefd6f825133b4bab9608705e47b87a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0c70a5dc56146e5ef025e4e5726a6373c6f12fd2f6784093a19ead0a7d17fb292a040645cbce4fd399e7bb9160b4c30c40d7ee616a030d4e18ef0ed3b02bdb65911a086e608555f63628417032a011d107b36427af37d153f0da02ce3f90fdd5e8c08b90100000000000000000000000000000000000000000000000200000008000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000080000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd882c0e384562791e880a0e3cc39ff775cc0a32f175995b92e84b729e5c9a3563ff899e3555b908bc21d75887c3cde283f4846a6f8cdf8cb01018304cb2f8080b87e6060604052606e8060106000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063c0406226146037576035565b005b60406004506056565b6040518082815260200191505060405180910390f35b6000600560006000508190555060059050606b565b90561ba05258615c63503c0a600d6994b12ea5750d45b3c69668e2a371b4fbfb9eeff6b8a0a11be762bc90491231274a2945be35a43f23c27775b1ff24dd521702fe15f73ec0".from_hex().unwrap(); + let bloom_b1 = H2048::from_str("00000020000000000000000000000000000000000000000002000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000000000000000002000").unwrap(); let bloom_b2 = H2048::from_str("00000000000000000000000000000000000000000000020000001000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap(); + let bloom_ba = H2048::from_str("00000000000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap(); + let temp = RandomTempPath::new(); let bc = BlockChain::new(&genesis, temp.as_path()); @@ -1049,6 +1057,24 @@ mod tests { let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 3); assert_eq!(blocks_b1, vec![1]); assert_eq!(blocks_b2, vec![2]); + + // hasn't been forked yet + bc.insert_block(&b1a, vec![]); + let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 3); + let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 3); + let blocks_ba = bc.blocks_with_bloom(&bloom_ba, 0, 3); + assert_eq!(blocks_b1, vec![1]); + assert_eq!(blocks_b2, vec![2]); + assert_eq!(blocks_ba, vec![]); + + // fork has happend + bc.insert_block(&b2a, vec![]); + let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 3); + let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 3); + let blocks_ba = bc.blocks_with_bloom(&bloom_ba, 0, 3); + assert_eq!(blocks_b1, vec![]); + assert_eq!(blocks_b2, vec![]); + assert_eq!(blocks_ba, vec![1, 2]); } #[test] From 61e1720d070cac6d896b8dcd6a5134d5f465b4fb Mon Sep 17 00:00:00 2001 From: debris Date: Mon, 22 Feb 2016 09:54:56 +0100 Subject: [PATCH 38/73] fork back tests --- ethcore/src/blockchain.rs | 50 +++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/ethcore/src/blockchain.rs b/ethcore/src/blockchain.rs index 2faf1bd30..085976a8d 100644 --- a/ethcore/src/blockchain.rs +++ b/ethcore/src/blockchain.rs @@ -480,13 +480,13 @@ impl BlockChain { while from_details.number > to_details.number { from_branch.push(current_from); current_from = from_details.parent.clone(); - from_details = self.block_details(&from_details.parent).unwrap(); + from_details = self.block_details(&from_details.parent).expect(&format!("1. Expected to find details for block {:?}", from_details.parent)); } while to_details.number > from_details.number { to_branch.push(current_to); current_to = to_details.parent.clone(); - to_details = self.block_details(&to_details.parent).unwrap(); + to_details = self.block_details(&to_details.parent).expect(&format!("2. Expected to find details for block {:?}", to_details.parent)); } assert_eq!(from_details.number, to_details.number); @@ -495,11 +495,11 @@ impl BlockChain { while current_from != current_to { from_branch.push(current_from); current_from = from_details.parent.clone(); - from_details = self.block_details(&from_details.parent).unwrap(); + from_details = self.block_details(&from_details.parent).expect(&format!("3. Expected to find details for block {:?}", from_details.parent)); to_branch.push(current_to); current_to = to_details.parent.clone(); - to_details = self.block_details(&to_details.parent).unwrap(); + to_details = self.block_details(&to_details.parent).expect(&format!("4. Expected to find details for block {:?}", from_details.parent)); } let index = from_branch.len(); @@ -816,6 +816,8 @@ mod tests { use blockchain::{BlockProvider, BlockChain}; use tests::helpers::*; use devtools::*; + use views::BlockView; + use util::uint::U256; #[test] fn valid_tests_extra32() { @@ -1027,10 +1029,13 @@ mod tests { let b2 = "f902ccf901f9a04ef46c05763fffc5f7e59f92a7ef438ffccbb578e6e5d0f04e3df8a7fa6c02f6a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0c70a5dc56146e5ef025e4e5726a6373c6f12fd2f6784093a19ead0a7d17fb292a040645cbce4fd399e7bb9160b4c30c40d7ee616a030d4e18ef0ed3b02bdb65911a086e608555f63628417032a011d107b36427af37d153f0da02ce3f90fdd5e8c08b90100000000000000000000000000000000000000000000000200000010000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000080000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd882c0e384562791e880a0e3cc39ff775cc0a32f175995b92e84b729e5c9a3563ff899e3555b908bc21d75887c3cde283f4846a6f8cdf8cb01018304cb2f8080b87e6060604052606e8060106000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063c0406226146037576035565b005b60406004506056565b6040518082815260200191505060405180910390f35b6000600560006000508190555060059050606b565b90561ba05258615c63503c0a600d6994b12ea5750d45b3c69668e2a371b4fbfb9eeff6b8a0a11be762bc90491231274a2945be35a43f23c27775b1ff24dd521702fe15f73ec0".from_hex().unwrap(); // prepare for fork (b1a, child of genesis) - let b1a = "f902ccf901f9a05716670833ec874362d65fea27a7cd35af5897d275b31a44944113111e4e96d2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0c70a5dc56146e5ef025e4e5726a6373c6f12fd2f6784093a19ead0a7d17fb292a040645cbce4fd399e7bb9160b4c30c40d7ee616a030d4e18ef0ed3b02bdb65911a086e608555f63628417032a011d107b36427af37d153f0da02ce3f90fdd5e8c08b90100000000000000000000000000000000000000000000000200000008000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000080000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd882c0e384562791e880a0e3cc39ff775cc0a32f175995b92e84b729e5c9a3563ff899e3555b908bc21d75887c3cde283f4846a6f8cdf8cb01018304cb2f8080b87e6060604052606e8060106000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063c0406226146037576035565b005b60406004506056565b6040518082815260200191505060405180910390f35b6000600560006000508190555060059050606b565b90561ba05258615c63503c0a600d6994b12ea5750d45b3c69668e2a371b4fbfb9eeff6b8a0a11be762bc90491231274a2945be35a43f23c27775b1ff24dd521702fe15f73ec0".from_hex().unwrap(); + let b1a = "f902ccf901f9a05716670833ec874362d65fea27a7cd35af5897d275b31a44944113111e4e96d2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0c70a5dc56146e5ef025e4e5726a6373c6f12fd2f6784093a19ead0a7d17fb292a040645cbce4fd399e7bb9160b4c30c40d7ee616a030d4e18ef0ed3b02bdb65911a086e608555f63628417032a011d107b36427af37d153f0da02ce3f90fdd5e8c08b90100000000000000000000000000000000000000000000000200000008000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000080000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004001832fefd882c0e384562791e880a0e3cc39ff775cc0a32f175995b92e84b729e5c9a3563ff899e3555b908bc21d75887c3cde283f4846a6f8cdf8cb01018304cb2f8080b87e6060604052606e8060106000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063c0406226146037576035565b005b60406004506056565b6040518082815260200191505060405180910390f35b6000600560006000508190555060059050606b565b90561ba05258615c63503c0a600d6994b12ea5750d45b3c69668e2a371b4fbfb9eeff6b8a0a11be762bc90491231274a2945be35a43f23c27775b1ff24dd521702fe15f73ec0".from_hex().unwrap(); // fork (b2a, child of b1a, with higher total difficulty) - let b2a = "f902ccf901f9a0d6e45b8289d8a18aed656ef9e8477ea385aefd6f825133b4bab9608705e47b87a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0c70a5dc56146e5ef025e4e5726a6373c6f12fd2f6784093a19ead0a7d17fb292a040645cbce4fd399e7bb9160b4c30c40d7ee616a030d4e18ef0ed3b02bdb65911a086e608555f63628417032a011d107b36427af37d153f0da02ce3f90fdd5e8c08b90100000000000000000000000000000000000000000000000200000008000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000080000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd882c0e384562791e880a0e3cc39ff775cc0a32f175995b92e84b729e5c9a3563ff899e3555b908bc21d75887c3cde283f4846a6f8cdf8cb01018304cb2f8080b87e6060604052606e8060106000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063c0406226146037576035565b005b60406004506056565b6040518082815260200191505060405180910390f35b6000600560006000508190555060059050606b565b90561ba05258615c63503c0a600d6994b12ea5750d45b3c69668e2a371b4fbfb9eeff6b8a0a11be762bc90491231274a2945be35a43f23c27775b1ff24dd521702fe15f73ec0".from_hex().unwrap(); + let b2a = "f902ccf901f9a0626b0774a7cbdad7bdce07b87d74b6fa91c1c359d725076215d76348f8399f56a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0c70a5dc56146e5ef025e4e5726a6373c6f12fd2f6784093a19ead0a7d17fb292a040645cbce4fd399e7bb9160b4c30c40d7ee616a030d4e18ef0ed3b02bdb65911a086e608555f63628417032a011d107b36427af37d153f0da02ce3f90fdd5e8c08b90100000000000000000000000000000000000000000000000200000008000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000080000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd882c0e384562791e880a0e3cc39ff775cc0a32f175995b92e84b729e5c9a3563ff899e3555b908bc21d75887c3cde283f4846a6f8cdf8cb01018304cb2f8080b87e6060604052606e8060106000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063c0406226146037576035565b005b60406004506056565b6040518082815260200191505060405180910390f35b6000600560006000508190555060059050606b565b90561ba05258615c63503c0a600d6994b12ea5750d45b3c69668e2a371b4fbfb9eeff6b8a0a11be762bc90491231274a2945be35a43f23c27775b1ff24dd521702fe15f73ec0".from_hex().unwrap(); + + // fork back :) + let b3 = "f902ccf901f9a0e6cd7250e4c32b33c906aca30280911c560ac67bd0a05fbeb874f99ac7e7e47aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0c70a5dc56146e5ef025e4e5726a6373c6f12fd2f6784093a19ead0a7d17fb292a040645cbce4fd399e7bb9160b4c30c40d7ee616a030d4e18ef0ed3b02bdb65911a086e608555f63628417032a011d107b36427af37d153f0da02ce3f90fdd5e8c08b90100000000000000000000000000000000000000000000000200000008000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000080000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004003832fefd882c0e384562791e880a0e3cc39ff775cc0a32f175995b92e84b729e5c9a3563ff899e3555b908bc21d75887c3cde283f4846a6f8cdf8cb01018304cb2f8080b87e6060604052606e8060106000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063c0406226146037576035565b005b60406004506056565b6040518082815260200191505060405180910390f35b6000600560006000508190555060059050606b565b90561ba05258615c63503c0a600d6994b12ea5750d45b3c69668e2a371b4fbfb9eeff6b8a0a11be762bc90491231274a2945be35a43f23c27775b1ff24dd521702fe15f73ec0".from_hex().unwrap(); let bloom_b1 = H2048::from_str("00000020000000000000000000000000000000000000000002000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000400000000000000000000002000").unwrap(); @@ -1041,40 +1046,49 @@ mod tests { let temp = RandomTempPath::new(); let bc = BlockChain::new(&genesis, temp.as_path()); - let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 3); - let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 3); + let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 5); + let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 5); assert_eq!(blocks_b1, vec![]); assert_eq!(blocks_b2, vec![]); bc.insert_block(&b1, vec![]); - let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 3); - let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 3); + let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 5); + let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 5); assert_eq!(blocks_b1, vec![1]); assert_eq!(blocks_b2, vec![]); bc.insert_block(&b2, vec![]); - let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 3); - let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 3); + let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 5); + let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 5); assert_eq!(blocks_b1, vec![1]); assert_eq!(blocks_b2, vec![2]); // hasn't been forked yet bc.insert_block(&b1a, vec![]); - let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 3); - let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 3); - let blocks_ba = bc.blocks_with_bloom(&bloom_ba, 0, 3); + let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 5); + let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 5); + let blocks_ba = bc.blocks_with_bloom(&bloom_ba, 0, 5); assert_eq!(blocks_b1, vec![1]); assert_eq!(blocks_b2, vec![2]); assert_eq!(blocks_ba, vec![]); // fork has happend bc.insert_block(&b2a, vec![]); - let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 3); - let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 3); - let blocks_ba = bc.blocks_with_bloom(&bloom_ba, 0, 3); + let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 5); + let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 5); + let blocks_ba = bc.blocks_with_bloom(&bloom_ba, 0, 5); assert_eq!(blocks_b1, vec![]); assert_eq!(blocks_b2, vec![]); assert_eq!(blocks_ba, vec![1, 2]); + + // fork back + bc.insert_block(&b3, vec![]); + let blocks_b1 = bc.blocks_with_bloom(&bloom_b1, 0, 5); + let blocks_b2 = bc.blocks_with_bloom(&bloom_b2, 0, 5); + let blocks_ba = bc.blocks_with_bloom(&bloom_ba, 0, 5); + assert_eq!(blocks_b1, vec![1]); + assert_eq!(blocks_b2, vec![2]); + assert_eq!(blocks_ba, vec![3]); } #[test] From 8f4c2d98baa65278663afd4672f99d95422a45d0 Mon Sep 17 00:00:00 2001 From: debris Date: Mon, 22 Feb 2016 10:11:07 +0100 Subject: [PATCH 39/73] added trailin , --- ethcore/src/blockchain.rs | 4 ++-- ethcore/src/chainfilter/chainfilter.rs | 2 +- ethcore/src/chainfilter/indexer.rs | 2 +- rpc/src/v1/types/filter.rs | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ethcore/src/blockchain.rs b/ethcore/src/blockchain.rs index 085976a8d..40a3f0606 100644 --- a/ethcore/src/blockchain.rs +++ b/ethcore/src/blockchain.rs @@ -52,7 +52,7 @@ pub struct CacheSize { /// Blooms cache size. pub blocks_blooms: usize, /// Block receipts size. - pub block_receipts: usize + pub block_receipts: usize, } struct BloomIndexer { @@ -106,7 +106,7 @@ struct ExtrasUpdate { /// New best block (if it has changed). new_best: Option, /// Changed blocks bloom location hashes. - bloom_hashes: HashSet + bloom_hashes: HashSet, } impl CacheSize { diff --git a/ethcore/src/chainfilter/chainfilter.rs b/ethcore/src/chainfilter/chainfilter.rs index 6b30066f7..e0a281f12 100644 --- a/ethcore/src/chainfilter/chainfilter.rs +++ b/ethcore/src/chainfilter/chainfilter.rs @@ -65,7 +65,7 @@ pub struct ChainFilter<'a, D> where D: FilterDataSource + 'a { data_source: &'a D, - indexer: Indexer + indexer: Indexer, } impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource diff --git a/ethcore/src/chainfilter/indexer.rs b/ethcore/src/chainfilter/indexer.rs index 141a4e7d3..524fab1a9 100644 --- a/ethcore/src/chainfilter/indexer.rs +++ b/ethcore/src/chainfilter/indexer.rs @@ -21,7 +21,7 @@ use chainfilter::BloomIndex; /// Simplifies working with bloom indexes. pub struct Indexer { index_size: usize, - level_sizes: Vec + level_sizes: Vec, } impl Indexer { diff --git a/rpc/src/v1/types/filter.rs b/rpc/src/v1/types/filter.rs index bb932f349..c5c3604dd 100644 --- a/rpc/src/v1/types/filter.rs +++ b/rpc/src/v1/types/filter.rs @@ -26,7 +26,7 @@ use ethcore::client::BlockId; pub enum VariadicValue where T: Deserialize { Single(T), Multiple(Vec), - Null + Null, } impl Deserialize for VariadicValue where T: Deserialize { @@ -54,7 +54,7 @@ pub struct Filter { #[serde(rename="toBlock")] pub to_block: Option, pub address: Option, - pub topics: Option> + pub topics: Option>, } impl Into for Filter { From 2be4f2f73767017f8490f1d48f381a8729cb8704 Mon Sep 17 00:00:00 2001 From: debris Date: Mon, 22 Feb 2016 10:14:31 +0100 Subject: [PATCH 40/73] added trailin , --- ethcore/src/blockchain.rs | 4 ++-- ethcore/src/extras.rs | 2 +- ethcore/src/log_entry.rs | 2 +- rpc/src/v1/types/log.rs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ethcore/src/blockchain.rs b/ethcore/src/blockchain.rs index 40a3f0606..8b83ef3e0 100644 --- a/ethcore/src/blockchain.rs +++ b/ethcore/src/blockchain.rs @@ -57,7 +57,7 @@ pub struct CacheSize { struct BloomIndexer { index_size: usize, - levels: u8 + levels: u8, } impl BloomIndexer { @@ -236,7 +236,7 @@ pub struct BlockChain { cache_man: RwLock, // blooms indexing - bloom_indexer: BloomIndexer + bloom_indexer: BloomIndexer, } impl FilterDataSource for BlockChain { diff --git a/ethcore/src/extras.rs b/ethcore/src/extras.rs index c7102dba9..64d8afcb9 100644 --- a/ethcore/src/extras.rs +++ b/ethcore/src/extras.rs @@ -314,7 +314,7 @@ impl Encodable for TransactionAddress { /// Contains all block receipts. #[derive(Clone)] pub struct BlockReceipts { - pub receipts: Vec + pub receipts: Vec, } impl BlockReceipts { diff --git a/ethcore/src/log_entry.rs b/ethcore/src/log_entry.rs index a7d409833..a75e6fcc1 100644 --- a/ethcore/src/log_entry.rs +++ b/ethcore/src/log_entry.rs @@ -90,7 +90,7 @@ pub struct LocalizedLogEntry { /// Index of transaction within block. pub transaction_index: usize, /// Log position in the block. - pub log_index: usize + pub log_index: usize, } impl Deref for LocalizedLogEntry { diff --git a/rpc/src/v1/types/log.rs b/rpc/src/v1/types/log.rs index 83880a222..0629c5534 100644 --- a/rpc/src/v1/types/log.rs +++ b/rpc/src/v1/types/log.rs @@ -33,7 +33,7 @@ pub struct Log { #[serde(rename="transactionIndex")] transaction_index: U256, #[serde(rename="logIndex")] - log_index: U256 + log_index: U256, } impl From for Log { From 077c5662a86d05eea01b011727393dfbc2559461 Mon Sep 17 00:00:00 2001 From: arkpar Date: Mon, 22 Feb 2016 13:47:25 +0100 Subject: [PATCH 41/73] Fixed a warning --- util/src/kvdb.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/src/kvdb.rs b/util/src/kvdb.rs index fa74553fb..2866925cb 100644 --- a/util/src/kvdb.rs +++ b/util/src/kvdb.rs @@ -55,7 +55,7 @@ pub struct DatabaseIterator<'a> { impl<'a> Iterator for DatabaseIterator<'a> { type Item = (Box<[u8]>, Box<[u8]>); - #[allow(type_complexity)] + #[cfg_attr(feature="dev", allow(type_complexity))] fn next(&mut self) -> Option<(Box<[u8]>, Box<[u8]>)> { self.iter.next() } From 4b69b96f9bef717f08c50c46ad7280f4513e7dc1 Mon Sep 17 00:00:00 2001 From: debris Date: Mon, 22 Feb 2016 15:14:35 +0100 Subject: [PATCH 42/73] added assert checking bloom index size --- ethcore/src/blockchain.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/ethcore/src/blockchain.rs b/ethcore/src/blockchain.rs index 8b83ef3e0..2b812e92d 100644 --- a/ethcore/src/blockchain.rs +++ b/ethcore/src/blockchain.rs @@ -663,6 +663,7 @@ impl BlockChain { let mut blocks_blooms = acc .entry(location.hash.clone()) .or_insert_with(|| self.blocks_blooms(&location.hash).unwrap_or_else(BlocksBlooms::new)); + assert_eq!(self.bloom_indexer.index_size, blocks_blooms.blooms.len()); blocks_blooms.blooms[location.index] = bloom; } acc From 394e57d3ce17f5a1c7a1b788202d2eb33ce00750 Mon Sep 17 00:00:00 2001 From: debris Date: Wed, 24 Feb 2016 10:23:25 +0100 Subject: [PATCH 43/73] removed unnecessary maps --- ethcore/src/chainfilter/chainfilter.rs | 6 ++---- ethcore/src/client.rs | 18 ++++++------------ 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/ethcore/src/chainfilter/chainfilter.rs b/ethcore/src/chainfilter/chainfilter.rs index e0a281f12..fb6df877a 100644 --- a/ethcore/src/chainfilter/chainfilter.rs +++ b/ethcore/src/chainfilter/chainfilter.rs @@ -110,9 +110,8 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource // map them to offsets .map(|li| li.index * level_size) // get all blocks that may contain our bloom - .map(|off| self.blocks(bloom, from_block, to_block, level - 1, off)) // filter existing ones - .filter_map(|x| x) + .filter_map(|off| self.blocks(bloom, from_block, to_block, level - 1, off)) // flatten nested structures .flat_map(|v| v) .collect(); @@ -161,9 +160,8 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource self.indexer.lower_level_bloom_indexes(&index) .into_iter() // get blooms - .map(bloom_at) // filter existing ones - .filter_map(|b| b) + .filter_map(bloom_at) // BitOr all of them .fold(H2048::new(), |acc, bloom| acc | bloom) }; diff --git a/ethcore/src/client.rs b/ethcore/src/client.rs index 18ce28c6b..9244c26fc 100644 --- a/ethcore/src/client.rs +++ b/ethcore/src/client.rs @@ -482,8 +482,7 @@ impl BlockChainClient for Client { fn logs(&self, filter: Filter) -> Vec { let mut blocks = filter.bloom_possibilities().iter() - .map(|bloom| self.blocks_with_bloom(bloom, filter.from_block.clone(), filter.to_block.clone())) - .filter_map(|m| m) + .filter_map(|bloom| self.blocks_with_bloom(bloom, filter.from_block.clone(), filter.to_block.clone())) .flat_map(|m| m) // remove duplicate elements .collect::>() @@ -493,17 +492,14 @@ impl BlockChainClient for Client { blocks.sort(); blocks.into_iter() - .map(|number| self.chain.read().unwrap().block_hash(number).map(|hash| (number, hash))) - .filter_map(|m| m) - .map(|(number, hash)| self.chain.read().unwrap().block_receipts(&hash).map(|r| (number, hash, r.receipts))) - .filter_map(|m| m) - .map(|(number, hash, receipts)| self.chain.read().unwrap().block(&hash).map(|ref b| (number, hash, receipts, BlockView::new(b).transaction_hashes()))) - .filter_map(|m| m) - .map(|(number, hash, receipts, hashes)| { + .filter_map(|number| self.chain.read().unwrap().block_hash(number).map(|hash| (number, hash))) + .filter_map(|(number, hash)| self.chain.read().unwrap().block_receipts(&hash).map(|r| (number, hash, r.receipts))) + .filter_map(|(number, hash, receipts)| self.chain.read().unwrap().block(&hash).map(|ref b| (number, hash, receipts, BlockView::new(b).transaction_hashes()))) + .flat_map(|(number, hash, receipts, hashes)| { let mut log_index = 0; receipts.into_iter() .enumerate() - .map(|(index, receipt)| { + .flat_map(|(index, receipt)| { log_index += receipt.logs.len(); receipt.logs.into_iter() .enumerate() @@ -518,11 +514,9 @@ impl BlockChainClient for Client { }) .collect::>() }) - .flat_map(|m| m) .collect::>() }) - .flat_map(|m| m) .collect() } } From ca251215cf871e82bdd8f7a7f6a265f201e635f5 Mon Sep 17 00:00:00 2001 From: debris Date: Wed, 24 Feb 2016 10:35:05 +0100 Subject: [PATCH 44/73] simplified filter iterators --- ethcore/src/filter.rs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/ethcore/src/filter.rs b/ethcore/src/filter.rs index f5f9135d6..95c5687a7 100644 --- a/ethcore/src/filter.rs +++ b/ethcore/src/filter.rs @@ -57,30 +57,26 @@ impl Filter { self.topics.iter().fold(blooms, | bs, topic | match *topic { None => bs, - Some(ref topics) => bs.into_iter().map(|bloom| { + Some(ref topics) => bs.into_iter().flat_map(|bloom| { topics.into_iter().map(|topic| { let mut b = bloom.clone(); b.shift_bloomed(&topic.sha3()); b }).collect::>() - }).flat_map(|m| m).collect() + }).collect() }) } /// Returns true if given log entry matches filter. pub fn matches(&self, log: &LogEntry) -> bool { let matches = match self.address { - Some(ref addresses) if !addresses.is_empty() => addresses.iter().fold(false, |res, address| { - res || &log.address == address - }), + Some(ref addresses) if !addresses.is_empty() => addresses.iter().any(|address| &log.address == address), _ => true }; - matches && self.topics.iter().enumerate().fold(true, |res, (i, topic)| match *topic { - Some(ref topics) if !topics.is_empty() => res && topics.iter().fold(false, | acc, topic | { - acc || log.topics.get(i) == Some(topic) - }), - _ => res, + matches && self.topics.iter().enumerate().all(|(i, topic)| match *topic { + Some(ref topics) if !topics.is_empty() => topics.iter().any(|topic| log.topics.get(i) == Some(topic)), + _ => true }) } } From da936d2e9490cf293c9ac17faa569e2dc1c610ca Mon Sep 17 00:00:00 2001 From: debris Date: Wed, 24 Feb 2016 10:45:17 +0100 Subject: [PATCH 45/73] removed unused umports --- ethcore/src/blockchain.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/ethcore/src/blockchain.rs b/ethcore/src/blockchain.rs index 2b812e92d..0e14b0502 100644 --- a/ethcore/src/blockchain.rs +++ b/ethcore/src/blockchain.rs @@ -817,8 +817,6 @@ mod tests { use blockchain::{BlockProvider, BlockChain}; use tests::helpers::*; use devtools::*; - use views::BlockView; - use util::uint::U256; #[test] fn valid_tests_extra32() { From dd8652dbf41715dcb44e7fa4c835634b99c1d771 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Wed, 24 Feb 2016 21:17:29 +0300 Subject: [PATCH 46/73] u256 to inline assembly opt --- util/benches/bigint.rs | 37 +++++++++++++++++ util/src/lib.rs | 1 + util/src/uint.rs | 90 ++++++++++++++++++++++++++++++------------ 3 files changed, 102 insertions(+), 26 deletions(-) create mode 100644 util/benches/bigint.rs diff --git a/util/benches/bigint.rs b/util/benches/bigint.rs new file mode 100644 index 000000000..6ba30d88c --- /dev/null +++ b/util/benches/bigint.rs @@ -0,0 +1,37 @@ +// Copyright 2015, 2016 Ethcore (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! benchmarking for rlp +//! should be started with: +//! ```bash +//! multirust run nightly cargo bench +//! ``` + +#![feature(test)] + +extern crate test; +extern crate ethcore_util; + +use test::{Bencher, black_box}; +use ethcore_util::uint::*; + +#[bench] +fn u256_first_degree(b: &mut test::Bencher) { + b.iter(|| { + let n = black_box(10000); + (0..n).fold(U256::zero(), |old, new| { old.overflowing_add(U256::from(new)).0 }) + }); +} diff --git a/util/src/lib.rs b/util/src/lib.rs index 2b7438cf3..1f04240dc 100644 --- a/util/src/lib.rs +++ b/util/src/lib.rs @@ -16,6 +16,7 @@ #![warn(missing_docs)] #![cfg_attr(feature="dev", feature(plugin))] +#![cfg_attr(feature="dev", feature(asm))] #![cfg_attr(feature="dev", plugin(clippy))] // Clippy settings diff --git a/util/src/uint.rs b/util/src/uint.rs index 6490cbd9b..8266aff42 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -51,6 +51,64 @@ macro_rules! impl_map_from { } } +macro_rules! overflowing_add_regular { + ($name:ident, $n_words:expr, $self_expr: expr, $other: expr) => ({ + let $name(ref me) = $self_expr; + let $name(ref you) = $other; + let mut ret = [0u64; $n_words]; + let mut carry = [0u64; $n_words]; + let mut b_carry = false; + let mut overflow = false; + + for i in 0..$n_words { + ret[i] = me[i].wrapping_add(you[i]); + + if ret[i] < me[i] { + if i < $n_words - 1 { + carry[i + 1] = 1; + b_carry = true; + } else { + overflow = true; + } + } + } + if b_carry { + let ret = overflowing!($name(ret).overflowing_add($name(carry)), overflow); + (ret, overflow) + } else { + ($name(ret), overflow) + } + }) +} + +macro_rules! overflowing_add_u256_asm { + (U256, $n_words: expr, $self_expr: expr, $other: expr) => ({ + let mut result: [u64; 4] = unsafe { mem::uninitialized() }; + let self_t: &[u64; 4] = unsafe { &mem::transmute($self_expr) }; + let other_t: &[u64; 4] = unsafe { &mem::transmute($other) }; + + let overflow: u8; + unsafe { + asm!(" + xor %al, %al + adc $9, %r8 + adc $10, %r9 + adc $11, %r10 + adc $12, %r11 + adc $$0, %al" + : "={r8}"(result[0]), "={r9}"(result[1]), "={r10}"(result[2]), "={r11}"(result[3]), "={al}"(overflow) + : "{r8}"(self_t[0]), "{r9}"(self_t[1]), "{r10}"(self_t[2]), "{r11}"(self_t[3]), "m"(other_t[0]), "m"(other_t[1]), "m"(other_t[2]), "m"(other_t[3]) + : + : + ); + } + (U256(result), overflow != 0) + }); + ($name:ident, $n_words:expr, $self_expr: expr, $other: expr) => ( + overflowing_add_regular!($name, $n_words, $self_expr, $other) + ) +} + macro_rules! overflowing { ($op: expr, $overflow: expr) => ( { @@ -297,32 +355,14 @@ macro_rules! construct_uint { (res, overflow) } + #[cfg(all(feature = "dev", target_arch = "x86_64"))] fn overflowing_add(self, other: $name) -> ($name, bool) { - let $name(ref me) = self; - let $name(ref you) = other; - let mut ret = [0u64; $n_words]; - let mut carry = [0u64; $n_words]; - let mut b_carry = false; - let mut overflow = false; + overflowing_add_u256_asm!($name, $n_words, self, other) + } - for i in 0..$n_words { - ret[i] = me[i].wrapping_add(you[i]); - - if ret[i] < me[i] { - if i < $n_words - 1 { - carry[i + 1] = 1; - b_carry = true; - } else { - overflow = true; - } - } - } - if b_carry { - let ret = overflowing!($name(ret).overflowing_add($name(carry)), overflow); - (ret, overflow) - } else { - ($name(ret), overflow) - } + #[cfg(not(all(feature = "dev", target_arch = "x86_64")))] + fn overflowing_add(self, other: $name) -> ($name, bool) { + overflowing_add_regular!($name, $n_words, self, other) } fn overflowing_sub(self, other: $name) -> ($name, bool) { @@ -1171,8 +1211,6 @@ mod tests { ); } - - #[test] #[should_panic] pub fn uint256_mul_overflow_panic() { From 476bb85d414ab5ae0ee1d67435757a517a3ff430 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Wed, 24 Feb 2016 21:36:31 +0300 Subject: [PATCH 47/73] r m/r + setc/xor --- util/src/uint.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/util/src/uint.rs b/util/src/uint.rs index 8266aff42..db8792592 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -91,13 +91,13 @@ macro_rules! overflowing_add_u256_asm { unsafe { asm!(" xor %al, %al - adc $9, %r8 - adc $10, %r9 - adc $11, %r10 - adc $12, %r11 - adc $$0, %al" - : "={r8}"(result[0]), "={r9}"(result[1]), "={r10}"(result[2]), "={r11}"(result[3]), "={al}"(overflow) - : "{r8}"(self_t[0]), "{r9}"(self_t[1]), "{r10}"(self_t[2]), "{r11}"(self_t[3]), "m"(other_t[0]), "m"(other_t[1]), "m"(other_t[2]), "m"(other_t[3]) + adc $9, $0 + adc $10, $1 + adc $11, $2 + adc $12, $3 + adc $$0, %al" + : "=r"(result[0]), "=r"(result[1]), "=r"(result[2]), "=r"(result[3]), "={al}"(overflow) + : "0"(self_t[0]), "1"(self_t[1]), "2"(self_t[2]), "3"(self_t[3]), "mr"(other_t[0]), "mr"(other_t[1]), "mr"(other_t[2]), "mr"(other_t[3]) : : ); From 7821505139c32d8326dae60efe9b6b63e8e7530f Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Wed, 24 Feb 2016 23:08:21 +0300 Subject: [PATCH 48/73] sub x64 optimize --- util/benches/bigint.rs | 11 +++++++++- util/src/uint.rs | 49 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/util/benches/bigint.rs b/util/benches/bigint.rs index 6ba30d88c..524d31508 100644 --- a/util/benches/bigint.rs +++ b/util/benches/bigint.rs @@ -29,9 +29,18 @@ use test::{Bencher, black_box}; use ethcore_util::uint::*; #[bench] -fn u256_first_degree(b: &mut test::Bencher) { +fn u256_add(b: &mut Bencher) { b.iter(|| { let n = black_box(10000); (0..n).fold(U256::zero(), |old, new| { old.overflowing_add(U256::from(new)).0 }) }); } + +#[bench] +fn u256_sub(b: &mut Bencher) { + b.iter(|| { + let n = black_box(10000); + (0..n).fold(U256::zero(), |old, new| { old.overflowing_add(U256::from(new)).0 }) + }); +} + diff --git a/util/src/uint.rs b/util/src/uint.rs index db8792592..147b83e42 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -41,6 +41,8 @@ use from_json::*; use rustc_serialize::hex::ToHex; use serde; +#[cfg_attr(x64_asm_optimizations, all(feature = "dev", target_arch = "x86_64"))] + macro_rules! impl_map_from { ($thing:ident, $from:ty, $to:ty) => { impl From<$from> for $thing { @@ -81,7 +83,7 @@ macro_rules! overflowing_add_regular { }) } -macro_rules! overflowing_add_u256_asm { +macro_rules! add_64x_optimized { (U256, $n_words: expr, $self_expr: expr, $other: expr) => ({ let mut result: [u64; 4] = unsafe { mem::uninitialized() }; let self_t: &[u64; 4] = unsafe { &mem::transmute($self_expr) }; @@ -90,12 +92,38 @@ macro_rules! overflowing_add_u256_asm { let overflow: u8; unsafe { asm!(" - xor %al, %al adc $9, $0 adc $10, $1 adc $11, $2 adc $12, $3 - adc $$0, %al" + setc %al" + : "=r"(result[0]), "=r"(result[1]), "=r"(result[2]), "=r"(result[3]), "={al}"(overflow) + : "0"(self_t[0]), "1"(self_t[1]), "2"(self_t[2]), "3"(self_t[3]), "mr"(other_t[0]), "mr"(other_t[1]), "mr"(other_t[2]), "mr"(other_t[3]) + : + : + ); + } + (U256(result), overflow != 0) + }); + ($name:ident, $n_words:expr, $self_expr: expr, $other: expr) => ( + overflowing_add_regular!($name, $n_words, $self_expr, $other) + ) +} + +macro_rules! sub_64x_optimized { + (U256, $n_words: expr, $self_expr: expr, $other: expr) => ({ + let mut result: [u64; 4] = unsafe { mem::uninitialized() }; + let self_t: &[u64; 4] = unsafe { &mem::transmute($self_expr) }; + let other_t: &[u64; 4] = unsafe { &mem::transmute($other) }; + + let overflow: u8; + unsafe { + asm!(" + sbb $9, %r8 + sbb $10, %r9 + sbb $11, %r10 + sbb $12, %r11 + setb %al" : "=r"(result[0]), "=r"(result[1]), "=r"(result[2]), "=r"(result[3]), "={al}"(overflow) : "0"(self_t[0]), "1"(self_t[1]), "2"(self_t[2]), "3"(self_t[3]), "mr"(other_t[0]), "mr"(other_t[1]), "mr"(other_t[2]), "mr"(other_t[3]) : @@ -355,16 +383,23 @@ macro_rules! construct_uint { (res, overflow) } - #[cfg(all(feature = "dev", target_arch = "x86_64"))] + /// Optimized instructions + #[cfg(x64_asm_optimizations)] + #[inline] fn overflowing_add(self, other: $name) -> ($name, bool) { - overflowing_add_u256_asm!($name, $n_words, self, other) + add_64x_optimized!($name, $n_words, self, other) } - - #[cfg(not(all(feature = "dev", target_arch = "x86_64")))] + #[cfg(not(x64_asm_optimizations))] fn overflowing_add(self, other: $name) -> ($name, bool) { overflowing_add_regular!($name, $n_words, self, other) } + #[cfg(x64_asm_optimizations)] + #[inline] + fn overflowing_sub(self, other: $name) -> ($name, bool) { + sub_64x_optimized!($name, $n_words, self, other) + } + #[cfg(not(x64_asm_optimizations))] fn overflowing_sub(self, other: $name) -> ($name, bool) { let res = overflowing!((!other).overflowing_add(From::from(1u64))); let res = overflowing!(self.overflowing_add(res)); From ccaa1946810e5566304f5e6e5cc2f33883f2a99b Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 25 Feb 2016 02:00:34 +0300 Subject: [PATCH 49/73] mul, bench showtime --- util/benches/bigint.rs | 20 ++++- util/src/uint.rs | 161 +++++++++++++++++++++++++++++++++-------- 2 files changed, 150 insertions(+), 31 deletions(-) diff --git a/util/benches/bigint.rs b/util/benches/bigint.rs index 524d31508..38ce10a4a 100644 --- a/util/benches/bigint.rs +++ b/util/benches/bigint.rs @@ -21,6 +21,7 @@ //! ``` #![feature(test)] +#![feature(asm)] extern crate test; extern crate ethcore_util; @@ -40,7 +41,24 @@ fn u256_add(b: &mut Bencher) { fn u256_sub(b: &mut Bencher) { b.iter(|| { let n = black_box(10000); - (0..n).fold(U256::zero(), |old, new| { old.overflowing_add(U256::from(new)).0 }) + (0..n).fold(U256::zero(), |old, new| { old.overflowing_sub(U256::from(new)).0 }) + }); +} + +#[bench] +fn u256_mul(b: &mut Bencher) { + b.iter(|| { + let n = black_box(10000); + (0..n).fold(U256([12345u64, 0u64, 0u64, 0u64]), |old, new| { old.overflowing_mul(U256::from(new)).0 }) + }); +} + + +#[bench] +fn u128_mul(b: &mut Bencher) { + b.iter(|| { + let n = black_box(10000); + (0..n).fold(U128([12345u64, 0u64]), |old, new| { old.overflowing_mul(U128::from(new)).0 }) }); } diff --git a/util/src/uint.rs b/util/src/uint.rs index 147b83e42..38b4e4906 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -41,8 +41,6 @@ use from_json::*; use rustc_serialize::hex::ToHex; use serde; -#[cfg_attr(x64_asm_optimizations, all(feature = "dev", target_arch = "x86_64"))] - macro_rules! impl_map_from { ($thing:ident, $from:ty, $to:ty) => { impl From<$from> for $thing { @@ -53,7 +51,8 @@ macro_rules! impl_map_from { } } -macro_rules! overflowing_add_regular { +#[cfg(not(all(feature="dev", target_arch = "x86_64")))] +macro_rules! uint_overflowing_add { ($name:ident, $n_words:expr, $self_expr: expr, $other: expr) => ({ let $name(ref me) = $self_expr; let $name(ref you) = $other; @@ -83,7 +82,8 @@ macro_rules! overflowing_add_regular { }) } -macro_rules! add_64x_optimized { +#[cfg(all(feature="dev", target_arch = "x86_64"))] +macro_rules! uint_overflowing_add { (U256, $n_words: expr, $self_expr: expr, $other: expr) => ({ let mut result: [u64; 4] = unsafe { mem::uninitialized() }; let self_t: &[u64; 4] = unsafe { &mem::transmute($self_expr) }; @@ -110,7 +110,17 @@ macro_rules! add_64x_optimized { ) } -macro_rules! sub_64x_optimized { +#[cfg(not(all(feature="dev", target_arch = "x86_64")))] +macro_rules! uint_overflowing_sub { + ($name:ident, $n_words: expr, $self_expr: expr, $other: expr) => ({ + let res = overflowing!((!$other).overflowing_add(From::from(1u64))); + let res = overflowing!($self_expr.overflowing_add(res)); + (res, $self_expr < $other) + }) +} + +#[cfg(all(feature="dev", target_arch = "x86_64"))] +macro_rules! uint_overflowing_sub { (U256, $n_words: expr, $self_expr: expr, $other: expr) => ({ let mut result: [u64; 4] = unsafe { mem::uninitialized() }; let self_t: &[u64; 4] = unsafe { &mem::transmute($self_expr) }; @@ -137,6 +147,119 @@ macro_rules! sub_64x_optimized { ) } +#[cfg(all(feature="dev", target_arch = "x86_64"))] +macro_rules! uint_overflowing_mul { + (U256, $n_words: expr, $self_expr: expr, $other: expr) => ({ + let mut result: [u64; 4] = unsafe { mem::uninitialized() }; + let self_t: &[u64; 4] = unsafe { &mem::transmute($self_expr) }; + let other_t: &[u64; 4] = unsafe { &mem::transmute($other) }; + + let overflow: u8; + unsafe { + asm!(" + mov $5, %rax + mulq $9 + mov %rax, %r8 + adc $6, %rdx + pushf + + mov %rdx, %rax + mulq $9 + popf + adc $$0, %rax + adc $7, %rdx + pushf + mov %rax, %r9 + + + mov %rdx, %rax + mulq $9 + popf + adc $$0, %rax + adc $8, %rdx + pushf + mov %rax, %r10 + + mov %rdx, %rax + mulq $9 + popf + adc $$0, %rax + mov %rax, %r11 + mov %rdx, %rcx + + mov $5, %rax + mulq $10 + adc %rax, %r9 + adc $6, %rdx + pushf + + mov %rdx, %rax + mulq $10 + popf + adc %rax, %r10 + adc $7, %rdx + pushf + + mov %rdx, %rax + mulq $10 + popf + adc %rax, %r11 + pushf + or %rax, %rcx + + mov $5, %rax + mulq $11 + popf + adc %rax, %r10 + adc $6, %rdx + pushf + + mov %rdx, %rax + mulq $11 + popf + adc %rax, %r11 + pushf + or %rdx, %rcx + + mov $5, %rax + mulq $12 + popf + adc %rax, %r11 + or %rdx, %rcx + " + : /* $0 */ "={r8}"(result[0]), /* $1 */ "={r9}"(result[1]), /* $2 */ "={r10}"(result[2]), + /* $3 */ "={r11}"(result[3]), /* $4 */ "={rcx}"(overflow) + + : /* $5 */ "m"(self_t[0]), /* $6 */ "m"(self_t[1]), /* $7 */ "m"(self_t[2]), + /* $8 */ "m"(self_t[3]), /* $9 */ "m"(other_t[0]), /* $10 */ "m"(other_t[1]), + /* $11 */ "m"(other_t[2]), /* $12 */ "m"(other_t[3]) + : "rax", "rdx" + : + + ); + } + (U256(result), overflow > 0) + }); + ($name:ident, $n_words:expr, $self_expr: expr, $other: expr) => ( + overflowing_mul_regular!($name, $n_words, $self_expr, $other) + ) +} + +#[cfg(not(all(feature="dev", target_arch = "x86_64")))] +macro_rules! uint_overflowing_mul { + ($name:ident, $n_words: expr, $self_expr: expr, $other: expr) => ({ + let mut res = $name::from(0u64); + let mut overflow = false; + // TODO: be more efficient about this + for i in 0..(2 * $n_words) { + let v = overflowing!($self_expr.overflowing_mul_u32(($other >> (32 * i)).low_u32()), overflow); + let res2 = overflowing!(v.overflowing_shl(32 * i as u32), overflow); + res = overflowing!(res.overflowing_add(res2), overflow); + } + (res, overflow) + }) +} + macro_rules! overflowing { ($op: expr, $overflow: expr) => ( { @@ -384,38 +507,16 @@ macro_rules! construct_uint { } /// Optimized instructions - #[cfg(x64_asm_optimizations)] - #[inline] fn overflowing_add(self, other: $name) -> ($name, bool) { - add_64x_optimized!($name, $n_words, self, other) - } - #[cfg(not(x64_asm_optimizations))] - fn overflowing_add(self, other: $name) -> ($name, bool) { - overflowing_add_regular!($name, $n_words, self, other) + uint_overflowing_add!($name, $n_words, self, other) } - #[cfg(x64_asm_optimizations)] - #[inline] fn overflowing_sub(self, other: $name) -> ($name, bool) { - sub_64x_optimized!($name, $n_words, self, other) - } - #[cfg(not(x64_asm_optimizations))] - fn overflowing_sub(self, other: $name) -> ($name, bool) { - let res = overflowing!((!other).overflowing_add(From::from(1u64))); - let res = overflowing!(self.overflowing_add(res)); - (res, self < other) + uint_overflowing_sub!($name, $n_words, self, other) } fn overflowing_mul(self, other: $name) -> ($name, bool) { - let mut res = $name::from(0u64); - let mut overflow = false; - // TODO: be more efficient about this - for i in 0..(2 * $n_words) { - let v = overflowing!(self.overflowing_mul_u32((other >> (32 * i)).low_u32()), overflow); - let res2 = overflowing!(v.overflowing_shl(32 * i as u32), overflow); - res = overflowing!(res.overflowing_add(res2), overflow); - } - (res, overflow) + uint_overflowing_mul!($name, $n_words, self, other) } fn overflowing_div(self, other: $name) -> ($name, bool) { From 0794049d18708a3d258df42cd43f51ce03a9ae33 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 25 Feb 2016 02:05:59 +0300 Subject: [PATCH 50/73] fix naughty macros --- util/src/uint.rs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/util/src/uint.rs b/util/src/uint.rs index 38b4e4906..f27150199 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -53,6 +53,12 @@ macro_rules! impl_map_from { #[cfg(not(all(feature="dev", target_arch = "x86_64")))] macro_rules! uint_overflowing_add { + ($name:ident, $n_words:expr, $self_expr: expr, $other: expr) => ({ + uint_overflowing_add_reg!($name, $n_words, $self_expr, $other) + }) +} + +macro_rules! uint_overflowing_add_reg { ($name:ident, $n_words:expr, $self_expr: expr, $other: expr) => ({ let $name(ref me) = $self_expr; let $name(ref you) = $other; @@ -82,6 +88,7 @@ macro_rules! uint_overflowing_add { }) } + #[cfg(all(feature="dev", target_arch = "x86_64"))] macro_rules! uint_overflowing_add { (U256, $n_words: expr, $self_expr: expr, $other: expr) => ({ @@ -106,7 +113,7 @@ macro_rules! uint_overflowing_add { (U256(result), overflow != 0) }); ($name:ident, $n_words:expr, $self_expr: expr, $other: expr) => ( - overflowing_add_regular!($name, $n_words, $self_expr, $other) + uint_overflowing_add_reg!($name, $n_words, $self_expr, $other) ) } @@ -142,9 +149,11 @@ macro_rules! uint_overflowing_sub { } (U256(result), overflow != 0) }); - ($name:ident, $n_words:expr, $self_expr: expr, $other: expr) => ( - overflowing_add_regular!($name, $n_words, $self_expr, $other) - ) + ($name:ident, $n_words: expr, $self_expr: expr, $other: expr) => ({ + let res = overflowing!((!$other).overflowing_add(From::from(1u64))); + let res = overflowing!($self_expr.overflowing_add(res)); + (res, $self_expr < $other) + }) } #[cfg(all(feature="dev", target_arch = "x86_64"))] @@ -241,12 +250,18 @@ macro_rules! uint_overflowing_mul { (U256(result), overflow > 0) }); ($name:ident, $n_words:expr, $self_expr: expr, $other: expr) => ( - overflowing_mul_regular!($name, $n_words, $self_expr, $other) + uint_overflowing_mul_reg!($name, $n_words, $self_expr, $other) ) } #[cfg(not(all(feature="dev", target_arch = "x86_64")))] macro_rules! uint_overflowing_mul { + ($name:ident, $n_words: expr, $self_expr: expr, $other: expr) => ({ + uint_overflowing_mul_reg!($name, $n_words, $self_expr, $other) + }) +} + +macro_rules! uint_overflowing_mul_reg { ($name:ident, $n_words: expr, $self_expr: expr, $other: expr) => ({ let mut res = $name::from(0u64); let mut overflow = false; From da69ea51fe2c5da3b540fb07066588a7a4e27d1e Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 25 Feb 2016 03:09:33 +0300 Subject: [PATCH 51/73] inline --- util/benches/bigint.rs | 12 ++++++++++-- util/src/uint.rs | 27 ++++++++++++++++----------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/util/benches/bigint.rs b/util/benches/bigint.rs index 38ce10a4a..3a9c6d118 100644 --- a/util/benches/bigint.rs +++ b/util/benches/bigint.rs @@ -33,7 +33,15 @@ use ethcore_util::uint::*; fn u256_add(b: &mut Bencher) { b.iter(|| { let n = black_box(10000); - (0..n).fold(U256::zero(), |old, new| { old.overflowing_add(U256::from(new)).0 }) + (0..n).fold(U256::from(1234599u64), |old, new| { old.overflowing_add(U256::from(new)).0 }) + }); +} + +#[bench] +fn u256_uber_add(b: &mut Bencher) { + b.iter(|| { + let n = black_box(10000); + (0..n).fold(U256::from(1234599u64), |old, new| { old.uber_add(U256::from(new)).0 }) }); } @@ -41,7 +49,7 @@ fn u256_add(b: &mut Bencher) { fn u256_sub(b: &mut Bencher) { b.iter(|| { let n = black_box(10000); - (0..n).fold(U256::zero(), |old, new| { old.overflowing_sub(U256::from(new)).0 }) + (0..n).fold(U256::from(::std::u64::MAX), |old, new| { old.overflowing_sub(U256::from(new)).0 }) }); } diff --git a/util/src/uint.rs b/util/src/uint.rs index f27150199..8dd7d8638 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -97,17 +97,19 @@ macro_rules! uint_overflowing_add { let other_t: &[u64; 4] = unsafe { &mem::transmute($other) }; let overflow: u8; - unsafe { - asm!(" - adc $9, $0 - adc $10, $1 - adc $11, $2 - adc $12, $3 - setc %al" - : "=r"(result[0]), "=r"(result[1]), "=r"(result[2]), "=r"(result[3]), "={al}"(overflow) - : "0"(self_t[0]), "1"(self_t[1]), "2"(self_t[2]), "3"(self_t[3]), "mr"(other_t[0]), "mr"(other_t[1]), "mr"(other_t[2]), "mr"(other_t[3]) - : - : + unsafe { + asm!(" + adc $9, %r8 + adc $10, %r9 + adc $11, %r10 + adc $12, %r11 + setc %al + " + : "={r8}"(result[0]), "={r9}"(result[1]), "={r10}"(result[2]), "={r11}"(result[3]), "={al}"(overflow) + : "{r8}"(self_t[0]), "{r9}"(self_t[1]), "{r10}"(self_t[2]), "{r11}"(self_t[3]), + "m"(other_t[0]), "m"(other_t[1]), "m"(other_t[2]), "m"(other_t[3]) + : + : ); } (U256(result), overflow != 0) @@ -522,14 +524,17 @@ macro_rules! construct_uint { } /// Optimized instructions + #[inline(always)] fn overflowing_add(self, other: $name) -> ($name, bool) { uint_overflowing_add!($name, $n_words, self, other) } + #[inline(always)] fn overflowing_sub(self, other: $name) -> ($name, bool) { uint_overflowing_sub!($name, $n_words, self, other) } + #[inline(always)] fn overflowing_mul(self, other: $name) -> ($name, bool) { uint_overflowing_mul!($name, $n_words, self, other) } From ae76a509dcc956ea329781bbc9cb6b6cc373580e Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 25 Feb 2016 03:10:02 +0300 Subject: [PATCH 52/73] inline test --- util/benches/bigint.rs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/util/benches/bigint.rs b/util/benches/bigint.rs index 3a9c6d118..826d5023e 100644 --- a/util/benches/bigint.rs +++ b/util/benches/bigint.rs @@ -37,13 +37,6 @@ fn u256_add(b: &mut Bencher) { }); } -#[bench] -fn u256_uber_add(b: &mut Bencher) { - b.iter(|| { - let n = black_box(10000); - (0..n).fold(U256::from(1234599u64), |old, new| { old.uber_add(U256::from(new)).0 }) - }); -} #[bench] fn u256_sub(b: &mut Bencher) { From f17d893f53f2551d51e590cb4ce2d296750f4093 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 25 Feb 2016 16:20:57 +0300 Subject: [PATCH 53/73] fixed mul, fixed register pref --- util/src/uint.rs | 159 +++++++++++++++++++++++++++-------------------- 1 file changed, 93 insertions(+), 66 deletions(-) diff --git a/util/src/uint.rs b/util/src/uint.rs index 8dd7d8638..6869c3ec1 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -99,15 +99,15 @@ macro_rules! uint_overflowing_add { let overflow: u8; unsafe { asm!(" - adc $9, %r8 - adc $10, %r9 - adc $11, %r10 - adc $12, %r11 + adc $9, $0 + adc $10, $1 + adc $11, $2 + adc $12, $3 setc %al " - : "={r8}"(result[0]), "={r9}"(result[1]), "={r10}"(result[2]), "={r11}"(result[3]), "={al}"(overflow) - : "{r8}"(self_t[0]), "{r9}"(self_t[1]), "{r10}"(self_t[2]), "{r11}"(self_t[3]), - "m"(other_t[0]), "m"(other_t[1]), "m"(other_t[2]), "m"(other_t[3]) + : "=r"(result[0]), "=r"(result[1]), "=r"(result[2]), "=r"(result[3]), "={al}"(overflow) + : "0"(self_t[0]), "1"(self_t[1]), "2"(self_t[2]), "3"(self_t[3]), + "mr"(other_t[0]), "mr"(other_t[1]), "mr"(other_t[2]), "mr"(other_t[3]) : : ); @@ -138,10 +138,10 @@ macro_rules! uint_overflowing_sub { let overflow: u8; unsafe { asm!(" - sbb $9, %r8 - sbb $10, %r9 - sbb $11, %r10 - sbb $12, %r11 + sbb $9, $0 + sbb $10, $1 + sbb $11, $2 + sbb $12, $3 setb %al" : "=r"(result[0]), "=r"(result[1]), "=r"(result[2]), "=r"(result[3]), "={al}"(overflow) : "0"(self_t[0]), "1"(self_t[1]), "2"(self_t[2]), "3"(self_t[3]), "mr"(other_t[0]), "mr"(other_t[1]), "mr"(other_t[2]), "mr"(other_t[3]) @@ -168,76 +168,103 @@ macro_rules! uint_overflowing_mul { let overflow: u8; unsafe { asm!(" + clc mov $5, %rax mulq $9 - mov %rax, %r8 - adc $6, %rdx - pushf + mov %rax, $0 + mov %rdx, $1 - mov %rdx, %rax + mov $6, %rax + mulq $9 + clc + adc %rax, $1 + mov %rdx, $2 + + mov $5, %rax + pushf + mulq $10 + popf + adc %rax, $1 + adc %rdx, $2 + + mov $6, %rax + mulq $10 + clc + adc %rax, $2 + mov %rdx, $3 + + mov $7, %rax + mulq $9 + clc + adc %rax, $2 + adc %rdx, $3 + + mov $5, %rax + mulq $11 + clc + adc %rax, $2 + adc %rdx, $3 + + mov $8, %rax + pushf mulq $9 popf - adc $$0, %rax - adc $7, %rdx - pushf - mov %rax, %r9 - - - mov %rdx, %rax - mulq $9 - popf - adc $$0, %rax - adc $8, %rdx - pushf - mov %rax, %r10 - - mov %rdx, %rax - mulq $9 - popf - adc $$0, %rax - mov %rax, %r11 + adc %rax, $3 + adc $$0, %rdx mov %rdx, %rcx + clc - mov $5, %rax - mulq $10 - adc %rax, %r9 - adc $6, %rdx + mov $7, %rax pushf - - mov %rdx, %rax mulq $10 popf - adc %rax, %r10 - adc $7, %rdx - pushf - - mov %rdx, %rax - mulq $10 - popf - adc %rax, %r11 - pushf - or %rax, %rcx - - mov $5, %rax - mulq $11 - popf - adc %rax, %r10 - adc $6, %rdx - pushf - - mov %rdx, %rax - mulq $11 - popf - adc %rax, %r11 - pushf + adc %rax, $3 + adc $$0, %rdx or %rdx, %rcx + clc + + mov $6, %rax + pushf + mulq $11 + popf + adc %rax, $3 + adc $$0, %rdx + or %rdx, %rcx + clc mov $5, %rax + pushf mulq $12 popf - adc %rax, %r11 - or %rdx, %rcx - " + adc %rax, $3 + adc $$0, %rdx + or %rdx, %rcx + clc + + cmpq $$0, %rcx + jne 2f + + mov $8, %rax + cmpq $$0, %rax + setz %cl + + mov $7, %rax + cmpq $$0, %rax + sete %dl + or %dl, %cl + + mov $3, %rax + cmpq $$0, %rax + sete %dl + + mov $2, %rax + cmpq $$0, %rax + sete %bl + or %bl, %dl + + and %dl, %cl + + 2: " : /* $0 */ "={r8}"(result[0]), /* $1 */ "={r9}"(result[1]), /* $2 */ "={r10}"(result[2]), /* $3 */ "={r11}"(result[3]), /* $4 */ "={rcx}"(overflow) From 5467b06c4f845bd8fde8adf216dec75deb4dbea6 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 25 Feb 2016 16:40:36 +0300 Subject: [PATCH 54/73] fix bench iter --- util/benches/bigint.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/benches/bigint.rs b/util/benches/bigint.rs index 826d5023e..a22edcfbc 100644 --- a/util/benches/bigint.rs +++ b/util/benches/bigint.rs @@ -33,7 +33,7 @@ use ethcore_util::uint::*; fn u256_add(b: &mut Bencher) { b.iter(|| { let n = black_box(10000); - (0..n).fold(U256::from(1234599u64), |old, new| { old.overflowing_add(U256::from(new)).0 }) + (0..n).fold(U256([12345u64, 0u64, 0u64, 0u64]), |old, new| { old.overflowing_add(U256::from(new)).0 }) }); } @@ -42,7 +42,7 @@ fn u256_add(b: &mut Bencher) { fn u256_sub(b: &mut Bencher) { b.iter(|| { let n = black_box(10000); - (0..n).fold(U256::from(::std::u64::MAX), |old, new| { old.overflowing_sub(U256::from(new)).0 }) + (0..n).fold(U256([::std::u64::MAX, 0u64, 0u64, 0u64]), |old, new| { old.overflowing_sub(U256::from(new)).0 }) }); } From fb5779a00eeeef78228ec61e09331fbed503293a Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 25 Feb 2016 16:55:03 +0300 Subject: [PATCH 55/73] specific feature for asm opt --- util/Cargo.toml | 1 + util/src/lib.rs | 2 +- util/src/uint.rs | 12 ++++++------ 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/util/Cargo.toml b/util/Cargo.toml index 6d2ebcd9b..e2e91eb4b 100644 --- a/util/Cargo.toml +++ b/util/Cargo.toml @@ -39,6 +39,7 @@ target_info = "0.1" [features] default = [] dev = ["clippy"] +x64asm = [] [build-dependencies] vergen = "*" diff --git a/util/src/lib.rs b/util/src/lib.rs index 1f04240dc..d0c74af10 100644 --- a/util/src/lib.rs +++ b/util/src/lib.rs @@ -16,7 +16,7 @@ #![warn(missing_docs)] #![cfg_attr(feature="dev", feature(plugin))] -#![cfg_attr(feature="dev", feature(asm))] +#![cfg_attr(feature="x64asm", feature(asm))] #![cfg_attr(feature="dev", plugin(clippy))] // Clippy settings diff --git a/util/src/uint.rs b/util/src/uint.rs index 6869c3ec1..98c16ab90 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -51,7 +51,7 @@ macro_rules! impl_map_from { } } -#[cfg(not(all(feature="dev", target_arch = "x86_64")))] +#[cfg(not(all(feature="x64asm", target_arch = "x86_64")))] macro_rules! uint_overflowing_add { ($name:ident, $n_words:expr, $self_expr: expr, $other: expr) => ({ uint_overflowing_add_reg!($name, $n_words, $self_expr, $other) @@ -89,7 +89,7 @@ macro_rules! uint_overflowing_add_reg { } -#[cfg(all(feature="dev", target_arch = "x86_64"))] +#[cfg(all(feature="x64asm", target_arch = "x86_64"))] macro_rules! uint_overflowing_add { (U256, $n_words: expr, $self_expr: expr, $other: expr) => ({ let mut result: [u64; 4] = unsafe { mem::uninitialized() }; @@ -119,7 +119,7 @@ macro_rules! uint_overflowing_add { ) } -#[cfg(not(all(feature="dev", target_arch = "x86_64")))] +#[cfg(not(all(feature="x64asm", target_arch = "x86_64")))] macro_rules! uint_overflowing_sub { ($name:ident, $n_words: expr, $self_expr: expr, $other: expr) => ({ let res = overflowing!((!$other).overflowing_add(From::from(1u64))); @@ -128,7 +128,7 @@ macro_rules! uint_overflowing_sub { }) } -#[cfg(all(feature="dev", target_arch = "x86_64"))] +#[cfg(all(feature="x64asm", target_arch = "x86_64"))] macro_rules! uint_overflowing_sub { (U256, $n_words: expr, $self_expr: expr, $other: expr) => ({ let mut result: [u64; 4] = unsafe { mem::uninitialized() }; @@ -158,7 +158,7 @@ macro_rules! uint_overflowing_sub { }) } -#[cfg(all(feature="dev", target_arch = "x86_64"))] +#[cfg(all(feature="x64asm", target_arch = "x86_64"))] macro_rules! uint_overflowing_mul { (U256, $n_words: expr, $self_expr: expr, $other: expr) => ({ let mut result: [u64; 4] = unsafe { mem::uninitialized() }; @@ -283,7 +283,7 @@ macro_rules! uint_overflowing_mul { ) } -#[cfg(not(all(feature="dev", target_arch = "x86_64")))] +#[cfg(not(all(feature="x64asm", target_arch = "x86_64")))] macro_rules! uint_overflowing_mul { ($name:ident, $n_words: expr, $self_expr: expr, $other: expr) => ({ uint_overflowing_mul_reg!($name, $n_words, $self_expr, $other) From 7525ff23cf1802cbeb6e4d51394eac3974de4c70 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 25 Feb 2016 17:59:08 +0300 Subject: [PATCH 56/73] removed artefact cls/pushf/popf --- util/src/uint.rs | 40 +++++++++++----------------------------- 1 file changed, 11 insertions(+), 29 deletions(-) diff --git a/util/src/uint.rs b/util/src/uint.rs index 98c16ab90..bebaade22 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -168,7 +168,6 @@ macro_rules! uint_overflowing_mul { let overflow: u8; unsafe { asm!(" - clc mov $5, %rax mulq $9 mov %rax, $0 @@ -176,77 +175,59 @@ macro_rules! uint_overflowing_mul { mov $6, %rax mulq $9 - clc - adc %rax, $1 + add %rax, $1 mov %rdx, $2 mov $5, %rax - pushf mulq $10 - popf - adc %rax, $1 + add %rax, $1 adc %rdx, $2 mov $6, %rax mulq $10 - clc - adc %rax, $2 + add %rax, $2 mov %rdx, $3 mov $7, %rax mulq $9 - clc - adc %rax, $2 + add %rax, $2 adc %rdx, $3 mov $5, %rax mulq $11 - clc - adc %rax, $2 + add %rax, $2 adc %rdx, $3 mov $8, %rax - pushf mulq $9 - popf adc %rax, $3 adc $$0, %rdx mov %rdx, %rcx - clc mov $7, %rax - pushf mulq $10 - popf - adc %rax, $3 + add %rax, $3 adc $$0, %rdx or %rdx, %rcx - clc mov $6, %rax - pushf mulq $11 - popf - adc %rax, $3 + add %rax, $3 adc $$0, %rdx or %rdx, %rcx - clc mov $5, %rax - pushf mulq $12 - popf - adc %rax, $3 + add %rax, $3 adc $$0, %rdx or %rdx, %rcx - clc cmpq $$0, %rcx jne 2f mov $8, %rax cmpq $$0, %rax - setz %cl + sete %cl mov $7, %rax cmpq $$0, %rax @@ -264,7 +245,8 @@ macro_rules! uint_overflowing_mul { and %dl, %cl - 2: " + 2: + " : /* $0 */ "={r8}"(result[0]), /* $1 */ "={r9}"(result[1]), /* $2 */ "={r10}"(result[2]), /* $3 */ "={r11}"(result[3]), /* $4 */ "={rcx}"(overflow) From 864e7540742ebc1c408e9e2de57f96eee28d7c5b Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 25 Feb 2016 18:02:08 +0300 Subject: [PATCH 57/73] overflowing_sub in sub --- util/src/uint.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/util/src/uint.rs b/util/src/uint.rs index bebaade22..6793376a0 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -765,9 +765,9 @@ macro_rules! construct_uint { #[inline] fn sub(self, other: $name) -> $name { - panic_on_overflow!(self < other); - let res = overflowing!((!other).overflowing_add(From::from(1u64))); - overflowing!(self.overflowing_add(res)) + let (result, overflow) = self.overflowing_sub(other); + panic_on_overflow!(overflow); + result } } From 5d22ad3fc8abe4617684213833550207ddca2c6b Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 25 Feb 2016 18:10:33 +0300 Subject: [PATCH 58/73] counter jump better --- util/src/uint.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/util/src/uint.rs b/util/src/uint.rs index 6793376a0..f4d5b5b76 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -222,8 +222,7 @@ macro_rules! uint_overflowing_mul { adc $$0, %rdx or %rdx, %rcx - cmpq $$0, %rcx - jne 2f + jrcxz 2f mov $8, %rax cmpq $$0, %rax @@ -234,6 +233,8 @@ macro_rules! uint_overflowing_mul { sete %dl or %dl, %cl + jrcxz 2f + mov $3, %rax cmpq $$0, %rax sete %dl From 2ee4a0c8c6ff29d6bbbc15752778590364d9bdb3 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 25 Feb 2016 18:16:08 +0300 Subject: [PATCH 59/73] mistake of ne/jcxz --- util/src/uint.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/util/src/uint.rs b/util/src/uint.rs index f4d5b5b76..6793376a0 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -222,7 +222,8 @@ macro_rules! uint_overflowing_mul { adc $$0, %rdx or %rdx, %rcx - jrcxz 2f + cmpq $$0, %rcx + jne 2f mov $8, %rax cmpq $$0, %rax @@ -233,8 +234,6 @@ macro_rules! uint_overflowing_mul { sete %dl or %dl, %cl - jrcxz 2f - mov $3, %rax cmpq $$0, %rax sete %dl From 600859ed04acd3650868f35bf4a1add4f983702d Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 25 Feb 2016 19:58:09 +0300 Subject: [PATCH 60/73] [ci skip] flush --- util/src/uint.rs | 48 +++++++++++++----------------------------------- 1 file changed, 13 insertions(+), 35 deletions(-) diff --git a/util/src/uint.rs b/util/src/uint.rs index 6793376a0..8e9172a04 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -165,7 +165,7 @@ macro_rules! uint_overflowing_mul { let self_t: &[u64; 4] = unsafe { &mem::transmute($self_expr) }; let other_t: &[u64; 4] = unsafe { &mem::transmute($other) }; - let overflow: u8; + let overflow: u64; unsafe { asm!(" mov $5, %rax @@ -222,25 +222,25 @@ macro_rules! uint_overflowing_mul { adc $$0, %rdx or %rdx, %rcx - cmpq $$0, %rcx + cmpq $$0, %rcx jne 2f mov $8, %rax cmpq $$0, %rax - sete %cl + setne %cl mov $7, %rax cmpq $$0, %rax - sete %dl + setne %dl or %dl, %cl mov $3, %rax cmpq $$0, %rax - sete %dl + setne %dl mov $2, %rax cmpq $$0, %rax - sete %bl + setne %bl or %bl, %dl and %dl, %cl @@ -253,7 +253,7 @@ macro_rules! uint_overflowing_mul { : /* $5 */ "m"(self_t[0]), /* $6 */ "m"(self_t[1]), /* $7 */ "m"(self_t[2]), /* $8 */ "m"(self_t[3]), /* $9 */ "m"(other_t[0]), /* $10 */ "m"(other_t[1]), /* $11 */ "m"(other_t[2]), /* $12 */ "m"(other_t[3]) - : "rax", "rdx" + : "rax", "rdx", "rbx" : ); @@ -740,23 +740,8 @@ macro_rules! construct_uint { type Output = $name; fn add(self, other: $name) -> $name { - let $name(ref me) = self; - let $name(ref you) = other; - let mut ret = [0u64; $n_words]; - let mut carry = [0u64; $n_words]; - let mut b_carry = false; - for i in 0..$n_words { - if i < $n_words - 1 { - ret[i] = me[i].wrapping_add(you[i]); - if ret[i] < me[i] { - carry[i + 1] = 1; - b_carry = true; - } - } else { - ret[i] = me[i] + you[i]; - } - } - if b_carry { $name(ret) + $name(carry) } else { $name(ret) } + let (result, _) = self.overflowing_add(other); + result } } @@ -765,8 +750,7 @@ macro_rules! construct_uint { #[inline] fn sub(self, other: $name) -> $name { - let (result, overflow) = self.overflowing_sub(other); - panic_on_overflow!(overflow); + let (result, _) = self.overflowing_sub(other); result } } @@ -775,15 +759,9 @@ macro_rules! construct_uint { type Output = $name; fn mul(self, other: $name) -> $name { - let mut res = $name::from(0u64); - // TODO: be more efficient about this - for i in 0..(2 * $n_words) { - let v = self.mul_u32((other >> (32 * i)).low_u32()); - let (r, overflow) = v.overflowing_shl(32 * i as u32); - panic_on_overflow!(overflow); - res = res + r; - } - res + let (result, overflow) = self.overflowing_mul(other); + panic_on_overflow!(overflow); + result } } From 937547f178a1d0b8a0e4a730a938561361381b03 Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 25 Feb 2016 20:20:00 +0100 Subject: [PATCH 61/73] rocksdb dependency version bump --- Cargo.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 424df8113..9bed0008a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -154,7 +154,7 @@ version = "0.5.4" source = "git+https://github.com/arkpar/rust-secp256k1.git#45503e1de68d909b1862e3f2bdb9e1cdfdff3f1e" dependencies = [ "arrayvec 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "gcc 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "gcc 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", @@ -233,7 +233,7 @@ dependencies = [ "log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "rocksdb 0.3.0 (git+https://github.com/arkpar/rust-rocksdb.git)", + "rocksdb 0.4.0 (git+https://github.com/arkpar/rust-rocksdb.git)", "rust-crypto 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -268,7 +268,7 @@ dependencies = [ [[package]] name = "gcc" -version = "0.3.24" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -419,8 +419,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "librocksdb-sys" -version = "0.1.0" -source = "git+https://github.com/arkpar/rust-rocksdb.git#4986bcec0d2907ebd2cae64c6753cf9291b08e86" +version = "0.2.0" +source = "git+https://github.com/arkpar/rust-rocksdb.git#bf61c18ca933850f68b730ce13d592fba6e88039" dependencies = [ "libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -588,11 +588,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "rocksdb" -version = "0.3.0" -source = "git+https://github.com/arkpar/rust-rocksdb.git#4986bcec0d2907ebd2cae64c6753cf9291b08e86" +version = "0.4.0" +source = "git+https://github.com/arkpar/rust-rocksdb.git#bf61c18ca933850f68b730ce13d592fba6e88039" dependencies = [ "libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "librocksdb-sys 0.1.0 (git+https://github.com/arkpar/rust-rocksdb.git)", + "librocksdb-sys 0.2.0 (git+https://github.com/arkpar/rust-rocksdb.git)", ] [[package]] @@ -600,7 +600,7 @@ name = "rust-crypto" version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "gcc 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "gcc 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", @@ -666,7 +666,7 @@ dependencies = [ name = "sha3" version = "0.1.0" dependencies = [ - "gcc 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "gcc 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] From e946e2ab183f8c1c60d88769602e654911244396 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 25 Feb 2016 22:27:22 +0300 Subject: [PATCH 62/73] epic mul overflow bug --- util/src/uint.rs | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/util/src/uint.rs b/util/src/uint.rs index 8e9172a04..f9d9b4af8 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -225,25 +225,17 @@ macro_rules! uint_overflowing_mul { cmpq $$0, %rcx jne 2f - mov $8, %rax - cmpq $$0, %rax - setne %cl + popcnt $8, %rcx + popcnt $7, %rax + add %rax, %rcx + jrcxz 2f - mov $7, %rax - cmpq $$0, %rax - setne %dl - or %dl, %cl + popcnt $12, %rcx + popcnt $11, %rax + add %rax, %rcx + jrcxz 2f - mov $3, %rax - cmpq $$0, %rax - setne %dl - - mov $2, %rax - cmpq $$0, %rax - setne %bl - or %bl, %dl - - and %dl, %cl + mov $$1, %rcx 2: " @@ -740,7 +732,8 @@ macro_rules! construct_uint { type Output = $name; fn add(self, other: $name) -> $name { - let (result, _) = self.overflowing_add(other); + let (result, overflow) = self.overflowing_add(other); + panic_on_overflow!(overflow); result } } @@ -750,7 +743,8 @@ macro_rules! construct_uint { #[inline] fn sub(self, other: $name) -> $name { - let (result, _) = self.overflowing_sub(other); + let (result, overflow) = self.overflowing_sub(other); + panic_on_overflow!(overflow); result } } From 4b0ec642995206fcef7cca18b8a3cec733813be3 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Thu, 25 Feb 2016 22:48:34 +0300 Subject: [PATCH 63/73] random init for benches --- util/benches/bigint.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/util/benches/bigint.rs b/util/benches/bigint.rs index a22edcfbc..3b2012bc7 100644 --- a/util/benches/bigint.rs +++ b/util/benches/bigint.rs @@ -25,6 +25,7 @@ extern crate test; extern crate ethcore_util; +extern crate rand; use test::{Bencher, black_box}; use ethcore_util::uint::*; @@ -33,7 +34,7 @@ use ethcore_util::uint::*; fn u256_add(b: &mut Bencher) { b.iter(|| { let n = black_box(10000); - (0..n).fold(U256([12345u64, 0u64, 0u64, 0u64]), |old, new| { old.overflowing_add(U256::from(new)).0 }) + (0..n).fold(U256([rand::random::(), rand::random::(), rand::random::(), rand::random::()]), |old, new| { old.overflowing_add(U256::from(new)).0 }) }); } @@ -42,7 +43,7 @@ fn u256_add(b: &mut Bencher) { fn u256_sub(b: &mut Bencher) { b.iter(|| { let n = black_box(10000); - (0..n).fold(U256([::std::u64::MAX, 0u64, 0u64, 0u64]), |old, new| { old.overflowing_sub(U256::from(new)).0 }) + (0..n).fold(U256([rand::random::(), rand::random::(), rand::random::(), rand::random::()]), |old, new| { old.overflowing_sub(U256::from(new)).0 }) }); } @@ -50,7 +51,7 @@ fn u256_sub(b: &mut Bencher) { fn u256_mul(b: &mut Bencher) { b.iter(|| { let n = black_box(10000); - (0..n).fold(U256([12345u64, 0u64, 0u64, 0u64]), |old, new| { old.overflowing_mul(U256::from(new)).0 }) + (0..n).fold(U256([rand::random::(), rand::random::(), rand::random::(), rand::random::()]), |old, new| { old.overflowing_mul(U256::from(new)).0 }) }); } From c76fc14a5cd2db0a8d3e518943e2c3c6613dce12 Mon Sep 17 00:00:00 2001 From: arkpar Date: Fri, 26 Feb 2016 03:22:18 +0100 Subject: [PATCH 64/73] rocksdb dependency version bump --- Cargo.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index faf345dc0..40fcb6627 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -234,7 +234,7 @@ dependencies = [ "log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "rocksdb 0.4.0 (git+https://github.com/arkpar/rust-rocksdb.git)", + "rocksdb 0.4.1 (git+https://github.com/arkpar/rust-rocksdb.git)", "rust-crypto 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -426,8 +426,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "librocksdb-sys" -version = "0.2.0" -source = "git+https://github.com/arkpar/rust-rocksdb.git#bf61c18ca933850f68b730ce13d592fba6e88039" +version = "0.2.1" +source = "git+https://github.com/arkpar/rust-rocksdb.git#2156621f583bda95c1c07e89e79e4019f75158ee" dependencies = [ "libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -636,11 +636,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "rocksdb" -version = "0.4.0" -source = "git+https://github.com/arkpar/rust-rocksdb.git#bf61c18ca933850f68b730ce13d592fba6e88039" +version = "0.4.1" +source = "git+https://github.com/arkpar/rust-rocksdb.git#2156621f583bda95c1c07e89e79e4019f75158ee" dependencies = [ "libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "librocksdb-sys 0.2.0 (git+https://github.com/arkpar/rust-rocksdb.git)", + "librocksdb-sys 0.2.1 (git+https://github.com/arkpar/rust-rocksdb.git)", ] [[package]] From 5545cbc6bc6a910faa4a4f5225afc24e396be45c Mon Sep 17 00:00:00 2001 From: Wojciech Langiewicz Date: Fri, 26 Feb 2016 10:07:30 +0100 Subject: [PATCH 65/73] ignore intellij idea project files as well --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 90750f379..58b1895c6 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ # jetbrains ide stuff .idea +*.iml From c66178e3f7c90b483f4f5a9fceeda0752f888235 Mon Sep 17 00:00:00 2001 From: arkpar Date: Fri, 26 Feb 2016 11:37:06 +0100 Subject: [PATCH 66/73] Fixed a race condition when a connecting peer disconnects immediately --- sync/src/chain.rs | 13 ++++++------- util/src/network/host.rs | 12 ++++++++---- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/sync/src/chain.rs b/sync/src/chain.rs index f76978bda..930518007 100644 --- a/sync/src/chain.rs +++ b/sync/src/chain.rs @@ -555,7 +555,10 @@ impl ChainSync { /// Called when a new peer is connected pub fn on_peer_connected(&mut self, io: &mut SyncIo, peer: PeerId) { trace!(target: "sync", "== Connected {}", peer); - self.send_status(io, peer); + if let Err(e) = self.send_status(io) { + warn!(target:"sync", "Error sending status request: {:?}", e); + io.disable_peer(peer); + } } /// Resume downloading @@ -887,7 +890,7 @@ impl ChainSync { } /// Send Status message - fn send_status(&mut self, io: &mut SyncIo, peer_id: PeerId) { + fn send_status(&mut self, io: &mut SyncIo) -> Result<(), UtilError> { let mut packet = RlpStream::new_list(5); let chain = io.chain().chain_info(); packet.append(&(PROTOCOL_VERSION as u32)); @@ -895,11 +898,7 @@ impl ChainSync { packet.append(&chain.total_difficulty); packet.append(&chain.best_block_hash); packet.append(&chain.genesis_hash); - //TODO: handle timeout for status request - if let Err(e) = io.send(peer_id, STATUS_PACKET, packet.out()) { - warn!(target:"sync", "Error sending status request: {:?}", e); - io.disable_peer(peer_id); - } + io.respond(STATUS_PACKET, packet.out()) } /// Respond to GetBlockHeaders request diff --git a/util/src/network/host.rs b/util/src/network/host.rs index 8dd9eb9cc..d50f2d86d 100644 --- a/util/src/network/host.rs +++ b/util/src/network/host.rs @@ -579,7 +579,7 @@ impl Host where Message: Send + Sync + Clone { } } if kill { - self.kill_connection(token, io, true); //TODO: mark connection as dead an check in kill_connection + self.kill_connection(token, io, true); return; } else if create_session { self.start_session(token, io); @@ -621,7 +621,7 @@ impl Host where Message: Send + Sync + Clone { } } if kill { - self.kill_connection(token, io, true); //TODO: mark connection as dead an check in kill_connection + self.kill_connection(token, io, true); } for p in ready_data { let h = self.handlers.read().unwrap().get(p).unwrap().clone(); @@ -685,6 +685,7 @@ impl Host where Message: Send + Sync + Clone { fn kill_connection(&self, token: StreamToken, io: &IoContext>, remote: bool) { let mut to_disconnect: Vec = Vec::new(); let mut failure_id = None; + let mut deregister = false; match token { FIRST_HANDSHAKE ... LAST_HANDSHAKE => { let handshakes = self.handshakes.write().unwrap(); @@ -693,7 +694,7 @@ impl Host where Message: Send + Sync + Clone { if !handshake.expired() { handshake.set_expired(); failure_id = Some(handshake.id().clone()); - io.deregister_stream(token).expect("Error deregistering stream"); + deregister = true; } } }, @@ -711,7 +712,7 @@ impl Host where Message: Send + Sync + Clone { } s.set_expired(); failure_id = Some(s.id().clone()); - io.deregister_stream(token).expect("Error deregistering stream"); + deregister = true; } } }, @@ -726,6 +727,9 @@ impl Host where Message: Send + Sync + Clone { let h = self.handlers.read().unwrap().get(p).unwrap().clone(); h.disconnected(&NetworkContext::new(io, p, Some(token), self.sessions.clone()), &token); } + if deregister { + io.deregister_stream(token).expect("Error deregistering stream"); + } } fn update_nodes(&self, io: &IoContext>, node_changes: TableUpdates) { From f29417eea91f689fe57d3d8b06e1921b93235291 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Fri, 26 Feb 2016 14:50:55 +0300 Subject: [PATCH 67/73] allow dead code for macros expansion --- util/src/uint.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/util/src/uint.rs b/util/src/uint.rs index f9d9b4af8..ca727190b 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -588,6 +588,7 @@ macro_rules! construct_uint { } impl $name { + #[allow(dead_code)] // not used when multiplied with inline assembly /// Multiplication by u32 fn mul_u32(self, other: u32) -> Self { let $name(ref arr) = self; @@ -609,6 +610,7 @@ macro_rules! construct_uint { $name(ret) + $name(carry) } + #[allow(dead_code)] // not used when multiplied with inline assembly /// Overflowing multiplication by u32 fn overflowing_mul_u32(self, other: u32) -> (Self, bool) { let $name(ref arr) = self; From 80d60cedf6f43b7cc3d03485f1c5be3202dec5f4 Mon Sep 17 00:00:00 2001 From: arkpar Date: Fri, 26 Feb 2016 13:27:05 +0100 Subject: [PATCH 68/73] Removed rocksdb from build scripts and instructions --- README.md | 25 +-------------------- ethcore/src/lib.rs | 13 ++--------- install-deps.sh | 55 +--------------------------------------------- install-parity.sh | 50 ++++++++++++++++------------------------- 4 files changed, 23 insertions(+), 120 deletions(-) diff --git a/README.md b/README.md index 4df7cad34..575234622 100644 --- a/README.md +++ b/README.md @@ -18,17 +18,9 @@ ##### Ubuntu 14.04, 15.04, 15.10 ```bash -# install rocksdb -add-apt-repository ppa:ethcore/ethcore -apt-get update -apt-get install -y --force-yes librocksdb-dev - # install multirust curl -sf https://raw.githubusercontent.com/brson/multirust/master/blastoff.sh | sh -s -- --yes -# install beta -multirust update beta - # download and build parity git clone https://github.com/ethcore/parity cd parity @@ -43,20 +35,9 @@ cargo build --release ##### Other Linux ```bash -# install rocksdb -git clone --tag v4.1 --depth=1 https://github.com/facebook/rocksdb.git -cd rocksdb -make shared_lib -sudo cp -a librocksdb.so* /usr/lib -sudo ldconfig -cd .. - # install rust beta curl -sf https://raw.githubusercontent.com/brson/multirust/master/blastoff.sh | sudo sh -s -- --yes -# install beta -multirust update beta - # download and build parity git clone https://github.com/ethcore/parity cd parity @@ -71,14 +52,10 @@ cargo build --release ##### OSX with Homebrew ```bash -# install rocksdb && multirust +# install multirust brew update -brew install rocksdb brew install multirust -# install beta -multirust update beta - # download and build parity git clone https://github.com/ethcore/parity cd parity diff --git a/ethcore/src/lib.rs b/ethcore/src/lib.rs index d4786bc21..5eb3beeb2 100644 --- a/ethcore/src/lib.rs +++ b/ethcore/src/lib.rs @@ -40,23 +40,17 @@ //! - Ubuntu 14.04 and later: //! //! ```bash -//! # install rocksdb -//! add-apt-repository "deb http://ppa.launchpad.net/giskou/librocksdb/ubuntu trusty main" -//! apt-get update -//! apt-get install -y --force-yes librocksdb //! //! # install multirust //! curl -sf https://raw.githubusercontent.com/brson/multirust/master/blastoff.sh | sh -s -- --yes //! -//! # install nightly and make it default -//! multirust update nightly && multirust default nightly -//! //! # export rust LIBRARY_PATH //! export LIBRARY_PATH=/usr/local/lib //! //! # download and build parity //! git clone https://github.com/ethcore/parity //! cd parity +//! multirust override beta //! cargo build --release //! ``` //! @@ -65,18 +59,15 @@ //! ```bash //! # install rocksdb && multirust //! brew update -//! brew install rocksdb //! brew install multirust //! -//! # install nightly and make it default -//! multirust update nightly && multirust default nightly -//! //! # export rust LIBRARY_PATH //! export LIBRARY_PATH=/usr/local/lib //! //! # download and build parity //! git clone https://github.com/ethcore/parity //! cd parity +//! multirust override beta //! cargo build --release //! ``` diff --git a/install-deps.sh b/install-deps.sh index f5e1e44cf..6cc7de002 100755 --- a/install-deps.sh +++ b/install-deps.sh @@ -342,8 +342,6 @@ function run_installer() exe brew update echo - info "Installing rocksdb" - exe brew install rocksdb info "Installing multirust" exe brew install multirust sudo multirust default beta @@ -391,7 +389,6 @@ function run_installer() linux_version find_multirust - find_rocksdb find_curl find_git @@ -402,21 +399,6 @@ function run_installer() find_sudo } - function find_rocksdb() - { - depCount=$((depCount+1)) - if [[ $(ldconfig -v 2>/dev/null | grep rocksdb | wc -l) == 1 ]]; then - depFound=$((depFound+1)) - check "apt-get" - isRocksDB=true - INSTALL_FILES+="${blue}${dim}==> librocksdb:${reset}$n" - else - uncheck "librocksdb is missing" - isRocksDB=false - INSTALL_FILES+="${blue}${dim}==> librocksdb:${reset}$n" - fi - } - function find_multirust() { depCount=$((depCount+2)) @@ -562,34 +544,6 @@ function run_installer() fi } - function ubuntu_rocksdb_installer() - { - sudo apt-get update -qq - sudo apt-get install -qq -y software-properties-common - sudo apt-add-repository -y ppa:ethcore/ethcore - sudo apt-get -f -y install - sudo apt-get update -qq - sudo apt-get install -qq -y librocksdb-dev librocksdb - } - - function linux_rocksdb_installer() - { - if [[ $isUbuntu == true ]]; then - ubuntu_rocksdb_installer - else - oldpwd=`pwd` - cd /tmp - exe git clone --branch v4.2 --depth=1 https://github.com/facebook/rocksdb.git - cd rocksdb - exe make shared_lib - sudo cp -a librocksdb.so* /usr/lib - sudo ldconfig - cd /tmp - rm -rf /tmp/rocksdb - cd $oldpwd - fi - } - function linux_installer() { if [[ $isGCC == false || $isGit == false || $isMake == false || $isCurl == false ]]; then @@ -610,12 +564,6 @@ function run_installer() echo fi - if [[ $isRocksDB == false ]]; then - info "Installing rocksdb..." - linux_rocksdb_installer - echo - fi - if [[ $isMultirust == false ]]; then info "Installing multirust..." if [[ $isSudo == false ]]; then @@ -655,10 +603,9 @@ function run_installer() find_git find_make find_gcc - find_rocksdb find_multirust - if [[ $isCurl == false || $isGit == false || $isMake == false || $isGCC == false || $isRocksDB == false || $isMultirustBeta == false ]]; then + if [[ $isCurl == false || $isGit == false || $isMake == false || $isGCC == false || $isMultirustBeta == false ]]; then abort_install fi fi diff --git a/install-parity.sh b/install-parity.sh index 60d3471d5..439700306 100755 --- a/install-parity.sh +++ b/install-parity.sh @@ -236,14 +236,29 @@ function run_installer() { linux_version - find_rocksdb - find_curl find_apt find_sudo } + function find_git() + { + depCount=$((depCount+1)) + GIT_PATH=`which git 2>/dev/null` + + if [[ -f $GIT_PATH ]] + then + depFound=$((depFound+1)) + check "git" + isGit=true + else + uncheck "git is missing" + isGit=false + INSTALL_FILES+="${blue}${dim}==> git:${reset}${n}" + fi + } + function find_brew() { BREW_PATH=`which brew 2>/dev/null` @@ -333,20 +348,6 @@ function run_installer() fi } - function find_rocksdb() - { - depCount=$((depCount+1)) - if [[ $(ldconfig -v 2>/dev/null | grep rocksdb | wc -l) == 1 ]]; then - depFound=$((depFound+1)) - check "librocksdb" - isRocksDB=true - else - uncheck "librocksdb is missing" - isRocksDB=false - INSTALL_FILES+="${blue}${dim}==>${reset}\tlibrocksdb${n}" - fi - } - function find_apt() { depCount=$((depCount+1)) @@ -386,10 +387,9 @@ function run_installer() info "Verifying installation" if [[ $OS_TYPE == "linux" ]]; then - find_rocksdb find_apt - if [[ $isRocksDB == false || $isApt == false ]]; then + if [[ $isApt == false ]]; then abortInstall fi fi @@ -397,23 +397,11 @@ function run_installer() function linux_deps_installer() { - if [[ $isRocksDB == false || $isCurl == false ]]; then + if [[ $isCurl == false ]]; then info "Preparing apt..." sudo apt-get update -qq echo fi - - if [[ $isRocksDB == false ]]; then - info "Installing rocksdb..." - - sudo apt-get install -qq -y software-properties-common - sudo apt-add-repository -y ppa:ethcore/ethcore - sudo apt-get -f -y install - sudo apt-get update -qq - sudo apt-get install -qq -y librocksdb - - echo - fi if [[ $isCurl == false ]]; then info "Installing curl..." From e95538f3ec716af0e051b6ed88761105b598defd Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Fri, 26 Feb 2016 15:56:55 +0300 Subject: [PATCH 69/73] [ci skip] style fixes, multipart add test --- util/src/uint.rs | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/util/src/uint.rs b/util/src/uint.rs index ca727190b..82d3afe97 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -51,7 +51,7 @@ macro_rules! impl_map_from { } } -#[cfg(not(all(feature="x64asm", target_arch = "x86_64")))] +#[cfg(not(all(feature="x64asm", target_arch="x86_64")))] macro_rules! uint_overflowing_add { ($name:ident, $n_words:expr, $self_expr: expr, $other: expr) => ({ uint_overflowing_add_reg!($name, $n_words, $self_expr, $other) @@ -89,7 +89,7 @@ macro_rules! uint_overflowing_add_reg { } -#[cfg(all(feature="x64asm", target_arch = "x86_64"))] +#[cfg(all(feature="x64asm", target_arch="x86_64"))] macro_rules! uint_overflowing_add { (U256, $n_words: expr, $self_expr: expr, $other: expr) => ({ let mut result: [u64; 4] = unsafe { mem::uninitialized() }; @@ -119,7 +119,7 @@ macro_rules! uint_overflowing_add { ) } -#[cfg(not(all(feature="x64asm", target_arch = "x86_64")))] +#[cfg(not(all(feature="x64asm", target_arch="x86_64")))] macro_rules! uint_overflowing_sub { ($name:ident, $n_words: expr, $self_expr: expr, $other: expr) => ({ let res = overflowing!((!$other).overflowing_add(From::from(1u64))); @@ -128,7 +128,7 @@ macro_rules! uint_overflowing_sub { }) } -#[cfg(all(feature="x64asm", target_arch = "x86_64"))] +#[cfg(all(feature="x64asm", target_arch="x86_64"))] macro_rules! uint_overflowing_sub { (U256, $n_words: expr, $self_expr: expr, $other: expr) => ({ let mut result: [u64; 4] = unsafe { mem::uninitialized() }; @@ -158,7 +158,7 @@ macro_rules! uint_overflowing_sub { }) } -#[cfg(all(feature="x64asm", target_arch = "x86_64"))] +#[cfg(all(feature="x64asm", target_arch="x86_64"))] macro_rules! uint_overflowing_mul { (U256, $n_words: expr, $self_expr: expr, $other: expr) => ({ let mut result: [u64; 4] = unsafe { mem::uninitialized() }; @@ -222,7 +222,7 @@ macro_rules! uint_overflowing_mul { adc $$0, %rdx or %rdx, %rcx - cmpq $$0, %rcx + cmpq $$0, %rcx jne 2f popcnt $8, %rcx @@ -257,7 +257,7 @@ macro_rules! uint_overflowing_mul { ) } -#[cfg(not(all(feature="x64asm", target_arch = "x86_64")))] +#[cfg(not(all(feature="x64asm", target_arch="x86_64")))] macro_rules! uint_overflowing_mul { ($name:ident, $n_words: expr, $self_expr: expr, $other: expr) => ({ uint_overflowing_mul_reg!($name, $n_words, $self_expr, $other) @@ -1468,5 +1468,26 @@ mod tests { fn display_uint_zero() { assert_eq!(format!("{}", U256::from(0)), "0"); } + + + #[test] + fn u256_multi_adds() { + let (result, _) = U256([0, 0, 0, 0]).overflowing_add(U256([0, 0, 0, 0])); + assert_eq!(result, U256([0, 0, 0, 0])); + + let (result, _) = U256([0, 0, 0, 1]).overflowing_add(U256([0, 0, 0, 1])); + assert_eq!(result, U256([0, 0, 0, 2])); + + let (result, overflow) = U256([0, 0, 2, 1]).overflowing_add(U256([0, 0, 3, 1])); + assert_eq!(result, U256([0, 0, 5, 2])); + assert!(!overflow); + + let (_, overflow) = U256([::std::u64::MAX, ::std::u64::MAX, ::std::u64::MAX, ::std::u64::MAX]) + .overflowing_add(U256([::std::u64::MAX, ::std::u64::MAX, ::std::u64::MAX, ::std::u64::MAX])); + assert!(overflow); + + let (_, overflow) = U256([0, 0, 0, ::std::u64::MAX]).overflowing_add(U256([0, 0, 0, ::std::u64::MAX])); + assert!(overflow); + } } From 228e3fefe02445b39ce227d182331483beb90dd5 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Fri, 26 Feb 2016 16:03:04 +0300 Subject: [PATCH 70/73] [ci skip] multipart sub test --- util/src/uint.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/util/src/uint.rs b/util/src/uint.rs index 82d3afe97..245381b4b 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -1489,5 +1489,32 @@ mod tests { let (_, overflow) = U256([0, 0, 0, ::std::u64::MAX]).overflowing_add(U256([0, 0, 0, ::std::u64::MAX])); assert!(overflow); } + + + #[test] + fn u256_multi_subs() { + let (result, _) = U256([0, 0, 0, 0]).overflowing_sub(U256([0, 0, 0, 0])); + assert_eq!(result, U256([0, 0, 0, 0])); + + let (result, _) = U256([0, 0, 0, 1]).overflowing_sub(U256([0, 0, 0, 1])); + assert_eq!(result, U256([0, 0, 0, 0])); + + let (_, overflow) = U256([0, 0, 2, 1]).overflowing_sub(U256([0, 0, 3, 1])); + assert!(overflow); + + let (result, overflow) = U256([::std::u64::MAX, ::std::u64::MAX, ::std::u64::MAX, ::std::u64::MAX]) + .overflowing_sub(U256([::std::u64::MAX/2, ::std::u64::MAX/2, ::std::u64::MAX/2, ::std::u64::MAX/2])); + assert!(!overflow); + assert_eq!(U256([::std::u64::MAX/2+1, ::std::u64::MAX/2+1, ::std::u64::MAX/2+1, ::std::u64::MAX/2+1]), result); + + let (result, overflow) = U256([0, 0, 0, 1]).overflowing_sub(U256([0, 0, 1, 0])); + assert!(!overflow); + assert_eq!(U256([0, 0, ::std::u64::MAX, 0]), result); + + let (result, overflow) = U256([0, 0, 0, 1]).overflowing_sub(U256([1, 0, 0, 0])); + assert!(!overflow); + assert_eq!(U256([::std::u64::MAX, ::std::u64::MAX, ::std::u64::MAX, 0]), result); + } + } From 3858a2011fb765dbb785f15773f21bb4578548f6 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Fri, 26 Feb 2016 16:12:47 +0300 Subject: [PATCH 71/73] [ci skip] mul multipart tests --- util/src/uint.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/util/src/uint.rs b/util/src/uint.rs index 245381b4b..a34742bd9 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -1516,5 +1516,51 @@ mod tests { assert_eq!(U256([::std::u64::MAX, ::std::u64::MAX, ::std::u64::MAX, 0]), result); } + + #[test] + fn u256_multi_muls() { + let (result, _) = U256([0, 0, 0, 0]).overflowing_mul(U256([0, 0, 0, 0])); + assert_eq!(U256([0, 0, 0, 0]), result); + + let (result, _) = U256([1, 0, 0, 0]).overflowing_mul(U256([1, 0, 0, 0])); + assert_eq!(U256([1, 0, 0, 0]), result); + + let (result, _) = U256([5, 0, 0, 0]).overflowing_mul(U256([5, 0, 0, 0])); + assert_eq!(U256([25, 0, 0, 0]), result); + + let (result, _) = U256([0, 5, 0, 0]).overflowing_mul(U256([0, 5, 0, 0])); + assert_eq!(U256([0, 0, 25, 0]), result); + + let (result, _) = U256([0, 0, 0, 1]).overflowing_mul(U256([1, 0, 0, 0])); + assert_eq!(U256([0, 0, 0, 1]), result); + + let (result, _) = U256([0, 0, 0, 5]).overflowing_mul(U256([2, 0, 0, 0])); + assert_eq!(U256([0, 0, 0, 10]), result); + + let (result, _) = U256([0, 0, 1, 0]).overflowing_mul(U256([0, 5, 0, 0])); + assert_eq!(U256([0, 0, 0, 5]), result); + + let (result, _) = U256([0, 0, 8, 0]).overflowing_mul(U256([0, 0, 7, 0])); + assert_eq!(U256([0, 0, 0, 0]), result); + + let (result, _) = U256([2, 0, 0, 0]).overflowing_mul(U256([0, 5, 0, 0])); + assert_eq!(U256([0, 10, 0, 0]), result); + + let (result, _) = U256([::std::u64::MAX, 0, 0, 0]).overflowing_mul(U256([::std::u64::MAX, 0, 0, 0])); + assert_eq!(U256([1, ::std::u64::MAX-1, 0, 0]), result); + + let (result, _) = U256([0, 0, 0, ::std::u64::MAX]).overflowing_mul(U256([0, 0, 0, ::std::u64::MAX])); + assert_eq!(U256([0, 0, 0, 0]), result); + + let (result, _) = U256([1, 0, 0, 0]).overflowing_mul(U256([0, 0, 0, ::std::u64::MAX])); + assert_eq!(U256([0, 0, 0, ::std::u64::MAX]), result); + + let (result, _) = U256([::std::u64::MAX, ::std::u64::MAX, ::std::u64::MAX, ::std::u64::MAX]) + .overflowing_mul(U256([::std::u64::MAX, ::std::u64::MAX, ::std::u64::MAX, ::std::u64::MAX])); + assert_eq!(U256([1, 0, 0, 0]), result); + } + + + } From 023c6236500b82f89110c0f482e15b23a559cbb5 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Fri, 26 Feb 2016 16:19:55 +0300 Subject: [PATCH 72/73] mul overflow multipart test --- util/src/uint.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/util/src/uint.rs b/util/src/uint.rs index a34742bd9..98541fe33 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -1560,7 +1560,34 @@ mod tests { assert_eq!(U256([1, 0, 0, 0]), result); } + #[test] + fn u256_multi_muls_overflow() { + let (_, overflow) = U256([1, 0, 0, 0]).overflowing_mul(U256([0, 0, 0, 0])); + assert!(!overflow); + let (_, overflow) = U256([1, 0, 0, 0]).overflowing_mul(U256([0, 0, 0, ::std::u64::MAX])); + assert!(!overflow); + let (_, overflow) = U256([0, 1, 0, 0]).overflowing_mul(U256([0, 0, 0, ::std::u64::MAX])); + assert!(!overflow); + + let (_, overflow) = U256([0, 1, 0, 0]).overflowing_mul(U256([0, 1, 0, 0])); + assert!(!overflow); + + let (_, overflow) = U256([0, 1, 0, ::std::u64::MAX]).overflowing_mul(U256([0, 1, 0, ::std::u64::MAX])); + assert!(overflow); + + let (_, overflow) = U256([0, ::std::u64::MAX, 0, 0]).overflowing_mul(U256([0, ::std::u64::MAX, 0, 0])); + assert!(!overflow); + + let (_, overflow) = U256([1, 0, 0, 0]).overflowing_mul(U256([10, 0, 0, 0])); + assert!(!overflow); + + let (_, overflow) = U256([2, 0, 0, 0]).overflowing_mul(U256([0, 0, 0, ::std::u64::MAX / 2])); + assert!(!overflow); + + let (_, overflow) = U256([0, 0, 8, 0]).overflowing_mul(U256([0, 0, 7, 0])); + assert!(overflow); + } } From 5013c4d1f1efc38e2237ed691e48f9e3f5e54aa0 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Fri, 26 Feb 2016 16:50:12 +0300 Subject: [PATCH 73/73] naughty overflow bug fixed --- util/src/uint.rs | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/util/src/uint.rs b/util/src/uint.rs index 98541fe33..b4940cfb8 100644 --- a/util/src/uint.rs +++ b/util/src/uint.rs @@ -226,16 +226,30 @@ macro_rules! uint_overflowing_mul { jne 2f popcnt $8, %rcx - popcnt $7, %rax - add %rax, %rcx - jrcxz 2f + jrcxz 12f popcnt $12, %rcx popcnt $11, %rax add %rax, %rcx - jrcxz 2f + popcnt $10, %rax + add %rax, %rcx + jmp 2f - mov $$1, %rcx + 12: + popcnt $12, %rcx + jrcxz 11f + + popcnt $7, %rcx + popcnt $6, %rax + add %rax, %rcx + + cmpq $$0, %rcx + jne 2f + + 11: + popcnt $11, %rcx + jrcxz 2f + popcnt $7, %rcx 2: " @@ -1569,7 +1583,7 @@ mod tests { assert!(!overflow); let (_, overflow) = U256([0, 1, 0, 0]).overflowing_mul(U256([0, 0, 0, ::std::u64::MAX])); - assert!(!overflow); + assert!(overflow); let (_, overflow) = U256([0, 1, 0, 0]).overflowing_mul(U256([0, 1, 0, 0])); assert!(!overflow);