From 59f2315e8e33cc8ce5a75f374fe8d231a397a9e0 Mon Sep 17 00:00:00 2001 From: Doug Wright Date: Sun, 27 Aug 2017 11:44:49 +0100 Subject: [PATCH 1/9] API compatible backport of v2.x-dev --- .travis.yml | 69 +- BoxList.php | 5 + ConstrainedItem.php | 29 + ItemList.php | 8 +- ItemTooLargeException.php | 40 + OrientatedItem.php | 97 + OrientatedItemFactory.php | 179 + PackedBox.php | 100 +- PackedBoxList.php | 11 +- PackedItem.php | 152 + PackedItemList.php | 76 + Packer.php | 291 +- README.md | 33 +- VolumePacker.php | 305 ++ WeightRedistributor.php | 139 + composer.json | 15 +- license.txt | 4 +- phpunit.xml | 25 +- tests/BoxListTest.php | 119 +- tests/ItemListTest.php | 47 +- tests/PackedBoxListTest.php | 10 +- tests/PackedBoxTest.php | 10 +- tests/PackerTest.php | 885 ++-- tests/Test/TestBox.php | 181 + tests/Test/TestConstrainedTestItem.php | 39 + tests/Test/TestItem.php | 114 + tests/VolumePackerTest.php | 190 + tests/bootstrap.php | 101 - tests/data/{expected.csv => expected2d.csv} | 610 +-- tests/data/expected3d.csv | 4558 +++++++++++++++++++ 30 files changed, 7179 insertions(+), 1263 deletions(-) create mode 100644 ConstrainedItem.php create mode 100644 ItemTooLargeException.php create mode 100644 OrientatedItem.php create mode 100644 OrientatedItemFactory.php create mode 100644 PackedItem.php create mode 100644 PackedItemList.php create mode 100644 VolumePacker.php create mode 100644 WeightRedistributor.php create mode 100644 tests/Test/TestBox.php create mode 100644 tests/Test/TestConstrainedTestItem.php create mode 100644 tests/Test/TestItem.php create mode 100644 tests/VolumePackerTest.php delete mode 100644 tests/bootstrap.php rename tests/data/{expected.csv => expected2d.csv} (92%) create mode 100644 tests/data/expected3d.csv diff --git a/.travis.yml b/.travis.yml index c145e9bc..3c0ccebe 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,22 +1,65 @@ language: php sudo: false -php: - - 5.4 - - 5.5 - - 5.6 - - 7.0 - - hhvm +matrix: + include: + - php: hhvm + sudo: required + services: + - docker + - php: 5.4 + env: lowest=1 + - php: 5.5 + - php: 5.6 + - php: 7.0 + - php: 7.1 + - php: 7.2 + +cache: + directories: + - $HOME/.cache/composer/files + +install: + - | + if [ "$TRAVIS_PHP_VERSION" = "hhvm" ]; then + docker pull hhvm/hhvm:latest; + docker run hhvm/hhvm:latest hhvm --version; + docker run --name hhvmapt hhvm/hhvm:latest bash -c "apt update -y; apt install -y dialog apt-utils wget curl git"; + docker commit hhvmapt dvdoug/hhvm:apt; + docker run --name hhvmcomposer dvdoug/hhvm:apt bash -c "/usr/bin/curl https://getcomposer.org/installer | hhvm -d hhvm.php7.all=1 --php -- /dev/stdin --install-dir=/usr/local/bin --filename=composer"; + docker commit hhvmcomposer dvdoug/hhvm:composer; + else + phpenv config-rm xdebug.ini || true; + fi; + + - | + if [ "$TRAVIS_PHP_VERSION" = "hhvm" ]; then + docker run -v $(pwd):/var/source dvdoug/hhvm:composer hhvm -d hhvm.php7.all=1 /usr/local/bin/composer update --working-dir /var/source; + elif [ "$lowest" = "1" ]; then + composer update --prefer-lowest --prefer-stable; + else + composer update; + fi; -# omitting "script:" will default to phpunit -# use the $DB env variable to determine the phpunit.xml to use before_script: - - composer self-update - - composer install + - | + if [ "$TRAVIS_PHP_VERSION" != "hhvm" ] && [ "$TRAVIS_PHP_VERSION" != "5.4" ] && [ "$TRAVIS_PHP_VERSION" != "5.5" ] && [ "$TRAVIS_PHP_VERSION" != "5.6" ]; then + echo "memory_limit = 3072M" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini; + fi; script: - - vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover tests + - | + if [ "$TRAVIS_PHP_VERSION" = "hhvm" ]; then + docker run -v $(pwd):/var/source dvdoug/hhvm:composer hhvm -d hhvm.php7.all=1 /var/source/vendor/bin/phpunit /var/source/tests; + elif [ "$TRAVIS_PHP_VERSION" = "7.1" ]; then + phpdbg -qrr vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover tests; + else + php vendor/bin/phpunit; + fi; after_script: - - wget https://scrutinizer-ci.com/ocular.phar - - php ocular.phar code-coverage:upload --format=php-clover coverage.clover + - | + if [ "$TRAVIS_PHP_VERSION" = "7.1" ]; then + wget https://scrutinizer-ci.com/ocular.phar; + php ocular.phar code-coverage:upload --format=php-clover coverage.clover; + fi; diff --git a/BoxList.php b/BoxList.php index 59537220..0ccb55eb 100644 --- a/BoxList.php +++ b/BoxList.php @@ -16,6 +16,11 @@ class BoxList extends \SplMinHeap /** * Compare elements in order to place them correctly in the heap while sifting up. * @see \SplMinHeap::compare() + * + * @param Box $boxA + * @param Box $boxB + * + * @return int */ public function compare($boxA, $boxB) { diff --git a/ConstrainedItem.php b/ConstrainedItem.php new file mode 100644 index 00000000..c5276877 --- /dev/null +++ b/ConstrainedItem.php @@ -0,0 +1,29 @@ + batteries per box + * + * @param ItemList $alreadyPackedItems + * @param Box $box + * + * @return bool + */ + public function canBePackedInBox(ItemList $alreadyPackedItems, Box $box); + +} + diff --git a/ItemList.php b/ItemList.php index d488dea3..af3f9fbc 100644 --- a/ItemList.php +++ b/ItemList.php @@ -16,7 +16,13 @@ class ItemList extends \SplMaxHeap /** * Compare elements in order to place them correctly in the heap while sifting up. + * * @see \SplMaxHeap::compare() + * + * @param mixed $itemA + * @param mixed $itemB + * + * @return int */ public function compare($itemA, $itemB) { @@ -25,7 +31,7 @@ public function compare($itemA, $itemB) } elseif ($itemA->getVolume() < $itemB->getVolume()) { return -1; } else { - return 0; + return $itemA->getWeight() - $itemB->getWeight(); } } diff --git a/ItemTooLargeException.php b/ItemTooLargeException.php new file mode 100644 index 00000000..6ae89f13 --- /dev/null +++ b/ItemTooLargeException.php @@ -0,0 +1,40 @@ +item = $item; + parent::__construct($message); + } + + /** + * @return Item + */ + public function getItem() { + return $this->item; + } + +} diff --git a/OrientatedItem.php b/OrientatedItem.php new file mode 100644 index 00000000..710eaa45 --- /dev/null +++ b/OrientatedItem.php @@ -0,0 +1,97 @@ +item = $item; + $this->width = $width; + $this->length = $length; + $this->depth = $depth; + } + + /** + * Item + * + * @return Item + */ + public function getItem() { + return $this->item; + } + + /** + * Item width in mm in it's packed orientation + * + * @return int + */ + public function getWidth() { + return $this->width; + } + + /** + * Item length in mm in it's packed orientation + * + * @return int + */ + public function getLength() { + return $this->length; + } + + /** + * Item depth in mm in it's packed orientation + * + * @return int + */ + public function getDepth() { + return $this->depth; + } + + /** + * Is this orientation stable (low centre of gravity) + * N.B. Assumes equal weight distribution + * + * @return bool + */ + public function isStable() { + return $this->getDepth() <= min($this->getLength(), $this->getWidth()); + } +} + diff --git a/OrientatedItemFactory.php b/OrientatedItemFactory.php new file mode 100644 index 00000000..aed1e3de --- /dev/null +++ b/OrientatedItemFactory.php @@ -0,0 +1,179 @@ +getPossibleOrientations($item, $prevItem, $widthLeft, $lengthLeft, $depthLeft); + $usableOrientations = $this->getUsableOrientations($possibleOrientations, $box, $item, $isLastItem); + + $orientationFits = []; + /** @var OrientatedItem $orientation */ + foreach ($usableOrientations as $o => $orientation) { + $orientationFit = min($widthLeft - $orientation->getWidth(), $lengthLeft - $orientation->getLength()); + $orientationFits[$o] = $orientationFit; + } + + if (!empty($orientationFits)) { + asort($orientationFits); + reset($orientationFits); + $bestFit = $usableOrientations[key($orientationFits)]; + $this->logger->debug("Selected best fit orientation", ['orientation' => $bestFit]); + return $bestFit; + } else { + return false; + } + } + + /** + * Find all possible orientations for an item + * @param Item $item + * @param PackedItem|null $prevItem + * @param int $widthLeft + * @param int $lengthLeft + * @param int $depthLeft + * @return OrientatedItem[] + */ + public function getPossibleOrientations(Item $item, PackedItem $prevItem = null, $widthLeft, $lengthLeft, $depthLeft) { + + $orientations = []; + + //Special case items that are the same as what we just packed - keep orientation + /** @noinspection PhpNonStrictObjectEqualityInspection */ + if ($prevItem && $prevItem->getItem() == $item) { + $orientations[] = new OrientatedItem($item, $prevItem->getWidth(), $prevItem->getLength(), $prevItem->getDepth()); + } else { + + //simple 2D rotation + $orientations[] = new OrientatedItem($item, $item->getWidth(), $item->getLength(), $item->getDepth()); + $orientations[] = new OrientatedItem($item, $item->getLength(), $item->getWidth(), $item->getDepth()); + } + + //remove any that simply don't fit + return array_filter($orientations, function(OrientatedItem $i) use ($widthLeft, $lengthLeft, $depthLeft) { + return $i->getWidth() <= $widthLeft && $i->getLength() <= $lengthLeft && $i->getDepth() <= $depthLeft; + }); + } + + /** + * @param Item $item + * @param Box $box + * @return OrientatedItem[] + */ + public function getPossibleOrientationsInEmptyBox(Item $item, Box $box) + { + $cacheKey = $item->getWidth() . + '|' . + $item->getLength() . + '|' . + $item->getDepth() . + '|' . + $box->getInnerWidth() . + '|' . + $box->getInnerLength() . + '|' . + $box->getInnerDepth(); + + if (isset(static::$emptyBoxCache[$cacheKey])) { + $orientations = static::$emptyBoxCache[$cacheKey]; + } else { + $orientations = $this->getPossibleOrientations( + $item, + null, + $box->getInnerWidth(), + $box->getInnerLength(), + $box->getInnerDepth() + ); + static::$emptyBoxCache[$cacheKey] = $orientations; + } + return $orientations; + } + + /** + * @param OrientatedItem[] $possibleOrientations + * @param Box $box + * @param Item $item + * @param bool $isLastItem + * + * @return OrientatedItem[] + */ + protected function getUsableOrientations( + $possibleOrientations, + Box $box, + Item $item, + $isLastItem + ) { + /* + * Divide possible orientations into stable (low centre of gravity) and unstable (high centre of gravity) + */ + $stableOrientations = []; + $unstableOrientations = []; + + foreach ($possibleOrientations as $o => $orientation) { + if ($orientation->isStable()) { + $stableOrientations[] = $orientation; + } else { + $unstableOrientations[] = $orientation; + } + } + + $orientationsToUse = []; + + /* + * We prefer to use stable orientations only, but allow unstable ones if either + * the item is the last one left to pack OR + * the item doesn't fit in the box any other way + */ + if (count($stableOrientations) > 0) { + $orientationsToUse = $stableOrientations; + } else if (count($unstableOrientations) > 0) { + $orientationsInEmptyBox = $this->getPossibleOrientationsInEmptyBox($item, $box); + + $stableOrientationsInEmptyBox = array_filter( + $orientationsInEmptyBox, + function(OrientatedItem $orientation) { + return $orientation->isStable(); + } + ); + + if ($isLastItem || count($stableOrientationsInEmptyBox) == 0) { + $orientationsToUse = $unstableOrientations; + } + } + + return $orientationsToUse; + } +} + diff --git a/PackedBox.php b/PackedBox.php index 11965902..6c598e48 100644 --- a/PackedBox.php +++ b/PackedBox.php @@ -56,6 +56,24 @@ class PackedBox */ protected $remainingWeight; + /** + * Used width inside box for packing items + * @var int + */ + protected $usedWidth; + + /** + * Used length inside box for packing items + * @var int + */ + protected $usedLength; + + /** + * Used depth inside box for packing items + * @var int + */ + protected $usedDepth; + /** * Get box used * @return Box @@ -80,7 +98,6 @@ public function getItems() */ public function getWeight() { - if (!is_null($this->weight)) { return $this->weight; } @@ -120,6 +137,33 @@ public function getRemainingDepth() return $this->remainingDepth; } + /** + * Used width inside box for packing items + * @return int + */ + public function getUsedWidth() + { + return $this->usedWidth; + } + + /** + * Used length inside box for packing items + * @return int + */ + public function getUsedLength() + { + return $this->usedLength; + } + + /** + * Used depth inside box for packing items + * @return int + */ + public function getUsedDepth() + { + return $this->usedDepth; + } + /** * Get remaining weight inside box for another item * @return int @@ -146,17 +190,31 @@ public function getVolumeUtilisation() } - /** - * Constructor + * Legacy constructor + * @deprecated + * * @param Box $box * @param ItemList $itemList * @param int $remainingWidth * @param int $remainingLength * @param int $remainingDepth * @param int $remainingWeight + * @param int $usedWidth + * @param int $usedLength + * @param int $usedDepth */ - public function __construct(Box $box, ItemList $itemList, $remainingWidth, $remainingLength, $remainingDepth, $remainingWeight) + public function __construct( + Box $box, + ItemList $itemList, + $remainingWidth, + $remainingLength, + $remainingDepth, + $remainingWeight, + $usedWidth, + $usedLength, + $usedDepth + ) { $this->box = $box; $this->items = $itemList; @@ -164,5 +222,39 @@ public function __construct(Box $box, ItemList $itemList, $remainingWidth, $rema $this->remainingLength = $remainingLength; $this->remainingDepth = $remainingDepth; $this->remainingWeight = $remainingWeight; + $this->usedWidth = $usedWidth; + $this->usedLength = $usedLength; + $this->usedDepth = $usedDepth; + } + + /** + * The constructor from v3 + * @param Box $box + * @param PackedItemList $packedItems + */ + public static function fromPackedItemList(Box $box, PackedItemList $packedItems) + { + $maxWidth = $maxLength = $maxDepth = $weight = 0; + /** @var PackedItem $item */ + foreach (clone $packedItems as $item) { + $maxWidth = max($maxWidth, $item->getX() + $item->getWidth()); + $maxLength = max($maxLength, $item->getY() + $item->getLength()); + $maxDepth = max($maxDepth, $item->getZ() + $item->getDepth()); + $weight += $item->getItem()->getWeight(); + } + + $packedBox = new self( + $box, + $packedItems->asItemList(), + $box->getInnerWidth() - $maxWidth, + $box->getInnerLength() - $maxLength, + $box->getInnerDepth() - $maxDepth, + $box->getMaxWeight() - $box->getEmptyWeight() - $weight, + $maxWidth, + $maxLength, + $maxDepth + ); + + return $packedBox; } } diff --git a/PackedBoxList.php b/PackedBoxList.php index 517173aa..be50c9bd 100644 --- a/PackedBoxList.php +++ b/PackedBoxList.php @@ -23,6 +23,11 @@ class PackedBoxList extends \SplMinHeap /** * Compare elements in order to place them correctly in the heap while sifting up. * @see \SplMinHeap::compare() + * + * @param PackedBox $boxA + * @param PackedBox $boxB + * + * @return int */ public function compare($boxA, $boxB) { @@ -38,6 +43,10 @@ public function compare($boxA, $boxB) /** * Reversed version of compare + * + * @param PackedBox $boxA + * @param PackedBox $boxB + * * @return int */ public function reverseCompare($boxA, $boxB) @@ -101,7 +110,7 @@ public function getVolumeUtilisation() foreach (clone $this as $box) { $boxVolume += $box->getBox()->getInnerVolume(); - /** @var Item $item */ + /** @var PackedItem $item */ foreach (clone $box->getItems() as $item) { $itemVolume += $item->getVolume(); } diff --git a/PackedItem.php b/PackedItem.php new file mode 100644 index 00000000..937042d3 --- /dev/null +++ b/PackedItem.php @@ -0,0 +1,152 @@ +item = $item; + $this->x = $x; + $this->y = $y; + $this->z = $z; + $this->width = $width; + $this->length = $length; + $this->depth = $depth; + } + + /** + * @return int + */ + public function getX() + { + return $this->x; + } + + /** + * @return int + */ + public function getY() + { + return $this->y; + } + + /** + * @return int + */ + public function getZ() + { + return $this->z; + } + + /** + * @return Item + */ + public function getItem() + { + return $this->item; + } + + /** + * @return int + */ + public function getWidth() + { + return $this->width; + } + + /** + * @return int + */ + public function getLength() + { + return $this->length; + } + + /** + * @return int + */ + public function getDepth() + { + return $this->depth; + } + + + /** + * @param OrientatedItem $orientatedItem + * @param int $x + * @param int $y + * @param int $z + * + * @return PackedItem + */ + public static function fromOrientatedItem(OrientatedItem $orientatedItem, $x, $y, $z) + { + return new static( + $orientatedItem->getItem(), + $x, + $y, + $z, + $orientatedItem->getWidth(), + $orientatedItem->getLength(), + $orientatedItem->getDepth() + ); + } +} + diff --git a/PackedItemList.php b/PackedItemList.php new file mode 100644 index 00000000..9a5b2660 --- /dev/null +++ b/PackedItemList.php @@ -0,0 +1,76 @@ +getItem()->getVolume() > $itemB->getItem()->getVolume()) { + return 1; + } elseif ($itemA->getItem()->getVolume() < $itemB->getItem()->getVolume()) { + return -1; + } else { + return $itemA->getItem()->getWeight() - $itemB->getItem()->getWeight(); + } + } + + /** + * Get copy of this list as a standard PHP array + * @return PackedItem[] + */ + public function asArray() + { + $return = []; + foreach (clone $this as $item) { + $return[] = $item; + } + return $return; + } + + /** + * Get copy of this list as a standard PHP array + * @return Item[] + */ + public function asItemArray() + { + $return = []; + foreach (clone $this as $item) { + $return[] = $item->getItem(); + } + return $return; + } + + /** + * Get copy of this list as a standard PHP array + * @return ItemList + */ + public function asItemList() + { + $return = new ItemList; + foreach (clone $this as $packedItem) { + $return->insert($packedItem->getItem()); + } + return $return; + } +} diff --git a/Packer.php b/Packer.php index c9037319..cf22ef21 100644 --- a/Packer.php +++ b/Packer.php @@ -20,6 +20,8 @@ class Packer implements LoggerAwareInterface { use LoggerAwareTrait; + const MAX_BOXES_TO_BALANCE_WEIGHT = 12; + /** * List of items to be packed * @var ItemList @@ -94,7 +96,6 @@ public function setBoxes(BoxList $boxList) /** * Pack items into boxes * - * @throws \RuntimeException * @return PackedBoxList */ public function pack() @@ -102,8 +103,10 @@ public function pack() $packedBoxes = $this->doVolumePacking(); //If we have multiple boxes, try and optimise/even-out weight distribution - if ($packedBoxes->count() > 1) { - $packedBoxes = $this->redistributeWeight($packedBoxes); + if ($packedBoxes->count() > 1 && $packedBoxes->count() < static::MAX_BOXES_TO_BALANCE_WEIGHT) { + $redistributor = new WeightRedistributor($this->boxes); + $redistributor->setLogger($this->logger); + $packedBoxes = $redistributor->redistributeWeight($packedBoxes); } $this->logger->log(LogLevel::INFO, "packing completed, {$packedBoxes->count()} boxes"); @@ -113,7 +116,7 @@ public function pack() /** * Pack items into boxes using the principle of largest volume item first * - * @throws \RuntimeException + * @throws ItemTooLargeException * @return PackedBoxList */ public function doVolumePacking() @@ -129,7 +132,10 @@ public function doVolumePacking() //Loop through boxes starting with smallest, see what happens while (!$boxesToEvaluate->isEmpty()) { $box = $boxesToEvaluate->extract(); - $packedBox = $this->packIntoBox($box, clone $this->items); + + $volumePacker = new VolumePacker($box, clone $this->items); + $volumePacker->setLogger($this->logger); + $packedBox = $volumePacker->pack(); if ($packedBox->getItems()->count()) { $packedBoxesIteration->insert($packedBox); @@ -142,10 +148,11 @@ public function doVolumePacking() //Check iteration was productive if ($packedBoxesIteration->isEmpty()) { - throw new \RuntimeException('Item ' . $this->items->top()->getDescription() . ' is too large to fit into any box'); + throw new ItemTooLargeException('Item ' . $this->items->top()->getDescription() . ' is too large to fit into any box', $this->items->top()); } //Find best box of iteration, and remove packed items from unpacked list + /** @var PackedBox $bestBox */ $bestBox = $packedBoxesIteration->top(); $unPackedItems = $this->items->asArray(); foreach (clone $bestBox->getItems() as $packedItem) { @@ -168,267 +175,19 @@ public function doVolumePacking() return $packedBoxes; } - /** - * Given a solution set of packed boxes, repack them to achieve optimum weight distribution - * - * @param PackedBoxList $originalBoxes - * @return PackedBoxList - */ - public function redistributeWeight(PackedBoxList $originalBoxes) - { - - $targetWeight = $originalBoxes->getMeanWeight(); - $this->logger->log(LogLevel::DEBUG, "repacking for weight distribution, weight variance {$originalBoxes->getWeightVariance()}, target weight {$targetWeight}"); - - $packedBoxes = new PackedBoxList; - - $overWeightBoxes = []; - $underWeightBoxes = []; - foreach (clone $originalBoxes as $packedBox) { - $boxWeight = $packedBox->getWeight(); - if ($boxWeight > $targetWeight) { - $overWeightBoxes[] = $packedBox; - } elseif ($boxWeight < $targetWeight) { - $underWeightBoxes[] = $packedBox; - } else { - $packedBoxes->insert($packedBox); //target weight, so we'll keep these - } - } - - do { //Keep moving items from most overweight box to most underweight box - $tryRepack = false; - $this->logger->log(LogLevel::DEBUG, 'boxes under/over target: ' . count($underWeightBoxes) . '/' . count($overWeightBoxes)); - - foreach ($underWeightBoxes as $u => $underWeightBox) { - $this->logger->log(LogLevel::DEBUG, 'Underweight Box ' . $u); - foreach ($overWeightBoxes as $o => $overWeightBox) { - $this->logger->log(LogLevel::DEBUG, 'Overweight Box ' . $o); - $overWeightBoxItems = $overWeightBox->getItems()->asArray(); - - //For each item in the heavier box, try and move it to the lighter one - foreach ($overWeightBoxItems as $oi => $overWeightBoxItem) { - $this->logger->log(LogLevel::DEBUG, 'Overweight Item ' . $oi); - if ($underWeightBox->getWeight() + $overWeightBoxItem->getWeight() > $targetWeight) { - $this->logger->log(LogLevel::DEBUG, 'Skipping item for hindering weight distribution'); - continue; //skip if moving this item would hinder rather than help weight distribution - } - - $newItemsForLighterBox = clone $underWeightBox->getItems(); - $newItemsForLighterBox->insert($overWeightBoxItem); - - $newLighterBoxPacker = new Packer(); //we may need a bigger box - $newLighterBoxPacker->setBoxes($this->boxes); - $newLighterBoxPacker->setItems($newItemsForLighterBox); - $this->logger->log(LogLevel::INFO, "[ATTEMPTING TO PACK LIGHTER BOX]"); - $newLighterBox = $newLighterBoxPacker->doVolumePacking()->extract(); - - if ($newLighterBox->getItems()->count() === $newItemsForLighterBox->count()) { //new item fits - $this->logger->log(LogLevel::DEBUG, 'New item fits'); - unset($overWeightBoxItems[$oi]); //now packed in different box - - $newHeavierBoxPacker = new Packer(); //we may be able to use a smaller box - $newHeavierBoxPacker->setBoxes($this->boxes); - $newHeavierBoxPacker->setItems($overWeightBoxItems); - - $this->logger->log(LogLevel::INFO, "[ATTEMPTING TO PACK HEAVIER BOX]"); - $newHeavierBoxes = $newHeavierBoxPacker->doVolumePacking(); - if (count($newHeavierBoxes) > 1) { //found an edge case in packing algorithm that *increased* box count - $this->logger->log(LogLevel::INFO, "[REDISTRIBUTING WEIGHT] Abandoning redistribution, because new packing is less efficient than original"); - return $originalBoxes; - } - - $overWeightBoxes[$o] = $newHeavierBoxes->extract(); - $underWeightBoxes[$u] = $newLighterBox; - - $tryRepack = true; //we did some work, so see if we can do even better - usort($overWeightBoxes, [$packedBoxes, 'reverseCompare']); - usort($underWeightBoxes, [$packedBoxes, 'reverseCompare']); - break 3; - } - } - } - } - } while ($tryRepack); - - //Combine back into a single list - $packedBoxes->insertFromArray($overWeightBoxes); - $packedBoxes->insertFromArray($underWeightBoxes); - - return $packedBoxes; - } - - /** * Pack as many items as possible into specific given box + * + * @deprecated * @param Box $box * @param ItemList $items * @return PackedBox packed box */ public function packIntoBox(Box $box, ItemList $items) { - $this->logger->log(LogLevel::DEBUG, "[EVALUATING BOX] {$box->getReference()}"); - - $packedItems = new ItemList; - $remainingDepth = $box->getInnerDepth(); - $remainingWeight = $box->getMaxWeight() - $box->getEmptyWeight(); - $remainingWidth = $box->getInnerWidth(); - $remainingLength = $box->getInnerLength(); - - $layerWidth = $layerLength = $layerDepth = 0; - while (!$items->isEmpty()) { - - $itemToPack = $items->top(); - - //skip items that are simply too large - if ($this->isItemTooLargeForBox($itemToPack, $remainingDepth, $remainingWeight)) { - $items->extract(); - continue; - } - - $this->logger->log(LogLevel::DEBUG, "evaluating item {$itemToPack->getDescription()}"); - $this->logger->log(LogLevel::DEBUG, "remaining width: {$remainingWidth}, length: {$remainingLength}, depth: {$remainingDepth}"); - $this->logger->log(LogLevel::DEBUG, "layerWidth: {$layerWidth}, layerLength: {$layerLength}, layerDepth: {$layerDepth}"); - - $itemWidth = $itemToPack->getWidth(); - $itemLength = $itemToPack->getLength(); - - if ($this->fitsGap($itemToPack, $remainingWidth, $remainingLength)) { - - $packedItems->insert($items->extract()); - $remainingWeight -= $itemToPack->getWeight(); - - $nextItem = !$items->isEmpty() ? $items->top() : null; - if ($this->fitsBetterRotated($itemToPack, $nextItem, $remainingWidth, $remainingLength)) { - $this->logger->log(LogLevel::DEBUG, "fits (better) unrotated"); - $remainingLength -= $itemLength; - $layerLength += $itemLength; - $layerWidth = max($itemWidth, $layerWidth); - } else { - $this->logger->log(LogLevel::DEBUG, "fits (better) rotated"); - $remainingLength -= $itemWidth; - $layerLength += $itemWidth; - $layerWidth = max($itemLength, $layerWidth); - } - $layerDepth = max($layerDepth, $itemToPack->getDepth()); //greater than 0, items will always be less deep - - //allow items to be stacked in place within the same footprint up to current layerdepth - $maxStackDepth = $layerDepth - $itemToPack->getDepth(); - while (!$items->isEmpty() && $this->canStackItemInLayer($itemToPack, $items->top(), $maxStackDepth, $remainingWeight)) { - $remainingWeight -= $items->top()->getWeight(); - $maxStackDepth -= $items->top()->getDepth(); - $packedItems->insert($items->extract()); - } - } else { - if ($remainingWidth >= min($itemWidth, $itemLength) && $this->isLayerStarted($layerWidth, $layerLength, $layerDepth)) { - $this->logger->log(LogLevel::DEBUG, "No more fit in lengthwise, resetting for new row"); - $remainingLength += $layerLength; - $remainingWidth -= $layerWidth; - $layerWidth = $layerLength = 0; - continue; - } elseif ($remainingLength < min($itemWidth, $itemLength) || $layerDepth == 0) { - $this->logger->log(LogLevel::DEBUG, "doesn't fit on layer even when empty"); - $items->extract(); - continue; - } - - $remainingWidth = $layerWidth ? min(floor($layerWidth * 1.1), $box->getInnerWidth()) : $box->getInnerWidth(); - $remainingLength = $layerLength ? min(floor($layerLength * 1.1), $box->getInnerLength()) : $box->getInnerLength(); - $remainingDepth -= $layerDepth; - - $layerWidth = $layerLength = $layerDepth = 0; - $this->logger->log(LogLevel::DEBUG, "doesn't fit, so starting next vertical layer"); - } - } - $this->logger->log(LogLevel::DEBUG, "done with this box"); - return new PackedBox($box, $packedItems, $remainingWidth, $remainingLength, $remainingDepth, $remainingWeight); - } - - /** - * @param Item $item - * @param int $remainingDepth - * @param int $remainingWeight - * @return bool - */ - protected function isItemTooLargeForBox(Item $item, $remainingDepth, $remainingWeight) { - return $item->getDepth() > $remainingDepth || $item->getWeight() > $remainingWeight; - } - - /** - * Figure out space left for next item if we pack this one in it's regular orientation - * @param Item $item - * @param int $remainingWidth - * @param int $remainingLength - * @return int - */ - protected function fitsSameGap(Item $item, $remainingWidth, $remainingLength) { - return min($remainingWidth - $item->getWidth(), $remainingLength - $item->getLength()); - } - - /** - * Figure out space left for next item if we pack this one rotated by 90deg - * @param Item $item - * @param int $remainingWidth - * @param int $remainingLength - * @return int - */ - protected function fitsRotatedGap(Item $item, $remainingWidth, $remainingLength) { - return min($remainingWidth - $item->getLength(), $remainingLength - $item->getWidth()); - } - - /** - * @param Item $item - * @param Item|null $nextItem - * @param $remainingWidth - * @param $remainingLength - * @return bool - */ - protected function fitsBetterRotated(Item $item, Item $nextItem = null, $remainingWidth, $remainingLength) { - - $fitsSameGap = $this->fitsSameGap($item, $remainingWidth, $remainingLength); - $fitsRotatedGap = $this->fitsRotatedGap($item, $remainingWidth, $remainingLength); - - return !!($fitsRotatedGap < 0 || - ($fitsSameGap >= 0 && $fitsSameGap <= $fitsRotatedGap) || - ($item->getWidth() <= $remainingWidth && $nextItem == $item && $remainingLength >= 2 * $item->getLength())); - } - - /** - * Does item fit in specified gap - * @param Item $item - * @param $remainingWidth - * @param $remainingLength - * @return bool - */ - protected function fitsGap(Item $item, $remainingWidth, $remainingLength) { - return $this->fitsSameGap($item, $remainingWidth, $remainingLength) >= 0 || - $this->fitsRotatedGap($item, $remainingWidth, $remainingLength) >= 0; - } - - /** - * Figure out if we can stack the next item vertically on top of this rather than side by side - * Used when we've packed a tall item, and have just put a shorter one next to it - * @param Item $item - * @param Item $nextItem - * @param $maxStackDepth - * @param $remainingWeight - * @return bool - */ - protected function canStackItemInLayer(Item $item, Item $nextItem, $maxStackDepth, $remainingWeight) - { - return $nextItem->getDepth() <= $maxStackDepth && - $nextItem->getWeight() <= $remainingWeight && - $nextItem->getWidth() <= $item->getWidth() && - $nextItem->getLength() <= $item->getLength(); - } - - /** - * @param $layerWidth - * @param $layerLength - * @param $layerDepth - * @return bool - */ - protected function isLayerStarted($layerWidth, $layerLength, $layerDepth) { - return $layerWidth > 0 && $layerLength > 0 && $layerDepth > 0; + $volumePacker = new VolumePacker($box, clone $items); + $volumePacker->setLogger($this->logger); + return $volumePacker->pack(); } /** @@ -443,4 +202,18 @@ public function packBox(Box $box, ItemList $items) $packedBox = $this->packIntoBox($box, $items); return $packedBox->getItems(); } + + /** + * Given a solution set of packed boxes, repack them to achieve optimum weight distribution + * + * @deprecated + * @param PackedBoxList $originalBoxes + * @return PackedBoxList + */ + public function redistributeWeight(PackedBoxList $originalBoxes) + { + $redistributor = new WeightRedistributor($this->boxes); + $redistributor->setLogger($this->logger); + return $redistributor->redistributeWeight($originalBoxes); + } } diff --git a/README.md b/README.md index 343f756f..f9563e06 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,8 @@ BoxPacker An implementation of the 3D bin packing/knapsack problem i.e. given a list of items, how many boxes do you need to fit them all in. -Especially useful for e.g. e-commerce contexts when you need to know box size/weight to calculate shipping costs. +Especially useful for e.g. e-commerce contexts when you need to know box size/weight to calculate shipping costs, or +even just want to know the right number of labels to print. [![Build Status](https://travis-ci.org/dvdoug/BoxPacker.svg?branch=master)](https://travis-ci.org/dvdoug/BoxPacker) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/dvdoug/BoxPacker/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/dvdoug/BoxPacker/?branch=master) @@ -43,12 +44,8 @@ Constraints Installation ------------ If you use [Composer](http://getcomposer.org/), just add `dvdoug/boxpacker` to your project's `composer.json` file: -```json - { - "require": { - "dvdoug/boxpacker": "~1.5" - } - } +``` +composer require dvdoug/boxpacker ``` Otherwise, the library is PSR-4 compliant, so will work with the autoloader of your choice. @@ -64,15 +61,19 @@ Basic usage then looks something like the below: ```php + use DVDoug\BoxPacker\Packer; + use DVDoug\BoxPacker\Test\TestBox; // use your own implementation + use DVDoug\BoxPacker\Test\TestItem; // use your own implementation + /* * To figure out which boxes you need, and which items go into which box */ $packer = new Packer(); $packer->addBox(new TestBox('Le petite box', 300, 300, 10, 10, 296, 296, 8, 1000)); $packer->addBox(new TestBox('Le grande box', 3000, 3000, 100, 100, 2960, 2960, 80, 10000)); - $packer->addItem(new TestItem('Item 1', 250, 250, 2, 200)); - $packer->addItem(new TestItem('Item 2', 250, 250, 2, 200)); - $packer->addItem(new TestItem('Item 3', 250, 250, 2, 200)); + $packer->addItem(new TestItem('Item 1', 250, 250, 12, 200)); + $packer->addItem(new TestItem('Item 2', 250, 250, 12, 200)); + $packer->addItem(new TestItem('Item 3', 250, 250, 24, 200)); $packedBoxes = $packer->pack(); echo("These items fitted into " . count($packedBoxes) . " box(es)" . PHP_EOL); @@ -102,8 +103,8 @@ Basic usage then looks something like the below: $items->insert(new TestItem('Item 2', 297, 296, 2, 500)); $items->insert(new TestItem('Item 3', 296, 296, 4, 290)); - $packer = new Packer(); - $packedBox = $packer->packIntoBox($box, $items); + $volumePacker = new VolumePacker($box, $items); + $packedBox = $volumePacker->pack(); /* $packedBox->getItems() contains the items that fit */ ``` @@ -112,10 +113,16 @@ seconds in the Ubuntu VM on my workstation, giving a rate of approx ≈385 solut most e-commerce stores :) If you do wish to benchmark the library to evaluate performance in your own scenarios, please disable Xdebug when doing so - in my experience the unit tests take 4.5x longer (11.9sec->54 sec) when Xdebug is loaded. +Advanced Usage +-------------- +For more advanced use cases where greater control over the contents of each box is required (e.g. legal limits on the +number of hazardous items per box), you may implement the `BoxPacker\ConstrainedItem` interface which contains an +additional callback method allowing you to decide whether an item may be packed into a box given it's existing contents. + Requirements ------------ -* PHP version 5.4 or higher +* PHP version 5.4 or higher (including PHP7 and HHVM) License ------- diff --git a/VolumePacker.php b/VolumePacker.php new file mode 100644 index 00000000..03f8694a --- /dev/null +++ b/VolumePacker.php @@ -0,0 +1,305 @@ +box = $box; + $this->items = $items; + + $this->boxWidth = max($this->box->getInnerWidth(), $this->box->getInnerLength()); + $this->boxLength = min($this->box->getInnerWidth(), $this->box->getInnerLength()); + $this->remainingWeight = $this->box->getMaxWeight() - $this->box->getEmptyWeight(); + $this->skippedItems = new ItemList(); + $this->logger = new NullLogger(); + } + + /** + * Pack as many items as possible into specific given box + * + * @return PackedBox packed box + */ + public function pack() + { + $this->logger->debug("[EVALUATING BOX] {$this->box->getReference()}"); + + $packedItems = new PackedItemList; + $prevItem = null; + + $x = $y = $z = $rowWidth = $rowLength = $layerWidth = $layerLength = $layerDepth = 0; + + $packingWidthLeft = $this->boxWidth; + $packingLengthLeft = $this->boxLength; + $packingDepthLeft = $this->box->getInnerDepth(); + + while (!$this->items->isEmpty()) { + $itemToPack = $this->items->extract(); + $isLastItem = $this->skippedItems->isEmpty() && $this->items->isEmpty(); + + //skip items that are simply too heavy or too large + if (!$this->checkConstraints($itemToPack, $packedItems)) { + $this->rebuildItemList(); + continue; + } + + $orientatedItem = $this->getOrientationForItem($itemToPack, $prevItem, $isLastItem, $packingWidthLeft, $packingLengthLeft, $packingDepthLeft); + + if ($orientatedItem instanceof OrientatedItem) { + $packedItem = PackedItem::fromOrientatedItem($orientatedItem, $x, $y, $z); + $packedItems->insert($packedItem); + $this->remainingWeight -= $orientatedItem->getItem()->getWeight(); + $packingWidthLeft -= $orientatedItem->getWidth(); + + $rowWidth += $orientatedItem->getWidth(); + $rowLength = max($rowLength, $orientatedItem->getLength()); + $layerDepth = max($layerDepth, $orientatedItem->getDepth()); + + //allow items to be stacked in place within the same footprint up to current layer depth + $stackableDepth = $layerDepth - $orientatedItem->getDepth(); + $this->tryAndStackItemsIntoSpace($packedItems, $prevItem, $orientatedItem->getWidth(), $orientatedItem->getLength(), $stackableDepth, $x, $y, $z + $orientatedItem->getDepth()); + $x += $orientatedItem->getWidth(); + + $prevItem = $packedItem; + + $this->rebuildItemList(); + } else { + if ($layerWidth == 0 && $layerDepth == 0) { // zero items on layer + $this->logger->debug("doesn't fit on layer even when empty, skipping for good"); + $prevItem = null; + continue; + } elseif (!$this->items->isEmpty()) { // skip for now, move on to the next item + $this->logger->debug("doesn't fit, skipping for now"); + $this->skippedItems->insert($itemToPack); + } elseif ($x > 0 && $packingLengthLeft >= min($itemToPack->getWidth(), $itemToPack->getLength())) { + $this->logger->debug("No more fit in width wise, resetting for new row"); + $layerWidth = max($layerWidth, $rowWidth); + $layerLength += $rowLength; + $packingWidthLeft += $rowWidth; + $packingLengthLeft -= $rowLength; + $y += $rowLength; + $x = $rowWidth = $rowLength = 0; + $this->rebuildItemList(); + $this->items->insert($itemToPack); + $prevItem = null; + continue; + } else { + $this->logger->debug("no items fit, so starting next vertical layer"); + + $layerWidth = max($layerWidth, $rowWidth); + $layerLength += $rowLength; + $packingWidthLeft = $rowWidth ? min(floor($layerWidth * 1.1), $this->boxWidth) : $this->boxWidth; + $packingLengthLeft = $rowLength ? min(floor($layerLength * 1.1), $this->boxLength) : $this->boxLength; + $packingDepthLeft -= $layerDepth; + + $z += $layerDepth; + $x = $y = $rowWidth = $rowLength = $layerWidth = $layerLength = $layerDepth = 0; + + $this->rebuildItemList(); + $this->items->insert($itemToPack); + $prevItem = null; + } + } + } + $this->logger->debug("done with this box"); + return PackedBox::fromPackedItemList($this->box, $packedItems); + } + + /** + * @param Item $itemToPack + * @param PackedItem|null $prevItem + * @param bool $isLastItem + * @param int $maxWidth + * @param int $maxLength + * @param int $maxDepth + * + * @return OrientatedItem|false + */ + protected function getOrientationForItem( + Item $itemToPack, + PackedItem $prevItem = null, + $isLastItem, + $maxWidth, + $maxLength, + $maxDepth + ) { + $this->logger->debug( + "evaluating item {$itemToPack->getDescription()} for fit", + [ + 'item' => $itemToPack, + 'space' => [ + 'maxWidth' => $maxWidth, + 'maxLength' => $maxLength, + 'maxDepth' => $maxDepth, + ] + ] + ); + + $orientatedItemFactory = new OrientatedItemFactory(); + $orientatedItemFactory->setLogger($this->logger); + $orientatedItem = $orientatedItemFactory->getBestOrientation($this->box, $itemToPack, $prevItem, $isLastItem, $maxWidth, $maxLength, $maxDepth); + + return $orientatedItem; + } + + /** + * Figure out if we can stack the next item vertically on top of this rather than side by side + * Used when we've packed a tall item, and have just put a shorter one next to it + * + * @param PackedItemList $packedItems + * @param PackedItem|null $prevItem + * @param int $maxWidth + * @param int $maxLength + * @param int $maxDepth + * @param int $x + * @param int $y + * @param int $z + */ + protected function tryAndStackItemsIntoSpace( + PackedItemList $packedItems, + PackedItem $prevItem = null, + $maxWidth, + $maxLength, + $maxDepth, + $x, + $y, + $z + ) { + while (!$this->items->isEmpty() && $this->checkNonDimensionalConstraints($this->items->top(), $packedItems)) { + $stackedItem = $this->getOrientationForItem( + $this->items->top(), + $prevItem, + $this->items->count() === 1, + $maxWidth, + $maxLength, + $maxDepth + ); + if ($stackedItem) { + $this->remainingWeight -= $this->items->top()->getWeight(); + $packedItems->insert(PackedItem::fromOrientatedItem($stackedItem, $x, $y, $z)); + $this->items->extract(); + $maxDepth -= $stackedItem->getDepth(); + $z += $stackedItem->getDepth(); + } else { + break; + } + } + } + + /** + * Check item generally fits into box + * + * @param Item $itemToPack + * @param PackedItemList $packedItems + * + * @return bool + */ + protected function checkConstraints( + Item $itemToPack, + PackedItemList $packedItems + ) { + return $this->checkNonDimensionalConstraints($itemToPack, $packedItems) && + $this->checkDimensionalConstraints($itemToPack); + } + + /** + * As well as purely dimensional constraints, there are other constraints that need to be met + * e.g. weight limits or item-specific restrictions (e.g. max batteries per box) + * + * @param Item $itemToPack + * @param PackedItemList $packedItems + * + * @return bool + */ + protected function checkNonDimensionalConstraints(Item $itemToPack, PackedItemList $packedItems) + { + $weightOK = $itemToPack->getWeight() <= $this->remainingWeight; + + if ($itemToPack instanceof ConstrainedItem) { + return $weightOK && $itemToPack->canBePackedInBox($packedItems->asItemList(), $this->box); + } + + return $weightOK; + } + + /** + * Check the item physically fits in the box (at all) + * + * @param Item $itemToPack + * + * @return bool + */ + protected function checkDimensionalConstraints(Item $itemToPack) + { + $orientatedItemFactory = new OrientatedItemFactory(); + $orientatedItemFactory->setLogger($this->logger); + return !!$orientatedItemFactory->getPossibleOrientationsInEmptyBox($itemToPack, $this->box); + } + + /** + * Reintegrate skipped items into main list when nothing left to process + */ + protected function rebuildItemList() { + if ($this->items->isEmpty()) { + $this->items = $this->skippedItems; + $this->skippedItems = new ItemList(); + } + } +} diff --git a/WeightRedistributor.php b/WeightRedistributor.php new file mode 100644 index 00000000..90a6939c --- /dev/null +++ b/WeightRedistributor.php @@ -0,0 +1,139 @@ +boxes = clone $boxList; + $this->logger = new NullLogger(); + } + + /** + * Given a solution set of packed boxes, repack them to achieve optimum weight distribution + * + * @param PackedBoxList $originalBoxes + * @return PackedBoxList + */ + public function redistributeWeight(PackedBoxList $originalBoxes) + { + + $targetWeight = $originalBoxes->getMeanWeight(); + $this->logger->log(LogLevel::DEBUG, "repacking for weight distribution, weight variance {$originalBoxes->getWeightVariance()}, target weight {$targetWeight}"); + + $packedBoxes = new PackedBoxList; + + $overWeightBoxes = []; + $underWeightBoxes = []; + foreach (clone $originalBoxes as $packedBox) { + $boxWeight = $packedBox->getWeight(); + if ($boxWeight > $targetWeight) { + $overWeightBoxes[] = $packedBox; + } elseif ($boxWeight < $targetWeight) { + $underWeightBoxes[] = $packedBox; + } else { + $packedBoxes->insert($packedBox); //target weight, so we'll keep these + } + } + + do { //Keep moving items from most overweight box to most underweight box + $tryRepack = false; + $this->logger->log(LogLevel::DEBUG, 'boxes under/over target: ' . count($underWeightBoxes) . '/' . count($overWeightBoxes)); + + foreach ($underWeightBoxes as $u => $underWeightBox) { + $this->logger->log(LogLevel::DEBUG, 'Underweight Box ' . $u); + foreach ($overWeightBoxes as $o => $overWeightBox) { + $this->logger->log(LogLevel::DEBUG, 'Overweight Box ' . $o); + $overWeightBoxItems = $overWeightBox->getItems()->asArray(); + + //For each item in the heavier box, try and move it to the lighter one + /** @var Item $overWeightBoxItem */ + foreach ($overWeightBoxItems as $oi => $overWeightBoxItem) { + $this->logger->log(LogLevel::DEBUG, 'Overweight Item ' . $oi); + if ($underWeightBox->getWeight() + $overWeightBoxItem->getWeight() > $targetWeight) { + $this->logger->log(LogLevel::DEBUG, 'Skipping item for hindering weight distribution'); + continue; //skip if moving this item would hinder rather than help weight distribution + } + + $newItemsForLighterBox = $underWeightBox->getItems()->asArray(); + $newItemsForLighterBox[] = $overWeightBoxItem; + + $newLighterBoxPacker = new Packer(); //we may need a bigger box + $newLighterBoxPacker->setBoxes($this->boxes); + $newLighterBoxPacker->setItems($newItemsForLighterBox); + $this->logger->log(LogLevel::INFO, "[ATTEMPTING TO PACK LIGHTER BOX]"); + $newLighterBox = $newLighterBoxPacker->doVolumePacking()->extract(); + + if ($newLighterBox->getItems()->count() === count($newItemsForLighterBox)) { //new item fits + $this->logger->log(LogLevel::DEBUG, 'New item fits'); + unset($overWeightBoxItems[$oi]); //now packed in different box + + if (count($overWeightBoxItems) > 0) { + $newHeavierBoxPacker = new Packer(); //we may be able to use a smaller box + $newHeavierBoxPacker->setBoxes($this->boxes); + $newHeavierBoxPacker->setItems($overWeightBoxItems); + + $this->logger->log(LogLevel::INFO, "[ATTEMPTING TO PACK HEAVIER BOX]"); + $newHeavierBoxes = $newHeavierBoxPacker->doVolumePacking(); + if ($newHeavierBoxes->count() + > 1) { //found an edge case in packing algorithm that *increased* box count + $this->logger->log( + LogLevel::INFO, + "[REDISTRIBUTING WEIGHT] Abandoning redistribution, because new packing is less efficient than original" + ); + + return $originalBoxes; + } + + $overWeightBoxes[$o] = $newHeavierBoxes->extract(); + } else { + unset($overWeightBoxes[$o]); + } + $underWeightBoxes[$u] = $newLighterBox; + + $tryRepack = true; //we did some work, so see if we can do even better + usort($overWeightBoxes, [$packedBoxes, 'reverseCompare']); + usort($underWeightBoxes, [$packedBoxes, 'reverseCompare']); + break 3; + } + } + } + } + } while ($tryRepack); + + //Combine back into a single list + $packedBoxes->insertFromArray($overWeightBoxes); + $packedBoxes->insertFromArray($underWeightBoxes); + + return $packedBoxes; + } +} diff --git a/composer.json b/composer.json index 3abd6876..0be67ab5 100644 --- a/composer.json +++ b/composer.json @@ -1,8 +1,8 @@ { "name": "dvdoug/boxpacker", - "description": "An implementation of the 3D bin packing/knapsack problem (aka creating parcels by putting items into boxes)", + "description": "An implementation of the 3D (actually 4D) bin packing/knapsack problem (aka creating parcels by putting items into boxes)", "keywords": ["packing","binpacking","bin packing","knapsack","box","boxpacking","parcel","parcelpacking","shipping","packaging","boxes", "container"], - "homepage": "https://github.com/dvdoug/BoxPacker", + "homepage": "http://boxpacker.io/", "authors": [ { "name": "Doug Wright", @@ -12,16 +12,21 @@ "license": "MIT", "require": { "php": ">=5.4.0", - "psr/log": "~1.0" + "psr/log": "^1.0" }, "require-dev": { - "phpunit/phpunit": "^4.3", - "monolog/monolog": "~1.11", + "phpunit/phpunit": "^4.8.35||^5.0||^6.0", + "monolog/monolog": "^1.11", "squizlabs/php_codesniffer": "^2.5" }, "autoload": { "psr-4": { "DVDoug\\BoxPacker\\": "" } + }, + "autoload-dev": { + "psr-4": { + "DVDoug\\BoxPacker\\Test\\": "tests/Test" + } } } diff --git a/license.txt b/license.txt index 209ff177..80a8fdf0 100644 --- a/license.txt +++ b/license.txt @@ -1,4 +1,4 @@ -Copyright (C) 2012-2015 Doug Wright +Copyright (C) 2012-2017 Doug Wright Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -15,4 +15,4 @@ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/phpunit.xml b/phpunit.xml index bd117e54..af4acb5b 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,21 +1,4 @@ - - + @@ -23,12 +6,6 @@ - - - - . diff --git a/tests/BoxListTest.php b/tests/BoxListTest.php index 6fafbaae..c0b9eb55 100644 --- a/tests/BoxListTest.php +++ b/tests/BoxListTest.php @@ -1,68 +1,75 @@ insert($box1); - $list->insert($box2); - $list->insert($box3); + $box1 = new TestBox('Small', 21, 21, 3, 1, 20, 20, 2, 100); + $box2 = new TestBox('Large', 201, 201, 21, 1, 200, 200, 20, 1000); + $box3 = new TestBox('Medium', 101, 101, 11, 5, 100, 100, 10, 500); - $sorted = []; - while (!$list->isEmpty()) { - $sorted[] = $list->extract(); - } - self::assertEquals(array($box1,$box3,$box2), $sorted); + $list = new BoxList; + $list->insert($box1); + $list->insert($box2); + $list->insert($box3); + + $sorted = []; + while (!$list->isEmpty()) { + $sorted[] = $list->extract(); + } + self::assertEquals(array($box1, $box3, $box2), $sorted); } - function testIssue14A() { - $box1 = new TestBox('Small', 21, 21, 3, 1, 20, 20, 2, 100); - $box2 = new TestBox('Large', 1301, 1301, 1301, 1, 1300, 1300, 1300, 1000); - $box3 = new TestBox('Medium', 101, 101, 11, 5, 100, 100, 10, 500); - $list = new BoxList; - $list->insert($box1); - $list->insert($box2); - $list->insert($box3); - $sorted = []; - while (!$list->isEmpty()) { - $sorted[] = $list->extract(); - } - self::assertEquals(array($box1,$box3,$box2), $sorted); + function testIssue14A() + { + $box1 = new TestBox('Small', 21, 21, 3, 1, 20, 20, 2, 100); + $box2 = new TestBox('Large', 1301, 1301, 1301, 1, 1300, 1300, 1300, 1000); + $box3 = new TestBox('Medium', 101, 101, 11, 5, 100, 100, 10, 500); + $list = new BoxList; + $list->insert($box1); + $list->insert($box2); + $list->insert($box3); + $sorted = []; + while (!$list->isEmpty()) { + $sorted[] = $list->extract(); + } + self::assertEquals(array($box1, $box3, $box2), $sorted); } - function testIssue14B() { - $box1 = new TestBox('Small', 21, 21, 3, 1, 20, 20, 2, 100); - $box2 = new TestBox('Large', 1301, 1301, 1301, 1, 1300, 1300, 1300, 1000); - $box3 = new TestBox('Medium', 101, 101, 11, 5, 100, 100, 10, 500); - $list = new BoxList; - $list->insert($box3); - $list->insert($box2); - $list->insert($box1); - $sorted = []; - while (!$list->isEmpty()) { - $sorted[] = $list->extract(); - } - self::assertEquals(array($box1,$box3,$box2), $sorted); - $list = new BoxList; - $list->insert($box2); - $list->insert($box1); - $list->insert($box3); - $sorted = []; - while (!$list->isEmpty()) { - $sorted[] = $list->extract(); - } - self::assertEquals(array($box1,$box3,$box2), $sorted); + function testIssue14B() + { + $box1 = new TestBox('Small', 21, 21, 3, 1, 20, 20, 2, 100); + $box2 = new TestBox('Large', 1301, 1301, 1301, 1, 1300, 1300, 1300, 1000); + $box3 = new TestBox('Medium', 101, 101, 11, 5, 100, 100, 10, 500); + $list = new BoxList; + $list->insert($box3); + $list->insert($box2); + $list->insert($box1); + $sorted = []; + while (!$list->isEmpty()) { + $sorted[] = $list->extract(); + } + self::assertEquals(array($box1, $box3, $box2), $sorted); + $list = new BoxList; + $list->insert($box2); + $list->insert($box1); + $list->insert($box3); + $sorted = []; + while (!$list->isEmpty()) { + $sorted[] = $list->extract(); + } + self::assertEquals(array($box1, $box3, $box2), $sorted); } - } +} diff --git a/tests/ItemListTest.php b/tests/ItemListTest.php index e7f5656c..faaf8614 100644 --- a/tests/ItemListTest.php +++ b/tests/ItemListTest.php @@ -1,29 +1,34 @@ insert($box1); - $list->insert($box2); - $list->insert($box3); + $box1 = new TestItem('Small', 20, 20, 2, 100); + $box2 = new TestItem('Large', 200, 200, 20, 1000); + $box3 = new TestItem('Medium', 100, 100, 10, 500); - $sorted = []; - while (!$list->isEmpty()) { - $sorted[] = $list->extract(); - } - self::assertEquals(array($box2,$box3,$box1), $sorted); + $list = new ItemList; + $list->insert($box1); + $list->insert($box2); + $list->insert($box3); + + $sorted = []; + while (!$list->isEmpty()) { + $sorted[] = $list->extract(); + } + self::assertEquals(array($box2, $box3, $box1), $sorted); } - } +} diff --git a/tests/PackedBoxListTest.php b/tests/PackedBoxListTest.php index bc1e8fc1..18d3b823 100644 --- a/tests/PackedBoxListTest.php +++ b/tests/PackedBoxListTest.php @@ -7,7 +7,11 @@ namespace DVDoug\BoxPacker; -class PackedBoxListTest extends \PHPUnit_Framework_TestCase +use DVDoug\BoxPacker\Test\TestBox; +use DVDoug\BoxPacker\Test\TestItem; +use PHPUnit\Framework\TestCase; + +class PackedBoxListTest extends TestCase { function testVolumeUtilisation() { @@ -17,7 +21,7 @@ function testVolumeUtilisation() $boxItems = new ItemList(); $boxItems->insert($item); - $packedBox = new PackedBox($box, $boxItems, 1, 2, 3, 4); + $packedBox = new PackedBox($box, $boxItems, 1, 2, 3, 4, 0, 0, 0); $packedBoxList = new PackedBoxList(); $packedBoxList->insert($packedBox); @@ -33,7 +37,7 @@ function testWeightVariance() $boxItems = new ItemList(); $boxItems->insert($item); - $packedBox = new PackedBox($box, $boxItems, 1, 2, 3, 4); + $packedBox = new PackedBox($box, $boxItems, 1, 2, 3, 4, 0, 0, 0); $packedBoxList = new PackedBoxList(); $packedBoxList->insert($packedBox); diff --git a/tests/PackedBoxTest.php b/tests/PackedBoxTest.php index dfd288aa..09dfa167 100644 --- a/tests/PackedBoxTest.php +++ b/tests/PackedBoxTest.php @@ -7,7 +7,11 @@ namespace DVDoug\BoxPacker; -class PackedBoxTest extends \PHPUnit_Framework_TestCase +use DVDoug\BoxPacker\Test\TestBox; +use DVDoug\BoxPacker\Test\TestItem; +use PHPUnit\Framework\TestCase; + +class PackedBoxTest extends TestCase { function testGetters() { @@ -17,7 +21,7 @@ function testGetters() $boxItems = new ItemList(); $boxItems->insert($item); - $packedBox = new PackedBox($box, $boxItems, 1, 2, 3, 4); + $packedBox = new PackedBox($box, $boxItems, 1, 2, 3, 4, 0, 0, 0); self::assertEquals(1, $packedBox->getRemainingWidth()); self::assertEquals(2, $packedBox->getRemainingLength()); @@ -33,7 +37,7 @@ function testVolumeUtilisation() $boxItems = new ItemList(); $boxItems->insert($item); - $packedBox = new PackedBox($box, $boxItems, 1, 2, 3, 4); + $packedBox = new PackedBox($box, $boxItems, 1, 2, 3, 4, 0, 0, 0); self::assertEquals(50, $packedBox->getVolumeUtilisation()); } diff --git a/tests/PackerTest.php b/tests/PackerTest.php index 769f3376..7df495b2 100644 --- a/tests/PackerTest.php +++ b/tests/PackerTest.php @@ -1,552 +1,533 @@ insert(new TestItem('Item 1', 250, 250, 2, 200)); - $items->insert(new TestItem('Item 2', 250, 250, 2, 200)); - $items->insert(new TestItem('Item 3', 250, 250, 2, 200)); - - $packer = new Packer(); - $packedItems = $packer->packBox($box, $items); - - self::assertEquals(3, $packedItems->count()); +/** + * Box packing (3D bin packing, knapsack problem) + * @package BoxPacker + * @author Doug Wright + */ + +namespace DVDoug\BoxPacker; + +use DVDoug\BoxPacker\Test\TestBox; +use DVDoug\BoxPacker\Test\TestItem; +use PHPUnit\Framework\TestCase; + +class PackerTest extends TestCase +{ + public function testPackThreeItemsFitEasilyInSmallerOfTwoBoxes() + { + + $box1 = new TestBox('Le petite box', 300, 300, 10, 10, 296, 296, 8, 1000); + $box2 = new TestBox('Le grande box', 3000, 3000, 100, 100, 2960, 2960, 80, 10000); + + $item1 = new TestItem('Item 1', 250, 250, 2, 200); + $item2 = new TestItem('Item 2', 250, 250, 2, 200); + $item3 = new TestItem('Item 3', 250, 250, 2, 200); + + $packer = new Packer(); + $packer->addBox($box1); + $packer->addBox($box2); + $packer->addItem($item1); + $packer->addItem($item2); + $packer->addItem($item3); + $packedBoxes = $packer->pack(); + + self::assertEquals(1, $packedBoxes->count()); + self::assertEquals(3, $packedBoxes->top()->getItems()->count()); + self::assertEquals($box1, $packedBoxes->top()->getBox()); + self::assertEquals(610, $packedBoxes->top()->getWeight()); } - public function testPackBoxThreeItemsFitExactly() { + public function testPackThreeItemsFitEasilyInLargerOfTwoBoxes() + { - $box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000); + $box1 = new TestBox('Le petite box', 300, 300, 10, 10, 296, 296, 8, 1000); + $box2 = new TestBox('Le grande box', 3000, 3000, 100, 100, 2960, 2960, 80, 10000); - $items = new ItemList; - $items->insert(new TestItem('Item 1', 296, 296, 2, 200)); - $items->insert(new TestItem('Item 2', 296, 296, 2, 500)); - $items->insert(new TestItem('Item 3', 296, 296, 4, 290)); + $item1 = new TestItem('Item 1', 2500, 2500, 20, 2000); + $item2 = new TestItem('Item 2', 2500, 2500, 20, 2000); + $item3 = new TestItem('Item 3', 2500, 2500, 20, 2000); - $packer = new Packer(); - $packedItems = $packer->packBox($box, $items); + $packer = new Packer(); + $packer->addBox($box1); + $packer->addBox($box2); + $packer->addItem($item1); + $packer->addItem($item2); + $packer->addItem($item3); + $packedBoxes = $packer->pack(); - self::assertEquals(3, $packedItems->count()); + self::assertEquals(1, $packedBoxes->count()); + self::assertEquals(3, $packedBoxes->top()->getItems()->count()); + self::assertEquals($box2, $packedBoxes->top()->getBox()); + self::assertEquals(6100, $packedBoxes->top()->getWeight()); } - public function testPackBoxThreeItemsFitExactlyNoRotation() { + public function testPackFiveItemsTwoLargeOneSmallBox() + { - $box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000); + $box1 = new TestBox('Le petite box', 600, 600, 10, 10, 596, 596, 8, 1000); + $box2 = new TestBox('Le grande box', 3000, 3000, 50, 100, 2960, 2960, 40, 10000); - $items = new ItemList; - $items->insert(new TestItem('Item 1', 296, 148, 2, 200)); - $items->insert(new TestItem('Item 2', 296, 148, 2, 500)); + $item1 = new TestItem('Item 1', 2500, 2500, 20, 500); + $item2 = new TestItem('Item 2', 550, 550, 2, 500); + $item3 = new TestItem('Item 3', 2500, 2500, 20, 500); + $item4 = new TestItem('Item 4', 2500, 2500, 20, 500); + $item5 = new TestItem('Item 5', 2500, 2500, 20, 500); - $packer = new Packer(); - $packedItems = $packer->packBox($box, $items); + $packer = new Packer(); + $packer->addBox($box1); + $packer->addBox($box2); + $packer->addItem($item1); + $packer->addItem($item2); + $packer->addItem($item3); + $packer->addItem($item4); + $packer->addItem($item5); + $packedBoxes = $packer->pack(); - self::assertEquals(2, $packedItems->count()); - } + self::assertEquals(3, $packedBoxes->count()); - public function testPackBoxThreeItemsFitSizeButOverweight() { + self::assertEquals(2, $packedBoxes->top()->getItems()->count()); + self::assertEquals($box2, $packedBoxes->top()->getBox()); + self::assertEquals(1100, $packedBoxes->top()->getWeight()); - $box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000); + $packedBoxes->extract(); - $items = new ItemList; - $items->insert(new TestItem('Item 1', 250, 250, 2, 400)); - $items->insert(new TestItem('Item 2', 250, 250, 2, 500)); - $items->insert(new TestItem('Item 3', 250, 250, 2, 200)); + self::assertEquals(2, $packedBoxes->top()->getItems()->count()); + self::assertEquals($box2, $packedBoxes->top()->getBox()); + self::assertEquals(1100, $packedBoxes->top()->getWeight()); - $packer = new Packer(); - $packedItems = $packer->packBox($box, $items); + $packedBoxes->extract(); - self::assertEquals(2, $packedItems->count()); + self::assertEquals(1, $packedBoxes->top()->getItems()->count()); + self::assertEquals($box1, $packedBoxes->top()->getBox()); + self::assertEquals(510, $packedBoxes->top()->getWeight()); } - public function testPackBoxThreeItemsFitWeightBut2Oversize() { - - $box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000); + public function testPackFiveItemsTwoLargeOneSmallBoxButThreeAfterRepack() + { - $items = new ItemList; - $items->insert(new TestItem('Item 1', 297, 296, 2, 200)); - $items->insert(new TestItem('Item 2', 297, 296, 2, 500)); - $items->insert(new TestItem('Item 3', 296, 296, 4, 290)); + $box1 = new TestBox('Le petite box', 600, 600, 10, 10, 596, 596, 8, 1000); + $box2 = new TestBox('Le grande box', 3000, 3000, 50, 100, 2960, 2960, 40, 10000); - $packer = new Packer(); - $packedItems = $packer->packBox($box, $items); + $item1 = new TestItem('Item 1', 2500, 2500, 20, 2000); + $item2 = new TestItem('Item 2', 550, 550, 2, 200); + $item3 = new TestItem('Item 3', 2500, 2500, 20, 2000); + $item4 = new TestItem('Item 4', 2500, 2500, 20, 2000); + $item5 = new TestItem('Item 5', 2500, 2500, 20, 2000); - self::assertEquals(1, $packedItems->count()); - } - - public function testPackThreeItemsFitEasilyInSmallerOfTwoBoxes() { - - $box1 = new TestBox('Le petite box', 300, 300, 10, 10, 296, 296, 8, 1000); - $box2 = new TestBox('Le grande box', 3000, 3000, 100, 100, 2960, 2960, 80, 10000); - - $item1 = new TestItem('Item 1', 250, 250, 2, 200); - $item2 = new TestItem('Item 2', 250, 250, 2, 200); - $item3 = new TestItem('Item 3', 250, 250, 2, 200); - - $packer = new Packer(); - $packer->addBox($box1); - $packer->addBox($box2); - $packer->addItem($item1); - $packer->addItem($item2); - $packer->addItem($item3); - $packedBoxes = $packer->pack(); - - self::assertEquals(1, $packedBoxes->count()); - self::assertEquals(3, $packedBoxes->top()->getItems()->count()); - self::assertEquals($box1, $packedBoxes->top()->getBox()); - self::assertEquals(610, $packedBoxes->top()->getWeight()); - } - - public function testPackThreeItemsFitEasilyInLargerOfTwoBoxes() { - - $box1 = new TestBox('Le petite box', 300, 300, 10, 10, 296, 296, 8, 1000); - $box2 = new TestBox('Le grande box', 3000, 3000, 100, 100, 2960, 2960, 80, 10000); - - $item1 = new TestItem('Item 1', 2500, 2500, 20, 2000); - $item2 = new TestItem('Item 2', 2500, 2500, 20, 2000); - $item3 = new TestItem('Item 3', 2500, 2500, 20, 2000); - - $packer = new Packer(); - $packer->addBox($box1); - $packer->addBox($box2); - $packer->addItem($item1); - $packer->addItem($item2); - $packer->addItem($item3); - $packedBoxes = $packer->pack(); - - self::assertEquals(1, $packedBoxes->count()); - self::assertEquals(3, $packedBoxes->top()->getItems()->count()); - self::assertEquals($box2, $packedBoxes->top()->getBox()); - self::assertEquals(6100, $packedBoxes->top()->getWeight()); - } + $packer = new Packer(); + $packer->addBox($box1); + $packer->addBox($box2); + $packer->addItem($item1); + $packer->addItem($item2); + $packer->addItem($item3); + $packer->addItem($item4); + $packer->addItem($item5); + $packedBoxes = $packer->pack(); - public function testPackFiveItemsTwoLargeOneSmallBox() { + self::assertEquals(3, $packedBoxes->count()); - $box1 = new TestBox('Le petite box', 600, 600, 10, 10, 596, 596, 8, 1000); - $box2 = new TestBox('Le grande box', 3000, 3000, 50, 100, 2960, 2960, 40, 10000); + self::assertEquals(2, $packedBoxes->top()->getItems()->count()); + self::assertEquals($box2, $packedBoxes->top()->getBox()); + self::assertEquals(4100, $packedBoxes->top()->getWeight()); - $item1 = new TestItem('Item 1', 2500, 2500, 20, 500); - $item2 = new TestItem('Item 2', 550, 550, 2, 500); - $item3 = new TestItem('Item 3', 2500, 2500, 20, 500); - $item4 = new TestItem('Item 4', 2500, 2500, 20, 500); - $item5 = new TestItem('Item 5', 2500, 2500, 20, 500); + $packedBoxes->extract(); - $packer = new Packer(); - $packer->addBox($box1); - $packer->addBox($box2); - $packer->addItem($item1); - $packer->addItem($item2); - $packer->addItem($item3); - $packer->addItem($item4); - $packer->addItem($item5); - $packedBoxes = $packer->pack(); + self::assertEquals(2, $packedBoxes->top()->getItems()->count()); + self::assertEquals($box2, $packedBoxes->top()->getBox()); + self::assertEquals(2300, $packedBoxes->top()->getWeight()); - self::assertEquals(3, $packedBoxes->count()); + $packedBoxes->extract(); - self::assertEquals(2, $packedBoxes->top()->getItems()->count()); - self::assertEquals($box2, $packedBoxes->top()->getBox()); - self::assertEquals(1100, $packedBoxes->top()->getWeight()); - - $packedBoxes->extract(); - - self::assertEquals(2, $packedBoxes->top()->getItems()->count()); - self::assertEquals($box2, $packedBoxes->top()->getBox()); - self::assertEquals(1100, $packedBoxes->top()->getWeight()); - - $packedBoxes->extract(); - - self::assertEquals(1, $packedBoxes->top()->getItems()->count()); - self::assertEquals($box1, $packedBoxes->top()->getBox()); - self::assertEquals(510, $packedBoxes->top()->getWeight()); - } - - public function testPackFiveItemsTwoLargeOneSmallBoxButThreeAfterRepack() { - - $box1 = new TestBox('Le petite box', 600, 600, 10, 10, 596, 596, 8, 1000); - $box2 = new TestBox('Le grande box', 3000, 3000, 50, 100, 2960, 2960, 40, 10000); - - $item1 = new TestItem('Item 1', 2500, 2500, 20, 2000); - $item2 = new TestItem('Item 2', 550, 550, 2, 200); - $item3 = new TestItem('Item 3', 2500, 2500, 20, 2000); - $item4 = new TestItem('Item 4', 2500, 2500, 20, 2000); - $item5 = new TestItem('Item 5', 2500, 2500, 20, 2000); - - $packer = new Packer(); - $packer->addBox($box1); - $packer->addBox($box2); - $packer->addItem($item1); - $packer->addItem($item2); - $packer->addItem($item3); - $packer->addItem($item4); - $packer->addItem($item5); - $packedBoxes = $packer->pack(); - - self::assertEquals(3, $packedBoxes->count()); - - self::assertEquals(2, $packedBoxes->top()->getItems()->count()); - self::assertEquals($box2, $packedBoxes->top()->getBox()); - self::assertEquals(4100, $packedBoxes->top()->getWeight()); - - $packedBoxes->extract(); - - self::assertEquals(2, $packedBoxes->top()->getItems()->count()); - self::assertEquals($box2, $packedBoxes->top()->getBox()); - self::assertEquals(2300, $packedBoxes->top()->getWeight()); - - $packedBoxes->extract(); - - self::assertEquals(1, $packedBoxes->top()->getItems()->count()); - self::assertEquals($box2, $packedBoxes->top()->getBox()); - self::assertEquals(2100, $packedBoxes->top()->getWeight()); + self::assertEquals(1, $packedBoxes->top()->getItems()->count()); + self::assertEquals($box2, $packedBoxes->top()->getBox()); + self::assertEquals(2100, $packedBoxes->top()->getWeight()); } /** - * @expectedException \RuntimeException + * @expectedException \DVDoug\BoxPacker\ItemTooLargeException */ - public function testPackThreeItemsOneDoesntFitInAnyBox() { - - $box1 = new TestBox('Le petite box', 300, 300, 10, 10, 296, 296, 8, 1000); - $box2 = new TestBox('Le grande box', 3000, 3000, 100, 100, 2960, 2960, 80, 10000); - - $item1 = new TestItem('Item 1', 2500, 2500, 20, 2000); - $item2 = new TestItem('Item 2', 25000, 2500, 20, 2000); - $item3 = new TestItem('Item 3', 2500, 2500, 20, 2000); - - $packer = new Packer(); - $packer->addBox($box1); - $packer->addBox($box2); - $packer->addItem($item1); - $packer->addItem($item2); - $packer->addItem($item3); - $packedBoxes = $packer->pack(); + public function testPackThreeItemsOneDoesntFitInAnyBox() + { + + $box1 = new TestBox('Le petite box', 300, 300, 10, 10, 296, 296, 8, 1000); + $box2 = new TestBox('Le grande box', 3000, 3000, 100, 100, 2960, 2960, 80, 10000); + + $item1 = new TestItem('Item 1', 2500, 2500, 20, 2000); + $item2 = new TestItem('Item 2', 25000, 2500, 20, 2000); + $item3 = new TestItem('Item 3', 2500, 2500, 20, 2000); + + $packer = new Packer(); + $packer->addBox($box1); + $packer->addBox($box2); + $packer->addItem($item1); + $packer->addItem($item2); + $packer->addItem($item3); + $packedBoxes = $packer->pack(); } /** - * @expectedException \RuntimeException + * @expectedException \DVDoug\BoxPacker\ItemTooLargeException */ - public function testPackWithoutBox() { - - $item1 = new TestItem('Item 1', 2500, 2500, 20, 2000); - $item2 = new TestItem('Item 2', 25000, 2500, 20, 2000); - $item3 = new TestItem('Item 3', 2500, 2500, 20, 2000); - - $packer = new Packer(); - $packer->addItem($item1); - $packer->addItem($item2); - $packer->addItem($item3); - $packedBoxes = $packer->pack(); + public function testPackWithoutBox() + { + + $item1 = new TestItem('Item 1', 2500, 2500, 20, 2000); + $item2 = new TestItem('Item 2', 25000, 2500, 20, 2000); + $item3 = new TestItem('Item 3', 2500, 2500, 20, 2000); + + $packer = new Packer(); + $packer->addItem($item1); + $packer->addItem($item2); + $packer->addItem($item3); + $packedBoxes = $packer->pack(); } - public function testPackTwoItemsFitExactlySideBySide() { + public function testIssue1() + { - $box = new TestBox('Le box', 300, 400, 10, 10, 296, 496, 8, 1000); + $packer = new Packer(); + $packer->addBox(new TestBox('Le petite box', 292, 336, 60, 10, 292, 336, 60, 9000)); + $packer->addBox(new TestBox('Le grande box', 421, 548, 335, 100, 421, 548, 335, 10000)); + $packer->addItem(new TestItem('Item 1', 226, 200, 40, 440)); + $packer->addItem(new TestItem('Item 2', 200, 200, 155, 1660)); + $packedBoxes = $packer->pack(); - $items = new ItemList; - $items->insert(new TestItem('Item 1', 296, 248, 8, 200)); - $items->insert(new TestItem('Item 2', 248, 296, 8, 200)); - - $packer = new Packer(); - $packedItems = $packer->packBox($box, $items); - - self::assertEquals(2, $packedItems->count()); + self::assertEquals(1, $packedBoxes->count()); } - public function testPackThreeItemsBottom2FitSideBySideOneExactlyOnTop() { - - $box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000); + public function testIssue3() + { - $items = new ItemList; - $items->insert(new TestItem('Item 1', 248, 148, 4, 200)); - $items->insert(new TestItem('Item 2', 148, 248, 4, 200)); - $items->insert(new TestItem('Item 3', 296, 296, 4, 200)); + $packer = new Packer(); + $packer->addBox(new TestBox('OW Box 1', 51, 33, 33, 0.6, 51, 33, 33, 0.6)); + $packer->addBox(new TestBox('OW Box 2', 50, 40, 40, 0.95, 50, 40, 40, 0.95)); + $packer->addItem(new TestItem('Product', 28, 19, 9, 0), 6); + $packedBoxes = $packer->pack(); - $packer = new Packer(); - $packedItems = $packer->packBox($box, $items); - - self::assertEquals(3, $packedItems->count()); + self::assertEquals(1, $packedBoxes->count()); } - public function testPackThreeItemsBottom2FitSideBySideWithSpareSpaceOneOverhangSlightlyOnTop() { - - $box = new TestBox('Le box', 250, 250, 10, 10, 248, 248, 8, 1000); + public function testIssue6() + { - $items = new ItemList; - $items->insert(new TestItem('Item 1', 200, 200, 4, 200)); - $items->insert(new TestItem('Item 2', 110, 110, 4, 200)); - $items->insert(new TestItem('Item 3', 110, 110, 4, 200)); + $packer = new Packer(); + $packer->addBox(new TestBox('Package 22', 675, 360, 210, 2, 670, 355, 204, 1000)); + $packer->addBox(new TestBox('Package 2', 330, 130, 102, 2, 335, 135, 107, 1000)); + $packer->addItem(new TestItem('Item 3', 355.6, 335.28, 127, 1.5)); + $packer->addItem(new TestItem('Item 7', 330.2, 127, 101.6, 1)); + $packer->addItem(new TestItem('Item 7', 330.2, 127, 101.6, 1)); + $packedBoxes = $packer->pack(); - $packer = new Packer(); - $packedItems = $packer->packBox($box, $items); + self::assertEquals(1, $packedBoxes->count()); - self::assertEquals(3, $packedItems->count()); } - public function testPackSingleItemFitsBetterRotated() { - - $box = new TestBox('Le box', 400, 300, 10, 10, 396, 296, 8, 1000); + public function testIssue9() + { + $packer = new Packer(); + $packer->addBox(new TestBox('24x24x24Box', 24, 24, 24, 24, 24, 24, 24, 100)); - $items = new ItemList; - $items->insert(new TestItem('Item 1', 250, 290, 2, 200)); + $packer->addItem(new TestItem('6x6x6Item', 6, 6, 6, 1), 64); + $packedBoxes = $packer->pack(); - $packer = new Packer(); - $packedItems = $packer->packBox($box, $items); - - self::assertEquals(1, $packedItems->count()); + self::assertEquals(1, $packedBoxes->count()); } - public function testIssue1() { + public function testIssue11() + { + $packer = new Packer(); + $packer->addBox(new TestBox('4x4x4Box', 4, 4, 4, 4, 4, 4, 4, 100)); - $packer = new Packer(); - $packer->addBox(new TestBox('Le petite box', 292, 336, 60, 10, 292, 336, 60, 9000)); - $packer->addBox(new TestBox('Le grande box', 421, 548, 335, 100, 421, 548, 335, 10000)); - $packer->addItem(new TestItem('Item 1', 226, 200, 40, 440)); - $packer->addItem(new TestItem('Item 2', 200, 200, 155, 1660)); - $packedBoxes = $packer->pack(); + $packer->addItem(new TestItem('BigItem', 2, 2, 4, 1), 2); + $packer->addItem(new TestItem('SmallItem', 1, 1, 1, 1), 32); + $packedBoxes = $packer->pack(); - self::assertEquals(1, $packedBoxes->count()); + self::assertEquals(1, $packedBoxes->count()); } - public function testIssue3() { + public function testIssue13() + { + $packer = new Packer(); + $packer->addBox(new TestBox('Le petite box', 12, 12, 12, 10, 10, 10, 10, 1000)); - $packer = new Packer(); - $packer->addBox(new TestBox('OW Box 1', 51, 33, 33, 0.6, 51, 33, 33, 0.6)); - $packer->addBox(new TestBox('OW Box 2', 50, 40, 40, 0.95, 50, 40, 40, 0.95)); - $packer->addItem(new TestItem('Product', 28, 19, 9, 0), 6); - $packedBoxes = $packer->pack(); + $packer->addItem(new TestItem('Item 1', 5, 3, 2, 2)); + $packer->addItem(new TestItem('Item 2', 5, 3, 2, 2)); + $packer->addItem(new TestItem('Item 3', 3, 3, 3, 3)); + $packedBoxes = $packer->pack(); - self::assertEquals(1, $packedBoxes->count()); + self::assertEquals(1, $packedBoxes->count()); } - public function testIssue6() { - - $packer = new Packer(); - $packer->addBox(new TestBox('Package 22', 675, 360, 210, 2, 670, 355, 204, 1000)); - $packer->addBox(new TestBox('Package 2', 330, 130, 102, 2, 335, 135, 107, 1000)); - $packer->addItem(new TestItem('Item 3', 355.6, 335.28, 127, 1.5)); - $packer->addItem(new TestItem('Item 7', 330.2, 127, 101.6, 1)); - $packer->addItem(new TestItem('Item 7', 330.2, 127, 101.6, 1)); - $packedBoxes = $packer->pack(); + public function testIssue14() + { + $packer = new Packer(); + $packer->addBox(new TestBox('29x1x23Box', 29, 1, 23, 0, 29, 1, 23, 100)); + $packer->addItem(new TestItem('13x1x10Item', 13, 1, 10, 1)); + $packer->addItem(new TestItem('9x1x6Item', 9, 1, 6, 1)); + $packer->addItem(new TestItem('9x1x6Item', 9, 1, 6, 1)); + $packer->addItem(new TestItem('9x1x6Item', 9, 1, 6, 1)); + $packedBoxes = $packer->pack(); + + self::assertEquals(1, $packedBoxes->count()); + } - self::assertEquals(1, $packedBoxes->count()); + public function testIssue47A() + { + $packer = new Packer(); + $packer->addBox(new TestBox('165x225x25Box', 165, 225, 25, 0, 165, 225, 25, 100)); + $packer->addItem(new TestItem('20x69x20Item', 20, 69, 20, 0), 23); + $packedBoxes = $packer->pack(); + self::assertEquals(1, $packedBoxes->count()); } - public function testIssue9() { - $packer = new Packer(); - $packer->addBox(new TestBox('24x24x24Box', 24, 24, 24, 24, 24, 24, 24, 100)); + public function testIssue47B() + { + $packer = new Packer(); + $packer->addBox(new TestBox('165x225x25Box', 165, 225, 25, 0, 165, 225, 25, 100)); + $packer->addItem(new TestItem('20x69x20Item', 69, 20, 20, 0), 23); + $packedBoxes = $packer->pack(); - $packer->addItem(new TestItem('6x6x6Item', 6, 6, 6, 1), 64); - $packedBoxes = $packer->pack(); - - self::assertEquals(1, $packedBoxes->count()); + self::assertEquals(1, $packedBoxes->count()); } - public function testIssue11() { - $packer = new Packer(); - $packer->addBox(new TestBox('4x4x4Box', 4, 4, 4, 4, 4, 4, 4, 100)); - - $packer->addItem(new TestItem('BigItem', 2, 2, 4, 1), 2); - $packer->addItem(new TestItem('SmallItem', 1, 1, 1, 1), 32); - $packedBoxes = $packer->pack(); + public function testIssue47C() + { + $packer = new Packer(); + $packer->addBox(new TestBox('Box', 11.75, 23.6875, 3, 0, 11.75, 23.6875, 3, 70)); + $packer->addItem(new TestItem('Item', 3.75, 6.5, 3, 0), 9); + $packedBoxes = $packer->pack(); - self::assertEquals(1, $packedBoxes->count()); + self::assertEquals(1, $packedBoxes->count()); } - public function testIssue13() { - $packer = new Packer(); - $packer->addBox(new TestBox('Le petite box', 12, 12, 12, 10, 10, 10, 10, 1000)); + public function testIssue47D() + { + $packer = new Packer(); + $packer->addBox(new TestBox('Box', 11.75, 23.6875, 3, 0, 11.75, 23.6875, 3, 70)); + $packer->addItem(new TestItem('Item', 6.5, 3.75, 3, 0), 9); + $packedBoxes = $packer->pack(); - $packer->addItem(new TestItem('Item 1', 5, 3, 2, 2)); - $packer->addItem(new TestItem('Item 2', 5, 3, 2, 2)); - $packer->addItem(new TestItem('Item 3', 3, 3, 3, 3)); - $packedBoxes = $packer->pack(); - - self::assertEquals(1, $packedBoxes->count()); + self::assertEquals(1, $packedBoxes->count()); } - public function testIssue14() { - $packer = new Packer(); - $packer->addBox(new TestBox('29x1x23Box', 29, 1, 23, 0, 29, 1, 23, 100)); - $packer->addItem(new TestItem('13x1x10Item', 13, 1, 10, 1)); - $packer->addItem(new TestItem('9x1x6Item', 9, 1, 6, 1)); - $packer->addItem(new TestItem('9x1x6Item', 9, 1, 6, 1)); - $packer->addItem(new TestItem('9x1x6Item', 9, 1, 6, 1)); - $packedBoxes = $packer->pack(); + public function testPackerPacksRotatedBoxesInNewRow() + { + $packer = new Packer(); + $packer->addItem(new TestItem('30x10x30item', 30, 10, 30, 0), 9); + + //Box can hold 7 items in a row and then is completely full, so 9 items won't fit + $packer->addBox(new TestBox('30x70x30InternalBox', 30, 70, 30, 0, 30, 70, 30, 0, 1000)); + $packedBoxes = $packer->pack(); + self::assertEquals(2, $packedBoxes->count()); + + //Box can hold 7 items in a row, plus two more rotated, making 9 items + // with a 10x10x30 hole in the corner. + // + // Overhead view: + // + // +--+--++ + // ++++++++ + // |||||||| + // ++++++++ + // + $packer = new Packer(); + $packer->addItem(new TestItem('30x10x30item', 30, 10, 30, 0), 9); + $packer->addBox(new TestBox('40x70x30InternalBox', 40, 70, 30, 0, 40, 70, 30, 0, 1000)); + $packedBoxes = $packer->pack(); + self::assertEquals(1, $packedBoxes->count()); + + // Make sure that it doesn't try to fit in a 10th item + $packer = new Packer(); + $packer->addItem(new TestItem('30x10x30item', 30, 10, 30, 0), 10); + $packer->addBox(new TestBox('40x70x30InternalBox', 40, 70, 30, 0, 40, 70, 30, 0, 1000)); + $packedBoxes = $packer->pack(); + self::assertEquals(2, $packedBoxes->count()); + } - self::assertEquals(1, $packedBoxes->count()); + public function testIssue52A() + { + $packer = new Packer(); + $packer->addBox(new TestBox('Box', 100, 50, 50, 0, 100, 50, 50, 5000)); + $packer->addItem(new TestItem('Item', 15, 13, 8, 407), 2); + $packedBoxes = $packer->pack(); + + self::assertEquals(1, $packedBoxes->count()); + self::assertEquals(26, $packedBoxes->top()->getUsedWidth()); + self::assertEquals(15, $packedBoxes->top()->getUsedLength()); + self::assertEquals(8, $packedBoxes->top()->getUsedDepth()); } - public function testPackerPacksRotatedBoxesInNewRow() { - $packer = new Packer(); - $packer->addItem(new TestItem('30x10x30item', 30, 10, 30, 0), 9); - - //Box can hold 7 items in a row and then is completely full, so 9 items won't fit - $packer->addBox(new TestBox('30x70x30InternalBox', 30, 70, 30, 0, 30, 70, 30, 0, 1000)); - $packedBoxes = $packer->pack(); - self::assertEquals(2, $packedBoxes->count()); - - //Box can hold 7 items in a row, plus two more rotated, making 9 items - // with a 10x10x30 hole in the corner. - // - // Overhead view: - // - // +--+--++ - // ++++++++ - // |||||||| - // ++++++++ - // - $packer = new Packer(); - $packer->addItem(new TestItem('30x10x30item', 30, 10, 30, 0), 9); - $packer->addBox(new TestBox('40x70x30InternalBox', 40, 70, 30, 0, 40, 70, 30, 0, 1000)); - $packedBoxes = $packer->pack(); - self::assertEquals(1, $packedBoxes->count()); - - // Make sure that it doesn't try to fit in a 10th item - $packer = new Packer(); - $packer->addItem(new TestItem('30x10x30item', 30, 10, 30, 0), 10); - $packer->addBox(new TestBox('40x70x30InternalBox', 40, 70, 30, 0, 40, 70, 30, 0, 1000)); - $packedBoxes = $packer->pack(); - self::assertEquals(2, $packedBoxes->count()); + public function testIssue52B() + { + $packer = new Packer(); + $packer->addBox(new TestBox('Box',370,375,60,140,364,374,40,3000)); + $packer->addItem(new TestItem('Item 1',220,310,12,679)); + $packer->addItem(new TestItem('Item 2',210,297,11,648)); + $packer->addItem(new TestItem('Item 3',210,297,5,187)); + $packer->addItem(new TestItem('Item 4',148,210,32,880)); + $packedBoxes = $packer->pack(); + + self::assertEquals(1, $packedBoxes->count()); + self::assertEquals(368, $packedBoxes->top()->getUsedWidth()); + self::assertEquals(310, $packedBoxes->top()->getUsedLength()); + self::assertEquals(32, $packedBoxes->top()->getUsedDepth()); } + public function testIssue52C() + { + $packer = new Packer(); + $packer->addBox(new TestBox('Box',230,300,240,160,230,300,240,15000)); + $packer->addItem(new TestItem('Item 1',210,297,4,213)); + $packer->addItem(new TestItem('Item 2',80,285,70,199)); + $packer->addItem(new TestItem('Item 3',80,285,70,199)); + $packedBoxes = $packer->pack(); + + self::assertEquals(2, $packedBoxes->count()); + $box1 = $packedBoxes->extract(); + $box2 = $packedBoxes->extract(); + + self::assertEquals(285, $box1->getUsedWidth()); + self::assertEquals(160, $box1->getUsedLength()); + self::assertEquals(70, $box1->getUsedDepth()); + + self::assertEquals(297, $box2->getUsedWidth()); + self::assertEquals(210, $box2->getUsedLength()); + self::assertEquals(4, $box2->getUsedDepth()); + } - //PHP7/HHVM behave(d) differently than PHP5.x - public function testWeightRedistribution() { - - $box = new TestBox('Box', 370,375,60,140,364,374,40,3000); - $item1 = new TestItem('Item #1', 230, 330, 6, 320); - $item2 = new TestItem('Item #2', 210, 297, 5, 187); - $item3 = new TestItem('Item #3', 210, 297, 11, 674); - $item4 = new TestItem('Item #4', 210, 297, 3, 82); - $item5 = new TestItem('Item #5', 206, 295, 4, 217); - - $box1Items = new ItemList(); - $box1Items->insert(clone $item1); - $box1Items->insert(clone $item1); - $box1Items->insert(clone $item1); - $box1Items->insert(clone $item1); - $box1Items->insert(clone $item1); - $box1Items->insert(clone $item1); - $box1Items->insert(clone $item5); - - $box2Items = new ItemList(); - $box2Items->insert(clone $item3); - $box2Items->insert(clone $item1); - $box2Items->insert(clone $item1); - $box2Items->insert(clone $item1); - $box2Items->insert(clone $item1); - $box2Items->insert(clone $item2); - - $box3Items = new ItemList(); - $box3Items->insert(clone $item5); - $box3Items->insert(clone $item4); - - $packedBox1 = new PackedBox($box, $box1Items, 0, 0, 0, 0); - $packedBox2 = new PackedBox($box, $box2Items, 0, 0, 0, 0); - $packedBox3 = new PackedBox($box, $box3Items, 0, 0, 0, 0); - - $packedBoxList = new PackedBoxList(); - $packedBoxList->insert($packedBox1); - $packedBoxList->insert($packedBox2); - $packedBoxList->insert($packedBox3); - - $packer = new Packer(); - $packer->addBox($box); - $packedBoxes = $packer->redistributeWeight($packedBoxList); - - $packedItemCount = 0; - foreach (clone $packedBoxes as $packedBox) { - $packedItemCount += $packedBox->getItems()->count(); - } - - self::assertEquals(3070, (int) $packedBoxes->getWeightVariance()); + public function testIssue79() { + $packer = new Packer(); + $packer->addBox(new TestBox('Bundle', 75, 15, 15, 0, 75, 15, 15, 30)); + $packer->addItem(new TestItem('Item 1', 14, 12, 2, 2)); + $packer->addItem(new TestItem('Item 2', 14, 12, 2, 2)); + $packer->addItem(new TestItem('Item 3', 14, 12, 2, 2)); + $packer->addItem(new TestItem('Item 4', 14, 12, 2, 2)); + $packer->addItem(new TestItem('Item 5', 14, 12, 2, 2)); + $packedBoxes = $packer->pack(); + $box = $packedBoxes->extract(); + + self::assertEquals(60, $box->getUsedWidth()); + self::assertEquals(14, $box->getUsedLength()); + self::assertEquals(2, $box->getUsedDepth()); } /** * @dataProvider getSamples * @coversNothing */ - public function testCanPackRepresentativeLargerSamples($test, $boxes, $items, $expectedBoxes, $expectedWeightVariance) { - - $expectedItemCount = 0; - $packedItemCount = 0; + public function testCanPackRepresentativeLargerSamples2D( + $test, + $boxes, + $items, + $expectedBoxes2D, + $expectedBoxes3D, + $expectedWeightVariance2D, + $expectedWeightVariance3D + ) { + $expectedItemCount = 0; + $packedItemCount = 0; + + $packer = new Packer(); + foreach ($boxes as $box) { + $packer->addBox($box); + } + foreach ($items as $item) { + $packer->addItem( + new TestItem( + $item['name'], + $item['width'], + $item['length'], + $item['depth'], + $item['weight'], + true + ), + $item['qty'] + ); + $expectedItemCount += $item['qty']; + } + $packedBoxes = $packer->pack(); - $packer = new Packer(); - foreach($boxes as $box) { - $packer->addBox($box); - } - foreach ($items as $item) { - $packer->addItem(new TestItem($item['name'], $item['width'], $item['length'], $item['depth'], $item['weight']), $item['qty']); - $expectedItemCount += $item['qty']; - } - $packedBoxes = $packer->pack(); + foreach (clone $packedBoxes as $packedBox) { + $packedItemCount += $packedBox->getItems()->count(); + } - foreach (clone $packedBoxes as $packedBox) { - $packedItemCount += $packedBox->getItems()->count(); - } + self::assertEquals($expectedBoxes2D, $packedBoxes->count()); + self::assertEquals($expectedItemCount, $packedItemCount); + self::assertEquals($expectedWeightVariance2D, (int)$packedBoxes->getWeightVariance()); + } - self::assertEquals($expectedBoxes, $packedBoxes->count()); - self::assertEquals($expectedItemCount, $packedItemCount); - self::assertEquals($expectedWeightVariance, (int) $packedBoxes->getWeightVariance()); + public function getSamples() + { + $expected = ['2D' => [], '3D' => []]; - } + $expected2DData = fopen(__DIR__ . '/data/expected2d.csv', 'r'); + while ($data = fgetcsv($expected2DData)) { + $expected['2D'][$data[0]] = array('boxes' => $data[1], 'weightVariance' => $data[2]); + } + fclose($expected2DData); - public function getSamples() { - - $expected = []; - $expectedData = fopen(__DIR__ . '/data/expected.csv', 'r'); - while ($data = fgetcsv($expectedData)) { - $expected[$data[0]] = array('boxes' => $data[1], 'weightVariance' => $data[2]); - } - fclose($expectedData); - - $boxes = []; - $boxData = fopen(__DIR__ . '/data/boxes.csv', 'r'); - while ($data = fgetcsv($boxData)) { - $boxes[] = new TestBox($data[0], $data[1], $data[2], $data[3], $data[4], $data[5], $data[6], $data[7], $data[8]); - } - fclose($boxData); - - $tests = []; - $itemData = fopen(__DIR__ . '/data/items.csv', 'r'); - while ($data = fgetcsv($itemData)) { - - if (isset($tests[$data[0]])) { - $tests[$data[0]]['items'][] = array('qty' => $data[1], - 'name' => $data[2], - 'width' => $data[3], - 'length' => $data[4], - 'depth' => $data[5], - 'weight' => $data[6]); + $expected3DData = fopen(__DIR__ . '/data/expected3d.csv', 'r'); + while ($data = fgetcsv($expected3DData)) { + $expected['3D'][$data[0]] = array('boxes' => $data[1], 'weightVariance' => $data[2]); + } + fclose($expected3DData); + + $boxes = []; + $boxData = fopen(__DIR__ . '/data/boxes.csv', 'r'); + while ($data = fgetcsv($boxData)) { + $boxes[] = new TestBox( + $data[0], + $data[1], + $data[2], + $data[3], + $data[4], + $data[5], + $data[6], + $data[7], + $data[8] + ); } - else { - $tests[$data[0]] = array('test' => $data[0], - 'boxes' => $boxes, - 'items' => array(array('qty' => $data[1], - 'name' => $data[2], - 'width' => $data[3], - 'length' => $data[4], - 'depth' => $data[5], - 'weight' => $data[6])), - 'expected' => $expected[$data[0]]['boxes'], - 'weightVariance' => $expected[$data[0]]['weightVariance']); + fclose($boxData); + + $tests = []; + $itemData = fopen(__DIR__ . '/data/items.csv', 'r'); + while ($data = fgetcsv($itemData)) { + + if (isset($tests[$data[0]])) { + $tests[$data[0]]['items'][] = array( + 'qty' => $data[1], + 'name' => $data[2], + 'width' => $data[3], + 'length' => $data[4], + 'depth' => $data[5], + 'weight' => $data[6] + ); + } else { + $tests[$data[0]] = array( + 'test' => $data[0], + 'boxes' => $boxes, + 'items' => array( + array( + 'qty' => $data[1], + 'name' => $data[2], + 'width' => $data[3], + 'length' => $data[4], + 'depth' => $data[5], + 'weight' => $data[6] + ) + ), + 'expected2D' => $expected['2D'][$data[0]]['boxes'], + 'expected3D' => $expected['3D'][$data[0]]['boxes'], + 'weightVariance2D' => $expected['2D'][$data[0]]['weightVariance'], + 'weightVariance3D' => $expected['3D'][$data[0]]['weightVariance'] + ); + } } - } - fclose($itemData); + fclose($itemData); - return $tests; + return $tests; } - } +} diff --git a/tests/Test/TestBox.php b/tests/Test/TestBox.php new file mode 100644 index 00000000..6535090a --- /dev/null +++ b/tests/Test/TestBox.php @@ -0,0 +1,181 @@ +reference = $reference; + $this->outerWidth = $outerWidth; + $this->outerLength = $outerLength; + $this->outerDepth = $outerDepth; + $this->emptyWeight = $emptyWeight; + $this->innerWidth = $innerWidth; + $this->innerLength = $innerLength; + $this->innerDepth = $innerDepth; + $this->maxWeight = $maxWeight; + $this->innerVolume = $this->innerWidth * $this->innerLength * $this->innerDepth; + } + + /** + * @return string + */ + public function getReference() + { + return $this->reference; + } + + /** + * @return int + */ + public function getOuterWidth() + { + return $this->outerWidth; + } + + /** + * @return int + */ + public function getOuterLength() + { + return $this->outerLength; + } + + /** + * @return int + */ + public function getOuterDepth() + { + return $this->outerDepth; + } + + /** + * @return int + */ + public function getEmptyWeight() + { + return $this->emptyWeight; + } + + /** + * @return int + */ + public function getInnerWidth() + { + return $this->innerWidth; + } + + /** + * @return int + */ + public function getInnerLength() + { + return $this->innerLength; + } + + /** + * @return int + */ + public function getInnerDepth() + { + return $this->innerDepth; + } + + /** + * @return int + */ + public function getInnerVolume() + { + return $this->innerVolume; + } + + /** + * @return int + */ + public function getMaxWeight() + { + return $this->maxWeight; + } +} + diff --git a/tests/Test/TestConstrainedTestItem.php b/tests/Test/TestConstrainedTestItem.php new file mode 100644 index 00000000..63d45fb4 --- /dev/null +++ b/tests/Test/TestConstrainedTestItem.php @@ -0,0 +1,39 @@ +asArray(), + function(TestItem $item) { + return $item->getDescription() === $this->getDescription(); + } + ); + + return count($alreadyPackedType) + 1 <= static::$limit; + } +} + diff --git a/tests/Test/TestItem.php b/tests/Test/TestItem.php new file mode 100644 index 00000000..5a3866ec --- /dev/null +++ b/tests/Test/TestItem.php @@ -0,0 +1,114 @@ +description = $description; + $this->width = $width; + $this->length = $length; + $this->depth = $depth; + $this->weight = $weight; + + $this->volume = $this->width * $this->length * $this->depth; + } + + /** + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * @return int + */ + public function getWidth() + { + return $this->width; + } + + /** + * @return int + */ + public function getLength() + { + return $this->length; + } + + /** + * @return int + */ + public function getDepth() + { + return $this->depth; + } + + /** + * @return int + */ + public function getWeight() + { + return $this->weight; + } + + /** + * @return int + */ + public function getVolume() + { + return $this->volume; + } +} + + diff --git a/tests/VolumePackerTest.php b/tests/VolumePackerTest.php new file mode 100644 index 00000000..cf30de9a --- /dev/null +++ b/tests/VolumePackerTest.php @@ -0,0 +1,190 @@ +insert(new TestItem('Item 1', 250, 250, 2, 200)); + $items->insert(new TestItem('Item 2', 250, 250, 2, 200)); + $items->insert(new TestItem('Item 3', 250, 250, 2, 200)); + + $packer = new VolumePacker($box, $items); + $packedBox = $packer->pack(); + + self::assertEquals(3, $packedBox->getItems()->count()); + } + + public function testPackBoxThreeItemsFitExactly() + { + + $box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000); + + $items = new ItemList; + $items->insert(new TestItem('Item 1', 296, 296, 2, 200)); + $items->insert(new TestItem('Item 2', 296, 296, 2, 500)); + $items->insert(new TestItem('Item 3', 296, 296, 4, 290)); + + $packer = new VolumePacker($box, $items); + $packedBox = $packer->pack(); + + self::assertEquals(3, $packedBox->getItems()->count()); + } + + public function testPackBoxThreeItemsFitExactlyNoRotation() + { + + $box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000); + + $items = new ItemList; + $items->insert(new TestItem('Item 1', 296, 148, 2, 200)); + $items->insert(new TestItem('Item 2', 296, 148, 2, 500)); + + $packer = new VolumePacker($box, $items); + $packedBox = $packer->pack(); + + self::assertEquals(2, $packedBox->getItems()->count()); + } + + public function testPackBoxThreeItemsFitSizeButOverweight() + { + + $box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000); + + $items = new ItemList; + $items->insert(new TestItem('Item 1', 250, 250, 2, 400)); + $items->insert(new TestItem('Item 2', 250, 250, 2, 500)); + $items->insert(new TestItem('Item 3', 250, 250, 2, 200)); + + $packer = new VolumePacker($box, $items); + $packedBox = $packer->pack(); + + self::assertEquals(2, $packedBox->getItems()->count()); + } + + public function testPackBoxThreeItemsFitWeightBut2Oversize() + { + + $box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000); + + $items = new ItemList; + $items->insert(new TestItem('Item 1', 297, 296, 2, 200)); + $items->insert(new TestItem('Item 2', 297, 296, 2, 500)); + $items->insert(new TestItem('Item 3', 296, 296, 4, 290)); + + $packer = new VolumePacker($box, $items); + $packedBox = $packer->pack(); + + self::assertEquals(1, $packedBox->getItems()->count()); + } + + public function testPackTwoItemsFitExactlySideBySide() + { + + $box = new TestBox('Le box', 300, 400, 10, 10, 296, 496, 8, 1000); + + $items = new ItemList; + $items->insert(new TestItem('Item 1', 296, 248, 8, 200)); + $items->insert(new TestItem('Item 2', 248, 296, 8, 200)); + + $packer = new VolumePacker($box, $items); + $packedBox = $packer->pack(); + + self::assertEquals(2, $packedBox->getItems()->count()); + } + + public function testPackThreeItemsBottom2FitSideBySideOneExactlyOnTop() + { + + $box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000); + + $items = new ItemList; + $items->insert(new TestItem('Item 1', 248, 148, 4, 200)); + $items->insert(new TestItem('Item 2', 148, 248, 4, 200)); + $items->insert(new TestItem('Item 3', 296, 296, 4, 200)); + + $packer = new VolumePacker($box, $items); + $packedBox = $packer->pack(); + + self::assertEquals(3, $packedBox->getItems()->count()); + } + + public function testPackThreeItemsBottom2FitSideBySideWithSpareSpaceOneOverhangSlightlyOnTop() + { + + $box = new TestBox('Le box', 250, 250, 10, 10, 248, 248, 8, 1000); + + $items = new ItemList; + $items->insert(new TestItem('Item 1', 200, 200, 4, 200)); + $items->insert(new TestItem('Item 2', 110, 110, 4, 200)); + $items->insert(new TestItem('Item 3', 110, 110, 4, 200)); + + $packer = new VolumePacker($box, $items); + $packedBox = $packer->pack(); + + self::assertEquals(3, $packedBox->getItems()->count()); + } + + public function testPackSingleItemFitsBetterRotated() + { + + $box = new TestBox('Le box', 400, 300, 10, 10, 396, 296, 8, 1000); + + $items = new ItemList; + $items->insert(new TestItem('Item 1', 250, 290, 2, 200)); + + $packer = new VolumePacker($box, $items); + $packedBox = $packer->pack(); + + self::assertEquals(1, $packedBox->getItems()->count()); + } + + public function testIssue53() + { + $packer = new Packer(); + $packer->addBox(new TestBox('Box', 500, 1000, 500, 0, 500, 1000, 500, 0)); + $packer->addItem(new TestItem('Item 1', 500, 500, 500, 0)); + $packer->addItem(new TestItem('Item 2', 500, 500, 250, 0), 2); + $packedBoxes = $packer->pack(); + + self::assertEquals(1, $packedBoxes->count()); + } + + public function testIssue75() + { + $packer = new Packer(); + $packer->addBox(new TestBox('CONTAINER (20 x 12 x 10)', 20, 12, 10, 0, 20, 12, 10, 2500)); + $packer->addItem(new TestItem('B (12 x 12 x 5)', 12, 12, 5, 8),2); + $packer->addItem(new TestItem('C (8 x 12 x 5)', 8, 12, 5, 8),2); + $packedBoxes = $packer->pack(); + + self::assertEquals(1, $packedBoxes->count()); + } + + public function testConstraints() + { + TestConstrainedTestItem::$limit = 2; + + $packer = new Packer(); + $packer->addBox(new TestBox('Box', 10, 10, 10, 0, 10, 10, 10, 0)); + $packer->addItem(new TestConstrainedTestItem('Item', 1, 1, 1, 0), 8); + $packedBoxes = $packer->pack(); + + self::assertEquals(4, $packedBoxes->count()); + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php deleted file mode 100644 index 93f84f18..00000000 --- a/tests/bootstrap.php +++ /dev/null @@ -1,101 +0,0 @@ -reference = $reference; - $this->outerWidth = $outerWidth; - $this->outerLength = $outerLength; - $this->outerDepth = $outerDepth; - $this->emptyWeight = $emptyWeight; - $this->innerWidth = $innerWidth; - $this->innerLength = $innerLength; - $this->innerDepth = $innerDepth; - $this->maxWeight = $maxWeight; - $this->innerVolume = $this->innerWidth * $this->innerLength * $this->innerDepth; - } - - public function getReference() { - return $this->reference; - } - - public function getOuterWidth() { - return $this->outerWidth; - } - - public function getOuterLength() { - return $this->outerLength; - } - - public function getOuterDepth() { - return $this->outerDepth; - } - - public function getEmptyWeight() { - return $this->emptyWeight; - } - - public function getInnerWidth() { - return $this->innerWidth; - } - - public function getInnerLength() { - return $this->innerLength; - } - - public function getInnerDepth() { - return $this->innerDepth; - } - - public function getInnerVolume() { - return $this->innerVolume; - } - - public function getMaxWeight() { - return $this->maxWeight; - } - } - - class TestItem implements Item { - - public function __construct($description,$width,$length,$depth,$weight) { - $this->description = $description; - $this->width = $width; - $this->length = $length; - $this->depth = $depth; - $this->weight = $weight; - $this->volume = $this->width * $this->length * $this->depth; - } - - public function getDescription() { - return $this->description; - } - - public function getWidth() { - return $this->width; - } - - public function getLength() { - return $this->length; - } - - public function getDepth() { - return $this->depth; - } - - public function getWeight() { - return $this->weight; - } - - public function getVolume() { - return $this->volume; - } - } - diff --git a/tests/data/expected.csv b/tests/data/expected2d.csv similarity index 92% rename from tests/data/expected.csv rename to tests/data/expected2d.csv index 5c792bec..bd9e699a 100644 --- a/tests/data/expected.csv +++ b/tests/data/expected2d.csv @@ -9,7 +9,7 @@ 001c8b4432cdb77b175f3f6641d2e999,1,0 001d57d72de2bd7a49fe3fc7ecf1540b,1,0 001f4c4d83fc56d92b20463a9169da45,1,0 -003b0ae4f2883a8b1dd879ce9427b8dc,2,17556 +003b0ae4f2883a8b1dd879ce9427b8dc,1,0 0052503c5b3ae8acd0903b3e5e53f9a1,1,0 00595cdd640e7d9a3c5f1c208d915065,1,0 005cae5a6d3c095cd179b3dca813d5d2,1,0 @@ -18,7 +18,7 @@ 007858f41e3aa258da334f3724bec17c,1,0 007950d92588b3503fba5d8332d771a4,1,0 009da5d2b856bef84b9fba40a17946da,1,0 -009f0d24994b021fa2151198fe7dc839,2,72 +009f0d24994b021fa2151198fe7dc839,1,0 00a5c92624b11041245f8527d0724448,1,0 00a85cf3514d2c6b6af0045b56ea33f6,1,0 00bc6c102e88469c8b25a91d15240a27,1,0 @@ -61,9 +61,9 @@ 021043df46948f92604acaedfd836b72,1,0 02247d9b965c02b76c56f539a5b328de,1,0 022b005f3821042be9cc9b293a7bece9,1,0 -022d427fddf0f0ba070197ea120cb803,2,182 +022d427fddf0f0ba070197ea120cb803,1,0 02339d3f79a09587b1e95df382d25caa,2,34225 -02388a4df0d88b80ee34aa77fa875c21,2,14062500 +02388a4df0d88b80ee34aa77fa875c21,2,10329796 023cd5ca4ff048626461fb6bec62f456,1,0 026490ed40e4c3c44ef9a6652e804358,1,0 0269a01d71c1c557bff58c0c56def1e8,1,0 @@ -94,7 +94,7 @@ 03b07b744fb23d9f0c0b9ff20006aa45,2,169 03b2b3ef702e75ea99a009d711df4874,2,0 03c3527f76fd51521a3fb906feef5c11,1,0 -03c6eb712530050d2a0a70151a7f32b0,2,4160 +03c6eb712530050d2a0a70151a7f32b0,2,3306 03daac497b69844a5614d6445fe8bcf8,1,0 03e1d416d8f1434168d3db31cc24dcb1,1,0 03f8d4fd6cdc4ebc5d054d6034f2374c,1,0 @@ -105,7 +105,7 @@ 046f8f72de0e6138363511df08ebc1ff,1,0 0471ae53555af80e1ee3d9080b8cf17a,1,0 0473c6dd804ee3b7fb451b7f143d7b97,1,0 -04805d01af90f7a0e8dedba7009f2e87,2,56 +04805d01af90f7a0e8dedba7009f2e87,2,72 0489cc63e7a518b98d38e7c42dda0074,1,0 04ac56ef0a98732990bcdb11f6bd901b,1,0 04b1608c6144fc8ed550a47dddc8e97f,1,0 @@ -124,7 +124,7 @@ 055faaa27e98405af37b33e77220f37e,1,0 0570e0d866b5f4d6576e6c87661b7492,1,0 0583138edb945a54c21ecbd1bee3bb74,1,0 -0589ea6d7faa29202d456b58f5958bca,2,367236 +0589ea6d7faa29202d456b58f5958bca,2,188356 058a604bb25e4b3211def3b48de5c077,1,0 0592a17a06696b009529c47398ae413d,1,0 05a0d7355f542616bdfaebd5eb2cf711,3,160600 @@ -137,7 +137,7 @@ 05f8c47a7ba3f97de2a9e1917c523c7d,1,0 06047ccd9e75b3835a4f2baf1cff1806,1,0 060b9e59a411127afa0b76b12f2cab10,1,0 -062130922782dfe7fe3732ce1d33e6bf,2,5476 +062130922782dfe7fe3732ce1d33e6bf,2,7225 06245f34f1757ab0a63e197127c343a6,1,0 062fa9662371cd2ead727dacab30e4fc,1,0 06345c7f769d9495f3871496c7a2a493,1,0 @@ -171,14 +171,14 @@ 07ba3b33beb570c242bcf41ac0d42a9f,1,0 07beb004a5e77a551ffbe947f661b221,3,11139 07c91f75f0fec5e2f8915063b6b21a9a,1,0 -07ce55f9be4a82448866f49d0b215577,2,9039042 +07ce55f9be4a82448866f49d0b215577,2,8505972 07d0157133ff50ed663fedcc17738e67,1,0 07ede23f03c941ef54dcd86630dec465,1,0 080f51fb5ffecd6c02ed162f12b888f8,1,0 0811c8c991979f97e3b7ebb16ad2d7fd,1,0 081d4e84c89d5dce4afb774e1d1d2b4b,1,0 082858b4a99ac2b83b93c69d64dfc0bb,1,0 -0831fb9c69b2d41c685d7b4c2a8ac623,2,2450 +0831fb9c69b2d41c685d7b4c2a8ac623,2,19182 083bd95cc96bc166c1dcd8456a4a5aa2,2,8464 083c18f9aa81b373ef48d4c75ab6df62,1,0 08401f95c72c51ecbc4e77a38adeab6e,1,0 @@ -204,14 +204,14 @@ 0929de7f17dfdac865160f4683a091f1,2,3782 092aca4a4960616e5758699fc0242fea,1,0 09417514af17447d817e59dbb33b7ca7,1,0 -09439a9302b7419954ddf39df4161961,2,29246464 +09439a9302b7419954ddf39df4161961,2,26584336 0956562fe323da7e156df4c6081fcaa8,1,0 09a3a3045abc2a58eded017798a8909a,1,0 09a4c78a8e0891b2a9e3d50a65037f92,1,0 09a9787dc54e80d50642d86a9cdbf202,2,0 09afc770b55a6b859544fa29809ed6c8,2,25600 09b141fd18a5af271ba1efa2196e0267,1,0 -09c5b203bf83f133b4013c3d2991fec6,2,2916 +09c5b203bf83f133b4013c3d2991fec6,2,2500 09d84d2dff8d25e8cbb8f63ac1dbcfe4,1,0 09dcfda35a6149fa4baea1fda1788198,2,11130 09e2db5a9b80b82937a139f3105fbf8e,2,4761 @@ -235,7 +235,7 @@ 0a95352f49b8a4501370aac0fec9c2f7,1,0 0aa6693470d3fdc7161331fa55e13ba0,1,0 0ab89fe2638d7fb52c000c6bccf17b48,1,0 -0adc7f903703764503ec78e64782783e,2,99225 +0adc7f903703764503ec78e64782783e,2,1296 0ae64226c86d13caaccc045c4fc41a9e,2,676 0ae8ca5ba0a30351aa4a0660202b58bb,1,0 0aed1d9162c4e908790fe593fcb48016,1,0 @@ -249,7 +249,7 @@ 0b2e2168e768c840e7982b7433c26fd6,1,0 0b311555b9d3a95da3b020e36ad49015,1,0 0b33edc86eb2ff71cf33b318aa693ad7,2,4096 -0b3b67f740a350db3bb7c85cd5162c6e,2,96100 +0b3b67f740a350db3bb7c85cd5162c6e,2,72361 0b42c09f1c805d839c3a48c60885d5c5,1,0 0b44bc17fe86d0e067c4c069dc80f9b2,1,0 0b44d7d8a3c6a5e8fe9f1dca83dbe074,1,0 @@ -261,7 +261,7 @@ 0b7149cf096c596dc9490cc32adb4ac5,1,0 0b758f34027d8cfc524c9d0ace003207,1,0 0b9e486c276f1443af942980aa213a24,1,0 -0ba8cc8122701bdbc378521bbab967bb,2,5184 +0ba8cc8122701bdbc378521bbab967bb,2,3844 0bc75701bd215ff542c198b7ac312366,1,0 0bdfdb2cd4a33e6224113a59bac6af28,2,8464 0be8f38f8f391caf75a2eb97cc81710a,1,0 @@ -300,7 +300,7 @@ 0d167c09dc3afcd70dd5728b1cad0d93,1,0 0d1983784732e45a55b1040a82db07c1,1,0 0d35aba678c039f477280c22cdbe6d46,1,0 -0d36d441ceb0caec57d77547730409a8,2,2601 +0d36d441ceb0caec57d77547730409a8,2,20449 0d3c2338df7cc72f5fd90c4b315d4ff0,2,1410156 0d41f4783eeeb20337d3d1f7f058cfe2,3,337782 0d66c19661114ec65fb923367d0988fd,1,0 @@ -314,7 +314,7 @@ 0d9d0d3ac1c4114815f8d0a03d1f1c0c,1,0 0d9eed9deb761d004cfbba96aa41e4cd,2,289 0dab25a72aa2b1af1b1104ea637caf57,1,0 -0dab40433d70db3fa0aa2cfcf3a6adf8,2,3721 +0dab40433d70db3fa0aa2cfcf3a6adf8,2,6400 0dc7e6aa7925e91b7ed95f3fb46a24ac,2,1737124 0dd69752b0581f863670fe1fc341a0cb,2,64 0de591690429b7a90f2357f1923dbf45,1,0 @@ -340,7 +340,7 @@ 0ea031fc7b3937a32b03c29e7f3e57ba,1,0 0eace944f293ecea88a878b4576cf28a,1,0 0ec644e309fbf4a8e513bd1c6f59c535,1,0 -0ecdac1402b341feb550024ebdf3187a,3,23022040 +0ecdac1402b341feb550024ebdf3187a,3,21329636 0f1d795fa9b30b68243f2e7817636527,3,187734 0f246ad80da166487e6ad6d60eac0e53,1,0 0f3417dd97a8bca6495309e83a8fe122,1,0 @@ -362,11 +362,11 @@ 0fdf7d151bc346f4cebf1d68d1d699a6,2,42 0fe141261f88d82a9350cc01e831e92b,2,0 0ffcf796d7f552ffcd2743f792971727,1,0 -1007795d3079bb3acf30de577a474960,2,65280 +1007795d3079bb3acf30de577a474960,1,0 102668daca640519eab0c61556dde2af,1,0 -103e813ebe49170bed33111fa4bfac67,2,10302 +103e813ebe49170bed33111fa4bfac67,1,0 105353bfd74310a88566572e05331d1b,3,22755 -105ff82e4e133f248955d6a29a049b0f,2,39601 +105ff82e4e133f248955d6a29a049b0f,2,36 10600250d866d924a22595aa18a6d62e,7,545319 1063546c4ed2350f8dfc5cc2976e9c2f,1,0 107cd7b979d1603b982758a8405cda6c,1,0 @@ -401,7 +401,7 @@ 120a58c525ef8b268e784681ea2d748d,1,0 1215ae1f60071a4ccbe85373b0a36907,1,0 121ae169997274891425005fd26f1dab,1,0 -123062d6f6a24a1f35514fb3b35655fa,2,5929 +123062d6f6a24a1f35514fb3b35655fa,2,4489 123b4cdb69ba6ee957b086497f29750d,1,0 1265d690f3ffdd3c07186da78e05fc58,1,0 126e64611e341a1ca8beb19d4557d1ab,2,12769 @@ -416,7 +416,7 @@ 12a3714ab408c632443805bae5d5eac3,1,0 12a4349601e54af96f21cd1c69465ea3,1,0 12b8da5d8c4d3b8c4e9304585571ff00,1,0 -12bb8d3b86bb35d684b4bf2818536e26,2,25 +12bb8d3b86bb35d684b4bf2818536e26,2,8281 12c177002236edf68f132c92f8486092,1,0 12c9cb9fb957272d2469011ea5f52414,1,0 12ee29d472657dc03baf65a093b1c79e,2,2304 @@ -430,7 +430,7 @@ 132bd5251ea1b6f9862a0e432c269cd9,1,0 13338197eaef508e44f7f98bf4f24da4,1,0 1343ae5970f34aa307d83655f05e1369,1,0 -1353c40870c08308f85c46dd6e8fdead,2,24649 +1353c40870c08308f85c46dd6e8fdead,1,0 136d652800703d3856469a712565d27d,1,0 13760aaa652377b16a936e6b3f6238b8,1,0 137dfa8dbab93eccf47cbe3e5085e83e,1,0 @@ -438,7 +438,7 @@ 139a1732aa66155a9bd489188e11adb7,1,0 13b033d670114a7a522ebb823819e2d0,1,0 13b0f8c122e0bc9b659ecc0d07f7f847,1,0 -13b34989d80f6ad1d82aec123ecd3059,2,182 +13b34989d80f6ad1d82aec123ecd3059,2,2352 13b367a9c2f67535863b16bf4cbaf902,2,930 13b5600192bd5110260081b28c72b1d0,1,0 13bbfd54adee8b7f0f1bac309e0c05e0,1,0 @@ -446,7 +446,7 @@ 13c0823a134234459e294777c09755fe,1,0 13c495d7a7f64cdc4c4c53e3b71fe5f1,1,0 13c5ebb4ba0ad650e4c7009c9d350cc3,1,0 -13d7f222739a48a3baba049daab3a120,2,30 +13d7f222739a48a3baba049daab3a120,2,56 13db2dda7a36b30457597209bac2396e,2,35532 13fa0144e053bf444cff9af9c10c82c2,1,0 13fde7dfedf94cc298b3f8741d5e9758,2,213444 @@ -468,7 +468,7 @@ 154a652ef5c8a5ffc6b1dad0a8fc12a0,1,0 156943c04e44cc409aa9761fe374cde2,1,0 159ce68451de57300a1c21bf57d6aa62,1,0 -15b9d71cc8f2749f1e0e1aacd12d1f57,2,7027801 +15b9d71cc8f2749f1e0e1aacd12d1f57,2,4116841 15cdba8a57acf0cf65ae14b941dc6193,1,0 15d88a5d3172625e417577d19b5f75b9,1,0 15db68fa425701db671c3e08c711c8be,1,0 @@ -479,12 +479,12 @@ 163d126bd50284c6c22f52eb2acc9f23,1,0 16402717163e04a826604205d9aba029,1,0 16424a0329d70ba7c565c001e82c275d,1,0 -16630c85439fe3d365e6b745055eba5c,2,3152400 +16630c85439fe3d365e6b745055eba5c,2,2400950 16694a30ee52fce8f09a880754bb7f1b,1,0 1672e9897bfb16f7f644365da8d6992c,1,0 167db38fa514a30e70f167f70d19f214,1,0 -168065302d10d2f4b683e3d5e7475594,2,1637120 -1680b70ba864c313d28c9386ce54ac25,4,8575636 +168065302d10d2f4b683e3d5e7475594,2,536556 +1680b70ba864c313d28c9386ce54ac25,4,8008442 1694662b95ac32661ee2b45826bb54f6,1,0 16a2283358cddda00bf2e47e5ad746d3,1,0 16a59c72d05be053c19e4b32ceafaef0,1,0 @@ -498,7 +498,7 @@ 16f174fb41c7377fd050162de28a9557,1,0 16fbc8f6f5c9a151cb479f42e85d227a,1,0 16fd6ae426e0c1a784fa00ac704a2768,1,0 -170556f4b9e4c65587e59963ae41520e,2,78400 +170556f4b9e4c65587e59963ae41520e,2,81 1716a199178f72d3bca2332e613f7ac5,1,0 171aaeae0fff586f35165fcd47772eaf,2,35721 171f7badc43e34208270b5db59484857,1,0 @@ -536,7 +536,7 @@ 18ac679c76a235f2e1f930c11c4ded56,1,0 18ac9d54ad6e7e8e4ba558adb1acdb7c,1,0 18b2380360411f360cab8d261a3a1602,1,0 -18b3f02db85d77e654da01db9a4a9252,2,13456 +18b3f02db85d77e654da01db9a4a9252,1,0 18b5be50e12be4af41874cd3f10377ed,1,0 18ba339c7c22de578a5c298276ca0f0d,1,0 18c3d6f0617721248dfa8f460ec62fb6,2,256 @@ -557,13 +557,13 @@ 191909ab474fbb9f500c7c76f4f5697b,1,0 1927bc198a6b6b93a1d2dbbb6c11fd88,2,42 192aa66ebca07300ea732e2a05cdc370,1,0 -19389352a94fb01b2a359fdc23c5e62d,2,42 +19389352a94fb01b2a359fdc23c5e62d,2,6642 19471900c0fbc832cfcf3a64bd911d5d,1,0 194a256a5a4782ac7f049c2eb05fac01,1,0 1960c5d6c7d34a4b0eaf5e4cef6cc0af,2,1 1978adc9db55d8ea9a3fcb7c05b66854,1,0 199d20f7442756529544ab0b1b562f08,1,0 -19a82482257a115ed515fd8f108159c1,2,1807680 +19a82482257a115ed515fd8f108159c1,2,1093070 19a93053b78a62871886d6c754c6efeb,1,0 19ae8a76a13b7132df82add77f746d33,1,0 19bf77c5d38eace014480d17220e7b0b,1,0 @@ -621,7 +621,7 @@ 1c065f4a3680d7cde0db4c3bea7844f7,1,0 1c1a9d7a3095a1b0b8d20f3978ac75c8,1,0 1c257f4d2253487f6032962cd0f7e74e,1,0 -1c377344735c4bd2fbe2a7dbf0e0d293,2,729 +1c377344735c4bd2fbe2a7dbf0e0d293,2,36 1c4abe9fd7b843389bed396e61ff47c0,2,56406 1c513362d8359cc54e6edd42196eb244,2,1444 1c51b2f4fe04f93f476c671ca265202e,1,0 @@ -646,16 +646,16 @@ 1d4ee2f6da2778746e053ed7422d8c51,3,12970 1d61a12124fe4d8ce9d6dfc6cb178fe1,1,0 1d838cde6da3dc1acb90d46089603e46,1,0 -1d8e385ec516f5de7463369e52a7a347,2,2318006 +1d8e385ec516f5de7463369e52a7a347,2,1870056 1dac6e630d97bdf71a57203cec111af8,1,0 -1db0998574dc8165091f73c5a3f01819,2,2652 +1db0998574dc8165091f73c5a3f01819,2,306 1db30cd3712a8c309287cea04743754a,1,0 1dd0ca5d68b320cd9376b9aba37b3fd9,1,0 1dd25b0e6bc4c47dca5328ac92f071f7,1,0 1dde24cc2898e9ee781237c0c2aa7652,2,1024 1df1b1f792b9328801f40406008ec50b,1,0 1df392d16403002997b44e622b40c25d,1,0 -1df7261c9a68c7aac4557b3ef1c92689,2,8464 +1df7261c9a68c7aac4557b3ef1c92689,2,1764 1e2ea4827764957f2f0ebb6fc234b5a8,1,0 1e3576b097febae61d71b70ae74c1c91,9,169472 1e52311b44caf51b40cfe59ecb1142f4,2,25760 @@ -683,11 +683,11 @@ 1f51dea652b19ce9db60b12dfb1b58c6,1,0 1f6a39758b56bc10aec6ba55b34f8912,2,11881 1f706b3f264b93faa5d9a7918deb4456,2,37442 -1f87bf154d63455989b352ea94b3dfcd,2,41006 +1f87bf154d63455989b352ea94b3dfcd,2,18906 1f8c9133a6e79c41924becae0695988a,1,0 1f98f12faf5a5cd32adf0b59d34309b7,1,0 1f9bc3968e53725db6175dac9f8e5a50,1,0 -1fad94014cb3bca5e469c3db6bcb37aa,2,16 +1fad94014cb3bca5e469c3db6bcb37aa,2,9 1fb00e9197e1dd3b51f26501767f26d5,1,0 1fba23cbf4ea1686efac8fec64a9a8f5,1,0 1fbdfd6db9226d650797c7c31f0c5215,1,0 @@ -723,7 +723,7 @@ 21a0b79f586df93ea0cab3c23a3af1bb,1,0 21adf1e3167e4d7a31cf9c0b76f6d373,1,0 21cf601fd46cf67cb63fa7ab5d48207f,2,1600 -21e6c4ac1969e04400efcb225c1e5591,2,28224 +21e6c4ac1969e04400efcb225c1e5591,2,16129 21e7bae73a20bf0ea87cdceceee57bdb,1,0 21ec732212703ed0e54db3f7e8bc3f04,1,0 21ef546e0865a4b2a6fc055091688943,2,66049 @@ -742,7 +742,7 @@ 229f61e8d535d1fc91b0f93b77fa4486,2,36 22ac3fea9826846625a5b8f13c068036,1,0 22c8135eeb88d5e8fb85c8cdedd57021,3,8004 -22f57187b251f58cb8cc70258a4f61da,2,497025 +22f57187b251f58cb8cc70258a4f61da,2,300304 23096b18ade09c3fca57d138581726ff,1,0 23126a948870ee434a5813742e1c057b,1,0 23194f2b2917d2fa4338924defd04d6b,1,0 @@ -752,7 +752,7 @@ 235095bd8066371a348fef55f543a1a1,1,0 2352cab29095cc770565afc62dd8b648,1,0 235bfe967e831d566850568fa779212c,1,0 -237bbfe3a1449ed114ca1854114690fd,2,14768649 +237bbfe3a1449ed114ca1854114690fd,2,11431161 237f448b9a2fea70ac1bbda25647a606,1,0 2387960556f215eb0c515884ae73cb15,2,10712 2398406c0c2fcd739182b2e1197d627f,1,0 @@ -763,19 +763,19 @@ 23dd90c9f93b2b63f917d9925220cd6e,1,0 240b849406cba1c9bb4cd03301730fe7,1,0 241cf8d5e840a8145075d01de71b6781,1,0 -242162697b79a8867c04f0ce038f51be,2,110 +242162697b79a8867c04f0ce038f51be,2,702 24289d8ee637742500a24280810c4e05,1,0 2429c20ebf0745033be332c44bdfb130,2,256 242ec27d58bad2320c390e724a059c9d,1,0 -243c2f9b8192c14007f71c66ae09e359,3,787520 +243c2f9b8192c14007f71c66ae09e359,3,817328 243c8cab623188653d5097d1a5af6af4,2,64 2443af570acade3e36145cc9b7390c51,1,0 2446829e8ec2c44ddadb7d281a7d2786,1,0 2467a12731347cd3cb2e3dd584e15d6d,1,0 248726c012b571ac9abf326331502ea3,1,0 24954b7a00796ecf977e88bd2e8d9e10,1,0 -2499465ead429063b78212268d639e51,4,92620 -24af14adaa72f015d4d55644228984ff,2,23104 +2499465ead429063b78212268d639e51,4,102486 +24af14adaa72f015d4d55644228984ff,1,0 24b21b2a00c09e7a74480573cb8682fe,1,0 24ba59827b55655342b4154b7e474bf3,1,0 24c4863f0fe2488a5486c3770df0bbd2,1,0 @@ -810,7 +810,7 @@ 266caf080d5e2f5cd263dd22e6e5e045,2,2 26798f2da475796f816e1fc8df790eeb,1,0 26883b9c3c5fc5b01f6a925ef81e6f47,1,0 -269fe4641fd114dd756b6f5f05884b54,2,7921 +269fe4641fd114dd756b6f5f05884b54,2,3721 26b043cac817d012c21ed0d6c9c2e106,1,0 26bde79bb4f910332e70d1dfa56bbf94,1,0 26d27a1cfdc2b72798331d3050eafc6d,1,0 @@ -821,14 +821,14 @@ 27196022d71fa0c0209c10883e2472a5,1,0 274919613dc315f08d2d5e71ed6f412f,1,0 274d4edd3fdb72d972171d12e5cd517d,1,0 -2776f894339d90c191c7a6aea383ac89,3,674704 +2776f894339d90c191c7a6aea383ac89,3,646694 278bcce783f7aa499032b3a1d74ba04e,2,547600 2799dc1eff75690679fdc12f4255300e,1,0 27f2e8bbc0ce5e4c51925da8397e7681,1,0 27fd7ec6d28ce388dbfabf41333edc0c,1,0 28085d1303851b0229b26694333e0625,1,0 280fe52395dfeb4bc27d6ca93416fbde,1,0 -28163d6af74ee72cad63bf52d760bab2,2,529 +28163d6af74ee72cad63bf52d760bab2,2,169 2819f534da844e4a6940e78bbf5946ef,1,0 283c1171b89d69c9aae92c62cf0546f8,1,0 28481fadd5a3c0f21c78e8a20327974a,3,28362 @@ -840,17 +840,17 @@ 288e0f32f360f54c019013f94e23f2f5,1,0 288fbde55d9e095bc273d91016c91680,1,0 289699ed2c174fad2fcdde262d9f6540,1,0 -28be03d86716b7321350f487d5df448e,2,484 +28be03d86716b7321350f487d5df448e,1,0 28c7953ca4cfe936162454c247f9fe65,1,0 28ca4052d643d67ed4ecd704a1e2060b,2,252004 28ce15e3c0598fa12149b30d32a015b7,1,0 -28cf5ef3ea4c72897148af3ec5ab1e64,2,6400 +28cf5ef3ea4c72897148af3ec5ab1e64,1,0 28e00eab4f2fb97930a549aca90cb441,1,0 28e3e4dfaa23fd53638bf8de1d670756,1,0 28fcc98b4f9298fe43907130bda751d6,1,0 290b90065c9d1dd7e845d7f2ec27e25e,1,0 294522dc1d137b2699a1a58f6de0bf03,1,0 -294dcb100e42cb38390ad62bc798df6a,2,5112 +294dcb100e42cb38390ad62bc798df6a,2,702 296aa4b523f301c1f665afb07aee5c2b,1,0 297db2771298ef0447c9c9955754fd3e,2,64 29b60478ae220525096a25507b373e2e,2,4356 @@ -869,11 +869,11 @@ 2a65cfc1dacf90b1c4c80f28e44f0547,1,0 2a76d243fe2f35f7a9509320193bd879,1,0 2a8886d8dfe1682db88c0a2b1f9c1786,3,0 -2ab74f79bd7909a354db771d23c5d983,2,19044 +2ab74f79bd7909a354db771d23c5d983,2,52900 2ac1594fb9a767b6d37cba42f9c69e57,1,0 2ac238b975b9a21aac0aab210b73c58a,1,0 2af1cea745516b9dac949406483180e3,2,14400 -2b035aade40ca193585735fcbc44dd20,2,2256 +2b035aade40ca193585735fcbc44dd20,2,1406 2b21015ea86c14e7f1682782275acfa1,2,361 2b292c009c80b291c98b1a151180142e,2,0 2b43a7e7910e30cfa6e61b800dd1408e,2,4422 @@ -886,7 +886,7 @@ 2baccfef13644b2af8be7bc2fc673ff9,1,0 2bb8cf7e0bbcada766272e6e406330dc,2,1892 2bba98b9a0f110337122b7d36a32a034,1,0 -2bbebb2512cea8b96e0f453d8bc82e44,2,196692 +2bbebb2512cea8b96e0f453d8bc82e44,2,9312 2bd76d9aebbb490f59282abf34c70869,2,451584 2bf07e15c84b81dbcfd7b159343c1564,2,2 2c18d224d3563df1ffc1a44d4a999d52,1,0 @@ -920,7 +920,7 @@ 2d3690fdff28c15e0750a75845064299,2,13924 2d47ec05de0ce7446525ff62eda670a3,1,0 2d4fa4421f57d61e83780b068eb01a32,1,0 -2d5210195be8f48f980c6fd41abc9209,2,5476 +2d5210195be8f48f980c6fd41abc9209,2,1089 2d6e584477b7a9bd0040d011b5310e3f,1,0 2d947ab4b29374e52d1fd58b42ab1edd,1,0 2db3241b7c8958a946b219a592369bef,1,0 @@ -951,9 +951,9 @@ 2ed53646a729904612fc790873a4511b,1,0 2ef2a5c57c08c8c3b909c7022180dfaa,1,0 2f40c5cd89da22e706e4c2893c2dccb3,1,0 -2f419dab07b92225fa941d15b83f8314,2,19600 +2f419dab07b92225fa941d15b83f8314,1,0 2f465e9076de95b96b927208b46705f2,1,0 -2f537fcb5df6f785082d9548928e3d9b,7,2840074 +2f537fcb5df6f785082d9548928e3d9b,7,3178634 2f59969c2f5d7f75ec3b78396d271b87,1,0 2f5f3f5bdd74b62412f2f6245d78f6ef,1,0 2f6466b8866b7b8c515c89362098ad19,1,0 @@ -965,21 +965,21 @@ 2fc5594aa99d07d0db6bd9bcc9d74088,1,0 2fce926281d80f100ce2481b62ba1f5e,4,25600 2fd05724ba96577dbaabf098ea507b40,1,0 -2fe394593cd24c20272d4461127f2f99,2,625 +2fe394593cd24c20272d4461127f2f99,2,6724 2fe94be5e84bbf672aa657173a1aa5b7,1,0 2ff10514b75cee66dc6f7cabd62e1497,2,64 2fffff39600acb91a32853d9c8a8f8fa,1,0 3004d7b042ae19dca17e23572ccd0307,2,4356 300a552c32cf943b6cb1f89272b98f0a,1,0 -30207339e3ae62b06cfdaf7ff2bc7a60,2,1467732 -30239296520840f04db4b3553c44ebff,2,2 +30207339e3ae62b06cfdaf7ff2bc7a60,2,1118306 +30239296520840f04db4b3553c44ebff,2,12 3058994b05cdb67763ea7a7ee4ab33ff,1,0 306db218fea51e46b2be7741d8ec8ac9,3,14734 -3076c18ae7baa43ffe44347dde360671,2,756 +3076c18ae7baa43ffe44347dde360671,2,56 309fbc01864b25cc668f8d15da4e5c4b,1,0 30a145ca665d2274c16275506739b556,1,0 30b87f73891edca6c874cd5c08f9f2e1,1,0 -30b9f26493ae48785508388d29bf6278,2,291600 +30b9f26493ae48785508388d29bf6278,2,7744 30bcb01733c19e9b1a45f4d3b9fb46df,1,0 30c453d25bd1b32b18b9ed98b1014eb9,1,0 30cba2a4087f03528316eed34d391281,2,2070 @@ -999,7 +999,7 @@ 314048ee0fb5a898df6d22636af07ae9,1,0 31560490b0bd3b1fdc9ca0a99a37678c,1,0 31755722c3b85b5374871527cd937c4c,1,0 -3184d1f704cb4a956cd521ffcba1046c,2,169 +3184d1f704cb4a956cd521ffcba1046c,2,289 318b04c86f97f5bd50e9ec665dfc459d,1,0 3192f2069dccea539668e0f817f19f3b,1,0 31941acbe64cd3f68be863ecb170956f,1,0 @@ -1010,12 +1010,12 @@ 31c14b571dc20ac3a88b1db5e00d38f5,1,0 31d3aa94260518323149745747784975,1,0 321750ffd1c0f5eb2cb52d4398c65a0a,1,0 -3223ff53874ff3768881db6e163c96a3,2,414736 -323d3a61ac8f60761edc56c34b339a1d,2,8742 +3223ff53874ff3768881db6e163c96a3,2,99856 +323d3a61ac8f60761edc56c34b339a1d,1,0 3242e661790ad530e5a8419a5c7c0b5b,1,0 -3247e39c4bfd94e9f525f7ef5c179317,2,366025 +3247e39c4bfd94e9f525f7ef5c179317,2,4231249 326b6af0e5d3ac4f72622ce744ee4b27,1,0 -3276e0aa9afede0f2e5b0d5e3dcf7426,2,22801 +3276e0aa9afede0f2e5b0d5e3dcf7426,2,14884 328f28aadcd871aa3ade0646fda55b85,1,0 328f55c00a17ff9ab2d6f40d4144110b,1,0 32ae30b9ec25f60018f26bd4d1af34c0,1,0 @@ -1029,7 +1029,7 @@ 33657a6f7712f339a82a053ea111df6f,1,0 336aaa665a5b5f16db9aade3068bb62f,1,0 33713a88fa87c38343ee41674237f11c,1,0 -338cbfd9fbda572bdb5f969e79aa29dc,2,358801 +338cbfd9fbda572bdb5f969e79aa29dc,2,184900 33903f805cd452c1aaad7373861281bc,1,0 33a72f1349e63ccfac42968439da9316,2,576 33d4b1da34c847592dc36686290eed8c,1,0 @@ -1050,7 +1050,7 @@ 34c4f6cf4b6a3eda9848bd6fabb8d8c0,1,0 34d0f1758071f64a22d46bc1a47754cb,2,100 34d29e9f8f44b2b592a6a87eb4d1c3d2,1,0 -34da49aa71402781275d1366420e11c7,2,44732 +34da49aa71402781275d1366420e11c7,2,55460 34e1be2553feefb525b0b5047c8773e4,1,0 34e58e1a92dc3989e653e32264ee158b,1,0 3505138e251294a1aa7df203f9300829,2,64 @@ -1071,7 +1071,7 @@ 35cc13c1ac14b8dd34530a773ab2b242,1,0 35d2ac4fd9ba4dfacd63092fa5e53fff,1,0 35d339f18d9ec7bad395ad0577c90205,1,0 -35dd89ec6912312f95a326431e56ebf2,2,12250000 +35dd89ec6912312f95a326431e56ebf2,2,12145225 35e055e1a843ca3fa70b6479e747855a,1,0 35e3c7a4a56c418bfa1769605d62e4ff,1,0 35e3e2e06dcbf1005ced1c33e6dbe026,1,0 @@ -1091,14 +1091,14 @@ 36d050ed96f0c3a6c396f6a720d3d09d,1,0 36d0a71ff24cf612aa6f67429406384e,1,0 36d17d5d4a363775ab8f0a4dc0850076,1,0 -36dc47f2cf56e0088061c7c303f71397,2,3113460 +36dc47f2cf56e0088061c7c303f71397,2,2497980 36e15d1d4fd95f70d48fea99eb914d76,2,187489 36e71c43a05f58a24df559844858408e,1,0 36f02497ad0a7667ea0161713f63124f,1,0 36f66d38b52eb728c923d2a9445f0f60,1,0 3702c98cf273e30e08eeab16205ce064,2,2862 370818db5ed9bc534879357305747a8b,1,0 -37097d3d4e65f1e955856ed0376003a1,2,2304 +37097d3d4e65f1e955856ed0376003a1,2,6561 37429fc759e7dee68162eaa64f7677fd,1,0 3743efe135f630a88a1396b164e973f1,1,0 374f7e8792e077e6ed39899b27e32fee,1,0 @@ -1110,7 +1110,7 @@ 37aa0d8a09f08fe1ecb328633f10ba94,1,0 37c49c4ca1efceaaa35275e5bae079f5,1,0 37f3173198df341a277d065a321502d3,4,0 -37f70763eb8760921800f5cc403708e9,2,16370116 +37f70763eb8760921800f5cc403708e9,2,14455204 37f874c3360a75ae189781235d9953da,1,0 37ff00f25dac4c4770086b6c0bfdeaa7,1,0 3811ebf671f8339c86840f4967b0ecee,2,25600 @@ -1140,7 +1140,7 @@ 39479bb6f511ccd47ecbc3aa98cdbcc1,1,0 394f880149b80e60af966019e1ba0962,1,0 39533474e0e8138e6b7eb58fba0eb017,1,0 -395719bc23b0a6d144a7bddb733316fd,2,210 +395719bc23b0a6d144a7bddb733316fd,2,600 395c0ae9476d3757ee4e59655b28e82e,1,0 397fea1e089cf5eef44b8ef15f847844,1,0 39812ca5970ac223915a7766ee8dc62d,2,5256 @@ -1168,8 +1168,8 @@ 3a307cbd026f3f420871f41131f89012,1,0 3a37c4a592a4be22a8d8d5e4ee80d7e9,1,0 3a3dc364bfebd251baf6c465c212ed1c,1,0 -3a3f7d42355f64485a59cb25fd4f6eb2,2,1243225 -3a41ed4b08d3bbc912a4f4aaecee9dd0,3,15526646 +3a3f7d42355f64485a59cb25fd4f6eb2,2,1205604 +3a41ed4b08d3bbc912a4f4aaecee9dd0,3,14816216 3a505cd384cc4eb05934e959fad8185e,2,16900 3a5f312bc61069dfbada3bea35595687,1,0 3a8f892aefcf1c1de6b1b126fc6b22e2,1,0 @@ -1203,9 +1203,9 @@ 3bee0a82a9098c92945daac991fca070,2,12 3c1b74fc52f870503d59c3327da6d203,2,607620 3c29ccbdb900b4ade8f05884d9bafb1c,1,0 -3c2bc39429c8d1a0db6369149f454d65,2,4356 +3c2bc39429c8d1a0db6369149f454d65,2,2916 3c47276e13a1bf073b7f2987f09b21d9,1,0 -3c483603c5e87a59b5e762591bfe0b1e,2,729 +3c483603c5e87a59b5e762591bfe0b1e,2,14161 3c4f92d98c4e7792e46c0269daab7d6d,2,400 3c51cd3b2b4b213f076ba27e90d04225,3,6299530 3c583eb716f36fa0ebe89e3573c733c0,1,0 @@ -1214,10 +1214,10 @@ 3c818393311027c75019b2ba034de93b,1,0 3c99cb23c525923952d8f1b1b4b3ba0c,1,0 3ca27742b6e229b059d8bf4ef3b43388,1,0 -3cb72a7703f1b64b546fe2b12c6cef80,2,984064 +3cb72a7703f1b64b546fe2b12c6cef80,2,487204 3cbfbd3eb80d263f313fe2a234e2d031,1,0 3cc7b63f5e355127e29f54a965c7943d,1,0 -3cea529e6cc7f6e9e3dad087d778aabe,2,5550 +3cea529e6cc7f6e9e3dad087d778aabe,1,0 3cf7c19aca94dada099d78d1ea37f74f,1,0 3d0d56b5d475614b461ce18005952487,1,0 3d0f8af98a90479d141d397df22476e3,1,0 @@ -1226,7 +1226,7 @@ 3d48fa6f56d18697c7ca2af4e387a611,2,7056 3d64e640502ccfc5a94899c883659416,1,0 3da388214a261e7ebd90fe3a3c58ff2f,1,0 -3dae26103d7d8ff41aa1c547cf78f242,2,522729 +3dae26103d7d8ff41aa1c547cf78f242,2,330625 3dae601152e20b2d54152bb17e40d627,1,0 3db55231b451ee6982a19c6ffce11be7,2,16 3dbde9268a37583457d230812e7cf0be,1,0 @@ -1271,7 +1271,7 @@ 3fd963faf334d754bb0c3b8150dbd207,1,0 3fe17aead3c5393fce20862740ad5137,1,0 3fef0065b823d4b09016d1945deb7329,1,0 -3fefa94d6ad10f4a36e0e69b460c0b09,2,1122 +3fefa94d6ad10f4a36e0e69b460c0b09,2,20 401d8fbf2fa3309c2ae56c907b886abe,2,100 402dcec8801b5134787e4c55d06d14b2,1,0 40367a047b866dfbfdfb494bb1f7fef7,1,0 @@ -1282,9 +1282,9 @@ 40760c22eee2c4d4c8f586d7ee52cce3,3,22755 407d4561c9cfdba54ff3d4f70ab8560f,1,0 408e426ef134340cb6b4a67f2b5f1efe,1,0 -40999575e5fbf9bf7bb387bfce7b1f72,2,9801 +40999575e5fbf9bf7bb387bfce7b1f72,1,0 40a8c29c07461c56476da542e4833137,2,90 -40b66f54ab0332c255ea016fa6cc9789,2,42 +40b66f54ab0332c255ea016fa6cc9789,2,25122 40ecc71da95a3d82f0007469cc897417,1,0 40ff4b639acc26f3bdc98002b716380a,1,0 410cac71760b16a88bb0dbaf88a4d996,1,0 @@ -1297,7 +1297,7 @@ 414fe91e92f8ee2b9da5bd53947e8602,1,0 4155b3e8153c79b68a5a0779be6c6f3c,1,0 415f7f89525d77c17b95c6c838c18536,1,0 -4162ac2e41d7b5b8b916d6fb1e2beb2c,2,256 +4162ac2e41d7b5b8b916d6fb1e2beb2c,2,324 416513bca3c8be3e8c7c25a32a8434d7,1,0 4175dbdd2af48d4a8e517af0a69f2f3b,2,14762 417c520b1c5904699d21916bce7f68b6,1,0 @@ -1308,7 +1308,7 @@ 41ced7cdf40b84f5b1744fefb2606ad5,1,0 41e5428334d60821fac6482b9651c094,2,1332 41ed2d24b3d061ecc107fceb2c724f77,1,0 -41ff6cdc50b2dbb5afff635235b22c8c,2,1349082 +41ff6cdc50b2dbb5afff635235b22c8c,2,258572 4215e6728b1d996c2a46b887d82625f4,1,0 421c77d60e7431f45c8fa5dc54fedef9,2,19600 42234b2a9cf4163d23e3c343984da1f1,2,356409 @@ -1327,7 +1327,7 @@ 42d3d8a912a5130f233a0243ed3e7e89,3,696 42d8c748d36ffcdf2588d140afe972d2,1,0 42d90c4830bc59d179039ef906cff934,1,0 -42ddc34977d7bf725f37e8fe01b0eb76,2,39402 +42ddc34977d7bf725f37e8fe01b0eb76,2,29756 42e19bad9cd0741554c20d11c3c24fc9,1,0 42e9745c1400c0bd18a325c1a63ab30e,1,0 42f1d5af21a6bf349b20f638a3b5da4d,2,3249 @@ -1363,14 +1363,14 @@ 44b152555c04356b25f73e03b3c6c588,2,256 44beedc8c4c7a8ee5ead1606a9f67e22,2,19460 44c295d3726c40e6e23a85b33e55cbad,1,0 -44d6fc9cda0dc4618dc2f8987e93dd4e,2,225625 +44d6fc9cda0dc4618dc2f8987e93dd4e,2,2304 44d95b82310f335f54eac14fc0afc6cf,1,0 44e907b0bfee57abf9dc01e7e1fcc1a8,1,0 44f0914715663a55fa89524cf734eac9,3,25091 44ff4fe711acb48be3ca84d0c0c8c351,1,0 45153f16dc4fcf9a51d4f45156c3bb29,2,113569 4536a8f136729440b4762de771b72c45,2,870 -4541ef924dcadbd4118b9521b1ec7981,2,5501370 +4541ef924dcadbd4118b9521b1ec7981,2,4458432 4543031646f0dace54dd007c834e3581,1,0 45499743a72c9cff765b00fdb3e3f6df,1,0 455ca7f6c94ffd38cb8af2339d546e33,1,0 @@ -1423,7 +1423,7 @@ 477ed740426579e50ccf77344614bea8,1,0 477f2b5bb64bc25a70fb4189a7956eef,1,0 47809016f7c669cb21faeb01f20fe3a3,1,0 -478ab003feab9cbb5c71d27d8f4671a7,2,3540 +478ab003feab9cbb5c71d27d8f4671a7,2,56 479916ce3bd7978837818aece73bd27e,1,0 479db86f798881146de944a1544b4375,2,16512 479e2d0d6fb09694e1fc79dab9ca10dd,1,0 @@ -1431,14 +1431,14 @@ 47cc0a2e5e9fe4659a004fbae9b5a359,1,0 47d3ae28deb6d120658c3438a717c514,1,0 47e8570a8c62fda1e2cf21e17ab7f990,1,0 -47ff914efb5ea253ff39ee7519417384,2,20736 +47ff914efb5ea253ff39ee7519417384,1,0 482220168428f56b5b46c7a7831d211b,1,0 48257b6d27c84079859bca40ff7e4195,1,0 4834d595e4c374472ecf6122d5f209ee,1,0 4838b0403c3c782242b2665442a2a1db,2,19044 486d159e24fec9d668e5e44e2f8b7704,1,0 4880046ba8679cd74eacebed69bd0fdd,1,0 -48a4a65df57dc6b7aab949a4ec2b1936,3,2554944 +48a4a65df57dc6b7aab949a4ec2b1936,3,2217405 48a538bdd0c2df51b76c1281de59c8ec,1,0 48ac63d3c4a4705bf2cbc3926783f917,2,81 48e800786c283e10517d7774e5b3678a,1,0 @@ -1446,7 +1446,7 @@ 490020bdc653925805b306bfea05241a,1,0 491189320c4c44cd6adfb45d0c949553,2,4096 49127588843fa4e8710eea4e28aad75c,1,0 -491f7f7f0e16681ee2bb9eeca81b019e,2,9120 +491f7f7f0e16681ee2bb9eeca81b019e,3,58411 49240f211307b3138e7fb627ccf3c818,2,2209 493969d387822814ebe7b8f09918549b,1,0 494340f606d9bc07e35b581e38bf71b3,2,32220 @@ -1461,7 +1461,7 @@ 497c53b2b8778401361dc509a51125fc,1,0 498071d2a77f67545907c474091b15f0,2,18225 498dd19e4de16de2367dfd7facc718d6,1,0 -499499cddad499803d1cc572cddb318b,3,19933 +499499cddad499803d1cc572cddb318b,3,16080 4999e15284ca074d1e52bd542c73e1b3,1,0 49a9c61008dd61b32ec9c0292771f94b,1,0 49bd65fc4d200f569316c8d1fa023fc8,1,0 @@ -1494,15 +1494,15 @@ 4b47bd34b344411bba8ababa8f01a90c,1,0 4b897376b83d831114dadd8c38c9a5e1,1,0 4bbb8da8563889feed5727ac8f332eda,1,0 -4bbc92581240ac5a6a06fae0088fd6f3,2,5929 +4bbc92581240ac5a6a06fae0088fd6f3,2,4489 4be1d10c7f69cc8fdf77ea49fb08b183,1,0 4c039757edba47e82c1d95ed499896d6,2,17556 -4c2d6c9bdcfdd2aaac599d91c9192dee,2,345156 +4c2d6c9bdcfdd2aaac599d91c9192dee,2,333506 4c3bda3a0021a8c42b66bf989df6b7a8,1,0 4c4ea6ecfb63e37142e5cc4ed9793442,1,0 4c5362ea0d360523704c0a29e02c4a53,1,0 4c58dabe226ae982f3ad16850cfc33b9,2,1482 -4c5ca8e2ac8c22fb727012c9c9d777b5,4,9151432 +4c5ca8e2ac8c22fb727012c9c9d777b5,4,9188324 4c6203bc189d009c8d64604cf2551029,1,0 4c65d4f4c69d7a3640b5c9bd1527738d,7,109581 4c6a5b5b7b2d279ae79d81e039ca7234,1,0 @@ -1522,14 +1522,14 @@ 4d5195bc164bc40158f67db8f80f323e,3,225190 4d52009d9f40aaf37d2f1535b4d02526,1,0 4d694a451475f18c0267081c2603d261,1,0 -4d8aafc374a39f0defada8fedde08784,2,49 +4d8aafc374a39f0defada8fedde08784,2,25 4d9129c57e5321595dd14214f72624ee,2,4624 4d9770616207b215f6e8d54ead87b874,1,0 4db13332c8f8b48ed3dadeacf263ac71,1,0 4dc1bee4acee794d018bb78dfb2d0549,2,8464 -4ddd6b3838472f299420610cfc354827,2,8649 -4de2e1c57d40087e865f3e20c708cd40,2,3006756 -4deffe156edf9fc646ff8c6aca8a3a5e,2,42 +4ddd6b3838472f299420610cfc354827,2,1 +4de2e1c57d40087e865f3e20c708cd40,2,2775556 +4deffe156edf9fc646ff8c6aca8a3a5e,2,12 4e0d56bd3538c9393f78b65c8266f44d,1,0 4e2ea1803259ebc0d8073536ef5fae03,1,0 4e40bb83ba92afc97cd1992221612d96,1,0 @@ -1548,14 +1548,14 @@ 4f35fa7d47961b8bad1e25530af6c264,1,0 4f4deb5c58771ce7c68e1f1afa846b82,1,0 4f5326336c2232176ec552c8ce578a5a,1,0 -4f53604ed9dc5471de1e395628c07304,2,324 +4f53604ed9dc5471de1e395628c07304,2,625 4f53af6ee62dd4f9ac2d80e1288415c4,1,0 -4f5d3f41c52405fd96d49fe7a27bfd58,3,20774214 +4f5d3f41c52405fd96d49fe7a27bfd58,3,18539483 4f62575d64210456f6cdaadab5d683cb,1,0 4f646ccde31c3f91018a2ba086c54b2f,2,34410 4f66571815a0845d53c2e89d010220b0,1,0 4f6dac4381c873505d8a4370bf922d87,1,0 -4f768eae1404854f5c0aa0a15d17898f,2,169 +4f768eae1404854f5c0aa0a15d17898f,2,81 4f7bb8082c83dd6a31deb909e2384924,1,0 4f89db016ada69247c0cde3d9b649fb5,1,0 4f9b7a4143851d89234cf7dce92ded3c,1,0 @@ -1585,7 +1585,7 @@ 50ff2e9660ba1139fad98e2054b5027c,1,0 51208327ce5013e1bb3d0328658e9527,1,0 51364010bb26dffd76ac74776b4dcfc7,1,0 -5154d80056fb8b678d4c31ff994b390d,2,78120 +5154d80056fb8b678d4c31ff994b390d,2,15750 515b41975749c35f4f1abf0552b7e838,1,0 5164a5e2bf97169a2c0845673dd55ec2,2,41616 516c0c44053aa33145a6bdb47d17e0ef,2,579882 @@ -1645,7 +1645,7 @@ 540c13239d30468657729992f60603e0,2,101124 542022b5c9484ae0989629e58ede0f4f,1,0 542528e421913b58bb1209d4fb82354c,1,0 -543ab259e3b81b4caeb2d781924e48d5,2,324 +543ab259e3b81b4caeb2d781924e48d5,2,2209 544111900fd03d06f97415fde82f7230,1,0 5445b05c42beebbb88c04541192e8d9c,1,0 544cfa8691e7a30c9dca49a15474ef42,2,43681 @@ -1655,10 +1655,10 @@ 5456b004baaeda052885cefa5b976fbb,1,0 54661463fe2f19888c92010468263de0,1,0 54764163281faddf2e07f66679d1a0cf,1,0 -547b3c46daded352fbf63c857d87921c,6,9534416 +547b3c46daded352fbf63c857d87921c,6,8937399 548c715873b6223fe988a0f94c932b05,1,0 549e072fe0adbf86a9cdf96456702e6b,2,58806 -54aa5358f035a72d895437e03cf3393c,1,0 +54aa5358f035a72d895437e03cf3393c,2,121 54d00e9d39e00973e74abb7d463509df,2,3782 54d7241c191e5c5d30f55f86f3c2a1e2,2,25600 54ebd8d18b8e5eed18b5f0e263dc6449,2,9 @@ -1679,7 +1679,7 @@ 5590b4069f3a7932eaad11ad4730f2c6,1,0 559b0cca9a672b4a46b41706152d8a71,1,0 55a0d39762cc40b835309e24f2ca3751,1,0 -55a2702b00c4f6c67cd3909c0325c185,2,12210 +55a2702b00c4f6c67cd3909c0325c185,2,11772 55b0bcd070b40dff12137576e724a547,1,0 55c0bf9b3970e57fad2bafb71b635f4e,1,0 55c49de3d81dc23b934dc2e4955a53b6,1,0 @@ -1704,7 +1704,7 @@ 57536792c2734b70a10a8823352d6257,2,196 5754ab57591cccc3dcf583b73f00116b,1,0 575790cf99e831f20f46358e8a4849bf,2,56 -57749824aed1d6416239435d31fdd85d,2,900 +57749824aed1d6416239435d31fdd85d,2,38416 57818a53bd0ce7abad6d7081b4e98d2e,1,0 57a54357431e5199c2888bfb3860aa5b,1,0 57bd710f014b0c0e30f1c41db5f4fa44,1,0 @@ -1720,9 +1720,9 @@ 581b213c26fde625f564a4e690b5658d,1,0 582d6c210dde5a9877fb0c929d482486,1,0 583366e2e8841ca8da687d52733cb622,1,0 -5837162e0461da10814740b1c0cf2344,2,1 -58447adfd6752c1956c32767b4fe9b3f,2,506 -5845cb14b5385aa94eea8eced7ef9948,2,42 +5837162e0461da10814740b1c0cf2344,2,16 +58447adfd6752c1956c32767b4fe9b3f,2,42 +5845cb14b5385aa94eea8eced7ef9948,2,2970 585dd2c95aea14c8dc0495c5031b238d,2,2500 586950a28bc60abb67185f6e41498ce1,2,9 5869d281c98d28a71bf7fa67ae0010a0,2,4096 @@ -1745,7 +1745,7 @@ 5959ad9ef9066aa256ad9319548210eb,1,0 5964115440a6f378864d6e3b6e8fe9d9,1,0 598500d907a93537c896d16b02dbb88e,1,0 -5986b6506a6a6b56832f3a20186448a8,2,625681 +5986b6506a6a6b56832f3a20186448a8,2,404496 59a6f6250225c80285d9dceec8f72879,1,0 59a933f658f5dc4bbb8abe8196354b9f,1,0 59aed176d1e252f268f25d2a534b17c3,2,10609 @@ -1765,14 +1765,14 @@ 5a8dd71fc456b5cf6cac64f4bd32da30,1,0 5a8f522931df4152be3810a96dc74d39,3,7787192 5a948a477ebdf65ea602ddd003e1a6e5,2,12100 -5aabd5f7518c2d8caf77e519eb4cab36,4,3909756 +5aabd5f7518c2d8caf77e519eb4cab36,4,2934810 5ad12093ba63af191fb8e7d39614c0e5,1,0 5ad1f84cff57f163708d79b7f83fc748,1,0 5adcb1dca3ea875a6168c7a3ac61dd7b,1,0 -5ae0b4f50024bb27b428226681f1a33d,2,181476 +5ae0b4f50024bb27b428226681f1a33d,2,7921 5ae616658d4778694f7d099be347f524,1,0 5b1b6d290e884ff55816e6ae89512c42,1,0 -5b21c3b213c996fc3cec064fc9b7d5b4,2,26406 +5b21c3b213c996fc3cec064fc9b7d5b4,1,0 5b3bd141c0e1c5b9f08f87d3a49ee888,1,0 5b5eec00494a5e3fe7e1c1e0f2d3684c,1,0 5b66645f0ed4b7103ee866b6ede13ca5,1,0 @@ -1783,7 +1783,7 @@ 5b9f66103173b912178b68b3fc91da0f,1,0 5b9ff89c56904168f7539164dc37da09,1,0 5bd28509be7d9c9920a32df92f937a08,1,0 -5bdbb01b7d5b67349b6af158bd0625cb,2,5929 +5bdbb01b7d5b67349b6af158bd0625cb,2,4489 5bdf4ad67d7e9b6cc5807bb7ea2b7e04,1,0 5be1a25147e2696d1d5271904cdefceb,1,0 5bf680212000d00b729bd5925b35b507,1,0 @@ -1808,7 +1808,7 @@ 5cdf36d57dca1decf25b21fc70ccb7b4,2,3136 5ce2156cbcd2167998a9f5b143b44094,1,0 5d00aedb31357d336f4d8345f2dfbba4,1,0 -5d25acff5712b8a133c693ea5951b005,2,3577772 +5d25acff5712b8a133c693ea5951b005,2,1300740 5d32bc595150184de9f7f0b2115c5310,1,0 5d32fc5743aee3b38c57715bd1a2f99e,2,144 5d54995022690b8d50acb4c80a3e33f3,1,0 @@ -1833,7 +1833,7 @@ 5e4e82cf8061e383ae4b02bcb32dc48f,1,0 5e5493d8af6d2ea4d7dca46ffe92798a,1,0 5e664a82ff1f9ccd9a32440517ae58da,1,0 -5e6a9ff015fe8f5f9421d7ecbed6ee45,2,774400 +5e6a9ff015fe8f5f9421d7ecbed6ee45,2,427716 5e70a7cf4baea6d6ece5fb124dcdbcd4,1,0 5e7cde0c8600454d1a2672e2d744a577,1,0 5e935a0874bd58024eee403b7f4b1763,2,30 @@ -1850,7 +1850,7 @@ 5f30643a7154c4b0bb851202cee351ed,1,0 5f40426164670bc84c73008a0805f536,1,0 5f593738946dfcfa61eb973fc775c0e6,2,56 -5f5b63d386af6358341fb5b6e5e55d7c,2,56 +5f5b63d386af6358341fb5b6e5e55d7c,2,3906 5f6c044e215a37931daeedfd221151e6,1,0 5f8d5e28c6587ed21ed7be45413b7e39,1,0 5f95af48cbd9c1fe55bc06bacef7c4c0,1,0 @@ -1881,7 +1881,7 @@ 609674807ca67a046a336e5c6035702a,1,0 60a9c4de2d41664e74ca5b69942bbfc2,2,225 60ada50af4c6312b0a7d292fd6ebaaf8,2,8372 -60b3d715cec23d8f140b3517d6b50dcb,2,650 +60b3d715cec23d8f140b3517d6b50dcb,1,0 60d2c9252f543fb59d1b71e40fb6345f,1,0 60eb3dcfaaaa2a438d03fdf2565b76d2,1,0 60fa0c493d03c738716357cba4d6a9fc,1,0 @@ -1901,9 +1901,9 @@ 61ee3d96909e3261b48ee03ff46f4a35,1,0 61f1a6bdbcff8b94d549e49195bbb746,1,0 620d48bd3fc94a36bcbbad4026e1b86e,1,0 -621271088b13cdf58db84e174280c1be,2,19600 +621271088b13cdf58db84e174280c1be,1,0 6255a3b524b50a0b9c37389f6b416598,2,1225 -6278ce2b8e35f05fe145e6228b12120e,2,322056 +6278ce2b8e35f05fe145e6228b12120e,2,23870 62844d5db44b04b23f85ed351d24740b,1,0 628450f13ccc38d3d136aac88302c38f,3,0 629fa13773c72da7fedccbfcdd038195,1,0 @@ -1915,7 +1915,7 @@ 62dcab5291143dc6fc110ed65e070627,2,2500 62e6b715a5a841db4292ce86055ad993,3,7346294 62f1be6037444d4f1f37a941da288493,1,0 -62f9a1e4dc829da0729325702c2b031c,2,144 +62f9a1e4dc829da0729325702c2b031c,2,16 62fd86f546a52d904692e1a9e919e089,1,0 62fd8a5e4b91cd6c7cd1d0aebd05c4ca,1,0 63102af3c3bc3f814be53dffddb29e2d,1,0 @@ -1924,7 +1924,7 @@ 6339ef18ea5b5c443da5c792554771ab,2,26732 633ba21f6db545a7995dd3d6ef3b9c94,1,0 633c074eb247e799e458afa7613f2838,2,12544 -6347126fa8a859ed57adfa59bbc7b475,2,5184 +6347126fa8a859ed57adfa59bbc7b475,2,100 63471f815b0e040acf1eace6f782adb8,1,0 634a70279ae5aa6044113af0da0db751,1,0 63612b0a7235d56f612cf35638b6363e,1,0 @@ -1936,7 +1936,7 @@ 63a19473494f76017c8b0aab3d1753d4,2,2450 63a28ada3b132d34a24caa313e68e1aa,1,0 63bd4ddf16281a4b704ecc664fd96943,1,0 -63ca00bdca5925639a7c162654eb0ab5,2,518400 +63ca00bdca5925639a7c162654eb0ab5,2,3844 63ef169cd1d5d63837cbb93a0b8e60b8,1,0 63fa5915eed5a0bf51864e9b81b8e204,1,0 63fc2eb6b726fefa4e636b0837c812f5,1,0 @@ -1949,13 +1949,13 @@ 647400cdc2ee03e9c33041811328ceba,1,0 64815d03d3964f7f90e7fba137470653,1,0 64979bbb93624de22a39b4df2684188c,1,0 -649ca27a25c03a26b1f99d84edac0985,3,2628474 +649ca27a25c03a26b1f99d84edac0985,3,2217405 64a3f80b8ed6778133fcf965915a4158,1,0 64aa5d175b09709523b3e8a39592066e,1,0 64baff18d662db2a3c9f85ee54ddf9c9,1,0 64c48170ef17ac5c395da08a4fb466eb,2,5929 64d5ceb525e625bfbe67360360db77c8,1,0 -64fc2849008ef3db7758bdd31f7031e3,2,272 +64fc2849008ef3db7758bdd31f7031e3,2,240 64ff25add40f20e77dac9fdbcce600c7,1,0 6500b59d6d0a912155eca922055da997,1,0 6521aa6c9eab1a2f7db8575781d97269,1,0 @@ -1972,7 +1972,7 @@ 65760cb4f91df177104f83ed83386539,1,0 657bc6310d956ced1e52aa3c347a89e6,1,0 65923095336ac4cc961e255656124f95,2,4 -65c1b2cb8a848465abc354e14b4fbbb5,2,13110 +65c1b2cb8a848465abc354e14b4fbbb5,2,10302 65d300d61f4dfe6d59febb95a8f3d481,1,0 65fd13d308e17de0ecdccc29c531e8b6,2,10506 6611ccae3b3077cdd6c52dcaade52084,1,0 @@ -1996,7 +1996,7 @@ 66e7fc5f91b1a25a68ecbe3db9b7742e,1,0 66ff7bfe4da0b72b1fe35f5e211915f2,1,0 673678add1d458f12ec22ab7030a368b,1,0 -673df2c745f7d5f060f8936d23680d7a,2,132 +673df2c745f7d5f060f8936d23680d7a,2,600 67467830f03c44ade9508a3a09faa804,1,0 67627bae783ee474f3d32f332ea57bd4,1,0 6762809c24f36fee04800baf7be5d532,1,0 @@ -2014,18 +2014,18 @@ 68545d6d1fa27f425f08acdad9a5287b,1,0 685e0c4fc178e646602aa7bd99a69cc4,1,0 6868afecd784c04d19d7f39d9b887c82,1,0 -6893483f7750d75aebfd33ac45974c4d,2,7152950 +6893483f7750d75aebfd33ac45974c4d,2,6058982 68a9053192bea4c5fc7e3a4d23cd93fd,2,3969 68cc2ae38d52da467cad56df42e73406,1,0 68ceef85ed1fe7444aea3d0787112199,1,0 68dbc6fd679efb56735f2b7bd3b91ad0,1,0 68e5d74355ae86050a75c7c6f4818adb,1,0 -68e8f54ed68f96516cb8c9e6ad1f84db,2,231842 +68e8f54ed68f96516cb8c9e6ad1f84db,2,65792 68f142dece3e129296957faa10e121e0,1,0 68f26ed115e0706e994d66a12716e356,1,0 68f606e13d88a05ec93afbaf51790431,1,0 68f9df17537bfbc7a1e5d0b32a4caad2,1,0 -691344189661f516fdf99b47ced951cb,2,2 +691344189661f516fdf99b47ced951cb,1,0 691d8d4f9d8e09390edc1408f6fdd55c,1,0 6923c28b39fb264a6b04fd38063216a7,1,0 6942dbb5e441ae10b528da67b78cf3ef,1,0 @@ -2067,7 +2067,7 @@ 6aecad8c9f22c438aabfd2ef36f151b3,1,0 6aee1f9ce04bc1f914416f68aa86690c,1,0 6b3e9b6b21207e960246c001e3635848,1,0 -6b4c9eabfa73e777ec01a673762175c5,2,479556 +6b4c9eabfa73e777ec01a673762175c5,2,6 6b5bc78aaebf52df41143b88aa533a13,2,8190 6b79ac6fd68b1c89dd41a55e5de5d28d,1,0 6b805dd35df06392d573013b2b4be30b,2,36 @@ -2091,7 +2091,7 @@ 6ca6dd7e526d4ada5b75a80a212cf9a2,1,0 6cbaa7dbfee36b9d205e3c6c8710a4d1,1,0 6cbfe7e737808ac9eb94976e934f25d0,1,0 -6ccd3fb1af4286209eea26a0d8b738c4,2,5449890 +6ccd3fb1af4286209eea26a0d8b738c4,2,4066272 6cea2e104ec85f0dd826620e7e9644e9,1,0 6cee432019274198dc1972c40a38214f,1,0 6cf886d9994e45f61320a25bf8bc9c60,2,64 @@ -2099,9 +2099,9 @@ 6d0c88f8167434fcab5a7b9f330f0885,2,0 6d111f1a879a3c039d73657ccfe74005,1,0 6d1ebe448310ccf0f310b0236a9992d5,1,0 -6d30ec00cea682d3aadfab28a2665e39,2,169 +6d30ec00cea682d3aadfab28a2665e39,1,0 6d31a51a06785af8acc76099922e6c77,1,0 -6d3a1f35383f5a21e69f0477bfe8ba3b,2,18037009 +6d3a1f35383f5a21e69f0477bfe8ba3b,2,11923209 6d3ac65f88396d25753aafd4abbf6b0c,1,0 6d4d5d9c75d2257f0e85ea3be702e300,1,0 6d6c6fe48f0767f5278559bd92502fb9,1,0 @@ -2120,17 +2120,17 @@ 6e2ef82d6886e62c6af1ad0b3fcc2b4b,1,0 6e38ee396debf441cfa8e577c470f448,1,0 6e4effa3356e58ea32c0defbfd6db657,2,3192 -6e528335f756cc4b81d3749c70a484fd,2,799236 +6e528335f756cc4b81d3749c70a484fd,2,69169 6e597760beaea420e189f6ccdfac37e9,1,0 6e661a94c054c91838a109cae6dbbcc0,1,0 -6e7a0c2423947f624419a1a2ffe13012,2,26406 +6e7a0c2423947f624419a1a2ffe13012,1,0 6e865ef92fb6f796e3af7ee6180cb7d0,1,0 6e9f62bf7c285276a2ce450d7dbfc694,1,0 6ea2a99e7f857a79c77ac3b15e9aa067,2,17030 6ea71e3f25ba969fbc67826ac7eef939,3,13271612 6eac5b03a71c7ac2b7dd89bd6c191b6d,1,0 6ee9ba625326a5ad9cd42db1212d9755,2,2450 -6ef1b150922ae7b3dd5ed4a142710449,2,19881 +6ef1b150922ae7b3dd5ed4a142710449,1,0 6efa7407e4bc2a6b37798502b52c0ac4,2,8010 6efd75ded065fb6d7644505dac5c932e,1,0 6f03d8182d8400026d36581480021222,1,0 @@ -2138,11 +2138,11 @@ 6f0e33666b1d3d85a53a508c91fb41ae,1,0 6f195b9ca1ebc80fa390e03924fddd64,1,0 6f253a0daf7c4234f47950e5844f5812,1,0 -6f2d6eb158578f8c32c5594687ed559e,2,9702 +6f2d6eb158578f8c32c5594687ed559e,2,342 6f30821385211f84566084f313495b50,1,0 6f548230d488496003dde6d20e622460,1,0 6f71ec47b13803e267a7204ced0ee8a0,1,0 -6f75ea62e4efa3b3948873d80955db52,2,3540 +6f75ea62e4efa3b3948873d80955db52,2,1122 6f7a31bbe43dba661d5986793ff3e468,1,0 6fac5a50d88776da27fdd158f92c9768,2,1122 6fb47af860211c51e933ee22c9ddec24,2,324 @@ -2168,7 +2168,7 @@ 70be170c3080d4c9cf85a55b559853c3,1,0 70d445010c6b1f78b8c31f929c2596c4,1,0 70fae7fa92e3bbfd94cdeb0d3a177df6,1,0 -70fb1c0d120e4b7c13310a597fd8a700,2,9 +70fb1c0d120e4b7c13310a597fd8a700,1,0 7103ed8ff5e2b0e87ea82fabc8e88b7d,2,14520 7109d6d6de81f9a7910adeceaf51b735,1,0 710e2006ea57662b62a586d13adb4be1,1,0 @@ -2183,15 +2183,15 @@ 71a461f5405a12c1e13e2660ada283cc,1,0 71ab33098974880dee90b426c064f92c,1,0 71b1751f38d827c9bb3b1573783b409f,1,0 -71c13bfeabfecc85379abc6e0b9918ae,2,8930 +71c13bfeabfecc85379abc6e0b9918ae,2,110 71c4a121a62028692be515d03a9cb7a8,1,0 71d5b0ab52e5da5e3c05d7df1b8827f8,2,24180 71dfc5aae6816283bdea3324f38345a4,1,0 71e779a8ffccb89212817697f9021743,2,140625 -71e80f9e809f5a4e9681917dd5d9a776,2,23256 +71e80f9e809f5a4e9681917dd5d9a776,2,22650 71eee442b9d32bf146e016326b4b966f,1,0 71f4fb1aa3946b77a6227985983f2d5b,1,0 -72064262811d4e160e8719b946bd06d1,2,5929 +72064262811d4e160e8719b946bd06d1,2,4489 72274227bfc4b4c4f65ec2d112b663a8,1,0 7228f366f398d3cb2e98fd0c04a58d67,1,0 723156a3a715ee6e8a9f6775a9b89e73,1,0 @@ -2210,7 +2210,7 @@ 72bc2f8e169c7c43a009c3432a29ae2d,1,0 72d81ea6fe764eac2702fe48bb3762bd,1,0 72de2bafd7474fee816ddcbcd3d9faf6,2,9900 -72ecaa6dbb934be4f2524df6a543703e,2,9120 +72ecaa6dbb934be4f2524df6a543703e,2,30 7305ac70009d1c6253ebf16080f0345b,1,0 73629c8e0e3c78d24121d25bfe5254f2,1,0 7366285d837921c76989d9f797c1f0c7,2,3364 @@ -2221,9 +2221,9 @@ 73bb40c2188f99cde2e89bfe4af1c7f8,1,0 73c213ea3057cc8090ad906c80ae7028,1,0 73d4f329dfa2c62b41fb434ce4301cf5,2,9312 -73d989d7186a1d3f71c7369ce5207762,2,7140 +73d989d7186a1d3f71c7369ce5207762,2,1482 740a3a71e6431c09a56237901d99d823,1,0 -742d8bf425f69c84e27c349d5623dcd8,2,484416 +742d8bf425f69c84e27c349d5623dcd8,2,16 74422f12c555f9ef5575da01fef59dbc,1,0 744cfd4f381e19399057f936ade52feb,1,0 744e81f63b7468dc02be89c96808cdce,2,16256 @@ -2238,7 +2238,7 @@ 75035e1769bc99c1294ce13b2f431969,1,0 750d917e0c338e391564a015dcb9f961,3,9902018 75320c4b65cb67641080a4f508e71c56,1,0 -75479b97e6d30fca4062c9fb3547d9ff,2,47306 +75479b97e6d30fca4062c9fb3547d9ff,1,0 754d1b87ccb6d58274ca8dae1512f073,1,0 754f31a7392990b440fdb9c843a0e81f,1,0 755f69311f5fe827029d892ed86e57a6,1,0 @@ -2269,14 +2269,14 @@ 76d3900a6e0ef74bab8946e1d021d139,2,121 76f55e0353d041e74f86f43ba94b1817,2,3136 7704736861907127aebb56623d13eac1,1,0 -770deb8f939b2aca4bfe16e0dd7c1abf,2,172640 +770deb8f939b2aca4bfe16e0dd7c1abf,2,49952 77200e8999ab47f6c8957478747b1dda,1,0 772326abe1a27d8ef8f922f2aef61c6d,1,0 7730dcc616303845043cb327f1656585,1,0 7748fbc7adeae3233dbb3d7a5a038b56,1,0 7749a1ff837fd9238463d52ccb108822,1,0 776c135bf0198c649c2a423629662c0e,2,1406 -776f3bb05add2f71399ffdb41fe8ce90,2,25 +776f3bb05add2f71399ffdb41fe8ce90,2,16384 77812224c4cb3ba32d08652c404926a5,2,17556 7788fe5fbcbbcde0ae8be428392806f5,3,263112 778c87600ec1c3eb39a925c2eae779b7,1,0 @@ -2291,7 +2291,7 @@ 77ee435e81a6ed974d2d23d5ad92d758,1,0 77f36d03b8b0972966f784ede18df036,1,0 7803029edad1118c42361b90838021ff,1,0 -7808268fc06dc358047e06d04131dae6,2,3713329 +7808268fc06dc358047e06d04131dae6,2,34225 780e3fcb605b33a5293dc71d295e4f38,1,0 7818ebbfce480f11d9c91b9fdfeae9d7,1,0 78202b56af66040afa4b19d23164168b,1,0 @@ -2302,7 +2302,7 @@ 7883bce123aff82e1ab3bc5987aa1207,1,0 788c534189735fd7917ef749fdabfa59,1,0 789d13747320ee5cbe1ee6c1ad494377,1,0 -78d452e410037bc81da9eb8f8da72857,2,9 +78d452e410037bc81da9eb8f8da72857,1,0 78d69e9adde1d6705b84f288337cb856,2,90 78d9915b3b424cc490aa43c6155d1b02,2,4290 78df5fc03aa0cf22de8ad46162db7188,1,0 @@ -2335,7 +2335,7 @@ 7a56d533b013cfb4777e4c4accde6a00,1,0 7a6388ec56812a61d8d1b965094ce555,2,30 7a71c95fb8c85a8608c49227e50c5562,1,0 -7a8e1dc7f5cefb0ffcb78af9853c83b8,2,5929 +7a8e1dc7f5cefb0ffcb78af9853c83b8,2,4489 7aa18e7359b36b9c0cfb7f7ed7aca166,1,0 7ab60a01fcdc5845824846d06fbffceb,1,0 7ab99d1a3e11c343481aa1a30987b83b,1,0 @@ -2375,7 +2375,7 @@ 7caf70b2c3f50e4ccf843bef7e3f9936,1,0 7cb396cb5e7cb729eb85132dd74f848d,1,0 7cba071d868708fc7c2744d5fad916ba,1,0 -7cbe6c6030d821dbfdfaf2b7210ae409,3,2242849 +7cbe6c6030d821dbfdfaf2b7210ae409,3,2135562 7cc1e8bb3557ba84c2287a68a52c03f9,2,132 7cd501746a948787e052a31e36072399,2,0 7ce08a322b4a8619e63d2c016ff25d28,1,0 @@ -2386,7 +2386,7 @@ 7d31d1249dc7330d6cbde0514e887c10,1,0 7d3296f4471de2cce5b0c73cc838d078,1,0 7d4a847c9592f5a36f449d1bceff9fec,1,0 -7d4cadef53972470143ac162dc1b2a8e,5,65938 +7d4cadef53972470143ac162dc1b2a8e,5,34734 7d4d02c6035906b642147427993e8af9,1,0 7d52c18dfef8fdee50a66e8b3acfbeee,2,1444 7d586490c83de88c6a8fd1718adca37f,1,0 @@ -2398,27 +2398,27 @@ 7da74ad406e5daa73057862898c851d4,2,76729 7db52b6755ae33463a61da344e395573,3,140634 7dcea05343e01e5f51ec55a05299c6e2,1,0 -7dcede1438087320682a36c038d55d2e,2,2916 +7dcede1438087320682a36c038d55d2e,2,324 7dd5e9d7330bb6c5e69788beb5a41675,1,0 7dd94d83bc513c10f6eaa395e2dbfc2a,1,0 7de3cb7d789c1b2f92e91d24a90c8f6c,1,0 -7de50f8345745668a0379845272dfdcd,2,30 +7de50f8345745668a0379845272dfdcd,2,6 7e09b1016c49007498f6185d297ad6b1,2,12100 7e13a22f577ddb25816e8f5c3a439dbc,1,0 7e2b43ef37e59e46595fe8f1b06e3596,1,0 7e5ac1024b878f244dc7a68557aa9dea,2,0 -7e6d2c07a9b1a29f667127c197b7df9c,2,1056 +7e6d2c07a9b1a29f667127c197b7df9c,2,380 7e8f61eae3132362f9d2c9c83da51e30,4,11342 7e91ba78987d1b92cf8e1a60fa325cc4,1,0 7e9f5e81029e5c0ffc489fe56e41e621,1,0 7ecfb57643ebe679e4595ff7d98dba63,1,0 7ed7cc2da2a5c86ec492ca0eab8c7aff,1,0 -7ee0c17e9a0ce8879fd714ab285bb497,2,4290 +7ee0c17e9a0ce8879fd714ab285bb497,2,42 7ee4ce4084e63672ae55811fa6bb99c9,1,0 7eef0b97113f49f8ad8d2698af818107,1,0 7ef1e446000752f4e5a188f943fe001d,1,0 7efa85a0b6642eca801cc42480462d45,1,0 -7f00c1011acf8a3955307e8c3aa536c2,2,64516 +7f00c1011acf8a3955307e8c3aa536c2,2,19321 7f3e22d6d81f74ebd5edbdf966adb90a,1,0 7f3ffe4327e95d8ab2f8ff9c7458f62e,1,0 7f470c5b18784b542e4afb9bf1b86497,1,0 @@ -2426,7 +2426,7 @@ 7f622525b7bf652342aed4d1370a2221,1,0 7f895754a303dc55d49f9a6b5e41ac3a,1,0 7f8a85a74371ebbfd4e30298e41a6e95,1,0 -7f916401c66fe5f6191a59ad31fb97e0,2,4422 +7f916401c66fe5f6191a59ad31fb97e0,1,0 7fc44aa86feff6d736fe70c5a5b71868,1,0 7fc54d0bfb8aca6c52a7b5fd26da90d2,1,0 7fc5a1e0d8070351648baf8efa6b79b3,1,0 @@ -2447,7 +2447,7 @@ 808255961bd2cd69ada085757150b913,1,0 808b82b9297c4ab6bbd366c4e189962c,1,0 80ad76b20162a20c96fd28c1a0fd1554,1,0 -80b35862e48198d457d850237619a1be,2,21462 +80b35862e48198d457d850237619a1be,1,0 80bfcbb8cabb6d518bd218a09f72d280,1,0 80d45c7ecee2bf6045d135f0b149a218,1,0 80f0a1007c7e471ed1bfff1373ba6b53,2,756 @@ -2460,15 +2460,15 @@ 818a07eff45ae712917372f093178b13,2,27225 81d32640b634456f6a40c18cf5505069,1,0 82163ca8ab080fc08fa0ca41be4d8535,1,0 -823bd2ca4748b0ec68f78d5d846c35b3,2,19044 +823bd2ca4748b0ec68f78d5d846c35b3,2,21025 82839c99b92697daa6d5e69afb7a6ed8,1,0 828f6669083d640cfac8e570a2e2aec0,1,0 -829581add1553d0b8d8060f3bca72fd0,2,25 +829581add1553d0b8d8060f3bca72fd0,1,0 82ab59325eb79b4c27106fadcd253704,1,0 82bd0a90b1933dc84a49642d7d226689,3,523226 82c72d88193144045d1d50ac55aabf98,1,0 82cd372a9a8b779b50f0293c66effbb0,1,0 -82d302157dc4df18139b53fd3a8faccf,2,5929 +82d302157dc4df18139b53fd3a8faccf,2,4489 82db7db90c4ecf4f4a1936db670597f6,1,0 82f8354d24cf18c42fd25129738acaea,2,40200 830ab266f59695fa9fe578860b7f427b,1,0 @@ -2491,12 +2491,12 @@ 83ddf73eed4f61375375eb72e33380d2,1,0 83e511c5acd8e7699b099afb9348de65,1,0 8406a06a0c996be43412b6d5010d375d,1,0 -841738a64046050d5fd68e3cb6de6316,2,39204 +841738a64046050d5fd68e3cb6de6316,1,0 841c867115d4a3e8786e732c15cfc5b9,1,0 842aa3a39391bbb9d60b0bfe18de0b7a,1,0 8439c7faf10b79588f99d00e7e2380ac,2,5476 -8440255c426adfa79bee24eca38739ef,2,8010 -845a3071b689228b1f5ef28c007acb36,2,7140 +8440255c426adfa79bee24eca38739ef,2,42 +845a3071b689228b1f5ef28c007acb36,2,5402 8463e4abb813f12d343cae1fddf196b4,1,0 846f30d2c5dd0abbcea27fc15364f82a,1,0 84870cd7d20ba704693bf22d64e2a643,1,0 @@ -2519,7 +2519,7 @@ 85e17db5bfdb6a41d4bbfe3638f5f258,2,19740 85eb39e2f21dfe54b3b42e1a1a71c8a6,1,0 85ef6403a14fd3b6cdf037ef7fbc1d40,2,702 -85fe45fa0fb782ed8dc6136abfe88c26,3,18004 +85fe45fa0fb782ed8dc6136abfe88c26,3,35630 860d0faca8663646796c08d76d5359b3,1,0 860e4544726a0f0b511f2f395c6d7cce,2,1764 8615077030778ed8ad86b117d8a7d69e,1,0 @@ -2529,7 +2529,7 @@ 865c43072c811009f4da22ee0525dd8a,1,0 86662df0ffaffef90bc3a5148f5e2de8,1,0 8672f30b07050392198c25cf8ab568fd,2,6241 -867cd61bae65718bcc20e210c6b2234e,2,1809025 +867cd61bae65718bcc20e210c6b2234e,2,324 867f7b009007b84c4f8882a07f9a4d55,2,20449 868c30a0d203e41ffa05cb3b1810bb7c,6,516 869253e021bfbdfc79ffb385cf2678ec,2,1234321 @@ -2541,7 +2541,7 @@ 87074961a3c7652160242eb2902989ad,1,0 87636068173f2c50cb62004918ef673a,2,3422 8774705d643a77800df2ef7fdfcf7b63,1,0 -8799f0bfa9757aa20f9963f7d145a9f7,2,33306 +8799f0bfa9757aa20f9963f7d145a9f7,2,29756 87bbdd5329c23d245b186a037d6618cb,1,0 87c523d94d65e648176dbb3ed1977447,1,0 87ce0ba540449d5f322f25b501361f60,1,0 @@ -2552,7 +2552,7 @@ 883a49498ac8ef8de20fd046fae083fd,1,0 883cc24bf9bde694e11665d701d1065b,1,0 884dec69c4c59d08adec30839a170aca,1,0 -884e18ded2dfcfee34e8ae8e899932b9,3,15723 +884e18ded2dfcfee34e8ae8e899932b9,2,4 885718d03ad82b285015965ed745f435,1,0 885a4a2df4fc84cc8eee108990baf346,1,0 886cd0dcdf7a8bd1d7e8aab66adce2b4,1,0 @@ -2573,11 +2573,11 @@ 896404ca162493a1bbca2dd047f890f0,1,0 897e00024500888cf6b2a44cd989e547,1,0 89b68f8015a48cd7a6d13550a42e0665,1,0 -89ba7fd262af06cb0c37be4a7fbe3b18,3,15723 +89ba7fd262af06cb0c37be4a7fbe3b18,2,4 89d0cb3ddbe6537f75b10977d378ebab,1,0 89f00ecb09cbb78771892c26f9789826,1,0 89f4e1f984eb2c5d76a7f8de63abcc38,1,0 -8a057af80e82da742d2d8385ecc5b1e6,2,247009 +8a057af80e82da742d2d8385ecc5b1e6,2,30625 8a108463d99a2474724da6425ff74801,2,20 8a273dcbffc426b5fda2e302ab3f02ec,1,0 8a2de6e4171cac3a7779f8c5983fa7aa,1,0 @@ -2612,7 +2612,7 @@ 8b888d77fe06a86015fd6aff220c30f7,4,772896 8b8d40ed7310689ea422cf3d90658d28,1,0 8b902e84c49883addb4f3b46c997faa8,1,0 -8b916ff2365a573a2668daef8a62f03b,2,16641 +8b916ff2365a573a2668daef8a62f03b,2,17161 8b9882de94058bf1725e283373ad8286,1,0 8ba383d8e6d23268bb73420404ac0bd2,1,0 8bb98cd6c6e76f2a3c1bc2216b46f733,1,0 @@ -2621,7 +2621,7 @@ 8bdcc17b73ddd3729d3178cd71c00d58,2,2916 8c153e005ce3005a42167abcb645a2f4,2,34040 8c15de988d113611c2f8255675a8f658,1,0 -8c1b14c9adc338587b521561c6a8453a,2,7140 +8c1b14c9adc338587b521561c6a8453a,1,0 8c1b6a1242916aadb64ef7de6c4ac163,2,289 8c1e04eb92ea711cb9dc958222e31c0b,1,0 8c23abce7f389eb70fa88e25f73451fd,3,0 @@ -2632,12 +2632,12 @@ 8c718f4c10874f2ba8f8e340bd094eb0,2,8100 8c7425c1243d9efd7c0233de8feb2e43,1,0 8c7b8ff90f2bafcd9b162d17bc789f15,1,0 -8c887ab078bd8492a3a3e599e3aadb46,2,1398306 +8c887ab078bd8492a3a3e599e3aadb46,2,1335180 8c8e14fdf699eca6f52d874d530bd9f4,1,0 8cbb784be07b0f244459d8a8adf7047c,1,0 8cc2110f87f98dfee620d8a8af8ec9ef,1,0 8cc739f4a4b275bf946dc156a0b6e5a1,1,0 -8ccc140c97152638b9b89e012a9b8803,2,1332 +8ccc140c97152638b9b89e012a9b8803,2,22052 8ccde36c4019c9a6704325e3af29ee62,1,0 8ce1176acdecfc8e584e83dff751d4d7,1,0 8ce482b6459b27826445e338c0cd2b53,1,0 @@ -2647,7 +2647,7 @@ 8d0e3e4fb0fcc93d960c9dd2702b0499,1,0 8d382a0ab56b5c38bd13627d4b3ede04,1,0 8d4145840004e1d616bb3f479f98489a,1,0 -8d420138de49849eb92fbe2d911ce6d5,4,17398837 +8d420138de49849eb92fbe2d911ce6d5,3,15704814 8d53611d90e5b57e4e9cc42e57d09ebd,1,0 8d6d4c6159594fecf44811c6a3c10632,1,0 8d9682e73de30c116dcd306c8b94efc0,1,0 @@ -2656,12 +2656,12 @@ 8dbf8bc8a092c4f63cf9ca08956eac37,1,0 8ddbe72501b14943d63c90a58e432b89,1,0 8df251e889dbdcfe2588101ac4ab88b9,1,0 -8dfba43a5a47a8169092c879c0a09ab3,2,19600 +8dfba43a5a47a8169092c879c0a09ab3,2,576 8e09197670a70622a2181fec85e0f792,1,0 8e1c4d7c0a8fdecfd84a364ff6c16fa5,2,4900 8e38287ae1a68f80a18c3f186ddabab8,1,0 8e3869b6ebf441b97d0b1856baae2f39,1,0 -8e444410fe4438c42bc6fca447400fac,2,10302 +8e444410fe4438c42bc6fca447400fac,1,0 8e55a791857bba2c2e712c9abfd20c62,2,54990 8e70f9ad8e7340351b160d3e0de02abc,2,1764 8e97ad7e21cccf76736082e41302353b,2,756 @@ -2677,15 +2677,15 @@ 8f0a6693b33f2c747198f0496a56a4fa,2,0 8f2ac79d60dec5fa696ae14ca8e9b984,1,0 8f4b49b05df73a020d9534f5d450cc57,1,0 -8f4d2c490c286204737a71438bd922b8,2,289444 +8f4d2c490c286204737a71438bd922b8,2,22201 8f62b4615553f51b57c1ad13d47fad31,1,0 8f6bad7d7ef1e16da2bcd8b007a2286a,1,0 8f6dbb34a0d6a079df53c7e43ae6929b,1,0 -8f6f762cf826e4b3ab197be028d28787,3,5211010 +8f6f762cf826e4b3ab197be028d28787,3,4374912 8fa511223d29e3ebadddbc1de470c640,1,0 8fadbbdae33257e0df6a95e91bccf868,1,0 8faef5405127ed46e5bf9f8fa4546ed9,1,0 -8fafddc689ed1481dd1a5599827bed1a,2,6 +8fafddc689ed1481dd1a5599827bed1a,2,4422 8fcc091f2dc689b451ea55290bf2ab80,1,0 8ff6a50c006851b2da67c58db67a4980,2,8836 900205c3956e67bf3848702dc89820ff,2,0 @@ -2706,10 +2706,10 @@ 913bcc7cc43f21d59effb5ec8d9393df,2,30 91418349372e98ac344a2a7179e0e749,1,0 914850479a62ab1a892698670be81acf,1,0 -914fbe23b79e02c4daca5edb05b51c63,2,5402 +914fbe23b79e02c4daca5edb05b51c63,1,0 915dcb972e6a339aa6a41481fca0bf8c,1,0 916286089452237e34c5c77bfecf6e75,2,2809 -9169db4425d4a2d43a2e4c6b4e06b9da,2,144 +9169db4425d4a2d43a2e4c6b4e06b9da,2,1 917f3ebdd44c250400c356a82d027764,3,105198 91802590d86aa02624765bd7722a2262,1,0 9182d087e31f1093962a3d7f5ca0c8d4,2,7921 @@ -2726,8 +2726,8 @@ 920ea085ee7a93fbae7f8f48282d10e7,1,0 92147504f0f49a8738b5c1d38f75a738,2,1632006 921df551df0a26d7dc7b09c9ff74f3e6,1,0 -9228e1ac32290bf2a2f8dc157998f233,2,13340 -92461c23202a91720af4571b8c204b77,2,9120 +9228e1ac32290bf2a2f8dc157998f233,3,58411 +92461c23202a91720af4571b8c204b77,2,56 9248ed2c2730c99faacd43372f835dad,2,102400 9259d747320b9ad545f67a00353efd68,1,0 9261229c24b477b215be7d0966114eb9,1,0 @@ -2776,7 +2776,7 @@ 94cad158a5139b9d62baf10feb052cf1,1,0 94dd60fa8738dfb309faa0ba759e9fd6,1,0 94ea42d044252d9c7cbafe09ce60358a,1,0 -94eac43d93fd1f47e5c170a2ddd3e088,2,5929 +94eac43d93fd1f47e5c170a2ddd3e088,2,4489 94f0a97fdbcccca0db3014fb1b5183d2,1,0 94f764c81b6a59954c5e426362e2ebba,1,0 9508cb5a38f3c4b03529a0c39b7311a6,2,5700 @@ -2802,10 +2802,10 @@ 9675bf3aa220b34ce86f37154d92dee8,1,0 9675e309eba2867a7468a73752e1fb72,2,8836 96770089ba83cd0eeec62ce63b62a853,1,0 -967cf264704b2606c050f407aa0412f4,2,100489 +967cf264704b2606c050f407aa0412f4,2,784 9681dad714a44a7dbb8defd95382a52d,2,4096 96949f1e889f52807c6d3bafcff3129c,1,0 -969ddd9f884cce6ed616083ac0377a42,3,15616091 +969ddd9f884cce6ed616083ac0377a42,3,14521347 96a55d7beb90808330f65c1410c44fc3,2,5776 96a79f831388ac32a7b8018fd4696888,2,784 96c1930e097a8198434b3752a13eb733,1,0 @@ -2814,7 +2814,7 @@ 96e92cf36499c58baff546504900441a,1,0 96f4ef08d4f769e051e60bb5cebe7491,1,0 9700ec946417a4ef56daf97bb46a5bc4,1,0 -9703c3d7725b1b7e914b0ab015afddad,3,242444 +9703c3d7725b1b7e914b0ab015afddad,2,1545049 974da28a18d6e653f6a9e199f403cfe7,1,0 9768a0030974c0fd28b78535a819b800,1,0 9776ed2cd060f2ec977b6fdff3d948bc,1,0 @@ -2825,7 +2825,7 @@ 97ac47afe30c126d3330ea812d0b1ef0,1,0 97b7dad91b8185b06cf8d46ad17391d3,2,72 97bdb802189bdbd001648cc9d2b03e29,1,0 -97e207b8c7d2bc8da6b54ecedd0f9df3,4,1337209 +97e207b8c7d2bc8da6b54ecedd0f9df3,4,897285 97e7cbbd074457b824ba799d0418f1e7,1,0 97f5f8e2891615bc0ddc8901fb50a97d,1,0 97f781fb711f6ea219444c45453396b9,1,0 @@ -2834,7 +2834,7 @@ 982f138520b4f60e5ae36a6e9629e5b5,1,0 98322feac68c5808621d1476a1521345,1,0 984418084e79053af0acadf01005699f,1,0 -984edb05966e96b610f07cedff8e22f5,2,5625 +984edb05966e96b610f07cedff8e22f5,1,0 9857d9364017a24c2021854da5bd4196,1,0 9858d08809772904f8b0a9e6371060ef,1,0 9862f496fe6606a84f15834e421d8f73,5,6400 @@ -2870,7 +2870,7 @@ 9abd92f2d09b53f689cee54ea73449cb,1,0 9ad05f21be39341f42bfede52ef353c8,1,0 9ad068429596a5f0f7fcfaf327f876a3,3,41344 -9ad36f87de2203f7e5ea72f59d798e4f,4,11418480 +9ad36f87de2203f7e5ea72f59d798e4f,4,11470005 9add3fe8175b23cb776a00613b14924d,2,24492 9af9b9ac98cfaf7cc7bd36790a631ad8,1,0 9b0eb43b59048a9cf1d612d5d73f0086,1,0 @@ -2886,7 +2886,7 @@ 9b6af83c87e6f8b143372de80ae6288a,1,0 9b718d5227851efd7f8b090dd2111823,1,0 9b82eda309ee737e53a30050cf0b25c3,1,0 -9b8c192cf125bbb0d92bcedd37d62177,4,11439249 +9b8c192cf125bbb0d92bcedd37d62177,4,10123651 9b95269f0d32cfef0f5dd405766c9a63,1,0 9b96c4dbcd958014502327686e9ab3e3,3,21162 9bb9473afa3fd3d54ffc0eeffdb55d30,1,0 @@ -2906,7 +2906,7 @@ 9cd086d7383a7c9e7cdfa3961d4e6424,1,0 9ce19bcc04b2e0f132225a35dd7647b4,1,0 9cfc31eea726d9763d68bf5d3f2cd370,1,0 -9d105e3fde9b79c56034d1439fd0ebf9,2,272 +9d105e3fde9b79c56034d1439fd0ebf9,2,306 9d11ec92faa414e0f5b35476679b80a0,1,0 9d1815e84809cc29675219e525932e9f,1,0 9d20db0dcdde5b687436b5c5c2dedcce,1,0 @@ -2930,7 +2930,7 @@ 9e143735c4a3fd0252d2b2e53ac34379,2,7203856 9e1bdd2911fd6d817d914b7f723c6e4d,1,0 9e24269c0856f15217c60cf0fb236f96,2,20592 -9e29c2c2e08f7ab7cdf6994039deef30,2,5476 +9e29c2c2e08f7ab7cdf6994039deef30,1,0 9e2a86dc8498f9d624ae07d6effde5f0,1,0 9e520a48dfd70f936ed5f0fd14bdbb59,2,3422 9e6ca8398c7ed98f3a4c57ef2636c8c8,1,0 @@ -2947,23 +2947,23 @@ 9ee48699de56e0090f48b7bf274dc665,10,21504 9ef535e7a6cc0332a1166e38ecfd43ae,3,12970 9f02b3839f7d0c9ca085b599eb9ae984,1,0 -9f06d97a0c8501f9c23eca4a4aaa85ba,2,35721 +9f06d97a0c8501f9c23eca4a4aaa85ba,2,1156 9f0da261d140b7d0862000da05a31006,1,0 -9f1256752eff6533f6b44cb1c1a0b639,2,32400 +9f1256752eff6533f6b44cb1c1a0b639,2,306916 9f2b5306fa25f4048259a24a9e558ab8,4,26851 9f306221054d1f625ad51902e04aa637,1,0 9f4c1af281054f877264e1dfe3a3e846,2,7482 -9f53d95b50760e78e0366ef4c7a63ef5,3,17644120 +9f53d95b50760e78e0366ef4c7a63ef5,3,16490654 9f678e4d556b1da7c52e4769b6ff4b7a,1,0 9fb393eb0133650dec0ab1961fb7ad1b,2,17030 9fbe433f7f6799672a02db56b8be9fd2,1,0 9fde030604298e22ed72225dd5a567d1,1,0 9fe94dfc14cc6e81e3580bb3a675e3d9,1,0 9fee3fcda1554b4a1217481ba0636062,1,0 -9ffc94ff34c73ed55957c8884d97336f,2,2 +9ffc94ff34c73ed55957c8884d97336f,2,6 a00b50b0eee6d886d8ea670d4b4c412f,1,0 a0653a74dda0913c5e0bbbbe6ee801a4,1,0 -a077e991964f8ab0feba461a2aa9f4d4,2,4830 +a077e991964f8ab0feba461a2aa9f4d4,2,3540 a07bd1e2e9452f84351be70fe0bd0445,2,1441200 a08d75d1137f430dd90c5ae4e67fe55b,2,14884 a094b8859a54355895f1208679cc31f2,1,0 @@ -2975,8 +2975,8 @@ a0f5aa7204a02717f4c079d2937575a4,1,0 a10ab13234971a3b010b7ea536300567,1,0 a11344e4c9dd46adf3d5ad5e6755d33d,1,0 a1173f4270bcd2f934b4b6aa4d092f91,1,0 -a1312f92d4d371b8a251eb2713da6591,2,64 -a14636906e030c9a350d2db8b4f29af2,2,100 +a1312f92d4d371b8a251eb2713da6591,2,1849 +a14636906e030c9a350d2db8b4f29af2,2,121 a149e61e39445cb310febbabdc688bd4,1,0 a14de79e62273ce6b1281b7512609a64,1,0 a15ed07d7a11c46b96d077b23213c966,2,20 @@ -2990,7 +2990,7 @@ a1a47ce91a9683caae00f42f61f8b908,1,0 a1a857eba8fd4efa2d42128379294ea0,1,0 a1b9de90112b3f397d4bdb5f843e13ec,1,0 a1bfb219268b4fc3cc0cba225b46da89,1,0 -a1dd11a2c0f6887207a34f1413dea3d1,2,11664 +a1dd11a2c0f6887207a34f1413dea3d1,1,0 a1fa96f631f84b9de619bb6ecbc5b552,2,65025 a24668cd188d0d8e177bc20aca9df0e0,1,0 a25007d3ace81f5c2b1798ea9d4b20b7,1,0 @@ -2998,8 +2998,8 @@ a2523b196b8b24b2b291da03b65d0e00,1,0 a26803fa805490e3a05bb9b1069f15cf,1,0 a26d65914ab837eed26afab849689277,1,0 a273783308d4ff42c356f71bb0bb514d,1,0 -a2787b5480ba0724a5544b8a4a5ed230,2,169 -a29930c3ef18ec604a36056cfe9a7d4f,2,5929 +a2787b5480ba0724a5544b8a4a5ed230,2,946729 +a29930c3ef18ec604a36056cfe9a7d4f,2,4489 a2a1701dd6b099770c9ccc71a30458ba,2,34410 a2b19ce8b289916ad7544d0bed28e03d,2,128164 a2c167c4c57c932ae0b5c273027d31db,1,0 @@ -3029,11 +3029,11 @@ a3ce775d26ac8be3439ad24b24289f7e,2,87025 a3dddf09e71c503bc692f33ed332e5d1,1,0 a3e3c130372bee11d670de991210c9af,1,0 a3f95b935375913e85f66e3cb6480a9d,1,0 -a403a7d8ed1e7ba344e9a814dc938960,2,9 +a403a7d8ed1e7ba344e9a814dc938960,2,1521 a413a12acaf8fc5b8cc5118d76c0ebce,1,0 a4158880f12e267d4120f1c99e90b04b,1,0 a41d7001551662ca358cf917b4fa71f5,1,0 -a424fd77c944ee0bd0557b9fc4d3798b,2,521284 +a424fd77c944ee0bd0557b9fc4d3798b,2,73984 a42bfeebb707ac234591969f5d1f2cbf,1,0 a44593d1f1ad1011acdc49741c8ec650,1,0 a44f85a4e8c72fd938ad4445a57ec85c,1,0 @@ -3051,9 +3051,9 @@ a4e8c2d7bb8e21c07d5d5bae9a48e4d6,1,0 a4fd5a590aaa3f655ba15495467d6f70,1,0 a4ff6a3aaf181e8d271f83f5f54c08f0,1,0 a519050b60f3a28945c3af20e54c98e5,1,0 -a52ed384032d0d764c40c5b198b0cfe1,2,38612 +a52ed384032d0d764c40c5b198b0cfe1,2,13110 a5328f72f09fcc8322081db3107d25de,1,0 -a534bd597a5e786f47acade9b5189bb0,2,135056 +a534bd597a5e786f47acade9b5189bb0,2,2352 a536b666854eead81fb1bf325fedcf9a,1,0 a55a321fdf7de1c2a1e247cce4f5e343,1,0 a564daaf587906cef7f91685432d6294,2,16256 @@ -3067,7 +3067,7 @@ a5d6c152df8c6966ed3b39588106079f,1,0 a5ec92541060f2793041970dd5de10c3,1,0 a5efd1b0c6ca442b1c7a59bf00938d3e,1,0 a60d82e7aaff19e99d10de4cc5444356,1,0 -a6301dc72697cfd7e96312f0b33f51ac,2,3990006 +a6301dc72697cfd7e96312f0b33f51ac,2,3638556 a631d607f7a57e526b5c1fe63bab1a62,1,0 a632234c51a55c0ff877973a0198fcba,2,992 a6354eea25581f1805f09ffcd40eabe8,1,0 @@ -3078,7 +3078,7 @@ a665b2589e5a067ec87177b7e125602e,1,0 a669515f75c6275352a4721674d45a94,1,0 a68ae93c76205955a8639637e3943b89,2,10816 a68e179aceda7601629848cae5afcfdd,1,0 -a692cfff6d41d88083cd68c5a02fe34c,2,240 +a692cfff6d41d88083cd68c5a02fe34c,2,6 a6a3175648640da7e7e34b3bcf7eaf16,1,0 a6a60c8ee869a3b6f898cb9c2c2c6f91,1,0 a6c1a06ae9fd2123717adb93b6794e80,1,0 @@ -3113,7 +3113,7 @@ a8394f0df3448abdbc216d0b2a026a6b,1,0 a83e88ee094f8f0305bc9e2692157d0b,1,0 a848fe3f05e35954c7ff1b3ac8e8ecf3,2,1478656 a84ccfad5fbd5b25c1936f4c4951ae95,2,0 -a87526b2fa224408e932f2a52f632270,2,729 +a87526b2fa224408e932f2a52f632270,2,8836 a88368bf99493a6932b2f95f7599531d,1,0 a88fe8665c06eaa85c42063f707824a5,1,0 a8ae150219eb5be539b9a5e982bb6cc8,2,1296 @@ -3168,11 +3168,11 @@ ab9adb7a99dfc3d4b80d083a86f2f2ae,1,0 aba87d77c62dec94db2a7e6c0fffa3ba,1,0 abb0453a6d3702952eadaededbe9e8c4,1,0 abd0128689dad928f507b7fe7e11a193,1,0 -abd57ef21d646f61ca5a9a33a20cc36f,2,218089 +abd57ef21d646f61ca5a9a33a20cc36f,2,900 abd856a8c4f425784930433da14ca881,1,0 ac04800912fdbe12d091e6ac53b109cd,1,0 ac04843b693227695cb5f1b4eedb4214,2,27722 -ac0774e3e576dd5bd0d8133a31fd7aff,2,9111342 +ac0774e3e576dd5bd0d8133a31fd7aff,2,7870830 ac0818a2918c2e93eff436c41d801114,1,0 ac0e3f934a0d37b8d77d815aa20dac6a,1,0 ac12b614309b5aeebc9924f29b371f05,1,0 @@ -3194,8 +3194,8 @@ aca7fdc10cb64ba59d49dbaf30db8d75,2,1609092 acab98f452f8b8a262435c40beeda615,1,0 acb9fe1568054c608c85846e324db053,2,11881 acbb657b915f72ef780ac0230d777b4c,1,0 -acbeadee96d20b90baa7fe9cabcf0d87,2,1284822 -acc21a7f8c9bc9ccb3061e43457b2996,2,1136356 +acbeadee96d20b90baa7fe9cabcf0d87,3,217200 +acc21a7f8c9bc9ccb3061e43457b2996,2,804609 acc3d01c713b100321cc4d72067704f3,1,0 acc43fb24a791224adf7bfe31b32ed44,1,0 accfdb3a353ea6c183026a137bdf356f,1,0 @@ -3203,9 +3203,9 @@ ad031d6fd4052bc415cd3139995f9719,1,0 ad0723c19db4a769d335266213ac1c5b,1,0 ad0cbd69b08f2ef53b1b73cb0532a624,1,0 ad228828498ecc39f0dc8a615e079300,2,2116 -ad47466ed5264d990af031a3014b8025,2,110 +ad47466ed5264d990af031a3014b8025,2,6806 ad55a1435a4b3b04c751e9bbc8905c80,2,11236 -ad5bcb9ea1ec143865d4c4b8bb8ce7de,2,729 +ad5bcb9ea1ec143865d4c4b8bb8ce7de,2,14161 ad72d2553693c6e3a483b379a603f9d9,2,9 ad996f9413678956dcd1d2ebe67a2077,2,429680 adb39ecbdcb845f05a940ba45f604bfd,1,0 @@ -3217,25 +3217,25 @@ adee55d4565f6b07a78f7e4df87ba162,1,0 adfc3b954a70ab02b6539fe77f8a287c,1,0 ae1e1ab6e23233115aaba14b551f5993,1,0 ae2be94c703c264c5e50158ea608ff43,1,0 -ae4b6f3b58817637c32fb96e5937c834,3,6944900 +ae4b6f3b58817637c32fb96e5937c834,2,25806400 ae50d9eae9b2e980f1f61c95825fcde6,1,0 ae5f041297eaf32f448d03c3e621d40d,1,0 ae69e76bcfb563056277952a24bc760c,1,0 ae6a3f2050557ba593e2542b2110032e,1,0 -ae72eea7d3afda2b0ee9f925ccfdd18d,2,121 +ae72eea7d3afda2b0ee9f925ccfdd18d,2,529 ae9fa2c829b7efdd1b4e471b9e8006a1,1,0 aea8b701cb863fcde290758bc41e1c1d,1,0 aeb406bd2988bd5a9595680269d94cbb,1,0 aeb8179ba0cbd19526cb8a795f9bd638,2,1722 -aec030a5aaf64ba75bf9b26c0f5c405d,2,30276 -aec95faf997546f202338bd6a19e2cf4,3,6549979 +aec030a5aaf64ba75bf9b26c0f5c405d,2,36 +aec95faf997546f202338bd6a19e2cf4,3,6223686 aefa83606a936435e35f8b80176cdf9e,1,0 af04921d4e6b9efd99e58e9661f68b68,1,0 af1f21fdd330b462201ddadcc7a71a46,1,0 af2dafa925eeb18a76f5a93ef472aadf,1,0 af2e1cd8f3ad6be762accd9233114a59,2,0 af35024e9497f6acb4e9a4031608c10a,1,0 -af3c33f8007b632d5013cfbe53bc383c,2,106929 +af3c33f8007b632d5013cfbe53bc383c,2,43264 af3f1c56256a3b337db10fdd66eeae9f,1,0 af43282fa9c27b842c792bdb59c3aa44,1,0 af5414f9c670750db6af484f610b4185,3,221866 @@ -3252,8 +3252,8 @@ afe7ffb1f0c596924fab2a3d3cd3bca3,2,124962 afe82686f800749adfc6eb13778a6bb8,1,0 afea3328620147789d47b433c86fde2c,1,0 b00ea65a910e3dd0118177315f07180a,1,0 -b0224491fc31ee18889d73456855bb94,2,43056 -b0575930d777ae6178a5555d42e8b5dc,2,10000 +b0224491fc31ee18889d73456855bb94,2,870 +b0575930d777ae6178a5555d42e8b5dc,2,41209 b057a36ffd1832a29e1d765eb903df03,1,0 b05ece7b4e073e667c9dba8926b2941e,1,0 b05f1260c3cc5bcd9f70eb12e554ef7f,1,0 @@ -3275,7 +3275,7 @@ b16dae1b6d7cbf0f3a616e965abd7181,1,0 b17978fad62aea8c62a47fd20beec268,1,0 b17d126249ccbe48962744a29f4230ea,2,10816 b18f89c228a8beaa2e7c35f1383cb129,1,0 -b1b2974cf8551790a36bc6cd7cb48c9b,2,2450 +b1b2974cf8551790a36bc6cd7cb48c9b,2,1892 b1b92098b383445648e2f1a6463c51ad,2,35156 b1c036ce0e1c0b21530f025dc2f90284,2,16 b1e2323bc926aa31d56278f42a42f8a9,1,0 @@ -3310,16 +3310,16 @@ b363fba5a7a33ad7eb1264b974d0a0c9,1,0 b372f352f264af05e460b406d9804e02,2,88804 b38d7cd60d2f955ad5cb00c2eb85d2cc,5,1622136 b39137e05e28d99a0dae488ae87188f3,1,0 -b3953afa42831fd4574a9cf40447fea6,2,3306 +b3953afa42831fd4574a9cf40447fea6,2,1980 b3a222041fbfd2acbb5c6dedec0167e0,2,5476 b3cf295b110e66c5cc332ceb155650fc,1,0 -b4120e07ce346e6a02ffc9ba074c5267,2,428370 +b4120e07ce346e6a02ffc9ba074c5267,2,427062 b4165a27f008a520bf07d5fc3e43fa9d,1,0 b41c7e7258df26e79e1b28650347fd56,1,0 b423880b10399351279cab60c68b443a,2,650 b43ea437eab701da97ed33706e1f9293,1,0 b44f0911fc7103f5d5edc01897b29c26,2,28561 -b454b36210ef97a7af01230d18ab2e6e,2,35910 +b454b36210ef97a7af01230d18ab2e6e,2,26082 b45d470b27445daba17f93572e5675fd,2,1764 b47070b87d435dc69829bd9099cdefb4,1,0 b48094a36f09d0270396724d598ffd06,1,0 @@ -3329,7 +3329,7 @@ b4dd2a43f3b00943ec40539b0a428485,1,0 b50aa9e14c5fd53b1232ebfb9d9459a1,1,0 b517221a2f58d3729ab96c4d40c21b98,1,0 b51e75da1b8ced13c481e37ed56e0d9f,1,0 -b544c2873124131ea902f9953a4360dd,2,1929321 +b544c2873124131ea902f9953a4360dd,2,978121 b570131e0333d4dd7e900eb7b06986bf,1,0 b5748951600502ca21d82d1f94a0161e,1,0 b588a88717cceace47c076e1cadac849,1,0 @@ -3357,7 +3357,7 @@ b666bdfe74fcb14e02dd66e06d527eca,2,2450 b681e330983bd1e525ec3bd7d489b502,1,0 b68710fe3da0cfb68a7441bb7e2d85ea,1,0 b68bd3870389cab5d85b5097c39bbd92,1,0 -b6938c68e89c4b286ac1f425820f6196,2,625 +b6938c68e89c4b286ac1f425820f6196,2,1444 b6a7e4fa9183e74b5767952cdca8f010,1,0 b6ab2b40ec4109094efe68832736596f,2,25 b6b9f338b315e419a4a90c5ecbf5d1a8,2,22500 @@ -3378,17 +3378,17 @@ b7af14afe532035753a42293d0ad1a65,1,0 b7bd39f9ec8fbcef0086b266e498ba61,2,930 b7bf9164b0ec74fed596442effa26359,1,0 b7ee1747c149d9121e7eaaa526efd8b3,1,0 -b7f318ce1885530b07bc9aca2ebccf70,2,20 +b7f318ce1885530b07bc9aca2ebccf70,2,30 b7f5889c29ffd63d17a5f5b00f3f47fb,1,0 b7fd2d883931106292cf065f1464ec43,2,870 b80eda2f1b353e16adef99fc43b81fda,4,6397181 -b82173108a40f2072c06b3aa7bc9919f,2,1458056 +b82173108a40f2072c06b3aa7bc9919f,2,548340 b8305d80e25d3f2ec57cb92866a2beb7,2,1803649 b838dd9bbfea9d29fb01dd679f23d59c,1,0 b840610f7110fcbb24f01676dda52c87,1,0 b869437f87c9a86aad1a76d9d3fa8bc8,1,0 b86f50bf4d15947286a09798d93ec257,1,0 -b88c7a2351de28aee6716b9cff24f881,2,5184 +b88c7a2351de28aee6716b9cff24f881,1,0 b89760266cbb36fdc266096ada960a48,1,0 b8aeb54a75a38c029111451386c12f51,1,0 b8bde258959f11dbb2ccb7f3362351c1,1,0 @@ -3398,14 +3398,14 @@ b8d455f760646c55a3c3fbe511acd959,1,0 b8d6940a281f24abe00148c2df1f00a2,1,0 b8eb9e66693c38c71f3a2e43461103f1,1,0 b911fe0118f344ec71500e97bb4d2795,5,3913 -b914c373432568d14496a6fd786ab8a5,2,1929321 +b914c373432568d14496a6fd786ab8a5,2,978121 b92874b4b100035b5f2e3d9974f11f20,3,25486 b94a87fa463dff48fc0278a1580d7fd4,1,0 b956cbaf78e232c07d33994638cf5b25,2,256 b9580d3f78fa465c0574a3ee7625f2dc,1,0 b9582800b91bd2ef7aa3284f0ca2e72a,2,2809 b95a560d49589539381c8db26fd3f1cb,1,0 -b971be138036b84194a755c54de9fbd3,2,169 +b971be138036b84194a755c54de9fbd3,2,37636 b97ff3823d2cc7ee368602f9c70f440b,1,0 b98696eed74e4af81b090ec5b486357d,1,0 b9992b1517291cdb7859b574a28c617e,1,0 @@ -3428,9 +3428,9 @@ ba9db7741094e3f84417f9d313d2cabd,1,0 babefa94a7b82bacbd035e662451acc9,1,0 badc912ed05a0e591cb51aaddbc32ad1,2,25440 bae7822c468ba303cdb62a03ed3d6e8a,1,0 -baece3c7eda8103c1365f4abcc1e2757,2,147072 +baece3c7eda8103c1365f4abcc1e2757,2,139502 baf7ebc276478e8bda1cb73749ce8ccc,1,0 -baf89d460bd1c0b7ce21d0fa83cf8da9,2,1020100 +baf89d460bd1c0b7ce21d0fa83cf8da9,2,16900 bb008fa7b181df68b8fd1f7d167a97a3,2,16641 bb066fa597df8a76ae620dc7b0116022,1,0 bb25f0fc6cddc01991921d0d7db3f675,1,0 @@ -3439,12 +3439,12 @@ bb5633696285f5a42d4f8b89a31e874c,1,0 bb60a1f3fd3a8f1ad4c3acf08c439eb6,1,0 bb6c9830fb2a8fcc55e12d705aa09b0a,1,0 bb713bf959483817b2d47f5220623c3f,1,0 -bb9c2f4d57a01e6c74a25b90b9c929c9,2,609180 +bb9c2f4d57a01e6c74a25b90b9c929c9,2,158802 bba9ca73b8eb3aa828549faa6ebb171d,1,0 bbb6d21655c6ccd9b6f3bbc6ea9dca78,1,0 bbc13f4a9843398a131eb029cffe5aa5,1,0 bbd1ebfbf9c265e136c26df200b3c5e3,1,0 -bbd3aabf4b15f6af503a7b9f980ae4f6,2,5184 +bbd3aabf4b15f6af503a7b9f980ae4f6,2,7225 bbde0ef1a7c7e817ece73d3be15a6ac5,1,0 bbe7dfe9215d037fda80e6029ef8b531,1,0 bc0fff5430944ef7955b73e2e11ce1b7,1,0 @@ -3458,17 +3458,17 @@ bc6c22d23caa4cfa4f9c1ec186ecb464,2,2550 bc7570dff0ab21af870017f8be25282f,2,2256 bc7d15157115094cb23160d4df6dafd4,1,0 bc8f5e35cd51f79526c5ee16845e4f0e,1,0 -bc9dbfe40ae3960fdefdc6a626361062,2,233289 +bc9dbfe40ae3960fdefdc6a626361062,2,107584 bcac0b82d5ced17308aa34b87cc67eb2,1,0 bcc3bfce52744184bc339bbf7d207a9f,1,0 bce5c8e0dc3540072a9228b75ebb3590,1,0 bcf0512a1158930c8d95d13b16b2309b,1,0 bcf103fdfbd9549c101d99cf7584177a,1,0 -bcf68241e122a6373e6e77f2bdcbeef9,2,112896 +bcf68241e122a6373e6e77f2bdcbeef9,2,4489 bd290afba73d74fd08c0b0316f84d691,1,0 bd3a240db70ff672f1740c039e615852,1,0 bd5345a4c6cd948e83bc26ba7115aa99,2,136161 -bd5561e2ce80ada0cc17e6dd9d55e697,2,10920 +bd5561e2ce80ada0cc17e6dd9d55e697,1,0 bd5a6a1df954e5500d6f766f7518fe19,1,0 bd6272761405e3e8856c4b82efa0d5ee,1,0 bd64186c9ee0891fcd8a5e709f79e640,1,0 @@ -3492,7 +3492,7 @@ be0e073ca162ebfeaaecf630fbe502bc,1,0 be2c5f641024b406d201b61c85e09022,1,0 be32edeb201a551ed98279e91b89f1f8,2,10816 be43a1efa6de23e58f2fcf94ab9c73a7,2,0 -be445c24736a3c48d97a64c498b2b9b5,2,32580 +be445c24736a3c48d97a64c498b2b9b5,2,1560 be464771d6f3338ae8168938a569c226,1,0 be4c764e92dda55322399ec699c25fd6,1,0 be52c89dff039897756f5b10a8aa4c76,2,1227664 @@ -3539,7 +3539,7 @@ c0d1fae5286f918a047724dd7d5e9f28,1,0 c0df65b660b3d07769763c82fcdcb65d,3,12550050 c0e3f860f9e6f89485ae80f63178aeca,1,0 c0e908b85f06ad4e6c29c810b8d28d02,1,0 -c0ee6e0f5c0d01c7d2ab0b1743621c02,2,308025 +c0ee6e0f5c0d01c7d2ab0b1743621c02,2,300304 c0ff21c7760641cce8e9171e37d80461,1,0 c10190c0aab2e19a3c15872a04af309e,1,0 c108d5f38f1cd9364c5de8166b55483f,2,37249 @@ -3550,7 +3550,7 @@ c12ae409fcaae5400801c9aa3e86480f,1,0 c144d6dbf310fa477fe3b12746f66009,1,0 c160e17666522f175ee88b9093a18174,1,0 c1631001d534f1c3e27c158fea475f98,1,0 -c18ab92fb29c9b8d5714401e73b7b6f3,5,244851 +c18ab92fb29c9b8d5714401e73b7b6f3,5,237109 c18f806a86f94c637dbe0a922d6d9ff3,1,0 c19729fb78807e5f8c3ac879f5db04e0,1,0 c1a2340ec188c63b48f0b3bc5dfeb5b2,1,0 @@ -3566,7 +3566,7 @@ c2b26e5e3585a10fb6e08f978187380a,1,0 c2c75e25fd3ac4a12abd2ebed80bb897,1,0 c2c858834c938169eed3929eb781fc34,1,0 c2ccd77fd0a1ed9eb07289df0a229a0e,2,26732 -c2d1ec1a70fb90b3eb866be969841e42,2,166464 +c2d1ec1a70fb90b3eb866be969841e42,2,7921 c2f60f453dc7c2d08e4efa573edf3a78,1,0 c3035e240177ca535a52f79594b48e61,1,0 c306e22646f6729e748664ece2db083b,1,0 @@ -3632,14 +3632,14 @@ c6d25e5c694a9ebd48381e4c39e7c943,1,0 c709a7003176ebe42d9ec0e3797e6393,4,26864353 c70dffe2d9e3679ac67d4d51bd13f8a2,1,0 c70fff35015c7856fb37309ab22c6119,1,0 -c7154581202deb9590d4e8c07ac3fe09,2,1190 +c7154581202deb9590d4e8c07ac3fe09,2,380 c71c8a25efc5b806c10e8e22a3e3e46c,1,0 c71f22f0e863a4153d622455abe48dd2,1,0 c71f60155dcd36c16dd2b85f22935c62,1,0 c7425ea0b20848cc297a59c2c6e1f584,1,0 c749d85764410d02557868477f2837ad,1,0 c74dd6e81c39c3bd14164b32aa4a51c8,1,0 -c7594e523a00ac51e7360905af39768e,2,6469392 +c7594e523a00ac51e7360905af39768e,2,5491992 c76849a895f6dcf8c6a48bc8848e0e93,1,0 c776272987a8a324888f948ade5898c7,1,0 c782340f2b2127158fa41a9707b36fb1,1,0 @@ -3652,7 +3652,7 @@ c815b00347d8cd3d889ce9c5be12b8f8,1,0 c830e04c546b2bc74c62faa95ea7e8d7,1,0 c836b97742eff6b1996167e83c48b451,2,29929 c840bb8191109d2ca4f83db009567dc3,1,0 -c84d5ea9a3b2b3a210f80cf73cf4df39,3,6612900 +c84d5ea9a3b2b3a210f80cf73cf4df39,3,6292296 c851b85cd2992e6254e1ea5e4ca0c609,1,0 c854b1f9a31ad9cbb156684c90309ce0,1,0 c857e9d35624f78a3bcd6875586e024b,3,511664 @@ -3668,7 +3668,7 @@ c8b831cf9e0c0f83c042a1be951adad7,1,0 c8c8e7510c0b53f4dbed676bbb61da75,1,0 c8cd16255e23f77db9f4d212106d5130,1,0 c8d7db989046276ea139f602dcc5f42b,2,16129 -c8da098f187ed0f780465f64e2981ed0,2,81510 +c8da098f187ed0f780465f64e2981ed0,2,72630 c8f28f17d526d55b8001bd22bd0e1971,1,0 c924405f9680573e30cade45b285ab5b,2,992 c9480f4dc6dd7aabbb07de35d07a6ec7,2,1444 @@ -3704,7 +3704,7 @@ cb1775ed735c551a7e71b2f4fbd82a9f,1,0 cb28f086f99b5b7b61b087870fd71493,3,1615388 cb2de61a521a8547b7c4dc2662826362,2,12656 cb326fe9f7af2b81c53a4b69e6aa4c24,4,19200 -cb4760e2c76a3dc58e32ebe7fc4e2640,2,100 +cb4760e2c76a3dc58e32ebe7fc4e2640,1,0 cb4c2b2b257520977e5f0636dbc76b8f,2,3540 cb4c7e7256d481a71f63d7b9bc2895d8,1,0 cb4ce3610c2a0cf23381d4fdb23f80f2,2,23104 @@ -3722,7 +3722,7 @@ cc242d99b88ad949dc63b880353ce3b3,5,0 cc2c84a81648ca2bac1f40c8b9dfcd5e,2,4830 cc3350b52fb1608da8744bfcb7ec961a,1,0 cc46c27915f2e1acaf5c17050c073c0a,1,0 -cc52f91485015b404e90b92ff1114625,2,13806 +cc52f91485015b404e90b92ff1114625,2,21170 cc7955b38a7dc49eaba0d50745bec001,1,0 cc8849096f9bd9b76cbe22e65c0dd13d,1,0 cc9a5f6c7bdded630dc998a82c414e5c,2,5329 @@ -3775,7 +3775,7 @@ cf6c9e450532cd18a8ee0e3186336947,1,0 cf6eaff128e759b4a181aa09f887c9b3,1,0 cf85b4ef43701bc35b61cdd5b45c05b1,1,0 cfac033866a51bc45580a112c99721c6,1,0 -cfbe74ea632a5dc7535536f13260d75f,2,10683092 +cfbe74ea632a5dc7535536f13260d75f,2,8096870 cfc4b256cdea1e6690466b9f13b34cef,1,0 cfc60d3d8ec650a24cddfbf1ce965ca6,1,0 cfc9a621edc4d96df95b0a43ca4cecda,2,15006 @@ -3800,7 +3800,7 @@ d083e8eed5a98da16c8726048e6589c8,1,0 d08866971a046f44ca285c6beb32718f,1,0 d091fe364eddf33c3514db8db701dcf5,1,0 d0a71818e4a664e94ff10f8eb40937a4,1,0 -d0b437657d7b188d216668d5a9abbfda,2,8100 +d0b437657d7b188d216668d5a9abbfda,1,0 d0b7d75014136ebea2b9dfffbfabdc34,1,0 d0c53f58ab1315d145d72357ebfc294e,1,0 d0d84ef5a07fe5a8a181b445771522bf,1,0 @@ -3865,7 +3865,7 @@ d41cc4a7dbdf57d9438b8d5cd95dc51b,1,0 d41e05d3f9df1ed2de84a50c0caa5ffb,2,32220 d442070efa4f87142edb9f629b5c3b04,1,0 d45882c7e2dbe1ae49182bc9f7657297,1,0 -d46c26cea4af6bb841f2b9d7002c8b0f,2,104652 +d46c26cea4af6bb841f2b9d7002c8b0f,2,5852 d46e5e60473530db2e8f1ffd9437ffdb,1,0 d471596adbc31e076e657ec4d12e5d3f,1,0 d484e0790a22aa4dd9d57ddee472502a,1,0 @@ -3874,7 +3874,7 @@ d4b02dd76ff488652e24086a540c6f0e,1,0 d4bf6d99b6147efb6c0e3f0b89a29c4b,1,0 d4c8f43ec3278006a389275d37077208,1,0 d4c992bda7979b23cb1620f702e83f60,1,0 -d4d27fdfa20da0728ac2e1beb54eb695,2,990025 +d4d27fdfa20da0728ac2e1beb54eb695,2,910116 d4dcbecf0342153677596b6c4b6a2185,2,900 d4dcdeb612d98d99ba9beaf778bf5a1e,2,13340 d4e0dcd9dbdc53795274fb80d1b704ff,2,49 @@ -3887,12 +3887,12 @@ d4f96f0af7a1136071dc10c8b41a045e,4,0 d51656afd8b7f5e0323747bdf6345173,2,8836 d5167600987df4a3b73a9a25bbde8786,1,0 d52005c3b8202ef39293460fd6d2a985,2,380 -d525233a05ce3d88948b9b57fb6827a2,2,1296 +d525233a05ce3d88948b9b57fb6827a2,2,676 d5336d69db887c8d3c38b18101cd9bda,1,0 d53d915868c0d49f53d73f2ef4d6cb91,1,0 d541eab8de2c66a44cd70e2385bd9846,1,0 d54a1d8b04b17d6b4b7513fe787e36c6,1,0 -d55f18ae2cbd7bb6fbd415a863f1b860,2,57840 +d55f18ae2cbd7bb6fbd415a863f1b860,2,110 d56f3d629cb60650d5c0b267a3a42258,2,9 d587286a28cb62589de8aaf6fc12e373,1,0 d59f3e80138e0f13ac69ed2173851f41,1,0 @@ -3914,11 +3914,11 @@ d6ee75da9d933a159dcad86218188e2c,1,0 d6f9c9cf2e24d02f82757d6338d3695b,1,0 d7036d2f0c2853ff6d0914f155493b8f,1,0 d712b0884f9bb07fcf4bcb4ad3fc760c,1,0 -d726262b0658d57b458edd4c4e5ee8c4,2,5929 +d726262b0658d57b458edd4c4e5ee8c4,2,4489 d72f85f7a985d067309a2a9c262c30ef,1,0 d7420a241c1d4d35cdc87ae1c86a88c3,1,0 d7581c4077d98e38d0563601b73066e7,2,576 -d761219e01bbe2f4da25f988b8096ac2,2,2006472 +d761219e01bbe2f4da25f988b8096ac2,2,132132 d776c917f38e5c7676bfc4c7fdc88e03,1,0 d7871f7c9f92ba8c2f885c62b31d1227,1,0 d7a916d68f49ab767ba60abcf4712059,1,0 @@ -3926,7 +3926,7 @@ d7acfbe449fad0be5f3ff7f450f0e134,1,0 d7bb718f219b5265711fb0087abaf983,2,8464 d7d1bf2f060ebd8f779235440718ca1c,2,19460 d7ed6c8242a358241c959cea6c91f659,2,14400 -d80ea19e95e04087c4c24d2837fdd909,2,9506 +d80ea19e95e04087c4c24d2837fdd909,2,1980 d80fd68109f6fb7640cf5c454cf1708f,3,68731 d813742b8f80cd2b4b8055c3c4d8a413,2,16 d819c2646fe709ee8dda8e23ab4c2fd8,1,0 @@ -3960,7 +3960,7 @@ d9c9c85316195a77174f29ad7c5b4022,2,24649 d9dda9089bc4e3833b2dd170e4ac9b10,1,0 da04810164fc021b1592dc8b1fed6401,1,0 da30bfae6a9a5a83cadc7eec05eeda03,2,41820 -da660877a6d6b415aefc442798798ccb,4,24233169 +da660877a6d6b415aefc442798798ccb,4,22909716 da69840b381127b1528ecb3aff6341ee,1,0 da6d9a2e56d9ef2ce69d4d8c33688963,1,0 da7a9e5d5e8c6ee725b402ef1b22f12f,1,0 @@ -3983,7 +3983,7 @@ dbf088a8f45b3e0a1e4aa9c9272f55c7,1,0 dbf21c0b87f38c8c6461730fce7edaac,4,10607620 dbf5a17b7ad0a4d52e06612eca5e916b,2,1156 dbf6501e8cd61770ae1b8e1ec7554b3b,2,930 -dbf6cc4459569592597ac196a48ac6ef,2,56 +dbf6cc4459569592597ac196a48ac6ef,2,2 dbfcccd0bf6a234c253d45679ccca9f9,1,0 dc0ffbfcb32fc657e44f99fa4f304db8,1,0 dc19cfd76c4ecedeaeaf5cd4b3ff5095,2,173472 @@ -4010,7 +4010,7 @@ dd655a5bf318ca48d36010fce2709553,1,0 dd74f550bb177a933b62b5d2836fa4ac,1,0 dd8191420604dcedf2ec59a470b09b4b,2,6642 dd897cf7eea6d6a7cc0380f78f29ba4f,1,0 -dd9218a4b66b8a0378dc16a8fba27f67,2,13697401 +dd9218a4b66b8a0378dc16a8fba27f67,2,13593969 dd9fb38020ae211a57e53460275d0669,1,0 ddaa30c4e2af2de865dda0e017d98665,2,110 ddd908a2c90918db7e76f544b2a35883,1,0 @@ -4029,7 +4029,7 @@ deb3a0f1d990fca2642c22f78b2394f9,1,0 debd449f0841b79c26eb97a16ca44f07,1,0 dec1409cb858bcf7432ea149e83ebb2c,1,0 dec3650e71ebe7b02b6658c2cdcedc42,1,0 -deccfa6b69b800b071c387508f7464f8,2,735306 +deccfa6b69b800b071c387508f7464f8,2,494912 decd4980585a441914aab2d882d8fdb4,1,0 decfdb2fbc713ecf4f530978bf4d3206,2,30625 def6aea85211cb5eacbc7847c13b6c87,1,0 @@ -4043,7 +4043,7 @@ df85e19628c4d338b8faefc5dac5169b,1,0 df89c202d38fdb235ca1f96b0cc9cbef,1,0 df95028615882266460863f03e89dc80,1,0 dfaab40f4ad9594a381436bc75c65c97,1,0 -dfabb551e93632c3d7665811abec418f,2,25281 +dfabb551e93632c3d7665811abec418f,2,2916 dfdafbcde9f27a277c51d20ad3650227,1,0 dfe0e4da3af992090fba300c6b414f73,1,0 dfe581b4d11d9ddaa0b6a707530e1edd,1,0 @@ -4066,7 +4066,7 @@ e1214c4abbb63002ab826e159465f774,1,0 e1293fb6bdf4e33f29a104f4582e8d46,1,0 e1370dd7306b0eef9c2366318852e8e5,1,0 e13d432df441a669ceace62b43a7b3a3,1,0 -e140b24b0b630ccd07e1cf8e31bf1aad,2,42025 +e140b24b0b630ccd07e1cf8e31bf1aad,2,2601 e14769a7659515438fd954e0114e8ea1,2,893970 e1536a4b906e74eff7047ff1020b4857,1,0 e156aba6bdd6cc9cdfb721f4c65513b8,1,0 @@ -4109,7 +4109,7 @@ e385a6bcf5aa346beaa6efb66561db80,2,2162 e38e6fbc4147c66cd6bed4e93d46f80f,3,1796400 e39efc9706582b212f66dba86b3e0ca6,1,0 e3af6229865c76e595d3bd5ced875123,1,0 -e3b064d92e639a84840805f2ddc80269,2,11583812 +e3b064d92e639a84840805f2ddc80269,3,8242228 e3bb64f89a7f0f590fcc8f528e95666a,1,0 e3c340d1357616a6a2e1a5d4dc693ec3,1,0 e3c6a7706cf8158aafcfe6c284d0f435,1,0 @@ -4148,7 +4148,7 @@ e583fc9238046d12e7688ee558865ff6,1,0 e58efee8be26e7a1f3f70dd0a71877a2,1,0 e59197411e345a596dd06961a67a595a,1,0 e59d9464122b7bdeaffede305deb71a3,1,0 -e59e214ba46e7ac099c0f94f58e3c942,3,32096 +e59e214ba46e7ac099c0f94f58e3c942,3,10160 e5a9d7b49698b1d06eeae3ba9a072b62,2,18632 e5abf7641c7d55740fe6b91740675aec,1,0 e5b6b7c1623767c4dd7dc47b3525d4e4,2,4 @@ -4188,7 +4188,7 @@ e78efa42f02eed6758c276771e040a34,1,0 e79428b675045d775a8c5ddb831fd9f7,1,0 e7bafd6b79791c997780df259f74f0a8,1,0 e7c5d616f2bf53a38201bd6fe63ede4c,1,0 -e7ce49052d1b481395fc314783cc4432,2,125316 +e7ce49052d1b481395fc314783cc4432,2,35344 e7ced8ad83c78b7444f9e435215eb123,1,0 e7d547f4a27f1cc9e2deae64bffe6acf,2,30625 e7db60ae5af75bcf3a396dd309a7f562,1,0 @@ -4200,7 +4200,7 @@ e81dbca1a37b006477ea92411f11fbcd,1,0 e83783d03f3810844fbca24eb6fcd3ea,2,0 e856eeafd1ebd105950ddc1217b23c1a,1,0 e868fac92a9424bb61d3370269b9c899,1,0 -e86e94f808ad6ba87178b1b788233185,2,25281 +e86e94f808ad6ba87178b1b788233185,2,22500 e87f686f9b20412422d3cebe2830ce7d,1,0 e886f1eb5772308cf9ef39c0eff803b6,1,0 e88c30255f7f210c280bcef682b1e939,1,0 @@ -4225,7 +4225,7 @@ e9c359a6c93bec1961b298cc0977a8b5,1,0 e9cb86999770aa8f853972fac17c3b06,1,0 e9d5e9df22da59b4f852058721db3663,1,0 e9f36742653fd6f427d01db37c7fbb84,1,0 -ea121630a2189c3c95f076e55e4f7d69,2,11919756 +ea121630a2189c3c95f076e55e4f7d69,2,10781372 ea12be1c9c071b3614ecdafbed46cce4,2,324 ea266831e9477cce0b85e20b13aa1f80,1,0 ea34cb8db18f0013c9def40a8ef77fa2,1,0 @@ -4235,7 +4235,7 @@ ea7122ae9954678d540f9b751e7332d1,2,303050 ea80be7cc0e28b418054440bef9af100,1,0 ea8a581abae0dc3e269d0ffc7e6ab65f,1,0 eabe5412040e26fb2b47f6d7bf08bd4b,1,0 -eacf25c832163cc3c02cc8ef67e5ac81,2,3481 +eacf25c832163cc3c02cc8ef67e5ac81,2,256 eae143840bf7f0fc86e134802c7dc547,1,0 eaf265fc1e76d003d97acb83e904fae7,1,0 eaf774f16798d781d477621ac7d6de69,1,0 @@ -4260,7 +4260,7 @@ ec778df8e9a746b846276f4e834edf0f,2,24964 ec796392debc32cfe344a08e5f1950d4,3,7265766 ec9160e1ace8195aebf30d8280cf93d4,1,0 eca1e4ae09e18ddd559a91c9643d0f58,1,0 -ecc0fe4f6f88c4ec453e9e96af146096,6,356307 +ecc0fe4f6f88c4ec453e9e96af146096,2,17065161 ece1579e5961c057a7ceb1a0ecb22bcc,1,0 ece4e6a01bc6f79a928ab56e2caee9ff,1,0 ed1d321edc4bb344ef06c0c6f20bc81e,2,198916 @@ -4279,7 +4279,7 @@ ee583890792d12a9a8177553b3390d32,2,2500 ee63b8ec4fb811711abbb4024051b04b,1,0 ee783d35047d7e6ed6902d6aa7cf657a,1,0 ee827e9fa1ffea04267c2edd80aea15b,1,0 -ee888e69cf3c2cdee32b1f0abb14b3e0,2,154449 +ee888e69cf3c2cdee32b1f0abb14b3e0,2,33489 ee8d3b422df1f7110531f7465ec5fa0a,1,0 eea76afaa83b1c92654f4863d971476a,1,0 eeb14b9d24ffc04f1382a8fc821ea3c5,1,0 @@ -4289,19 +4289,19 @@ eed88af51c6ab627d1e366c068d8b062,1,0 eedd88981119a10f3e6d892cd554a076,1,0 eeddf672d72dbf56e335ddedc25798bc,1,0 eefc1572bff1456e4e032f9bcf0228a2,1,0 -eefd153f24eb03e4e0533c1d62fd63e2,2,32400 +eefd153f24eb03e4e0533c1d62fd63e2,2,21904 ef06350c70df4a9108433d372ccfd31c,1,0 ef0805936724e83adda881b2e8eaf408,2,6724 ef140fcd5dd3cd75f445f93bcff977f2,1,0 ef3c7a97edad12162bc2f0bbf4e2b910,1,0 -ef3ec0b920bb04d36a47c86a114d1eee,2,90 +ef3ec0b920bb04d36a47c86a114d1eee,2,16512 ef41dfce86de698d79d0b817ceb6da3c,2,17030 ef4f3b79626e7a5de77f16645c7ade8a,1,0 ef50008b01c3c0618d5cd5c1135360e5,2,17689 ef66aa583619fe215d5cc467d762d5f4,1,0 ef79ddad1458fdb8af477cc28c65988a,1,0 ef7a2f75c14a73bff5b4178d47da6727,1,0 -efb3e12fa99c1d6cd9a0e460a9d034e2,2,602952 +efb3e12fa99c1d6cd9a0e460a9d034e2,2,387506 efc0d6e26a916e63bdfbb7d5698d7893,1,0 efc18de5b670e8326250a5ff51f7dbd3,1,0 efdced1ea23989d43a2290ff81bf1430,1,0 @@ -4320,11 +4320,11 @@ f041ced5d24340efcbadb5978085ea90,1,0 f0606ab9d5621544a21365c3e53b4488,1,0 f064f2006d92d60ac291c381ae5a7a2a,2,49 f067fb18505fea47942de9ad90a5d427,2,196 -f06bf2fedd376cbdcc466726768c2f7d,2,9995082 +f06bf2fedd376cbdcc466726768c2f7d,2,8877420 f079d80d860507ab1aa7bb92ae526a72,2,225 f08330481f9656b42c0dce2cd80068ad,1,0 f08b9c00692934a367258751b727083c,1,0 -f08ea377661fc81e1fac59e94936ff93,2,1686102 +f08ea377661fc81e1fac59e94936ff93,2,1041420 f0acf5eb35c2a943c7a1a3fdb858bc91,1,0 f0dd894e70cb82b1c88de1fb6223a29a,3,2220469 f0f37463d2e1144811ac1c2c3662132f,1,0 @@ -4364,7 +4364,7 @@ f3a6c18066d81a492db046c4922c7e3e,1,0 f3b6d834ffd25a3c21ddb1de11c136fd,1,0 f3cb77747048e484f768813bed2ed007,2,7056 f3d6077ac898fbfc2555f958274986fd,1,0 -f3e2c1367ff235983aae981812e7d5ff,2,90 +f3e2c1367ff235983aae981812e7d5ff,2,18906 f3e35220f1830dd4f1b69776da90f0bc,1,0 f3eaba7a20c9a80bc3a66704ee33493b,2,4900 f3ee9480c80e7bda77784dc843ec8dcb,2,5041 @@ -4374,7 +4374,7 @@ f453a4581cf7450938e3c48eb99cd767,1,0 f4652034aae93bf8a9a6a6857c77ac44,2,11449 f489312319b1567c6e9bbd012582bcda,1,0 f49ed0526c51afe1db40e88e201c27d6,1,0 -f4b297419037c53cbe99eadd1e6b50e7,2,11556 +f4b297419037c53cbe99eadd1e6b50e7,1,0 f4b38f3d0548717990e815611bca0ce2,5,168673 f4bd79bf0e4f638a48e813b99ee178d5,1,0 f4d56c9d8d13ea5b40d1380aabbe8b47,1,0 @@ -4386,11 +4386,11 @@ f518ad54f8fcf2de0c6810ac7c0d121b,1,0 f527771e78e565bcae53cd63a04b435a,1,0 f539f4c9c7ca32f5cc8e1d851478c7b5,1,0 f55244c56464e0b9b03f8d19e678fac6,1,0 -f55cefb0d979a0cf5910b5b29e702717,2,7225 +f55cefb0d979a0cf5910b5b29e702717,1,0 f561d58bc43c039b3158ef211b60d489,1,0 -f567b11013bcd929db7ef7349cc59c4c,2,5929 +f567b11013bcd929db7ef7349cc59c4c,2,4489 f59673e61d54bd0243d553771e177184,1,0 -f5a59066ca3c0f3f7748528b32f68c3b,2,3844 +f5a59066ca3c0f3f7748528b32f68c3b,2,0 f5e0bc270f5f2d1ae67509e9bfb77026,1,0 f5e52d5eb44caf9179a27e29575777db,1,0 f5f2702790f0d279f25dcecfcf3c0188,1,0 @@ -4399,7 +4399,7 @@ f627b4aad2c323e18d8ba80de60cedcf,2,25600 f62a39fe608159a89a726d70e05d4876,1,0 f62a992daaac7f28843ecf3c1977cd46,1,0 f62f7c974de8096658594a8c8c57a901,1,0 -f632db3597f2e100c4e45a6ddb2ced82,2,144 +f632db3597f2e100c4e45a6ddb2ced82,2,13225 f639d9d84396c7af4f974c7429d8a879,1,0 f6496a9bd9b5f8212e702329c0d84921,1,0 f654d2df00a5fa48052a6e0196198df1,1,0 @@ -4409,7 +4409,7 @@ f65dbb3cc91910b1b3b839a7b14484a7,1,0 f666b6db5c10e854d89e5b4ed58ea5d2,2,992 f671b136f3f8299e037cb4b0c46b0e82,1,0 f67a490339d435f368cb7ecce3365e52,1,0 -f6b6ac47ca618ffe37b44848b372aad5,2,16662724 +f6b6ac47ca618ffe37b44848b372aad5,2,13176900 f6c12690c413517ea5773884d143af7d,1,0 f6e584b58a6f9cbc976a02e915dff93a,1,0 f6eb900c4f1f885178da95d8e64f0860,1,0 @@ -4422,12 +4422,12 @@ f79a66820843458dcfa393f9e4671b94,1,0 f7a91b3d76b05c775c33e4f4b61a90ca,1,0 f7ad960f891996077057fbb929a36626,1,0 f7bd764ff908455dec78fb72145e06c5,1,0 -f7c37ec04b1b572d393203852280a786,2,9216 +f7c37ec04b1b572d393203852280a786,1,0 f7d300dd9c05d7bb658ab899731d0506,1,0 f7f47e3a2f0a955e864ee3f778b6f8c5,1,0 f81ae8a5fbcefcd313f6eb33174d907c,1,0 -f81e3a5ac35f0e40ab763e7f7fa26cb3,2,1807680 -f81ecca4e56569f7cf1d7a60b7387259,2,138012 +f81e3a5ac35f0e40ab763e7f7fa26cb3,2,884540 +f81ecca4e56569f7cf1d7a60b7387259,2,101442 f82fea4dc25ad4dc865eabe09f4bdd7e,1,0 f84558f5184d3775ebfbf03c750964f9,1,0 f861252fafa357ac6f67c986de4a0517,1,0 @@ -4450,7 +4450,7 @@ f94569988ddc094725e018721a55b47d,1,0 f952e54189f2876032fcf94df5ef5b11,1,0 f954bcef9217d2c66cf213e8e3a7de0a,1,0 f99111ab7bef8c993cb0a07133059ce1,1,0 -f999251af259cc02349b53e07479a852,2,36 +f999251af259cc02349b53e07479a852,2,34969 f99d946fc9a26535618ec1f3bf516f20,1,0 f9ac32edc1f73fe3d6a4f85fbad3ba1b,1,0 f9b5a24df1b48d08b0760057247ffbfe,2,64262 @@ -4465,7 +4465,7 @@ fa4b5647c4c9de485b58c4fe6f062440,1,0 fa54912cc3e9fc55d5075030725b4b6d,1,0 fa5d56025029f9186c294df58ff37795,1,0 fa5d9ae6b63e9d33769081f7d4f2b115,1,0 -fa74eadd074843a8c78542d7602c31d4,2,5852 +fa74eadd074843a8c78542d7602c31d4,1,0 faa914e796a804997c19804300db0204,1,0 faae756f0de0eef0384474255db1e662,1,0 fac6c548649f983888821cb370e87966,1,0 @@ -4499,7 +4499,7 @@ fcb181254bb6c60ae02302c671065386,1,0 fcb5a252fc912fa3736c90348c222981,1,0 fcb75644dc47a7232329ec41122c1bc6,1,0 fccb9e61e76a8947c805e4b31e180c9f,1,0 -fcd99f7a69df6a3bdf9c50f5dec21fde,2,11025 +fcd99f7a69df6a3bdf9c50f5dec21fde,2,7225 fcdae1efce9c41a6a390e7100d443015,4,23768 fd050e15e9a62d79d6f3d9b6c70e654a,1,0 fd13b23efe45af3ce2a96538c3e9bb72,2,15750 @@ -4508,7 +4508,7 @@ fd5ae93d5c24884af440c6077daf34f0,1,0 fd752b87b8333955d409bd54f91730ac,1,0 fd82a328ac70197e94a67a983e8c3b2b,1,0 fd847921e894361e7873824c43f350f5,2,462 -fd8615b3f2dd43709e97cbe553c842d0,2,296480 +fd8615b3f2dd43709e97cbe553c842d0,1,0 fd940e6eb28a1a3ea2f79904b8823c45,5,21954 fd9a4b98b43ff6e30af5bdfe58bde1cc,3,38147 fd9d30e13c970c153bd6c820aa675124,2,1444 @@ -4533,10 +4533,10 @@ fea500bc3333d4cd61a772ea4eff4f29,1,0 feb4e424bfdaad0e2e0996f9477c5847,2,2407152 feb920824339702965d0d972455f2a21,1,0 fec4c5cee25105ccb92bd81e3de16cb9,1,0 -fec8c54eec8fb2c65ea80222bd53c1bd,2,2500 +fec8c54eec8fb2c65ea80222bd53c1bd,2,25921 fee37666b4e9dfc012cf247c08c843ce,2,25600 fee83d78e2f24638d08b9e5ca1d81538,1,0 -fee89965e7e6ee6d5752a425c76087df,2,3207681 +fee89965e7e6ee6d5752a425c76087df,2,2449225 feface92ffa841ecec8259f439d79874,1,0 ff03f3f30e675301fda512414a458e6d,1,0 ff1304f1d9c4d48370a9e8493b82ac72,1,0 diff --git a/tests/data/expected3d.csv b/tests/data/expected3d.csv new file mode 100644 index 00000000..7f67f492 --- /dev/null +++ b/tests/data/expected3d.csv @@ -0,0 +1,4558 @@ +0000ae0e5e344078ca60238632184998,1,0 +00054f3dc3bdc60ca83a1661e51fed4d,1,0 +0009503b71905a1dffe3cf45539bd92a,1,0 +000abb9134c7d586ca78f6cd476fd494,1,0 +000b7a25b51926172e027d16ec0cf2c5,2,930 +0012c8ff57729ec85734d12bc857189d,1,0 +0018b71973634bf9edbd6bbcb6e9ac9c,1,0 +001aef56d5a1569571d8cd55ec1279cb,1,0 +001c8b4432cdb77b175f3f6641d2e999,1,0 +001d57d72de2bd7a49fe3fc7ecf1540b,1,0 +001f4c4d83fc56d92b20463a9169da45,1,0 +003b0ae4f2883a8b1dd879ce9427b8dc,1,0 +0052503c5b3ae8acd0903b3e5e53f9a1,1,0 +00595cdd640e7d9a3c5f1c208d915065,1,0 +005cae5a6d3c095cd179b3dca813d5d2,1,0 +0071e815a0517592ca521a83fd473d12,1,0 +00766b9ac11f449261e81eefa0a57077,1,0 +007858f41e3aa258da334f3724bec17c,1,0 +007950d92588b3503fba5d8332d771a4,1,0 +009da5d2b856bef84b9fba40a17946da,1,0 +009f0d24994b021fa2151198fe7dc839,1,0 +00a5c92624b11041245f8527d0724448,1,0 +00a85cf3514d2c6b6af0045b56ea33f6,1,0 +00bc6c102e88469c8b25a91d15240a27,1,0 +00c566ed39ba9d5ef3645444b40e80af,2,0 +00cbafd8a129df08a50396bda67411f9,1,0 +00de4593e9c727619487c5432132a263,1,0 +00e2aa5cb792a839f7c7c8bc279bb846,1,0 +00e3e3957efb712bf39442d8f5b2e40a,1,0 +00e5909b35faf26eb50eb4686af5f3a4,1,0 +00e930a8e3416d649ed2b0ff08981837,1,0 +00eb4ac5d8cb3e29d38cb4b9aa4ce763,1,0 +00efda0e23b0a7b073acbdff84dc510e,1,0 +00fa3be42170fecbd1d5e8214f116dad,1,0 +010585cd8e8d3bbc0315a59a3a1f1e4f,1,0 +01093bd91e45abdf9725b70fae419650,1,0 +011ec0922a21ab6bc6e41128aa3fc3ea,1,0 +01212ae49142b228577a5116f4eaf237,2,3906 +0122080b2b06c0f01b15811a3af20821,1,0 +012c7808600075ec0bdc9df6a1653d82,1,0 +012ed00e3cfc301f250d7eb5fedb729e,1,0 +01357be33585046f49aebfc69259a63c,1,0 +014397d436d2b8fa02f5637807d1027f,1,0 +01463e0d9954b99188916b4cbcf84300,1,0 +0161ac3bf28dcc7e16fdc0131fd849c0,1,0 +0180288774545cd7c12f1ebc96ca6627,1,0 +018a6cddf2f19c10e53d6c8f490f32b5,1,0 +01921458f571ff9055bce1d214b98fae,1,0 +0197e81ab9577e81a7c495a79e1b746c,1,0 +01a5df2e7e264d803b0ba6b763c9fc1d,1,0 +01a8fe7ddad3d24e72a65e0f4a88d439,1,0 +01b02e04528aa3e351be8bfcb5e8c330,1,0 +01b0f903b7b1437d5af1668bcc130668,1,0 +01ba59e540b989d1e58aeacece752997,1,0 +01bc8fcd130a047f0b4d0c79896ed835,1,0 +01bca9d9f73ae0e83003247826baa62f,1,0 +01c57f7bcc9c354598ebbb108c9598ff,1,0 +01eb2d06e01a6f74387faf1537b1d033,1,0 +01f9f61a5ceda0280a4139fff484ed2f,1,0 +0207c841a45d1be4d0e4b5cbea5dbdfc,1,0 +021043df46948f92604acaedfd836b72,1,0 +02247d9b965c02b76c56f539a5b328de,1,0 +022b005f3821042be9cc9b293a7bece9,1,0 +022d427fddf0f0ba070197ea120cb803,1,0 +02339d3f79a09587b1e95df382d25caa,2,34225 +02388a4df0d88b80ee34aa77fa875c21,2,64 +023cd5ca4ff048626461fb6bec62f456,1,0 +026490ed40e4c3c44ef9a6652e804358,1,0 +0269a01d71c1c557bff58c0c56def1e8,1,0 +026d1e25156435218846b9279646ba78,1,0 +027c3154d13b2f96e21f852d7895a238,1,0 +028f9190e63d557b09397875290177ed,1,0 +02b8375b32866a64f0f92f56c9dc601f,1,0 +02c093220e1e2fc45d54616adb5bf3be,1,0 +02cb5c98e3e7b445a54989249a6c034e,1,0 +02cfb3af31f197ac3f232478bc456c13,1,0 +02e1550f357922c67f5736ff0fa29c48,1,0 +02eeca20a08fc7a990408ee234bcfce0,2,90000 +02efc7d1a14505513442b2f1dc4c1e9f,1,0 +02f1e70de01ee02cf0c045fe24b162c7,1,0 +02fc58588e1fca9402cecac0a618a892,1,0 +02fde3f2369da281e8e7e15f921e1570,1,0 +030946cb6efa1173e4d00b709d46e40b,1,0 +031d2ffa1572dbbc013edd91eba2da8e,2,625 +03252414a820615955c9aa25883313d5,1,0 +0334cac259a84d5041d2b960bb33d1d6,1,0 +033ecd0e0bf888f3363f511e2da5c08d,2,1056 +03563be3341d7270c90b98c0d8479971,1,0 +036384b3d794c712249be5f098adcbd1,1,0 +036bd61d9b18c1dbd6e2165b0bffb253,1,0 +039d8965e8c52e9604bfd8f5bbf84dd9,1,0 +03aaa83c63270c2a843e14322e6f0616,1,0 +03ad37102236e22e1656d4111da70c5b,1,0 +03b07b744fb23d9f0c0b9ff20006aa45,1,0 +03b2b3ef702e75ea99a009d711df4874,2,0 +03c3527f76fd51521a3fb906feef5c11,1,0 +03c6eb712530050d2a0a70151a7f32b0,1,0 +03daac497b69844a5614d6445fe8bcf8,1,0 +03e1d416d8f1434168d3db31cc24dcb1,1,0 +03f8d4fd6cdc4ebc5d054d6034f2374c,1,0 +0426d7984de77c8f8878712d68a05ab0,1,0 +04528df149cfcc90ba972a8cbf9d98f5,2,0 +0460bac933b9f95e06bb2211a2d85b57,2,592900 +0465ac13c9a3bba3e821826f76f27741,6,321489 +046f8f72de0e6138363511df08ebc1ff,1,0 +0471ae53555af80e1ee3d9080b8cf17a,1,0 +0473c6dd804ee3b7fb451b7f143d7b97,1,0 +04805d01af90f7a0e8dedba7009f2e87,2,72 +0489cc63e7a518b98d38e7c42dda0074,1,0 +04ac56ef0a98732990bcdb11f6bd901b,1,0 +04b1608c6144fc8ed550a47dddc8e97f,1,0 +04c4b3d7254ebf1cc8ac2205e0b6419a,1,0 +04d3d3d1196873dbaa07a13fbf0cd15e,2,19881 +04e3b57d84da7a5743fc151da40d4e5f,1,0 +04e49b2b3ea6515569ed8577a83c417f,1,0 +04f42b1474adb5673942d045d3133dab,1,0 +05014c9f575ccd525585c58d95510182,1,0 +0513393ba2f5e6e078e2ad3e2377a182,1,0 +05246d152f0f5fd726c4f642cedc5f38,1,0 +0528d6a4b3b757c8daa38a2d7bd722c1,1,0 +05371ca42e385bdf08a6fd086ad0316e,1,0 +0545a2f83a7fecb2707853336c991c44,1,0 +0546eccb1318244a8ed430671bf8723b,1,0 +055faaa27e98405af37b33e77220f37e,1,0 +0570e0d866b5f4d6576e6c87661b7492,1,0 +0583138edb945a54c21ecbd1bee3bb74,1,0 +0589ea6d7faa29202d456b58f5958bca,1,0 +058a604bb25e4b3211def3b48de5c077,1,0 +0592a17a06696b009529c47398ae413d,1,0 +05a0d7355f542616bdfaebd5eb2cf711,3,160600 +05a4d9ac2a62cb839246f1d5dfdd1670,1,0 +05b05f5f57a7f7fc73bc47295dff8258,1,0 +05c09b71f0c4acb43c36c604573548b1,1,0 +05caf84eb2692afefb6dd70f1699fd05,1,0 +05e7e4272e152d2e2a27f3fcc891e7a6,1,0 +05f1951c5010f480fae3f463bca3ed6c,1,0 +05f8c47a7ba3f97de2a9e1917c523c7d,1,0 +06047ccd9e75b3835a4f2baf1cff1806,1,0 +060b9e59a411127afa0b76b12f2cab10,1,0 +062130922782dfe7fe3732ce1d33e6bf,1,0 +06245f34f1757ab0a63e197127c343a6,1,0 +062fa9662371cd2ead727dacab30e4fc,1,0 +06345c7f769d9495f3871496c7a2a493,1,0 +0638033a59bae3fb076088b54bd82d59,1,0 +065d4300c357794868dc71c20048b1f1,1,0 +0668a337cfbd9820a701d6e7f3d264cf,1,0 +066ace464b83508c01398fc23848c8ed,1,0 +06856b84a9b05646438e6b131f38cbc6,1,0 +0695f148a2a9152ecd17b2cb320761ee,1,0 +06aae024de47f38d0e73c3e90f5a29d3,1,0 +06c3a2ff3128a15d208f366757f45ed8,1,0 +06deaab40d95483425f6be33de2f347b,1,0 +06df401c5a3309e6fa869a59e39d8c1e,1,0 +06e5dfb9a6f5c96535bbe5693d823f44,1,0 +06ed9fa23e639fc6e955d89ccdc8333a,1,0 +0703eef95253d7afc9675b44997a2df8,1,0 +070a327046f083c1451e0f3620bd9592,1,0 +0720290f279ed8afc3ee32b9a94df973,3,80248 +073b00cadc4d0f6dc1dbd8bc67c1bf3f,1,0 +073dd01658355a5a15a5e2eb70abf5bd,1,0 +074957a13caf49123dbc7a6a7181c642,1,0 +074f46449a5dadfd607bdb69e57104c7,1,0 +0759195e6319ff611ec5f51fa73f2fa8,1,0 +076764ccbaddb30f55bfff40e99acaac,1,0 +077a01ad5231563861f0d24207b04b9b,1,0 +077bf89305588bfb66cd283d78afe013,2,930 +078438b84459e5b5105ea150abe97fe1,1,0 +078e39bda107c1a119629b7ef67ff7c3,1,0 +0793515eb6770ff1979497b60971961d,1,0 +079cef43c2ed9320e033e4b75563c325,1,0 +07ba3b33beb570c242bcf41ac0d42a9f,1,0 +07beb004a5e77a551ffbe947f661b221,3,11139 +07c91f75f0fec5e2f8915063b6b21a9a,1,0 +07ce55f9be4a82448866f49d0b215577,2,8505972 +07d0157133ff50ed663fedcc17738e67,1,0 +07ede23f03c941ef54dcd86630dec465,1,0 +080f51fb5ffecd6c02ed162f12b888f8,1,0 +0811c8c991979f97e3b7ebb16ad2d7fd,1,0 +081d4e84c89d5dce4afb774e1d1d2b4b,1,0 +082858b4a99ac2b83b93c69d64dfc0bb,1,0 +0831fb9c69b2d41c685d7b4c2a8ac623,2,2450 +083bd95cc96bc166c1dcd8456a4a5aa2,2,21316 +083c18f9aa81b373ef48d4c75ab6df62,1,0 +08401f95c72c51ecbc4e77a38adeab6e,1,0 +084b2fd65028cae0a5181ad17bd36467,2,64 +08599702c55eed4ab1e2e2f5d9861789,1,0 +086ca5e7739b5df9d8e201372b606107,1,0 +0884ac73a4d97d582a49ab53aa976ef6,1,0 +0889f5ae9262f78e781d46d28f626b54,2,31506 +0898243e089a22bc009b1c073b89cfd8,2,426409 +089cdf44c0752a1a6adc80f309503f83,1,0 +08a8744c501a3e4317ed6e04f0d81d58,1,0 +08bc267792146a76a612c08319ca128b,1,0 +08c3438f8534969974dffcf787f7167d,1,0 +08cd0966bc825e57e85455072d6d9656,1,0 +08e62f3ed2e4312efdb8219878061b18,1,0 +08f2ea4b1059db5340579eff0b375ff0,1,0 +08f436e868e68f8ba4d475a52d11b971,1,0 +0903124c83458e3c957ec0fad6623848,1,0 +0919bdd23f932ff38f533fd052207b82,1,0 +091b9161bf67a74ed32550b67d7ba2b8,1,0 +092371b7a85c085d437292c58fb71cd6,1,0 +0924a282095f4b74b7e9c64db17131ab,1,0 +0929de7f17dfdac865160f4683a091f1,2,3782 +092aca4a4960616e5758699fc0242fea,1,0 +09417514af17447d817e59dbb33b7ca7,1,0 +09439a9302b7419954ddf39df4161961,2,26584336 +0956562fe323da7e156df4c6081fcaa8,1,0 +09a3a3045abc2a58eded017798a8909a,1,0 +09a4c78a8e0891b2a9e3d50a65037f92,1,0 +09a9787dc54e80d50642d86a9cdbf202,2,0 +09afc770b55a6b859544fa29809ed6c8,2,25600 +09b141fd18a5af271ba1efa2196e0267,1,0 +09c5b203bf83f133b4013c3d2991fec6,2,2500 +09d84d2dff8d25e8cbb8f63ac1dbcfe4,1,0 +09dcfda35a6149fa4baea1fda1788198,2,5550 +09e2db5a9b80b82937a139f3105fbf8e,2,4761 +09ed14c38d2cd48d0d0d97ccb2098ea0,1,0 +09efccb17da07ece808dbfa7687db577,1,0 +09f3f823a6c0af6ffcab4d05b8ce99e8,2,31684 +09f5c7342a2ed6b73c6de3a0d6909373,1,0 +09fda36d2e37aecb281b3bdc5d54257e,1,0 +0a0451f80f452ddf078f280a2bcbcfbb,1,0 +0a1e46545f88ce9d7f57542826df47c9,1,0 +0a352319ffc1d07034793ce87e4d4afb,1,0 +0a450d6011c6f1b733b52dd0313afd90,1,0 +0a451c4b6bc3a340b8b55963dcbdd597,1,0 +0a48bd8bc1108b2d9e67251f1bf8c18c,1,0 +0a4a56b6b9cd47bfd699b414143867e6,1,0 +0a5169a5aa34f4ded5524b0ad99952dd,1,0 +0a53b183d1a66e172e38ca37dd8f03e1,1,0 +0a54ad5436a0aa9e374cc2db034aefcf,1,0 +0a83aff1baf1f74ae4d34f8e801f71c4,1,0 +0a8ea3c2e65892a881ce7cd8ff5d1f0a,2,0 +0a95352f49b8a4501370aac0fec9c2f7,1,0 +0aa6693470d3fdc7161331fa55e13ba0,1,0 +0ab89fe2638d7fb52c000c6bccf17b48,1,0 +0adc7f903703764503ec78e64782783e,2,1296 +0ae64226c86d13caaccc045c4fc41a9e,2,2116 +0ae8ca5ba0a30351aa4a0660202b58bb,1,0 +0aed1d9162c4e908790fe593fcb48016,1,0 +0aed7a4a475577d3bf925f27cedc104c,1,0 +0b04396a9b02b9ac9bade075f3387ff9,1,0 +0b086f7c8184bb61a40c827e56d179c4,1,0 +0b095fc8f5215f54d73fd067fce18410,2,0 +0b0f07c8b065752fe11c2de5b23095c9,1,0 +0b217320c537fbc93c8008b7fa5bd88e,1,0 +0b2252a29e0f3bbe9ac226eb41b60680,1,0 +0b2e2168e768c840e7982b7433c26fd6,1,0 +0b311555b9d3a95da3b020e36ad49015,1,0 +0b33edc86eb2ff71cf33b318aa693ad7,2,4096 +0b3b67f740a350db3bb7c85cd5162c6e,2,72361 +0b42c09f1c805d839c3a48c60885d5c5,1,0 +0b44bc17fe86d0e067c4c069dc80f9b2,1,0 +0b44d7d8a3c6a5e8fe9f1dca83dbe074,1,0 +0b499970bf78fa4de3c5e8a4118690f1,1,0 +0b5d6efe95b9dc3cbcd035476617e8c7,1,0 +0b647e17623a1054561ab9a5da411f5e,1,0 +0b67eb63dca11b62267b83e630ecfd01,1,0 +0b6bc20aeb90afe0e85954be8c14236b,3,12970 +0b7149cf096c596dc9490cc32adb4ac5,1,0 +0b758f34027d8cfc524c9d0ace003207,1,0 +0b9e486c276f1443af942980aa213a24,1,0 +0ba8cc8122701bdbc378521bbab967bb,1,0 +0bc75701bd215ff542c198b7ac312366,1,0 +0bdfdb2cd4a33e6224113a59bac6af28,2,8464 +0be8f38f8f391caf75a2eb97cc81710a,1,0 +0be97f1acb29ac08dcfbdff2d634ef69,1,0 +0bf09fe420f9f00275697dad5442e37c,1,0 +0bf527c48481f5ba8e8700d36ec2db96,1,0 +0bf7dc80b3f436667f1d596f613a3a56,1,0 +0bff55e03330a7f2735722df9da3510a,1,0 +0c136fce1755e2ad2a8d55ecd549590b,1,0 +0c1aa618e7bda7a36bd0059a20c55d57,1,0 +0c239390400997a8c806697a7652a567,1,0 +0c28e29b40f8ab0af5022c67f119f5b4,1,0 +0c3488b3932e126f7fcdf8a4bdb47a63,2,0 +0c361bc9185c41e993575902e9cc8cf4,1,0 +0c4427c6c97b232c4ecc5453d52e5a76,1,0 +0c463066828e545300139a311b904813,1,0 +0c6632dc48b1b012987a906df696acec,1,0 +0c66bb270d4a6375884c0c28b2a01463,1,0 +0c6c40218ff912873680bee3bbc252dc,1,0 +0c6f50b45ab1b2b7437645de938522c3,1,0 +0c6fcae508f9c059c8354fc256fb271d,1,0 +0c705e5a3b85a4e73a1727355facbab4,1,0 +0c75081677e2801102b45ad335255bd1,1,0 +0c8eebc3f8449b02a4d5e9a0eeb0c026,3,78936 +0c8f2677c2cb4e92152419b4ae228abc,1,0 +0c97b39155ddaae161f0c0a068faf277,1,0 +0caf0a8d190f8c70b059e41cc86190f6,1,0 +0cb05359a429cc8a258cae35a19c269c,1,0 +0cc670cca8f632234593777d40e0ccf0,1,0 +0cce06aa1acace485aad916d65784e7b,1,0 +0cd1552082ea7748113d595ec62da59d,1,0 +0cdec3605d7f73522dc30b10aa6ebfc0,1,0 +0ce6ad822f2c66022e09c7bb0122feab,1,0 +0cf1f5d40ed1505f77ae8ba4b9f71981,1,0 +0cf9c998ee9239c03ac29fcdd437f530,3,2014886 +0d167c09dc3afcd70dd5728b1cad0d93,1,0 +0d1983784732e45a55b1040a82db07c1,1,0 +0d35aba678c039f477280c22cdbe6d46,1,0 +0d36d441ceb0caec57d77547730409a8,2,20449 +0d3c2338df7cc72f5fd90c4b315d4ff0,1,0 +0d41f4783eeeb20337d3d1f7f058cfe2,1,0 +0d66c19661114ec65fb923367d0988fd,1,0 +0d6b0374f997b7d434c9a1dc10da2d46,1,0 +0d786a2440a68c348fa1761614cdf441,1,0 +0d7ae21aefb01189d67009d4d83f0738,2,930 +0d7e6a0690bb8978defc97f6a2b86210,1,0 +0d7ec070cf1f3503343fcf40e286798b,1,0 +0d8365fb556b53987cd088f95f31a466,2,0 +0d953850f40a8abbbc596ef20618d530,1,0 +0d9d0d3ac1c4114815f8d0a03d1f1c0c,1,0 +0d9eed9deb761d004cfbba96aa41e4cd,2,289 +0dab25a72aa2b1af1b1104ea637caf57,1,0 +0dab40433d70db3fa0aa2cfcf3a6adf8,1,0 +0dc7e6aa7925e91b7ed95f3fb46a24ac,2,1737124 +0dd69752b0581f863670fe1fc341a0cb,2,64 +0de591690429b7a90f2357f1923dbf45,1,0 +0e16addc0900d805c8aaf88a9b0e6491,1,0 +0e1d0f7619a9c6ff2c8052dc2f488d53,2,0 +0e26b1d44638932453aed48334cf5fdf,2,124962 +0e2a6576cf495aa475e6ca9a8d23b5fa,1,0 +0e380996535e1f1e1cb42bc16442fc9a,2,671580 +0e4553e3e783e18b020c8d04c3039642,1,0 +0e49e45c509ea19bb57018b4d04f8595,1,0 +0e588ddb2a792778a90d7a9a02356996,1,0 +0e60d2ccb840af1505c186b990b8e0b0,1,0 +0e6e4c83cfb93c5835a9f22b44827bcd,2,6009852 +0e711cfd5d84b2b73c0466c8f8e2d1f6,2,21756 +0e7140d8353802e26e4a94f2de2b0fa1,1,0 +0e7369c823ce5b9a44c4f4765b8e8851,2,1444 +0e7610e9ddb85ce0b9629457c5d2861e,1,0 +0e80f567e47c3b6a2e0cb9c5b812d208,1,0 +0e84732a284632accf2f783743b088bf,1,0 +0e90d81775725c775c30f46178e70007,1,0 +0e98c51c237799a208cc9849be37807a,1,0 +0e9b92e41561065844dafb8576ce26ba,1,0 +0ea031fc7b3937a32b03c29e7f3e57ba,1,0 +0eace944f293ecea88a878b4576cf28a,1,0 +0ec644e309fbf4a8e513bd1c6f59c535,1,0 +0ecdac1402b341feb550024ebdf3187a,3,21329636 +0f1d795fa9b30b68243f2e7817636527,2,9900 +0f246ad80da166487e6ad6d60eac0e53,1,0 +0f3417dd97a8bca6495309e83a8fe122,1,0 +0f367a9fac21baf903ccd27f9a42e159,1,0 +0f37e62783f94f98fe0fa31b2531fa94,1,0 +0f3dcf3bf1ea35c638bf40d413e6e51f,1,0 +0f3fa65a8bea909aeae3db5a15934f34,1,0 +0f460fd06fac2b67c82b9da36d8e1c25,1,0 +0f57ba4d15925c51da51d18759f43354,1,0 +0f600b5ccb0a29df067bea23d64d2e94,1,0 +0f6f63a9593ff6bea91a55c2dc50ab21,1,0 +0f7b8f67dc119fc74e9dfd4570afd536,1,0 +0f7d8f0d4fe13b5f7ca013ee92584649,1,0 +0f84fb8e44208c118ee405895dd5e517,1,0 +0f8c028f538fd0fafa517e4c13630f67,1,0 +0f8c78de9811c15eaab28daea465ab70,1,0 +0f973d092aff337aa3991dfd999b91b4,1,0 +0fbfddb4d5521402d0f0c2676e2940de,1,0 +0fdf7d151bc346f4cebf1d68d1d699a6,2,870 +0fe141261f88d82a9350cc01e831e92b,2,0 +0ffcf796d7f552ffcd2743f792971727,1,0 +1007795d3079bb3acf30de577a474960,1,0 +102668daca640519eab0c61556dde2af,1,0 +103e813ebe49170bed33111fa4bfac67,1,0 +105353bfd74310a88566572e05331d1b,3,22755 +105ff82e4e133f248955d6a29a049b0f,2,19044 +10600250d866d924a22595aa18a6d62e,7,545319 +1063546c4ed2350f8dfc5cc2976e9c2f,1,0 +107cd7b979d1603b982758a8405cda6c,1,0 +10a3b3361260e53b6f1c5b3480159571,5,1440433 +10b38902f24174451ec23e2ffd1b1918,2,14520 +10bb0462f2ff0dfb4183f2033f15ef34,1,0 +10e46a0a5fc1b0a870500a2e15a2d862,2,7569 +10f41f90bd5a2f258c51bee485b9f4b7,1,0 +10f984389fef82b5a59c8b3360bc6899,1,0 +11018c4b5462adebf4e59d9969fc0459,3,6019267 +110335bff18a6aebd9bbd6399e20a949,1,0 +111342a422b6b21a92c0c559188415ad,3,142000 +1125b3f0b4eb1465429c2fe7ffeeba41,1,0 +1130a3eb84d73251106ecb252736e55e,1,0 +11330b790248ee281ad598b8b7bbc978,1,0 +1133d184f89e85422c1e92f7350210e1,1,0 +115dce46d6b5722747b48b4659a52015,1,0 +11614f6500eb4614921acef5ef5d36b8,1,0 +118098b6fd0e96cd3155b3c9a68f3e71,1,0 +1187d11f3e3771712da2d8944072015b,1,0 +1189236690edfdc46b6ad251dfd0d027,1,0 +118ec979ee44f5139f9a0772777f37af,1,0 +1190ca9b4646e354796c9490542acf1c,1,0 +11961e0d069e676125eb31fd97a0125c,1,0 +119ac3aaf52f1a74718f5b066f5e6e5d,1,0 +11a4059ac8b4ba3db182d203ce873537,1,0 +11a425a0ce1ba814bc5125eaf2f28cfb,1,0 +11d575f69003e3b7ff81da683e2fbb1b,1,0 +11e1c50f8c958dfa26e91023f276791c,2,13924 +11f9e85a27c4403e01cebe33bb4aa409,2,110 +11fe40d718fca8925c0b723a5b0a0ed7,1,0 +120a58c525ef8b268e784681ea2d748d,1,0 +1215ae1f60071a4ccbe85373b0a36907,1,0 +121ae169997274891425005fd26f1dab,1,0 +123062d6f6a24a1f35514fb3b35655fa,1,0 +123b4cdb69ba6ee957b086497f29750d,1,0 +1265d690f3ffdd3c07186da78e05fc58,1,0 +126e64611e341a1ca8beb19d4557d1ab,2,12769 +1276220d789fd4b5975d66f3306851d8,1,0 +127bbbe7f5a84ddcd00477c966bee008,1,0 +1281c10ff4c556da4fbef732e8557023,2,2316484 +12865d74ff768aa6a7a5a96be11329cd,2,0 +129333e885a9d1074965d95534974636,1,0 +12934a1f4e72599cc955696326b0cce2,1,0 +12973c59d2b051604e943eaefcd7ccf2,1,0 +129ceb20e73cf5110fe9af179a9e8baf,1,0 +12a3714ab408c632443805bae5d5eac3,1,0 +12a4349601e54af96f21cd1c69465ea3,1,0 +12b8da5d8c4d3b8c4e9304585571ff00,1,0 +12bb8d3b86bb35d684b4bf2818536e26,2,8281 +12c177002236edf68f132c92f8486092,1,0 +12c9cb9fb957272d2469011ea5f52414,1,0 +12ee29d472657dc03baf65a093b1c79e,1,0 +12fb9cf59cc8f5847b35cebba7b7cb84,3,611760 +12ffed1e23fa8d0a0b9e9306d7fadf60,1,0 +13065ef163462b038131541db666e402,1,0 +13175d45317be24dd4ed3c0fc9c7e0e8,1,0 +131bc1ac7e6265f11691257a918a7dfd,1,0 +13234c97042a119ac5319ffbced0afc6,1,0 +1329da613bc1eec69179473c9f595879,1,0 +132bd5251ea1b6f9862a0e432c269cd9,1,0 +13338197eaef508e44f7f98bf4f24da4,1,0 +1343ae5970f34aa307d83655f05e1369,1,0 +1353c40870c08308f85c46dd6e8fdead,1,0 +136d652800703d3856469a712565d27d,1,0 +13760aaa652377b16a936e6b3f6238b8,1,0 +137dfa8dbab93eccf47cbe3e5085e83e,1,0 +1383c9751f0cb61339f0f3443db89832,2,0 +139a1732aa66155a9bd489188e11adb7,1,0 +13b033d670114a7a522ebb823819e2d0,1,0 +13b0f8c122e0bc9b659ecc0d07f7f847,1,0 +13b34989d80f6ad1d82aec123ecd3059,1,0 +13b367a9c2f67535863b16bf4cbaf902,2,930 +13b5600192bd5110260081b28c72b1d0,1,0 +13bbfd54adee8b7f0f1bac309e0c05e0,1,0 +13be8481f06e26eafeaf23e0b91cd851,2,23562 +13c0823a134234459e294777c09755fe,1,0 +13c495d7a7f64cdc4c4c53e3b71fe5f1,1,0 +13c5ebb4ba0ad650e4c7009c9d350cc3,1,0 +13d7f222739a48a3baba049daab3a120,2,2756 +13db2dda7a36b30457597209bac2396e,2,16002 +13fa0144e053bf444cff9af9c10c82c2,1,0 +13fde7dfedf94cc298b3f8741d5e9758,2,37636 +13ff4b1b8bc5acb376662169b6288fa5,1,0 +1408ffda6b6ede635c964df7d2c954eb,1,0 +140a1edf3b26423012cf0450318643ec,1,0 +1489374b264fa6c4dde780baf45b55dd,1,0 +14897983c5f3a362b35a155dc1a783fd,1,0 +1495381fe4d99bf391637c08e5381167,1,0 +14bc3e301bcbd0204d93386fd8738866,1,0 +14d72de61281414a422c1cf2e7b49994,2,0 +14d7f2fddc9c2017953062c4e33a1190,1,0 +14e4e1496508e20e8898d46794947931,1,0 +14eb1687f63e0f02f2cc66ecdb442e41,1,0 +14f1c42cd52af9a6df718e82eafec4a0,1,0 +15092f8d2fa8e057b711a9e80ac90b65,1,0 +152f0cda78924375b9997be350b72604,1,0 +153c06d7bc4b9f997920cc3bf9e5319f,1,0 +154a652ef5c8a5ffc6b1dad0a8fc12a0,1,0 +156943c04e44cc409aa9761fe374cde2,1,0 +159ce68451de57300a1c21bf57d6aa62,1,0 +15b9d71cc8f2749f1e0e1aacd12d1f57,2,4116841 +15cdba8a57acf0cf65ae14b941dc6193,1,0 +15d88a5d3172625e417577d19b5f75b9,1,0 +15db68fa425701db671c3e08c711c8be,1,0 +15dda166f56ec06debc4a62d287f6fcb,1,0 +15fabf17e3d27b667a469d3d0593aaae,1,0 +162d5e8ab9fa51c2a4fb3ddfe3694486,1,0 +1636e123d2aed2f34385bc95536d29e2,1,0 +163d126bd50284c6c22f52eb2acc9f23,1,0 +16402717163e04a826604205d9aba029,1,0 +16424a0329d70ba7c565c001e82c275d,1,0 +16630c85439fe3d365e6b745055eba5c,2,13050156 +16694a30ee52fce8f09a880754bb7f1b,1,0 +1672e9897bfb16f7f644365da8d6992c,1,0 +167db38fa514a30e70f167f70d19f214,1,0 +168065302d10d2f4b683e3d5e7475594,1,0 +1680b70ba864c313d28c9386ce54ac25,3,612198 +1694662b95ac32661ee2b45826bb54f6,1,0 +16a2283358cddda00bf2e47e5ad746d3,1,0 +16a59c72d05be053c19e4b32ceafaef0,1,0 +16c0eed6ebe108a639371c5d9839fb63,1,0 +16cdab6a1c9890504a9a3539c3fb1ccd,1,0 +16ced46d79a53b69a3d966815778beb4,1,0 +16cfc70a50d7e07e3c9fec419ecb1234,3,100950 +16d658a96b4a4285c0a0e4c7ccbc72b7,1,0 +16dc54d065f2a511387747b7ff6f6728,1,0 +16ed1971e5035d0e1a078690c089b55b,1,0 +16f174fb41c7377fd050162de28a9557,1,0 +16fbc8f6f5c9a151cb479f42e85d227a,1,0 +16fd6ae426e0c1a784fa00ac704a2768,1,0 +170556f4b9e4c65587e59963ae41520e,1,0 +1716a199178f72d3bca2332e613f7ac5,1,0 +171aaeae0fff586f35165fcd47772eaf,2,35721 +171f7badc43e34208270b5db59484857,1,0 +172595dacd87084fe54b7f306b958bdf,1,0 +172d55ff6d52a8b227582b499a5451bf,1,0 +172f46c2c299d2a8a283d396dc9b0b61,1,0 +1741305df3bff39de42e2616a6998f47,1,0 +1745b71b7bb831e254cb6eaab021794d,1,0 +1748ba1137b59382cb22ebb45f6ff832,1,0 +174f7f80c6466a8be140c2c407415188,1,0 +175155a27740af9dbaa6240a7fb9cae9,2,0 +17813d85219d0d6f39e7da48ccf219fb,1,0 +1799c70502be47c1f08274774548f455,1,0 +17b48eb20752f70d8283725102695871,1,0 +17bb7ef3f1819ccdd08c8de2794f0571,1,0 +17c6f52885cc862a61ddd5fd7a2a4081,1,0 +17c884b2318cc6ff55c29b888d9ed333,1,0 +17dc38fc705106c58aa552255699af87,1,0 +17e380ba4076d7fc03080aad527af53f,1,0 +17e39b3f7f853eba74d4ff74d9349f9b,4,2957935 +17fa2051958a6b965c63e80d3ba38877,1,0 +17fc09ce7152a62c66635610843b26f5,1,0 +17ffe2b0793c6b94ed7ce25c266dcd48,1,0 +180d5ae43f2c54215bffaf36f47a5c9f,1,0 +183dcc8a1422a4b447a15d49a2eac385,1,0 +183f5a6eb097afed2624d8fb11306e65,1,0 +1851af890332b52b87f2b677871cdb94,3,0 +187854e47d319770701f80270911b54c,1,0 +188fdec3c99c3e09fef27f811658550d,2,9801 +189038ddd2df2d1a63c06eb36de35d3d,1,0 +189b7a1772a2a01977bc739034d29a93,1,0 +18a077a0fe7e286116250c2fcaab3e0d,1,0 +18a155a1eca68764dd20c39cd999e746,1,0 +18a99df8b936331787f735fef0b20f55,1,0 +18ac679c76a235f2e1f930c11c4ded56,1,0 +18ac9d54ad6e7e8e4ba558adb1acdb7c,1,0 +18b2380360411f360cab8d261a3a1602,1,0 +18b3f02db85d77e654da01db9a4a9252,1,0 +18b5be50e12be4af41874cd3f10377ed,1,0 +18ba339c7c22de578a5c298276ca0f0d,1,0 +18c3d6f0617721248dfa8f460ec62fb6,1,0 +18c8e99407fce5aa8c8c69e18000bbed,1,0 +18c9d59946a1462f7422b49a5415605f,1,0 +18cd227e712d7c604c56c2f563bea297,1,0 +18d883c992622ba12aac04b34706a09e,1,0 +18e34cbe6a841ce5c4aa5a6d46225b4c,2,4096 +18ed8cf8dca77d10f31def858bdc9c70,1,0 +18f39cada718f8b783155242488eec9d,2,289 +18f596798d20d6127458efd68621bd22,1,0 +18f79de00f8834ee23b5ab6ae5e6d487,1,0 +18fc85b55190af8663e043c01c9e2174,1,0 +1900aa9f8b3b6a1d2c5c7e806b15dcce,1,0 +1904f4ea2683aa1905fee7daf891b7e6,1,0 +1906e4b3034435293db7fbcab64a6a70,5,0 +1910fb6eff310652343b777ce93b7776,1,0 +191909ab474fbb9f500c7c76f4f5697b,1,0 +1927bc198a6b6b93a1d2dbbb6c11fd88,1,0 +192aa66ebca07300ea732e2a05cdc370,1,0 +19389352a94fb01b2a359fdc23c5e62d,1,0 +19471900c0fbc832cfcf3a64bd911d5d,1,0 +194a256a5a4782ac7f049c2eb05fac01,1,0 +1960c5d6c7d34a4b0eaf5e4cef6cc0af,2,32041 +1978adc9db55d8ea9a3fcb7c05b66854,1,0 +199d20f7442756529544ab0b1b562f08,1,0 +19a82482257a115ed515fd8f108159c1,2,1093070 +19a93053b78a62871886d6c754c6efeb,1,0 +19ae8a76a13b7132df82add77f746d33,1,0 +19bf77c5d38eace014480d17220e7b0b,1,0 +19cf46ad6c9a50e0567d39c640758edd,2,6757400 +19eb030ec8c52df0af2e485efbff1834,1,0 +1a0d300933fb605d9ab05fb0bb2477aa,1,0 +1a13a3840ff4018bf23d92d06c9c6846,1,0 +1a14ad0c2538dacb08e66ec8b68ee47c,2,256 +1a1b65e111ed4c7fd7a90841e9991444,1,0 +1a1ea58d19c2f5cba148497bf51331f6,1,0 +1a380d17b14d2cfd53463179e7ab3a90,2,8102562 +1a4fa18a7db8cb3adf657479f5c199ed,1,0 +1a516ff1e778f76a56a9b68aa957d5e5,1,0 +1a539d136497b6a9f91ea1a68a004077,2,14161 +1a5523d17080719d74914708cc7ece38,1,0 +1a6ff08d8bb31bac74eccfa4427d415c,1,0 +1a7327e62c95aec77b6495dcd9bb0a45,1,0 +1a803505badee4e77c2fd7d5826ebbd1,1,0 +1a8197c9a04e8143c3282da33fd2b67b,1,0 +1a8b064af851e5a2a98e2854dacdfc14,1,0 +1a8ba220f5c41f2076842e67800c7897,1,0 +1a93fd5594390dbbc03d25d03808e9c8,1,0 +1a9856b4de98dba4407d37225e355d98,1,0 +1aa4d4cfd158fdc7097651d33a9638fc,1,0 +1aab349959c6c2fab56d5b1195bbd6a5,1,0 +1ab0622160356f5d6579f4e7e9bdad97,1,0 +1ab5669bb7b57ab956f4468839ecc09a,1,0 +1ac7e4a77c721edb726a40fb46c3192a,1,0 +1ac806e1004bcf82d0255d6d03e6592f,1,0 +1acdcf068005c741ac92f29330a8a7f0,1,0 +1ade1dafcb0937d593902dde1d41fa88,1,0 +1adfba4c2fdae12da4417837efcc2c26,1,0 +1ae0859ac217d92f7e3bb26965c68d44,1,0 +1affbed960b7386a27d1825d9078339e,1,0 +1b076e535a5d36a409e3c7da64bb03ff,1,0 +1b394af64885efb292d7d149914a6246,2,12544 +1b3cb7845b83eb2d8290611f0033f4ff,1,0 +1b4d18f1e74ec8d715858c21df324c62,1,0 +1b4eec6b6aab2c5bf57563a3fcc765fc,3,7054 +1b52282dcbe5e0e6ce0f8a0dd5e98877,1,0 +1b5b98d7261cf7270e03258b3e62a255,1,0 +1b6d37246f4415d07f4f6ebc7c579982,2,22500 +1b8e99507611787fd00de0967bf2288a,1,0 +1b944b9ff8cf13ccc6f9cd36e86396a1,1,0 +1b95f260be3a54e90eca2c8824dc3ebb,1,0 +1bb2791024268994225848fbb9cbc3d3,1,0 +1bb54c648802eecd24f028e8b6142ae7,4,697 +1bc4006c4dd0d71e507869bb2733a0ba,1,0 +1bd069f31bde829dfe0cd46d82ea770e,1,0 +1bd0f6a2ed9e36c28d630bbce77c1d61,3,0 +1bde839ae62529764cef435c02aa18fc,1,0 +1be064ca4930df0249218f93619f4cde,1,0 +1beeca40bd922b60af8307323ddc5821,4,2954784 +1bf24b658c0d816860ebf0aceac48279,1,0 +1c065f4a3680d7cde0db4c3bea7844f7,1,0 +1c1a9d7a3095a1b0b8d20f3978ac75c8,1,0 +1c257f4d2253487f6032962cd0f7e74e,1,0 +1c377344735c4bd2fbe2a7dbf0e0d293,1,0 +1c4abe9fd7b843389bed396e61ff47c0,1,0 +1c513362d8359cc54e6edd42196eb244,2,1444 +1c51b2f4fe04f93f476c671ca265202e,1,0 +1c61efb7af65c56b94b78c8be1cd8d94,1,0 +1c6347142cf0d37dbd665080453d146d,1,0 +1c673d9f638e852ea15bf4f8aef8b42e,1,0 +1c6dd047510956bef74dcaee72d514d6,1,0 +1c7c013de742254b300aa95d3fcd86f5,1,0 +1c7cbff45bdfce360f71cbb62c864811,1,0 +1c8b1b8b001d90913bd93109f786407a,1,0 +1cafb8a6376968f54460a1a28efed6eb,1,0 +1cbde690b31d83b660bec85bc4418b86,1,0 +1cc975eba6a0ad1b2b3efa7831818552,1,0 +1ce785fcfacad35c189a0d9d396eed90,1,0 +1cf82f87bb9c3dbb42af21c752cf84fc,1,0 +1d00692324341b13f9ec22e758270710,1,0 +1d07fe693017dde3ab6c7ef459de384f,1,0 +1d161b401e3736e99ea949a29bd394c0,1,0 +1d1969e2f5f97c0cdfe027a41eac1526,1,0 +1d397c99b8ad3fb440369aa5ae06fd34,1,0 +1d482886f2107c928be09c8b61fd9bf4,2,0 +1d4ee2f6da2778746e053ed7422d8c51,3,12970 +1d61a12124fe4d8ce9d6dfc6cb178fe1,1,0 +1d838cde6da3dc1acb90d46089603e46,1,0 +1d8e385ec516f5de7463369e52a7a347,2,5256 +1dac6e630d97bdf71a57203cec111af8,1,0 +1db0998574dc8165091f73c5a3f01819,2,306 +1db30cd3712a8c309287cea04743754a,1,0 +1dd0ca5d68b320cd9376b9aba37b3fd9,1,0 +1dd25b0e6bc4c47dca5328ac92f071f7,1,0 +1dde24cc2898e9ee781237c0c2aa7652,2,1024 +1df1b1f792b9328801f40406008ec50b,1,0 +1df392d16403002997b44e622b40c25d,1,0 +1df7261c9a68c7aac4557b3ef1c92689,2,1764 +1e2ea4827764957f2f0ebb6fc234b5a8,1,0 +1e3576b097febae61d71b70ae74c1c91,9,141653 +1e52311b44caf51b40cfe59ecb1142f4,2,25760 +1e541545aa9d21512203412de01518d6,1,0 +1e621fccb032a07c9aac966967279a8b,2,18090 +1e63d79a5c3fb8bb67e3665aa17af851,1,0 +1e691a476c108c6be79ceadc3757dd34,2,38612 +1e6a902211f78015b6df8f562b8b99a9,1,0 +1e703ae2e828ec33aed9a62a3d73c7ea,1,0 +1e7b6df282995f419996b4c17357a6fd,2,1190 +1e873ce2f79876049a6f7264e6ec503f,2,10404 +1e8f416312401cf59f2e384e7f8aa555,2,5776 +1e91aa0774e7d5007848edaeecfc5615,1,0 +1e9596c25c585eb62203516e1c46b078,1,0 +1ea3f9ec96f5014c7f42e403c14721d5,1,0 +1ea9e3b0f35d29b8ef0570ad5cac9f05,1,0 +1ec4b99bfa2aa78a34224380f1306760,1,0 +1ed362e5838b01067a66f002a3c10234,1,0 +1ee7cf2fb6c14fe982c62fb31bd8b480,1,0 +1f00b62c35df4db95877147bab7bfdda,1,0 +1f09a0ea324d7a79cb767399c7ff2b90,1,0 +1f0b7a31787a87fe30cab6a67f1b909a,1,0 +1f48c57e79cd56d16fd08d50d7050c7c,2,90000 +1f4f44a4e5664e628d566dec2ded0aa3,1,0 +1f51dea652b19ce9db60b12dfb1b58c6,1,0 +1f6a39758b56bc10aec6ba55b34f8912,1,0 +1f706b3f264b93faa5d9a7918deb4456,2,37442 +1f87bf154d63455989b352ea94b3dfcd,1,0 +1f8c9133a6e79c41924becae0695988a,1,0 +1f98f12faf5a5cd32adf0b59d34309b7,1,0 +1f9bc3968e53725db6175dac9f8e5a50,1,0 +1fad94014cb3bca5e469c3db6bcb37aa,1,0 +1fb00e9197e1dd3b51f26501767f26d5,1,0 +1fba23cbf4ea1686efac8fec64a9a8f5,1,0 +1fbdfd6db9226d650797c7c31f0c5215,1,0 +1fdf97e6eb04dd9a6cf38e4e4791fecc,2,3136 +1ff698163c973cbcab763e238b2115be,1,0 +1ffd2b1ef2d0e7da5e583248daa9382d,1,0 +1fff524085cfaa1de69b557d2f6359a3,1,0 +2016c8bc8ad3503e11a6589ed615b091,1,0 +203228fd964df050fa0f7ffd9b4f5a55,2,25600 +20403fff3548d3639c7dff19101ef756,2,2809 +204b968d9f5e4f7ec90081a48ba6467d,2,6806 +205cb145e3e76d3b673f8e6842d9995c,1,0 +205d697230ccc3556669ac4e5b52940b,1,0 +206949131e46b07315169aabc3533a10,1,0 +2087436f66ff2aa9df56fcd7b76f0190,1,0 +20ac5718badaecefb62ba202cf510c6b,1,0 +20c5a6b8a4e9f24be222b86e9a8f37da,1,0 +20c5bc4b8b77d10999e8a6ad629511f4,1,0 +20e0500d9c085b4682d3094db85afa69,1,0 +20e6d1444616403b2161039b21f2dcb1,1,0 +20e89ebff50cd1ff76f811dfde7cc37e,1,0 +20ec22283fab0c05ea1bdec9823a3b14,1,0 +2103dccac70507d51a0b688674301a9a,1,0 +210df8af0fb0dbc4a9378da751b4a3a4,1,0 +2129f1648449d18aae56562a5c010733,1,0 +212a4f103631c3796de3d26b48994e86,1,0 +212efa1cb1b9041ac3ef152fa4a213a0,1,0 +21491e5c7e1c9a5cc3752effbc67daf8,1,0 +21563226fefcd59e70f83c2761110d19,1,0 +2160f333dc8bd6c492f31722cbba91e8,1,0 +21799d03be17e9aed1f4764baa7870a4,3,767147 +219e6e1e59fba34e27d0cf08160ae3f4,1,0 +21a0b79f586df93ea0cab3c23a3af1bb,1,0 +21adf1e3167e4d7a31cf9c0b76f6d373,1,0 +21cf601fd46cf67cb63fa7ab5d48207f,2,1600 +21e6c4ac1969e04400efcb225c1e5591,1,0 +21e7bae73a20bf0ea87cdceceee57bdb,1,0 +21ec732212703ed0e54db3f7e8bc3f04,1,0 +21ef546e0865a4b2a6fc055091688943,2,66049 +220902e5e521b243c96dd01818e1e51a,1,0 +2212c49e17ef373a90a864eb423e3416,1,0 +22141b91611eb69627e8ef175ba54195,2,25600 +2214ce5dacdbb6c583a0d663b11e3835,2,26406 +2242d1a30c18f081524f7c5a5e25704d,5,139264 +225f7db496f13fad8937a6b3f150c5c4,1,0 +226a24fbbbca432a7d75243d24b2a210,1,0 +227bd6e42a2be591b5856888e204d80b,1,0 +228bb9ecfd9aac1eaf69b3568a8d8186,1,0 +229295594f0b01931fc4e169b8b06103,1,0 +22966c3fbbd97e5025f4d049902a947d,2,2256 +229972be0f427a75dac5f23e550ee7a7,1,0 +229f61e8d535d1fc91b0f93b77fa4486,2,36 +22ac3fea9826846625a5b8f13c068036,1,0 +22c8135eeb88d5e8fb85c8cdedd57021,3,8004 +22f57187b251f58cb8cc70258a4f61da,1,0 +23096b18ade09c3fca57d138581726ff,1,0 +23126a948870ee434a5813742e1c057b,1,0 +23194f2b2917d2fa4338924defd04d6b,1,0 +231ef9103cee566160cb603b61a565e4,1,0 +233865b10973d8062a13697e7389e43f,1,0 +234300a2aca0bf6d53dc2d25fd74c512,1,0 +235095bd8066371a348fef55f543a1a1,1,0 +2352cab29095cc770565afc62dd8b648,1,0 +235bfe967e831d566850568fa779212c,1,0 +237bbfe3a1449ed114ca1854114690fd,2,19881 +237f448b9a2fea70ac1bbda25647a606,1,0 +2387960556f215eb0c515884ae73cb15,1,0 +2398406c0c2fcd739182b2e1197d627f,1,0 +23a9c537492b8f85309e64f053fe8d60,1,0 +23bb6b57841d81cc22bcb596ed30defd,1,0 +23c8de8317844e70da2ac7c4c720e6c9,1,0 +23d0ea6db5de6edbece34b048bc2acb2,1,0 +23dd90c9f93b2b63f917d9925220cd6e,1,0 +240b849406cba1c9bb4cd03301730fe7,1,0 +241cf8d5e840a8145075d01de71b6781,1,0 +242162697b79a8867c04f0ce038f51be,2,2450 +24289d8ee637742500a24280810c4e05,1,0 +2429c20ebf0745033be332c44bdfb130,2,256 +242ec27d58bad2320c390e724a059c9d,1,0 +243c2f9b8192c14007f71c66ae09e359,2,75900 +243c8cab623188653d5097d1a5af6af4,2,64 +2443af570acade3e36145cc9b7390c51,1,0 +2446829e8ec2c44ddadb7d281a7d2786,1,0 +2467a12731347cd3cb2e3dd584e15d6d,1,0 +248726c012b571ac9abf326331502ea3,1,0 +24954b7a00796ecf977e88bd2e8d9e10,1,0 +2499465ead429063b78212268d639e51,4,21649 +24af14adaa72f015d4d55644228984ff,1,0 +24b21b2a00c09e7a74480573cb8682fe,1,0 +24ba59827b55655342b4154b7e474bf3,1,0 +24c4863f0fe2488a5486c3770df0bbd2,1,0 +24c77d08872909802e5f945dd420f033,1,0 +24ca5b8fe24a3daded9a458e9b4e1aca,1,0 +251887e8eefdfdb57c31f46ed6ae276f,1,0 +252244865f58ca63d36852bcd10673a6,1,0 +252622856061b82c751bbbbf99a861b9,1,0 +252890ed39f9f8cef978e94bcd6b1c6f,2,25600 +2530eb45cbd4bcec88bfa1391fdde4c6,1,0 +2531ce45bd486ef003d3da1878cb5e03,1,0 +253f01fc413450b3b4ef7dd93d18c353,1,0 +255dbd23d3fd9c067adbf874e3adddd9,2,5700 +2571014a1559211ba8a76e42c4a1f705,1,0 +257d2b3d357708502884aaa135aa2ed8,1,0 +259b4606d74eb1dac36a44c7bc7df8ca,1,0 +259ba79e8b0c32ebff5dd82e2ddb0bd9,1,0 +259fb3859d5b338178eb20471cfbe881,1,0 +25bb36d80827bb008f18f92c3b76edfc,1,0 +25c28e471e72bcc2274f87fcf41888a3,1,0 +25cb5383c93219f399b294f187ae4565,1,0 +25d1e533f38aa9e9f4d8757e54cccd48,1,0 +25d2ee73799d03cabf90157088656e88,1,0 +25e00c3638f0a81f6e86c04d5f64712e,1,0 +26070599bf37236c2cf83e858c3d67b5,1,0 +26084e6d105fc002d0e7404202bd4f53,1,0 +2610ff3918341eae62ae339885939b68,1,0 +26232db25f006d3c402633a1b5dd1423,2,2550 +26577dc7884ca901102e0eabc024fdec,1,0 +2667f80197efcb20a374f47b9163a9c5,1,0 +2668528fc6ea13f620f82e2173abd40f,1,0 +266caf080d5e2f5cd263dd22e6e5e045,2,2 +26798f2da475796f816e1fc8df790eeb,1,0 +26883b9c3c5fc5b01f6a925ef81e6f47,1,0 +269fe4641fd114dd756b6f5f05884b54,1,0 +26b043cac817d012c21ed0d6c9c2e106,1,0 +26bde79bb4f910332e70d1dfa56bbf94,1,0 +26d27a1cfdc2b72798331d3050eafc6d,1,0 +26dce54f3dd508ed724e5a242fbd8c9c,2,121 +26ed57fc1d5649738e7ee9c7bee278e0,1,0 +270bd32c44833ebfe82ec7fbcdc25f48,1,0 +270e8965b54f9120d6e1aedaeba15bd7,1,0 +27196022d71fa0c0209c10883e2472a5,1,0 +274919613dc315f08d2d5e71ed6f412f,1,0 +274d4edd3fdb72d972171d12e5cd517d,1,0 +2776f894339d90c191c7a6aea383ac89,3,646694 +278bcce783f7aa499032b3a1d74ba04e,2,22500 +2799dc1eff75690679fdc12f4255300e,1,0 +27f2e8bbc0ce5e4c51925da8397e7681,1,0 +27fd7ec6d28ce388dbfabf41333edc0c,1,0 +28085d1303851b0229b26694333e0625,1,0 +280fe52395dfeb4bc27d6ca93416fbde,1,0 +28163d6af74ee72cad63bf52d760bab2,1,0 +2819f534da844e4a6940e78bbf5946ef,1,0 +283c1171b89d69c9aae92c62cf0546f8,1,0 +28481fadd5a3c0f21c78e8a20327974a,3,23154 +285364118fd21cfcea1d37612cc32110,1,0 +287a682fa23dfff23bf2e80e5705d294,3,8800 +287b2ad13b0d20a7d111aef8474875f1,1,0 +28847b5a8cb6339b1947655b11be7f7c,1,0 +288a0908058eb783b73b536757f55c09,1,0 +288e0f32f360f54c019013f94e23f2f5,1,0 +288fbde55d9e095bc273d91016c91680,1,0 +289699ed2c174fad2fcdde262d9f6540,1,0 +28be03d86716b7321350f487d5df448e,1,0 +28c7953ca4cfe936162454c247f9fe65,1,0 +28ca4052d643d67ed4ecd704a1e2060b,2,252004 +28ce15e3c0598fa12149b30d32a015b7,1,0 +28cf5ef3ea4c72897148af3ec5ab1e64,1,0 +28e00eab4f2fb97930a549aca90cb441,1,0 +28e3e4dfaa23fd53638bf8de1d670756,1,0 +28fcc98b4f9298fe43907130bda751d6,1,0 +290b90065c9d1dd7e845d7f2ec27e25e,1,0 +294522dc1d137b2699a1a58f6de0bf03,1,0 +294dcb100e42cb38390ad62bc798df6a,2,13110 +296aa4b523f301c1f665afb07aee5c2b,1,0 +297db2771298ef0447c9c9955754fd3e,2,64 +29b60478ae220525096a25507b373e2e,2,4356 +29ba86c70ffce431e8b1c4180b6b2b9c,1,0 +29d05be39df16bb6b835de0758419d4c,1,0 +29d79697bef016786a86fc88e9b86f80,2,292681 +29d92767f0d95f4c945d6b8ec1e7514d,1,0 +29e43ca50767497f6fff48689ea3b51b,1,0 +2a06ce3fa5d087906040678b2ceb6e84,5,14334489 +2a0a03db10c1129b67c554594fd474cd,1,0 +2a1a020f28502213d6f0b6c05c865f11,1,0 +2a1c7374a22c819607ab4b281bfb6332,1,0 +2a27931dde7c21fc1a90ba0adc5eb87a,3,88280 +2a2d9cf97723a5accc43a3f19f4d90bb,1,0 +2a64541f6c53cc4f0601284d293164f6,1,0 +2a65cfc1dacf90b1c4c80f28e44f0547,1,0 +2a76d243fe2f35f7a9509320193bd879,1,0 +2a8886d8dfe1682db88c0a2b1f9c1786,3,0 +2ab74f79bd7909a354db771d23c5d983,1,0 +2ac1594fb9a767b6d37cba42f9c69e57,1,0 +2ac238b975b9a21aac0aab210b73c58a,1,0 +2af1cea745516b9dac949406483180e3,1,0 +2b035aade40ca193585735fcbc44dd20,1,0 +2b21015ea86c14e7f1682782275acfa1,2,6400 +2b292c009c80b291c98b1a151180142e,2,0 +2b43a7e7910e30cfa6e61b800dd1408e,1,0 +2b445cc43979187909bf4390c78e337b,1,0 +2b4b396548b0a1a8ccb28d712bc93f7e,1,0 +2b5053274ec30d946f59367f790051ce,1,0 +2b5bcfe2609bba34ed4c275a9abca6a4,1,0 +2b8880ca2b8b1bb4f7cb03e1909f9147,1,0 +2b995ffd7b7bbaf457a63cc0a49e7914,1,0 +2baccfef13644b2af8be7bc2fc673ff9,1,0 +2bb8cf7e0bbcada766272e6e406330dc,2,1892 +2bba98b9a0f110337122b7d36a32a034,1,0 +2bbebb2512cea8b96e0f453d8bc82e44,1,0 +2bd76d9aebbb490f59282abf34c70869,2,0 +2bf07e15c84b81dbcfd7b159343c1564,2,2 +2c18d224d3563df1ffc1a44d4a999d52,1,0 +2c1d7fc73c75d8a01bd3f1cc17017f4a,1,0 +2c1fc4718ee69785b366e28f97efcd95,1,0 +2c2a0b669a2eb6b54d5e766465c35460,1,0 +2c35825c263eb1a958cc352f4dbbd86b,1,0 +2c3d3856ade00c460faadeaa15cf6f77,1,0 +2c58e40ac6a97c28de84ce0e7cdb6d74,1,0 +2c5ef4f53038b57c3764f588545a00e9,1,0 +2c6c1acca73e77635e7f91505c0ec812,1,0 +2c89bf1acc20c5bf79c2b6ff418d6810,1,0 +2c9459f04ee4cdd5b04e9d2cc01a02c1,2,10816 +2c97100fcf462e514fbd948d464fff83,1,0 +2ca54c62277ab926c004946b45dcabde,1,0 +2ca54dc8fee6134b19d7ad0f9bdf4b1e,1,0 +2ca6ab59757fb6e071e08de47455810c,1,0 +2ca9fe8b0532be1b6c0ed4299448f593,1,0 +2cb3a73905a0510dd44e9107486807b3,1,0 +2cb74b2dec1db9a1fe417579a2e63dc4,1,0 +2cc35d82a4e7eae2d5482313bf21bb18,2,14884 +2cc413fa5e2f07cf7cb2bf6018626e43,1,0 +2cedb6aea16c315d0900548576d9a805,1,0 +2cf655d78840ca1f68ecf1fb7ee6d10f,1,0 +2d05aac9cda439136bf92927f6d4d0c6,1,0 +2d2170ed34ffe78e3bc5a8b96e2f38f5,1,0 +2d27d05e9c7e4ce0dc4d7bca347e6efb,2,2025 +2d2a318a0bbc1da860a141b6f915a58a,1,0 +2d321125e2608c52a20510129e0ea35e,1,0 +2d3373da9fe2b9459a5745add3a7bc1d,1,0 +2d3690fdff28c15e0750a75845064299,2,13924 +2d47ec05de0ce7446525ff62eda670a3,1,0 +2d4fa4421f57d61e83780b068eb01a32,1,0 +2d5210195be8f48f980c6fd41abc9209,2,1089 +2d6e584477b7a9bd0040d011b5310e3f,1,0 +2d947ab4b29374e52d1fd58b42ab1edd,1,0 +2db3241b7c8958a946b219a592369bef,1,0 +2db7740e73ddabb1ce52b6e2a38fd0c2,2,0 +2dc303d424abe6d23e54a0b8e02853d0,1,0 +2dc542d1bcc17f932464c7ed8e3fc2d0,1,0 +2dced2f284a4e0c29a48c817e6cf5156,1,0 +2dd4c918418ee7fc5939d09dfdfa1db9,1,0 +2dde01ebc5fddfcc1560f7fb88b792b7,2,31506 +2df9ad086615de2c8717e7a376415f56,1,0 +2e0c9561bc4782ffd54392e866a77747,1,0 +2e1523aead384019fc77191290e91d1e,1,0 +2e1eccd63247e6a2bd8f437f0977c9c7,1,0 +2e22328637c05d0342be5da85db0f656,1,0 +2e45b2432fae8d8c57a544786742c2d1,1,0 +2e45fff456a8f948bd66fd686768d151,1,0 +2e47715263a96419f5740f5ffe9abbce,1,0 +2e4c2d68b51973367094ba83af92f996,1,0 +2e6295d05e20242e65a85b736d840bf2,1,0 +2e6aa767633aeccb52c38be56f562201,1,0 +2e733fbc48bb02310824625170f36905,1,0 +2e78b15a14c68589388da11692ce4a03,1,0 +2e917d6948779a55b99ba05621ee9d78,1,0 +2eaedf800d637ae91a706c60495e5d1f,1,0 +2ec36e26e19b291ef6d480a21cb71c69,1,0 +2ec648db6d66a12950b8dbde50d5fb3a,1,0 +2ec936309dcac9379f0f89669f8d95f1,1,0 +2ed53646a729904612fc790873a4511b,1,0 +2ef2a5c57c08c8c3b909c7022180dfaa,1,0 +2f40c5cd89da22e706e4c2893c2dccb3,1,0 +2f419dab07b92225fa941d15b83f8314,1,0 +2f465e9076de95b96b927208b46705f2,1,0 +2f537fcb5df6f785082d9548928e3d9b,5,4145448 +2f59969c2f5d7f75ec3b78396d271b87,1,0 +2f5f3f5bdd74b62412f2f6245d78f6ef,1,0 +2f6466b8866b7b8c515c89362098ad19,1,0 +2f6af35906ac1281d0470019e73f0e40,1,0 +2f777d3848d7dc6920ae742578dcb053,1,0 +2f89400a9a66e9d6f58b0b64cc629f90,1,0 +2fac0892b1550eead33297349adcd11d,1,0 +2fc5271857d1c68fddc33c1442ce1056,1,0 +2fc5594aa99d07d0db6bd9bcc9d74088,1,0 +2fce926281d80f100ce2481b62ba1f5e,4,25600 +2fd05724ba96577dbaabf098ea507b40,1,0 +2fe394593cd24c20272d4461127f2f99,1,0 +2fe94be5e84bbf672aa657173a1aa5b7,1,0 +2ff10514b75cee66dc6f7cabd62e1497,2,64 +2fffff39600acb91a32853d9c8a8f8fa,1,0 +3004d7b042ae19dca17e23572ccd0307,2,4356 +300a552c32cf943b6cb1f89272b98f0a,1,0 +30207339e3ae62b06cfdaf7ff2bc7a60,2,1484742 +30239296520840f04db4b3553c44ebff,1,0 +3058994b05cdb67763ea7a7ee4ab33ff,1,0 +306db218fea51e46b2be7741d8ec8ac9,3,14734 +3076c18ae7baa43ffe44347dde360671,2,1406 +309fbc01864b25cc668f8d15da4e5c4b,1,0 +30a145ca665d2274c16275506739b556,1,0 +30b87f73891edca6c874cd5c08f9f2e1,1,0 +30b9f26493ae48785508388d29bf6278,1,0 +30bcb01733c19e9b1a45f4d3b9fb46df,1,0 +30c453d25bd1b32b18b9ed98b1014eb9,1,0 +30cba2a4087f03528316eed34d391281,1,0 +30cea62eb09d112705db3257a8aa615c,1,0 +30ceeab531729eb4c78ea6c4d61f7f33,2,5329 +30df591a138d75ab4d2ba5c03eb1089a,1,0 +30e27ef7828bef5be8e83dc82ab6697e,1,0 +30e7ade8cd0e1851ff8f44ac626507a5,3,0 +30e9e17ea48c26f31d89d10a75ce8ad3,1,0 +30ec947828346479f97f9991e681cd6e,1,0 +30f17f0104abdc5659cf0bc21079a2ad,2,1190 +30f2126ff1eb60042bf63a1e91f85725,1,0 +30ff0b708f128dcf4c38c0a568b47705,1,0 +310f8482addb006dcebbd189e2718780,1,0 +312a1bb7688aa6ba2ad4bc18dacbf591,1,0 +312afee3e8de129da4e41cf360e5e318,7,20897 +314048ee0fb5a898df6d22636af07ae9,1,0 +31560490b0bd3b1fdc9ca0a99a37678c,1,0 +31755722c3b85b5374871527cd937c4c,1,0 +3184d1f704cb4a956cd521ffcba1046c,1,0 +318b04c86f97f5bd50e9ec665dfc459d,1,0 +3192f2069dccea539668e0f817f19f3b,1,0 +31941acbe64cd3f68be863ecb170956f,1,0 +319b16ce1f5d58753b6ed56d1f27fd8a,1,0 +31a90a4d6fee74ebc9d7e7a64986e7b5,1,0 +31bc3d04d7369d3e8a98d396100b794a,3,3793429 +31bc8e4363839f78a6ba170eadbf5d73,1,0 +31c14b571dc20ac3a88b1db5e00d38f5,1,0 +31d3aa94260518323149745747784975,1,0 +321750ffd1c0f5eb2cb52d4398c65a0a,1,0 +3223ff53874ff3768881db6e163c96a3,1,0 +323d3a61ac8f60761edc56c34b339a1d,1,0 +3242e661790ad530e5a8419a5c7c0b5b,1,0 +3247e39c4bfd94e9f525f7ef5c179317,2,173889 +326b6af0e5d3ac4f72622ce744ee4b27,1,0 +3276e0aa9afede0f2e5b0d5e3dcf7426,1,0 +328f28aadcd871aa3ade0646fda55b85,1,0 +328f55c00a17ff9ab2d6f40d4144110b,1,0 +32ae30b9ec25f60018f26bd4d1af34c0,1,0 +32b6a512d3fe3b9cd05c6dd90fc969cc,7,157464 +32bd6922e63112739d7b03af1bfa1e07,2,2025 +32dd68556743b7974de409bde35fcf16,1,0 +331f5367688b5f567bcbd43627db987b,1,0 +332a600a848d87440552a5261cc53cb8,1,0 +332affd8d631e58399cb8d21a11e58f3,1,0 +3362c28b2c796ec5e35a768594996314,1,0 +33657a6f7712f339a82a053ea111df6f,1,0 +336aaa665a5b5f16db9aade3068bb62f,1,0 +33713a88fa87c38343ee41674237f11c,1,0 +338cbfd9fbda572bdb5f969e79aa29dc,2,184900 +33903f805cd452c1aaad7373861281bc,1,0 +33a72f1349e63ccfac42968439da9316,2,1936 +33d4b1da34c847592dc36686290eed8c,1,0 +33d981c25a75e370f299d297244a7d70,1,0 +33fa00628803cf5b8af42b024a061b19,1,0 +3418e92f982f2a7c6de1a6bac8fad19c,2,35344 +343fe4e71123eb63e5ea8afd4518e520,2,113569 +344c62636e344e508197381259d241ab,1,0 +3457001ce979361ef447f4a29bb68cb2,1,0 +345d066aca14e36422eb730b11711c7b,1,0 +346c254cd6d0a573569d66a532315414,2,0 +347c3be2afa5133d26c8a335829a9618,1,0 +348a5bbfd12e81ef8ecb520c6a83d826,1,0 +349afa114e48c511d7f25ba3edcb765e,1,0 +34a68591418eceb9c08f408f527fd741,1,0 +34b05006ba43bc63d430ac483311755c,1,0 +34c2d0a8166cb58310efc74aa0fa41c8,3,2877526 +34c4f6cf4b6a3eda9848bd6fabb8d8c0,1,0 +34d0f1758071f64a22d46bc1a47754cb,1,0 +34d29e9f8f44b2b592a6a87eb4d1c3d2,1,0 +34da49aa71402781275d1366420e11c7,2,55460 +34e1be2553feefb525b0b5047c8773e4,1,0 +34e58e1a92dc3989e653e32264ee158b,1,0 +3505138e251294a1aa7df203f9300829,2,64 +350c7b51ea9079617772f90062ab6fa5,1,0 +351445ea5cdb1b33ee254b95c879920d,1,0 +35175595e4bc9710a9fd4465895cc48e,1,0 +351c81db947741e1487360fd4d2e3765,1,0 +3521a8988cae658556da2bede39e67e9,1,0 +352b2109c0645af77e960fe6c230b82b,1,0 +3543c6935284ef8e0583f312c4cca1ea,1,0 +3547102114b8514efce7a3ec91c96331,1,0 +354edef26638005ca0b4b14724bfe919,1,0 +3572a406577ab7fb3e9520663ef7535e,1,0 +35858565ccccbc45a32dcf7efb1e612b,3,30300 +35901f3d08f4d38dbc0674349563eb08,1,0 +35a082bb7c3542d0c6207455468b8557,1,0 +35c9c71dd8540859f4c9db3230ee0068,1,0 +35cc13c1ac14b8dd34530a773ab2b242,1,0 +35d2ac4fd9ba4dfacd63092fa5e53fff,1,0 +35d339f18d9ec7bad395ad0577c90205,1,0 +35dd89ec6912312f95a326431e56ebf2,2,12383361 +35e055e1a843ca3fa70b6479e747855a,1,0 +35e3c7a4a56c418bfa1769605d62e4ff,1,0 +35e3e2e06dcbf1005ced1c33e6dbe026,1,0 +35e9023c35e0e109266b3dc398ebf782,1,0 +35f531a162ab7532b9eceb1b9d1cbbda,1,0 +3606eddf8927f2ebe926d5315bfc63e9,1,0 +3609d64d90e7c20e60cf3ec2f2fd9173,1,0 +3612cbcac1f034ef5e584919ff20e8f9,1,0 +3634ecf125ef8c2c691dedef5851968d,4,0 +363766174535ef6a7941966a4e6430e6,1,0 +365b0f37895eea95c7b6e2c9c4521c0f,1,0 +36709445653614da6eca7b2e017657dd,1,0 +3683ef1aafff9f80830f8e5e29dff49e,1,0 +368c7f93edbcbff4bfecb49f490e53f6,1,0 +36b6a487535d18749b5deb20a8a1369e,1,0 +36c6192cd4845e3a6cfbedcb2e05b1ad,1,0 +36d050ed96f0c3a6c396f6a720d3d09d,1,0 +36d0a71ff24cf612aa6f67429406384e,1,0 +36d17d5d4a363775ab8f0a4dc0850076,1,0 +36dc47f2cf56e0088061c7c303f71397,2,2891700 +36e15d1d4fd95f70d48fea99eb914d76,2,187489 +36e71c43a05f58a24df559844858408e,1,0 +36f02497ad0a7667ea0161713f63124f,1,0 +36f66d38b52eb728c923d2a9445f0f60,1,0 +3702c98cf273e30e08eeab16205ce064,1,0 +370818db5ed9bc534879357305747a8b,1,0 +37097d3d4e65f1e955856ed0376003a1,2,1936 +37429fc759e7dee68162eaa64f7677fd,1,0 +3743efe135f630a88a1396b164e973f1,1,0 +374f7e8792e077e6ed39899b27e32fee,1,0 +3763559fe2c5799606982734da1bb25c,1,0 +3772732ef457ac3a492236c5ad846092,1,0 +378a99ff48945f48dbb37d88a9e949c3,2,240 +378ca84d2cbf4f0c5cca781cac76d126,1,0 +3796cdab7208682e58cd0df23525b24f,1,0 +37aa0d8a09f08fe1ecb328633f10ba94,1,0 +37c49c4ca1efceaaa35275e5bae079f5,1,0 +37f3173198df341a277d065a321502d3,4,0 +37f70763eb8760921800f5cc403708e9,2,14455204 +37f874c3360a75ae189781235d9953da,1,0 +37ff00f25dac4c4770086b6c0bfdeaa7,1,0 +3811ebf671f8339c86840f4967b0ecee,2,25600 +3813ff2b460670691a2aa0dd51031d3a,2,1560 +381aad0bf6ecd4b6768b25bb2442dff6,2,992 +382a2c67cf4151b5f30927dab252be10,1,0 +382ff714c48e2d31c12c212072e9f251,1,0 +383e1842a0c090e7c7677379f1047d5d,1,0 +384277bde4236e13e187e977c3c6bd6b,2,36 +386823bd3230c69a3142a7f42d709d67,2,25600 +3873259e10053233849732964a38df33,1,0 +3874e1c664bc5166a8ca574e013cee83,1,0 +3875386767383dfda2c704bdcceec889,3,2363572 +3888ecfbe34ef236f7be01b82d575af0,2,930 +389328407dbeb85b4974c2964f6cc79f,1,0 +389c7e5e0e539c5e3bf17003050c08cb,2,72092 +389de7eba54808ba4b3b0be5c4074342,1,0 +38b85785207bea408103ac286edd1801,1,0 +38c29e2e75447b32074c178f2d0da956,1,0 +38d4f2cbb59d9e4ea84b9d74f1a4de96,1,0 +38d5c6b4e7c80e6645e5934643638f2a,1,0 +38e7d758ac5191eaffbe6826fb129b48,1,0 +38fa4da4ae592437b6065a21fd634e4a,1,0 +39221fe736eb4a823d771e83a03a984c,1,0 +3942e9d3ceb036fcde71ba3596265fd3,1,0 +3945f817fba6ab1049c19a6644bfb6a0,1,0 +39479bb6f511ccd47ecbc3aa98cdbcc1,1,0 +394f880149b80e60af966019e1ba0962,1,0 +39533474e0e8138e6b7eb58fba0eb017,1,0 +395719bc23b0a6d144a7bddb733316fd,2,2352 +395c0ae9476d3757ee4e59655b28e82e,1,0 +397fea1e089cf5eef44b8ef15f847844,1,0 +39812ca5970ac223915a7766ee8dc62d,1,0 +39921ed37d0cd560cb9a061d33c71337,1,0 +39982001d2d048425110f42e5fd25a86,1,0 +399910ed014298cad431cdb2b465c76f,1,0 +399af7f34c02dfb6db0fa29d5725655c,1,0 +39a811bf7634c026ebcc650e8d07fd47,1,0 +39a96a253d39de34c8c41e58c2dcdf06,2,617796 +39aa4997f78248817265025150f16dcd,1,0 +39bc2ad2ce839f24394363b0e17a7f6d,1,0 +39c2aef92d22d74b68450fda9e1d9215,1,0 +39cbb6d305626703a4bc2eda601ca1cd,3,14025798 +39e7e3e37e8a3ac8d110c4f505f7f99d,1,0 +39eb8cd6b484c8b86cc95b4a4e921690,1,0 +39ec2a3401941f66535a783d81932580,1,0 +39ff3979fbfa29b06ed626d8282b24bd,1,0 +3a0717f0e19ec98ae5cb2d469ba2a345,1,0 +3a0abf1ea8d16c32a2778959fcf99571,1,0 +3a0f6b81d11ac5808aa1d06bb286290f,1,0 +3a12d42de70e19b42d57f252a0970112,1,0 +3a274511390ad9b156db99984460473c,1,0 +3a290fd86805c424dda0fb376afd0834,1,0 +3a2b6065128ee1adb3e97dfc52ba7318,1,0 +3a307cbd026f3f420871f41131f89012,1,0 +3a37c4a592a4be22a8d8d5e4ee80d7e9,1,0 +3a3dc364bfebd251baf6c465c212ed1c,1,0 +3a3f7d42355f64485a59cb25fd4f6eb2,1,0 +3a41ed4b08d3bbc912a4f4aaecee9dd0,3,2410717 +3a505cd384cc4eb05934e959fad8185e,2,22500 +3a5f312bc61069dfbada3bea35595687,1,0 +3a8f892aefcf1c1de6b1b126fc6b22e2,1,0 +3a98d443f34e4e7502ba39c4a64b25c6,1,0 +3a99f1cdb5480c6028e40b09169f10e9,1,0 +3aa1d644902c682b4e93edc708d61936,1,0 +3aac9f4e52773fe390120b4823646eb6,2,930 +3ab97af2c303715a28bb6d262a3f2d44,1,0 +3abc33ad9aea331a448ca014af02160a,1,0 +3ac30ce51e6cbe2fe498329514519254,1,0 +3ad21c375e64c425098545367110a56a,2,14884 +3adffc23765d50a356cb653696a28010,1,0 +3ae22df27ebce90149114ec4f959e38b,1,0 +3ae5bd908c895a7aecae816c495980d5,1,0 +3b0597b51257d570bbb6b3e1091de871,1,0 +3b112bbbd220416515efb28f02fb0020,2,4290 +3b1fcf68336de2d79ca1bec75ee8bec9,2,2070 +3b481854e918a04bffa59a0416028dda,1,0 +3b77714111548d20e5a24f694a3799a8,2,454276 +3b7a17bbf64dbcb68674ae710b45c79b,1,0 +3b94d1c8998f5ac3c985def219ab8132,2,4356 +3b9ad01f6cc22470bdb01a625064ff32,1,0 +3ba9f5512a618d3089a9f1bf073748c3,1,0 +3bb262eb27da9f721cda4ae361b6e628,1,0 +3bb2639e5bd40c58db0be0c54eb2e13b,2,25600 +3bd6564e4bffc131afe76760e02db797,2,4624 +3bda69c3fe4e30d6944a02d696661fe3,1,0 +3bdea76452dfd0a2dd349e05688ceea7,1,0 +3bec6daa3c92aab45d0db63b688bad9e,5,49060 +3becb246809835f192b15039849f3528,1,0 +3bee0a82a9098c92945daac991fca070,2,12 +3c1b74fc52f870503d59c3327da6d203,2,1332 +3c29ccbdb900b4ade8f05884d9bafb1c,1,0 +3c2bc39429c8d1a0db6369149f454d65,1,0 +3c47276e13a1bf073b7f2987f09b21d9,1,0 +3c483603c5e87a59b5e762591bfe0b1e,1,0 +3c4f92d98c4e7792e46c0269daab7d6d,1,0 +3c51cd3b2b4b213f076ba27e90d04225,3,6299530 +3c583eb716f36fa0ebe89e3573c733c0,1,0 +3c58eba0522266abecca9b20aad46677,1,0 +3c63070dfe31a39510ed0fdc001cd339,1,0 +3c818393311027c75019b2ba034de93b,1,0 +3c99cb23c525923952d8f1b1b4b3ba0c,1,0 +3ca27742b6e229b059d8bf4ef3b43388,1,0 +3cb72a7703f1b64b546fe2b12c6cef80,1,0 +3cbfbd3eb80d263f313fe2a234e2d031,1,0 +3cc7b63f5e355127e29f54a965c7943d,1,0 +3cea529e6cc7f6e9e3dad087d778aabe,1,0 +3cf7c19aca94dada099d78d1ea37f74f,1,0 +3d0d56b5d475614b461ce18005952487,1,0 +3d0f8af98a90479d141d397df22476e3,1,0 +3d1d4732308a40dc1414f6847902ce83,1,0 +3d4198d381c0eca19f83bfbd78ee4c35,1,0 +3d48fa6f56d18697c7ca2af4e387a611,2,5476 +3d64e640502ccfc5a94899c883659416,1,0 +3da388214a261e7ebd90fe3a3c58ff2f,1,0 +3dae26103d7d8ff41aa1c547cf78f242,2,330625 +3dae601152e20b2d54152bb17e40d627,1,0 +3db55231b451ee6982a19c6ffce11be7,2,44944 +3dbde9268a37583457d230812e7cf0be,1,0 +3dbeed9c18dfe17323ffa363ba30be7c,1,0 +3dd77a228d03dbe609dd624b16f2cfc8,1,0 +3df81cc814603b77ef1173d35c9e1bdb,3,483466 +3e001cb067c748fcf5cb835f314d44f4,1,0 +3e09b7532ef6afa5c06a72ceea397dda,1,0 +3e1cc24f2de080de6c4a34372fc4c698,2,0 +3e201c5fcaeacf1856c85a3070dfa284,2,812 +3e230d81ae5237353195634f1b66c303,2,61256 +3e23ad820e1202171e319ea2aa30e749,1,0 +3e29722bea84e0c2afc10632910d7881,1,0 +3e3ca03418ff5855a7134ab09d9833f9,1,0 +3e4b294c9f0313672d40881fbf868c91,1,0 +3e606a725f5357e4d369623dda438ced,1,0 +3e84ade66a54c4fc4aec57c3d4395182,1,0 +3e91e91175cc9534011a2c9ed31e6169,1,0 +3e9b0bd120bdeea2760e2cbfe220c62b,1,0 +3ea5a7c9caf52363f843a64998777f75,1,0 +3eaf47b1f378f8acda5fb6d6600ebb94,1,0 +3eb7d41f60aaa1b72d0be8901ca69891,1,0 +3ed01cf86c756f4e6345ac25580a268a,1,0 +3ed652f1fe93dba99a0613a54c7e5972,1,0 +3edd88b30ed1716812874b50a76ac78a,2,287832 +3ee1840603152178e773234ec6d03dd8,1,0 +3ee592bdc995c53fd7eda8c9db0d6d56,1,0 +3ee77e15803a08b68a9016a227b2f283,1,0 +3eeaa604eff754bf73cc8c2be2c3c81d,1,0 +3eeca30ab5043a2b42fa60cfdcba6d9e,2,18496 +3f17e0ef58cc19d2692531c48421530c,1,0 +3f1851e5424721978fc0d8923587b84d,1,0 +3f3d3d0a7cb189627b082c16539833a4,1,0 +3f4672ab5d64c5adf5172e4822929532,1,0 +3f5f78a86b860ec22bc597d8ac558ff8,1,0 +3f7da41a207cd8bced727132982d6917,1,0 +3f818d84f82a67e65358b06f59f0a608,1,0 +3f970e288a118592c116400cfd6e40b7,2,900 +3f9916e8f201475ef3536ac089f8fadd,1,0 +3fa1eb6c151af7d4e974a733622e911f,1,0 +3fa80c04437fbec58ca0678c8bcae586,1,0 +3fd963faf334d754bb0c3b8150dbd207,1,0 +3fe17aead3c5393fce20862740ad5137,1,0 +3fef0065b823d4b09016d1945deb7329,1,0 +3fefa94d6ad10f4a36e0e69b460c0b09,1,0 +401d8fbf2fa3309c2ae56c907b886abe,1,0 +402dcec8801b5134787e4c55d06d14b2,1,0 +40367a047b866dfbfdfb494bb1f7fef7,1,0 +40382bc1cee0c9776fe655194e1d1877,1,0 +40580e84e1aecc085f468e70759c8264,1,0 +405f1ebd115233ab2e368d25b4437b17,1,0 +40727cc6504b5044a08c16ee91dcfb16,1,0 +40760c22eee2c4d4c8f586d7ee52cce3,3,22755 +407d4561c9cfdba54ff3d4f70ab8560f,1,0 +408e426ef134340cb6b4a67f2b5f1efe,1,0 +40999575e5fbf9bf7bb387bfce7b1f72,1,0 +40a8c29c07461c56476da542e4833137,1,0 +40b66f54ab0332c255ea016fa6cc9789,1,0 +40ecc71da95a3d82f0007469cc897417,1,0 +40ff4b639acc26f3bdc98002b716380a,1,0 +410cac71760b16a88bb0dbaf88a4d996,1,0 +412363d62d4a978717cd65e8374debef,1,0 +41251af4ab36c9b1c4c4c0e86932beb1,1,0 +412d2129092abe01690fe2547274aa96,1,0 +41318da1afa1a3298f046302bbca5222,3,29866 +413c19c6e0a23d66962980f3c4e2e145,2,12 +414b9c41bf7b28d67fbf36392318955b,2,676 +414fe91e92f8ee2b9da5bd53947e8602,1,0 +4155b3e8153c79b68a5a0779be6c6f3c,1,0 +415f7f89525d77c17b95c6c838c18536,1,0 +4162ac2e41d7b5b8b916d6fb1e2beb2c,2,324 +416513bca3c8be3e8c7c25a32a8434d7,1,0 +4175dbdd2af48d4a8e517af0a69f2f3b,2,12432 +417c520b1c5904699d21916bce7f68b6,1,0 +419d3d578b8b0307d4d4416f8fd6aa4f,1,0 +419f839c61ec6dd9b134d8973fa1d59d,2,506 +41a821010f4d9a63f3605ad5f2c6e0e6,1,0 +41c9c8ab1e23364f238d2cd42a96dc5b,1,0 +41ced7cdf40b84f5b1744fefb2606ad5,1,0 +41e5428334d60821fac6482b9651c094,2,1332 +41ed2d24b3d061ecc107fceb2c724f77,1,0 +41ff6cdc50b2dbb5afff635235b22c8c,2,2970 +4215e6728b1d996c2a46b887d82625f4,1,0 +421c77d60e7431f45c8fa5dc54fedef9,1,0 +42234b2a9cf4163d23e3c343984da1f1,2,356409 +4236e00d1b5071db671f8a70ec40d406,2,1640 +4259d1143004ca92eeadf61c4abb3a7b,1,0 +4269fea655e245757c64bf338e45a808,1,0 +42758febc0e9c25e5a0873604ff87254,1,0 +4276de80837e9f7c6579a111acf0e455,1,0 +427e959d481e0c88297587db29eb8160,1,0 +4280dcfa65efbc5c61ba4a1a134727c5,1,0 +4291fc571c0ebbcd795cb0e356bd9c39,1,0 +42ad8b8c375feb5429af1dc4a8e1f028,1,0 +42b0f4c3ab6bfd1fea44ec6b441972c4,1,0 +42b396ee38776dfa13e4b5309ced359e,1,0 +42b63782e1bb539aa70af1ad352e1004,4,42048 +42d3d8a912a5130f233a0243ed3e7e89,3,696 +42d8c748d36ffcdf2588d140afe972d2,1,0 +42d90c4830bc59d179039ef906cff934,1,0 +42ddc34977d7bf725f37e8fe01b0eb76,1,0 +42e19bad9cd0741554c20d11c3c24fc9,1,0 +42e9745c1400c0bd18a325c1a63ab30e,1,0 +42f1d5af21a6bf349b20f638a3b5da4d,2,3249 +42f367bba888c4688084567f0e48aca6,1,0 +43046a94d326e45754daa250df96321f,2,930 +432378f2fdd63f235ec368747d79fdbf,3,29130 +432ca669e10bba9c03dc4020e3e12881,1,0 +4331cf30b7c151a7dc80ead8b3e6f3f0,1,0 +433228468c7c3e020ceae7687bcd8f05,1,0 +433cd87e098558301448e9022bb9b58f,1,0 +433eba3bf0cd0d3a60c6da3445ab05c4,1,0 +43580d86c815b67fffcd23dedea00004,1,0 +4359d12a3093953d7107e229a0e99d0d,1,0 +436708a5049c51515130524c66efbd6b,1,0 +437f0a6dbaf8e9e6aecb85944549ab68,1,0 +438aeb69a943f629570ae2f2fdc266e5,1,0 +438e999b959eea8f09508437c8dc72cb,1,0 +439012017e9e457d12a7daebfffe199f,1,0 +4390d7b8b114db8aa517d8cf98e017b2,1,0 +43b379083cb5ad31723890d4986f0842,1,0 +43b45bbb6e3dcfc85ef25695a1b0beb0,1,0 +43c4eb02eabc979c91c03bc1555cb580,1,0 +43d05c2b32b83228d9cf72f156310392,2,25600 +43ffe36826f00770cf1de1574167b0c5,1,0 +440263560756b70f3f3475b9b2385bbc,1,0 +4405fe2b8e78cb04e921da51b97a4a77,1,0 +441df38a0099a3fc857cb93647c95135,1,0 +4440205c2ae29c23f9086bd850f12dc5,1,0 +4440d0af17aed3d6aa2f81b8f647f4cc,1,0 +4442a04dfc092e0210a758a5541f2392,1,0 +446e814e7ccabca2b3d43284aaee76a7,1,0 +449358ac1c6da73b6cee858b566c898b,1,0 +44b152555c04356b25f73e03b3c6c588,2,256 +44beedc8c4c7a8ee5ead1606a9f67e22,1,0 +44c295d3726c40e6e23a85b33e55cbad,1,0 +44d6fc9cda0dc4618dc2f8987e93dd4e,2,2304 +44d95b82310f335f54eac14fc0afc6cf,1,0 +44e907b0bfee57abf9dc01e7e1fcc1a8,1,0 +44f0914715663a55fa89524cf734eac9,3,25091 +44ff4fe711acb48be3ca84d0c0c8c351,1,0 +45153f16dc4fcf9a51d4f45156c3bb29,2,113569 +4536a8f136729440b4762de771b72c45,2,870 +4541ef924dcadbd4118b9521b1ec7981,1,0 +4543031646f0dace54dd007c834e3581,1,0 +45499743a72c9cff765b00fdb3e3f6df,1,0 +455ca7f6c94ffd38cb8af2339d546e33,1,0 +4568bf24dd34641a21a82dd604b0b221,1,0 +45845948e24ff058292e26f707d5864b,1,0 +459d1047366eb7bbc87b415fb4de829b,1,0 +45b82b91ed15a21754ed1de30e5e3a4c,1,0 +45c0c9d0fbb91d618c37e7cb8eb52373,1,0 +45ebac38f0edfbb0f648ae701810fad3,1,0 +45edf482dc16dea51c8936863f83328d,1,0 +45eeab22c1f9962e24d656d47216d77e,1,0 +45f5b5e6b7b3df30691e5001e5bdccea,1,0 +45f654e47d33e411ea3d1f49f63551d1,1,0 +4601558290bffe645eac8fb9bd17221e,1,0 +4609dfe971fd144d63214d47166a8bca,1,0 +460c75bc84446ad8643f7f57c14a02e3,1,0 +460d673d1537bffa56f5e809bf5f2658,1,0 +461ea0b9bb9f7a4e8d8c3663c8368428,1,0 +4621d790ebc79ee9f2b9c6279611567f,1,0 +462bcc0bbb2048e40c004f28ccfaabe4,1,0 +464e9c5914344c0a5ebd52414c03e6f2,2,34040 +4654e43afc893bd036191feaf0345cee,1,0 +465e93291564f94150c55dde63db5911,2,45796 +466c320458e9898a65b9133ef8edc45f,1,0 +467bdca982021b65eae6085b5bb2290a,1,0 +4680a0b5fa12d567faaa7dd3e70cc04c,1,0 +4683c80c9300c3bc000e80ee7befc4ea,1,0 +468e5f09bad06690c134bb5d54aa1a6e,2,9702 +46a37bb8800c8af329b9be87b83d8dab,2,20048006 +46adf4daecbd3bb6a10863d3d3f4e79a,1,0 +46bc8747606dc9412d530a4e831cbe63,1,0 +46bf4d84fe89bb6190d3665cb94b3e90,1,0 +46c387a75880742be0f770ee5ce311d3,1,0 +46c649a3928f144d905432afa3626b6b,2,4356 +46e7f76fcfabc176699c0a6be4c6118f,2,30102 +46f55945777e47d678e19f9166d7a9c5,1,0 +4701872d3e4ff5a308aa6a98eba9e810,1,0 +47097c78342ff95aeca1c9d048ad7d74,1,0 +470deb71ae21d2605c0ecf0d5f1f1249,1,0 +4714b1bb741cfc8a2b89b4499549279e,1,0 +472073a0c13cd3306b62a7f8aa75634b,1,0 +4722b76c35bd514947d2f27b1aaeac89,1,0 +474436e93d2b1c2ea168f145663eba20,1,0 +47447690d7f95ad0411439454b502dcf,1,0 +4752b34f1dc4b6133197dae0ffbd2e31,1,0 +4769fd84445d558dfb8e965fe377bf7b,3,21162 +476e9bb75331f367175748aa90cc6717,1,0 +47799ab24ac1aa7d8c6f514bc8b8597d,1,0 +477b45abbec461c673a85ca283168d22,1,0 +477ed740426579e50ccf77344614bea8,1,0 +477f2b5bb64bc25a70fb4189a7956eef,1,0 +47809016f7c669cb21faeb01f20fe3a3,1,0 +478ab003feab9cbb5c71d27d8f4671a7,1,0 +479916ce3bd7978837818aece73bd27e,1,0 +479db86f798881146de944a1544b4375,1,0 +479e2d0d6fb09694e1fc79dab9ca10dd,1,0 +47b473a7c9668f03717da5255b0cc408,1,0 +47cc0a2e5e9fe4659a004fbae9b5a359,1,0 +47d3ae28deb6d120658c3438a717c514,1,0 +47e8570a8c62fda1e2cf21e17ab7f990,1,0 +47ff914efb5ea253ff39ee7519417384,1,0 +482220168428f56b5b46c7a7831d211b,1,0 +48257b6d27c84079859bca40ff7e4195,1,0 +4834d595e4c374472ecf6122d5f209ee,1,0 +4838b0403c3c782242b2665442a2a1db,1,0 +486d159e24fec9d668e5e44e2f8b7704,1,0 +4880046ba8679cd74eacebed69bd0fdd,1,0 +48a4a65df57dc6b7aab949a4ec2b1936,2,9572836 +48a538bdd0c2df51b76c1281de59c8ec,1,0 +48ac63d3c4a4705bf2cbc3926783f917,2,900 +48e800786c283e10517d7774e5b3678a,1,0 +48f95d8487b8646cc81c5b6c602caaa1,1,0 +490020bdc653925805b306bfea05241a,1,0 +491189320c4c44cd6adfb45d0c949553,2,4096 +49127588843fa4e8710eea4e28aad75c,1,0 +491f7f7f0e16681ee2bb9eeca81b019e,2,9120 +49240f211307b3138e7fb627ccf3c818,1,0 +493969d387822814ebe7b8f09918549b,1,0 +494340f606d9bc07e35b581e38bf71b3,2,32220 +494eee9aa36ad1e416271367de75fb25,1,0 +49541f056c040bab1f63523b9b505740,2,27722 +4956f38e6f58fcfafd6f6ef4826d7f3b,1,0 +495f5f4e88c63a73fe4039165a6593e9,3,15589 +49600bc99080ca9ec3e5628c275993b0,2,289 +4966e3bb30964633d0f41b0695e9dda2,1,0 +49682f1f4dc3f8c0f453159aa6ddaad0,1,0 +496ae6e3966ae7b77470d4192c881128,1,0 +497c53b2b8778401361dc509a51125fc,1,0 +498071d2a77f67545907c474091b15f0,1,0 +498dd19e4de16de2367dfd7facc718d6,1,0 +499499cddad499803d1cc572cddb318b,3,16080 +4999e15284ca074d1e52bd542c73e1b3,1,0 +49a9c61008dd61b32ec9c0292771f94b,1,0 +49bd65fc4d200f569316c8d1fa023fc8,1,0 +49c7d159fed821cfdd0ee7618e88daeb,1,0 +49cb15f0aeaa0894609154ac9a485a58,1,0 +49d5ce48a7c33f3019c05b70e07e7610,1,0 +49dd164bcf00947c0d799502b6f380ce,1,0 +49ddee58c20a0dad7b297842a4d35bf9,2,729 +49e49f075d920979b0420f0e75f9d597,1,0 +4a094db9fca2352010d7ddb4b4e9d693,1,0 +4a1132c3017dd845697ae4815807cfa0,2,1089 +4a11dd6f4612664ccc7460b375d7f820,1,0 +4a2a1de61abff3769dd540f0d9a04e42,1,0 +4a342df3f68ec8e92a78e6f290ea045f,1,0 +4a6f3d636e36ae3c46d496a170bae3cd,1,0 +4a827a17de9bf34ba743983b1a154c9c,1,0 +4a83e65159c34a83f6f42d06c39a3b25,1,0 +4a91733d5a71de5abb0740170b445bd6,1,0 +4aa2d8ebadc494dbbc27f6ea92860ae1,1,0 +4aadcfe22fcb16cd43414325f98a29c5,1,0 +4ab04a053ee8056c811e3c550bb87056,1,0 +4ac7a93f27fcccae8b46322861750444,1,0 +4ad37d494bdf40ce7ba7561bbe5339e2,1,0 +4ada049de148759a109f52bc084680c6,1,0 +4add7435371250ab53e0cda3893935ae,1,0 +4adf582047e965269cc88cbaf6cf75e0,1,0 +4ae799d5206fbaa7f2dcad2ad784ce8e,1,0 +4b1bc13f4ef9028cf8fc3b3aadea0ce4,1,0 +4b29de170d966b7f03c44fb1d90e6a6d,1,0 +4b47bd34b344411bba8ababa8f01a90c,1,0 +4b897376b83d831114dadd8c38c9a5e1,1,0 +4bbb8da8563889feed5727ac8f332eda,1,0 +4bbc92581240ac5a6a06fae0088fd6f3,1,0 +4be1d10c7f69cc8fdf77ea49fb08b183,1,0 +4c039757edba47e82c1d95ed499896d6,1,0 +4c2d6c9bdcfdd2aaac599d91c9192dee,2,110 +4c3bda3a0021a8c42b66bf989df6b7a8,1,0 +4c4ea6ecfb63e37142e5cc4ed9793442,1,0 +4c5362ea0d360523704c0a29e02c4a53,1,0 +4c58dabe226ae982f3ad16850cfc33b9,2,76452 +4c5ca8e2ac8c22fb727012c9c9d777b5,4,5152145 +4c6203bc189d009c8d64604cf2551029,1,0 +4c65d4f4c69d7a3640b5c9bd1527738d,4,475034 +4c6a5b5b7b2d279ae79d81e039ca7234,1,0 +4c71150c41a7a97b8edf582e6e238402,1,0 +4ca6f3e6d08f7d7395447a9837452850,1,0 +4caa4a85408cefc758966a3da2739dcb,1,0 +4caf58d214a6b5c4042c40bc0fb78fb2,1,0 +4cd9157971090e1422eb02a001b18a98,1,0 +4ce57f669a7e2923e498d67956d0cfd2,1,0 +4cf1c6e510e213fe730a7281de58c26d,1,0 +4cfa4e66383c8f2f43412cfda8c34275,1,0 +4cfeaf1ccc075f4c8617429ca092b4c9,1,0 +4d104f65ef898553420cbbf6ab588dcb,1,0 +4d1d0c8515720e20025fd581d2a5b413,2,13225 +4d337dafe600a5957fb9a39cb57992a7,1,0 +4d438f45d60564629dec2e3ffe8fd77c,1,0 +4d5195bc164bc40158f67db8f80f323e,2,27556 +4d52009d9f40aaf37d2f1535b4d02526,1,0 +4d694a451475f18c0267081c2603d261,1,0 +4d8aafc374a39f0defada8fedde08784,1,0 +4d9129c57e5321595dd14214f72624ee,1,0 +4d9770616207b215f6e8d54ead87b874,1,0 +4db13332c8f8b48ed3dadeacf263ac71,1,0 +4dc1bee4acee794d018bb78dfb2d0549,2,8464 +4ddd6b3838472f299420610cfc354827,2,1 +4de2e1c57d40087e865f3e20c708cd40,2,841 +4deffe156edf9fc646ff8c6aca8a3a5e,1,0 +4e0d56bd3538c9393f78b65c8266f44d,1,0 +4e2ea1803259ebc0d8073536ef5fae03,1,0 +4e40bb83ba92afc97cd1992221612d96,1,0 +4e47714171ba241b26f83203e66fb337,2,784 +4e5715a8f6d50df56347c3b16a988d2f,1,0 +4e60cb8201236c0fac66aae1d99eff2a,1,0 +4e60fdba7a7aba5eaa627103f3966f64,1,0 +4eb0dddd0d93dff5ccb4bf832664089e,1,0 +4ec44032027afda1ae140bd626f26bb1,1,0 +4ec48cff56615fcbc9f8255147dfa644,1,0 +4f010cfdba903868f4d9fca2320b6865,1,0 +4f0e4ea6ff547985d7ade096a12a0688,1,0 +4f1a2a4a45011bb14ba0543adbcc0918,1,0 +4f344cc2798da13a0c31150c0002bcae,1,0 +4f3598e6cfb319583643d3c71ed98900,1,0 +4f35fa7d47961b8bad1e25530af6c264,1,0 +4f4deb5c58771ce7c68e1f1afa846b82,1,0 +4f5326336c2232176ec552c8ce578a5a,1,0 +4f53604ed9dc5471de1e395628c07304,2,625 +4f53af6ee62dd4f9ac2d80e1288415c4,1,0 +4f5d3f41c52405fd96d49fe7a27bfd58,3,18539483 +4f62575d64210456f6cdaadab5d683cb,1,0 +4f646ccde31c3f91018a2ba086c54b2f,2,34410 +4f66571815a0845d53c2e89d010220b0,1,0 +4f6dac4381c873505d8a4370bf922d87,1,0 +4f768eae1404854f5c0aa0a15d17898f,2,400 +4f7bb8082c83dd6a31deb909e2384924,1,0 +4f89db016ada69247c0cde3d9b649fb5,1,0 +4f9b7a4143851d89234cf7dce92ded3c,1,0 +4f9bda76f88c6a29ebb878f778b0cd54,1,0 +4fa1e15776229c2ce11590238821ab7a,1,0 +4fb44d17cda18d0c04605f4374ffdb1a,2,43264 +4fc2ca67d296a3e0d82f8b854923d168,1,0 +4fcd699375dfa7df1c0eb12192d63b7c,2,266772 +4fd15118c3e987fccfbad711528ff651,1,0 +4fe79c3227acbda1fe01333d510f123d,1,0 +500766fa9c90269017ac1194fa6c1e0e,1,0 +500db53f251bd71c4d30a298b982f6ac,1,0 +502c4438ca95d673a76eb7ee9b976e21,1,0 +502f382992878aba124253abb95e2f75,1,0 +50451c1802dbbd8bdb2944ee31e57739,1,0 +504686d06a948e76c6b4f09f49b88d40,1,0 +505eaee5084aea052cdbdd34167c67a1,1,0 +5063bfbbb056cad0dafac4085903763f,1,0 +507f08835550eaa7f196026526781a19,1,0 +509deaf06f2023f530316cafa7066878,1,0 +50b09e4f53fa74432041b92269c0349a,1,0 +50b8d4a3604cc53661bdffc65167e43c,1,0 +50e39ee25735f9e17426180fdae37df4,1,0 +50e8fb464cec5281c4b2b4130b2d545a,1,0 +50f5fa034442c6c0ccd65af2bad96a29,1,0 +50fa764b720ea24a9c6d3d4254ab3bd0,6,1897 +50ff2e9660ba1139fad98e2054b5027c,1,0 +51208327ce5013e1bb3d0328658e9527,1,0 +51364010bb26dffd76ac74776b4dcfc7,1,0 +5154d80056fb8b678d4c31ff994b390d,2,2550 +515b41975749c35f4f1abf0552b7e838,1,0 +5164a5e2bf97169a2c0845673dd55ec2,2,41616 +516c0c44053aa33145a6bdb47d17e0ef,1,0 +51724917927135b6a744ad866c686986,1,0 +51811aa041a78325370c369e2a25562b,1,0 +5182a315a08fbea6a2cb394b9a607635,1,0 +51b4ddfbffe33512981f01d050edae6e,1,0 +51bdee30368a229ca0195cf4fdb0d845,4,12445 +51cbdf2310c035abbd3d43f80d3a5048,1,0 +51dad21dca9168118be254d252494b08,1,0 +51e053ae4ef1e03e523e00b16977d265,2,930 +51e500fb8b8ea4fb7628313c8f107689,2,9604 +51e71ed22d13753545a2036f98cb59b9,1,0 +51ebc7870c67a1997ac288a4c58315b5,1,0 +521dd1c5f08f23d4f1d4e89f90d46607,1,0 +52372a5b3b1c16c81a19397e884a2ce0,1,0 +52438aabff7c17cebf7ca99a93c85d3f,1,0 +5247a70e6deebb26d8b774abe310287c,1,0 +5264d364f6415a13569271f09fba86c0,2,37249 +5288a775c231a982542c53151fbf32e4,1,0 +529e69a732886eff9e0e076af6180cf8,1,0 +52a648347fc41ca0541cb0b24979d30f,1,0 +52cfde46503fa17148d4285f0467dc4d,1,0 +52e9b892c58b4c07bdff49638726e47b,2,319225 +52ea4af92d928917076593ed3f65a49b,1,0 +52f13565bbe93d69bc3fdaea1e12f583,1,0 +52f91abbc5006f7d10d5b355dae1d59f,1,0 +530b64fd4e9252c5ff62de9080c09f5f,1,0 +530db048216301cd61ab94ba5e840eec,1,0 +530dfe67c3165675fdcc9bcf7e736a6f,1,0 +5311af9dc14eb332cf17fa5b57bfc6fd,1,0 +531eed39fcc46f7c677b7be628710af2,1,0 +532233a14be1a5d7b3cf48449aa39483,1,0 +53227ecba0bf1872e8466222e1fdaf8e,1,0 +5339753feeb2b83ac445a834dbfbc5b4,1,0 +533bf8be216da961255d3a8dc270d879,1,0 +534fa864cbd3885692eefffd5369af34,1,0 +535067de4d6c36ac6aab7e618d607ffc,2,600 +535464071e8cbe8ee3227c49513fb9ff,1,0 +536ae112f360ed546f771f6c9392bbae,1,0 +536d2da33f630d70ce21d838b8217467,1,0 +536fc133f1c4144567db3d0deb603bdf,1,0 +53718de3e97c82d9fc8c479284c35a46,1,0 +537faff07697dc4088cf1436bbe1da84,2,37249 +5385ec2a409e4ae277687fd1c248aadf,1,0 +53906e394282e4e3eca93773f9ad3d42,1,0 +53a2ec607fc90792305e15848f1a3836,1,0 +53ab162dda0e1f7425962d4440d89b22,1,0 +53af4f5c69b2ea24054ba75d73dbe9e1,1,0 +53c1372795c61bf8f4b8de9c4ebfa3bc,4,113569 +53c43822c8f18eee98c7dc9078e1564f,1,0 +53c57619a35686ebd3a32c1f93764604,1,0 +53dffd31b782586513953b4f77198a13,1,0 +53ff5896f28ee88a08498a951e2bf477,1,0 +540433ee5bd98293ea44a31f3643486b,1,0 +540aa40ea9d5e4224e9409cbb5207dd5,1,0 +540c13239d30468657729992f60603e0,2,94864 +542022b5c9484ae0989629e58ede0f4f,1,0 +542528e421913b58bb1209d4fb82354c,1,0 +543ab259e3b81b4caeb2d781924e48d5,1,0 +544111900fd03d06f97415fde82f7230,1,0 +5445b05c42beebbb88c04541192e8d9c,1,0 +544cfa8691e7a30c9dca49a15474ef42,2,43681 +545128c505f2c1dfca3c1ab61ef5d4d3,1,0 +5455a1ea6b0903b06c5f46b46e0197e1,1,0 +5455da34683ffa798d95d56d1274dcc0,1,0 +5456b004baaeda052885cefa5b976fbb,1,0 +54661463fe2f19888c92010468263de0,1,0 +54764163281faddf2e07f66679d1a0cf,1,0 +547b3c46daded352fbf63c857d87921c,6,8937399 +548c715873b6223fe988a0f94c932b05,1,0 +549e072fe0adbf86a9cdf96456702e6b,1,0 +54aa5358f035a72d895437e03cf3393c,2,121 +54d00e9d39e00973e74abb7d463509df,2,22052 +54d7241c191e5c5d30f55f86f3c2a1e2,2,25600 +54ebd8d18b8e5eed18b5f0e263dc6449,1,0 +54f451a92b98e108e488811830502acc,1,0 +54fe2b6ed39b318c953f60b173ec189c,1,0 +55124a61026c948c2892fbf1d95d587a,1,0 +551b0839ea30085fa4b148c76b0d2441,1,0 +55267ca3d6c280845f614ace743c89af,1,0 +554369bd941e600ea5ce5893e45220bd,1,0 +555aa9c5c85a5219e8e528970779d198,1,0 +556a3aecbb41cfe1a2b288e1452dfb72,1,0 +5572482a61808f85e292c2340ed61313,1,0 +5573354112a271f02c4c5eecb4f97b55,1,0 +5582a0a3e92b116652bdd422bf99baec,1,0 +55880acd928ade4bf3426c1e6f061bc9,1,0 +558a20961b8d654328cf8af1ff16439b,1,0 +558f74b1184ec8e2072e259f887b16b6,1,0 +5590b4069f3a7932eaad11ad4730f2c6,1,0 +559b0cca9a672b4a46b41706152d8a71,1,0 +55a0d39762cc40b835309e24f2ca3751,1,0 +55a2702b00c4f6c67cd3909c0325c185,2,1190 +55b0bcd070b40dff12137576e724a547,1,0 +55c0bf9b3970e57fad2bafb71b635f4e,1,0 +55c49de3d81dc23b934dc2e4955a53b6,1,0 +55d181d826294e319a6eb178326e9d09,1,0 +56003cd6aab9eeec02e04108656ca685,1,0 +56077bca9db3ab7ecc93e3b93a896e88,1,0 +560b4d3081d0ba06d92aa2dd77a8d572,1,0 +5618345b791a8b8f190518a611f8d005,1,0 +561dd5ec08df31f9ec7d77eec02b3918,1,0 +5632de2165a9534eabe44b527e29fb54,2,7056 +56476df8a246930cfa2b846561822e50,1,0 +566a2c05cb08222313cb12d1c16d2003,1,0 +5670e594beffffadb657c796eee2e1b9,1,0 +56bb96dae980a9ea49ed271b6498c272,1,0 +56c1db35b0106c4f9cab9b0e28c49b11,1,0 +56d02238481909eff8f1a990d6c3ebbd,1,0 +56db7d0a9f258ed524f729a353dddd5e,1,0 +56eced55d533753013988341525b4734,1,0 +56f5fa37f6f4a4c71deeb0d86d0d4a99,1,0 +56fd28151dbc716d19a18c7a9e39b062,1,0 +570715a7b8e178a14680eb6525510a20,1,0 +57536792c2734b70a10a8823352d6257,2,196 +5754ab57591cccc3dcf583b73f00116b,1,0 +575790cf99e831f20f46358e8a4849bf,2,10712 +57749824aed1d6416239435d31fdd85d,2,38416 +57818a53bd0ce7abad6d7081b4e98d2e,1,0 +57a54357431e5199c2888bfb3860aa5b,1,0 +57bd710f014b0c0e30f1c41db5f4fa44,1,0 +57c8da0dfd0898a5d1b9effae6d5edb0,1,0 +57d57d3f1303dadbd001d5afe224cc03,2,37056 +57d71748f3abef62f2cc87bdc0554053,1,0 +57d9ae2292eec3d80963d23e2a534954,1,0 +57dac391409259be9e2e10ce09357652,1,0 +57ea1fdca02080122be8fb329c7b839f,1,0 +57ec44d3b8119c008a5aa8c59f56d1e1,1,0 +57fcb8d69343d901da5a3a881e9b23f7,1,0 +58104b51d917ce12b775087fffd55c80,1,0 +581b213c26fde625f564a4e690b5658d,1,0 +582d6c210dde5a9877fb0c929d482486,1,0 +583366e2e8841ca8da687d52733cb622,1,0 +5837162e0461da10814740b1c0cf2344,1,0 +58447adfd6752c1956c32767b4fe9b3f,1,0 +5845cb14b5385aa94eea8eced7ef9948,2,2970 +585dd2c95aea14c8dc0495c5031b238d,2,169 +586950a28bc60abb67185f6e41498ce1,1,0 +5869d281c98d28a71bf7fa67ae0010a0,1,0 +586ce0e61bbf9296f3cced148de26237,2,38220 +5871b08d04860265f661a2322febbe33,1,0 +5879a9f1bae1d7dba96353278431933e,1,0 +5883c8ca8ee8422b51286bfd9d1c2ffb,1,0 +588577d0abb27ca5c981ee657a9ce258,2,23409 +589ff3184e698c9da3847e9d4ba8f908,1,0 +58a1815757f9603f419f9bc9dce28f5c,1,0 +58a2f0aa31b0b42f9276a144aeb0faf0,1,0 +58a96e8e1bcaa3db0e8744a77c10d9cd,1,0 +58c565e36bff5fe56377b90562565449,1,0 +58c6734ce3a4e796afb753cecfac9e44,1,0 +58d13982e2ac56ab8c519df17cdfecc1,3,119822 +58dac9af62bd44a162747e6aff7c0cce,4,37507 +58dc5a705ee52ecdf5e33bb87ee6c1c6,1,0 +58def6a9b1d2d5b0f9d7d42cc1962701,1,0 +58fe32b702c918a6c99e8fcd5874345f,1,0 +5959ad9ef9066aa256ad9319548210eb,1,0 +5964115440a6f378864d6e3b6e8fe9d9,1,0 +598500d907a93537c896d16b02dbb88e,1,0 +5986b6506a6a6b56832f3a20186448a8,1,0 +59a6f6250225c80285d9dceec8f72879,1,0 +59a933f658f5dc4bbb8abe8196354b9f,1,0 +59aed176d1e252f268f25d2a534b17c3,2,10609 +59b26ded905387a83f94c57e0a3cd8d5,1,0 +59b3bb039537afe8dff549b9e9a72561,1,0 +59c3edb5580a7edfc82de1b84787ab41,1,0 +59cdf8af77ac2422f1198f32eadc4481,1,0 +5a2a7a262964c782eaaa580827d5763c,2,596756 +5a3773410e80020998219a843784c84a,1,0 +5a591cfc18aa4391cb34e8dd422388e6,1,0 +5a5a48e1c611c2b41a03cc8f1c89e7c0,1,0 +5a5b15753337923e314ec9e7a28e6c88,2,90 +5a6193233a9a1920337d05c326416668,1,0 +5a8000048622da5307e2269f5a5fa45f,3,22755 +5a857398f6ab90c25f668e92e6d00ef3,1,0 +5a865b5e9674ad76da63584ee18f05de,1,0 +5a8dd71fc456b5cf6cac64f4bd32da30,1,0 +5a8f522931df4152be3810a96dc74d39,3,7787192 +5a948a477ebdf65ea602ddd003e1a6e5,2,12100 +5aabd5f7518c2d8caf77e519eb4cab36,4,2934810 +5ad12093ba63af191fb8e7d39614c0e5,1,0 +5ad1f84cff57f163708d79b7f83fc748,1,0 +5adcb1dca3ea875a6168c7a3ac61dd7b,1,0 +5ae0b4f50024bb27b428226681f1a33d,2,7921 +5ae616658d4778694f7d099be347f524,1,0 +5b1b6d290e884ff55816e6ae89512c42,1,0 +5b21c3b213c996fc3cec064fc9b7d5b4,1,0 +5b3bd141c0e1c5b9f08f87d3a49ee888,1,0 +5b5eec00494a5e3fe7e1c1e0f2d3684c,1,0 +5b66645f0ed4b7103ee866b6ede13ca5,1,0 +5b6c48e881c0d7014ede9098ab82d85e,1,0 +5b7135091a8f054883ea1bd02c9fbca9,1,0 +5b7d6771c4960af114636589bea491b4,1,0 +5b8327e2fcf965a9862733726b83bb2e,1,0 +5b9f66103173b912178b68b3fc91da0f,1,0 +5b9ff89c56904168f7539164dc37da09,1,0 +5bd28509be7d9c9920a32df92f937a08,1,0 +5bdbb01b7d5b67349b6af158bd0625cb,1,0 +5bdf4ad67d7e9b6cc5807bb7ea2b7e04,1,0 +5be1a25147e2696d1d5271904cdefceb,1,0 +5bf680212000d00b729bd5925b35b507,1,0 +5c0566403166924f890ee540d40fb726,1,0 +5c14b4cf3576f3a179ac9bb75c1e8a48,1,0 +5c18cd77c10b540768c2674080f0fc90,1,0 +5c3a71ca49295a8d4a71ee1e125d558b,1,0 +5c4687df487bb7cd34c1564586ee87de,1,0 +5c48a56e25a88841494485f44e688bbc,1,0 +5c603a1fa898a214ff4b74bab9bc28df,1,0 +5c699d9cbca4b0efb4f9de3a66a9ff5a,1,0 +5c6cd13d57f0d8d74c0741036bf68066,1,0 +5c6d902cf9f6606f72152301260e3c8c,1,0 +5c7a6c2ca2b8190415d51336eabcfde1,1,0 +5c82569d94cee81844859d37d285014f,1,0 +5c8f25cce28aefb22133da7805ffc9b8,1,0 +5c9ca87b526c69176f7d1f9eda561530,1,0 +5cb03e32b33f4d531ca9adf3927516ac,1,0 +5cb128192ebdbb6569668ff1e6c1cfc1,2,159600 +5cb8d7aeace1fd5dfb651628ed16a2e4,1,0 +5cc9f483b1dbe297c83e49918cb90a67,1,0 +5cdf36d57dca1decf25b21fc70ccb7b4,2,3136 +5ce2156cbcd2167998a9f5b143b44094,1,0 +5d00aedb31357d336f4d8345f2dfbba4,1,0 +5d25acff5712b8a133c693ea5951b005,2,1300740 +5d32bc595150184de9f7f0b2115c5310,1,0 +5d32fc5743aee3b38c57715bd1a2f99e,1,0 +5d54995022690b8d50acb4c80a3e33f3,1,0 +5d62583b1a47edc2ea95de518ee2a848,1,0 +5d718828594723cc017dcaf6050b45bb,1,0 +5d7845e27258859888979ba7faa8be3d,1,0 +5d7f82c2b818867dfcb03e1457250bf2,2,6320 +5d806c277b0cd5d20deb5a39946b173d,1,0 +5d8417fee31846300ac842d13f79c41f,1,0 +5d9478aa8dfd7ae5599dfe22f3a0581b,1,0 +5d9c0091a094f46305d515154105804e,1,0 +5da3d78eaa85d27a9bcd97104a8c2a8b,2,64 +5dab63fd1a77061d73c2104cdf8e3f1d,1,0 +5dbf4d109f0447b0a483c54c45d4c252,1,0 +5dc1840f7c1ac726c96dafefde9e1c61,1,0 +5dc22f175c8c926938f86888bb20bf05,1,0 +5dda168864d275c2b96cb3ef496c6d06,1,0 +5deed5836a003c196e87d87439414e4a,1,0 +5dff70ad03dc82c063a226613cc4c91d,1,0 +5e00a4a505a20ba47a04eed13672cc8e,1,0 +5e0e3fe2d1eb8375795c6d701a230ff5,1,0 +5e4e82cf8061e383ae4b02bcb32dc48f,1,0 +5e5493d8af6d2ea4d7dca46ffe92798a,1,0 +5e664a82ff1f9ccd9a32440517ae58da,1,0 +5e6a9ff015fe8f5f9421d7ecbed6ee45,2,361 +5e70a7cf4baea6d6ece5fb124dcdbcd4,1,0 +5e7cde0c8600454d1a2672e2d744a577,1,0 +5e935a0874bd58024eee403b7f4b1763,2,30 +5e96581b32b70ca25bbb10a25c724c4f,1,0 +5e9e18221a395537a5dc85897f882636,1,0 +5eaae87bc205e4cad5f49b18b688ca5c,1,0 +5eba90f808e3359250c9c43499b642d4,1,0 +5ed50bf5e6df41d55a7d3f707338ba7e,1,0 +5ee48b11843b5039aee37fb352f7bdd4,1,0 +5ef97c55065b3bd222cb8448112951a8,1,0 +5f1ae48e6093b1ba52803b42e1e3d5ac,1,0 +5f2ac0fac8b39638357ab71ee303fc0e,1,0 +5f2da5962c6692de870e309979ec7016,1,0 +5f30643a7154c4b0bb851202cee351ed,1,0 +5f40426164670bc84c73008a0805f536,1,0 +5f593738946dfcfa61eb973fc775c0e6,1,0 +5f5b63d386af6358341fb5b6e5e55d7c,2,4290 +5f6c044e215a37931daeedfd221151e6,1,0 +5f8d5e28c6587ed21ed7be45413b7e39,1,0 +5f95af48cbd9c1fe55bc06bacef7c4c0,1,0 +5f9c73ab9720df372932d666065ef20b,1,0 +5fa11494a9604099622bca5e6b4816de,1,0 +5fa7107f968cf881baa6b6b9daeadfdb,2,21025 +5fafe6261f7387ce0022447a98eabb37,1,0 +5fb53693798b467fec91d50203306135,1,0 +5fcc42d6ddcbee6e4a82bec7597b2c9a,1,0 +5fcd724a46042a6e73db2570be5be3bf,1,0 +5fdba62b77407469ec1889cd65cd8cf7,1,0 +5fdd766930ae7a943cb8fc667643fe43,1,0 +5fe2f37ffa621c7c22e4a84ad8f7f61b,1,0 +5fed7b330c4e3106f9cb3646f78abf4c,1,0 +5ff034f2f681b83693902bc91087d1f9,1,0 +5ff3d753425933194d2536e49b337c92,1,0 +600a4f66506860d6da919fd24941fb47,1,0 +601c209c0e70061719fce16fe60ac403,2,5852 +601e679f1f886d5383d19ca69995c21c,1,0 +6027c9090b10b71b66fc79b3f6f270c0,1,0 +602c55f8627362f0b0a4cb58821165b4,1,0 +603cdc765910202b3f202fede1e6c886,2,6480 +60429686363b491f03048452f17ad473,1,0 +604819b0f2092b59f78f6cbab7c75a95,1,0 +60507f9a6a0cf4882bdce0dc6614893b,1,0 +6064b83ed3aa16520c987c7023e13c3e,1,0 +60672cff16873d2694fc293b3faf6331,1,0 +609674807ca67a046a336e5c6035702a,1,0 +60a9c4de2d41664e74ca5b69942bbfc2,1,0 +60ada50af4c6312b0a7d292fd6ebaaf8,1,0 +60b3d715cec23d8f140b3517d6b50dcb,1,0 +60d2c9252f543fb59d1b71e40fb6345f,1,0 +60eb3dcfaaaa2a438d03fdf2565b76d2,1,0 +60fa0c493d03c738716357cba4d6a9fc,1,0 +60fec0962dd05a061d8bfcbe149c9b4b,2,990025 +6100d5a625755ed42a150fe71de41a3c,1,0 +6119da26b1879eb13166057ab486f710,1,0 +6128ee141d6227fb13c8100b05e2474b,2,30 +61425eb97ab9aef1d097a29a3af4574e,1,0 +615e3fc18fac50c784936192933427fc,1,0 +616295110edbb6e9837ac63b9d5f2470,1,0 +6165ab98aa7d6665d89cd6407e9f0e20,1,0 +616f6a4bdd1c9e636feb33875d11ed31,2,11130 +6171c5ae2040bc3cb57e1ceb88a45341,1,0 +619a0a9b3da653b869e7ad8776aa6eb0,1,0 +61a96ec1c13f661c4dd7d68b5e373926,1,0 +61d3feb395630aee91e492d5abeb82c1,1,0 +61ee3d96909e3261b48ee03ff46f4a35,1,0 +61f1a6bdbcff8b94d549e49195bbb746,1,0 +620d48bd3fc94a36bcbbad4026e1b86e,1,0 +621271088b13cdf58db84e174280c1be,1,0 +6255a3b524b50a0b9c37389f6b416598,1,0 +6278ce2b8e35f05fe145e6228b12120e,1,0 +62844d5db44b04b23f85ed351d24740b,1,0 +628450f13ccc38d3d136aac88302c38f,3,0 +629fa13773c72da7fedccbfcdd038195,1,0 +62af62484077415dde4b243817e43856,1,0 +62b8022aa81ded570090f2afce852d57,1,0 +62d3b8d724a6a6da4b2692ccea3d1967,1,0 +62d74f458e74355106febc7a9b422aee,1,0 +62dad703eee71ddc8c8206832581d9ab,1,0 +62dcab5291143dc6fc110ed65e070627,2,2500 +62e6b715a5a841db4292ce86055ad993,3,7346294 +62f1be6037444d4f1f37a941da288493,1,0 +62f9a1e4dc829da0729325702c2b031c,2,16 +62fd86f546a52d904692e1a9e919e089,1,0 +62fd8a5e4b91cd6c7cd1d0aebd05c4ca,1,0 +63102af3c3bc3f814be53dffddb29e2d,1,0 +631a544cf68620718fd1c97ea1de8f58,1,0 +633513a62429a4268a5a6f4b2ab41249,1,0 +6339ef18ea5b5c443da5c792554771ab,1,0 +633ba21f6db545a7995dd3d6ef3b9c94,1,0 +633c074eb247e799e458afa7613f2838,2,12544 +6347126fa8a859ed57adfa59bbc7b475,2,100 +63471f815b0e040acf1eace6f782adb8,1,0 +634a70279ae5aa6044113af0da0db751,1,0 +63612b0a7235d56f612cf35638b6363e,1,0 +6362975c6a32ff5ad690d020c34b2598,1,0 +636a032bc0ef4304fe927ce6422ccd9a,1,0 +6377c9f21e9843a9ffc592de1c674a98,3,9338 +638c27f7695650b512855b5a328ef2c5,1,0 +63941c7ab6b417593923d1f9ed6673b7,1,0 +63a19473494f76017c8b0aab3d1753d4,1,0 +63a28ada3b132d34a24caa313e68e1aa,1,0 +63bd4ddf16281a4b704ecc664fd96943,1,0 +63ca00bdca5925639a7c162654eb0ab5,1,0 +63ef169cd1d5d63837cbb93a0b8e60b8,1,0 +63fa5915eed5a0bf51864e9b81b8e204,1,0 +63fc2eb6b726fefa4e636b0837c812f5,1,0 +641e5756d03cc357336bda732e1854a0,1,0 +642eff85a5c4b6b7e34191e736dabf39,1,0 +6435a6c02b8912c8a2edd2cf27d67d0a,1,0 +64435fac41a28a42ec4e3d539ce7526a,1,0 +6443c839ee400613d325d8d73679be70,1,0 +644b21b2a0109052f84320efa7030d8c,1,0 +647400cdc2ee03e9c33041811328ceba,1,0 +64815d03d3964f7f90e7fba137470653,1,0 +64979bbb93624de22a39b4df2684188c,1,0 +649ca27a25c03a26b1f99d84edac0985,2,9572836 +64a3f80b8ed6778133fcf965915a4158,1,0 +64aa5d175b09709523b3e8a39592066e,1,0 +64baff18d662db2a3c9f85ee54ddf9c9,1,0 +64c48170ef17ac5c395da08a4fb466eb,2,5929 +64d5ceb525e625bfbe67360360db77c8,1,0 +64fc2849008ef3db7758bdd31f7031e3,2,39402 +64ff25add40f20e77dac9fdbcce600c7,1,0 +6500b59d6d0a912155eca922055da997,1,0 +6521aa6c9eab1a2f7db8575781d97269,1,0 +6527a2ac5605cad067abd6f258cff33e,2,440232 +652fa97253c6611d9226351b74efcbca,1,0 +653507de2627219bf356756330eb6f50,1,0 +654099c77f08adbf3fc983089a527194,2,56 +65417b1e8ada6f476e5b3d35fe825dd3,1,0 +654410b0fa2b211d7b3a54e7ed148a38,1,0 +654737961d78a7b5b919d5dade25ab91,1,0 +654a3fa9af5bfe63aa279b7d8eb38bf2,1,0 +654c1701ad6c45bff83d9c0a152e37bd,3,1195269 +6565422b8caa92b34143b30eaee6452b,1,0 +65760cb4f91df177104f83ed83386539,1,0 +657bc6310d956ced1e52aa3c347a89e6,1,0 +65923095336ac4cc961e255656124f95,1,0 +65c1b2cb8a848465abc354e14b4fbbb5,2,10302 +65d300d61f4dfe6d59febb95a8f3d481,1,0 +65fd13d308e17de0ecdccc29c531e8b6,1,0 +6611ccae3b3077cdd6c52dcaade52084,1,0 +661828b17a22c03e39987fb9cc48ab4d,1,0 +6634fde11c718f8a373be32a9a78f18f,1,0 +664abcf03e27b4c45d673b4aa805d40a,1,0 +664ae404e14251f02648760479c96f1f,1,0 +665d9a746b3e7b37c5e93f39f2006838,1,0 +6664492ec59cd694984dc5f968ff0e55,2,22500 +66769f8ce5b86ae899de898656081ae2,1,0 +6677368ca670aea4a5e488d4eea36313,1,0 +6678210624cac0c593362c5e085fffdf,1,0 +66890ae1f8fdd06f78e1d4bcfcecf3fc,1,0 +66a11b9b5667705aa6d833602406dfd7,1,0 +66a2c918fb3b72112ac888e31e5e6a83,1,0 +66cc2e44219402213fcae77b937ae418,1,0 +66cfc755b3bf57a31443b880a13b8329,1,0 +66d19a0cf23fd8bdc01c8ce6331b005e,1,0 +66dc2656db4413ae3e09c518ed7bb556,1,0 +66dc2e0b086507a10167fbafabee6ac2,3,12394200 +66e7fc5f91b1a25a68ecbe3db9b7742e,1,0 +66ff7bfe4da0b72b1fe35f5e211915f2,1,0 +673678add1d458f12ec22ab7030a368b,1,0 +673df2c745f7d5f060f8936d23680d7a,1,0 +67467830f03c44ade9508a3a09faa804,1,0 +67627bae783ee474f3d32f332ea57bd4,1,0 +6762809c24f36fee04800baf7be5d532,1,0 +677d32de63cbb7a294a11cc038dc8ac8,2,100 +6791c86c49fc284bb4d5bc4f9d2a177d,1,0 +67a8254db90c82a5b5b36e515f2b61ba,3,3070 +67bbdccdd0284645e4f2e9f2e787f355,2,1089 +67bed5d06db888a167f2d68383df1369,1,0 +67c5a54d2dc4ab7fe5c2e8fe5a19f5ab,1,0 +67f9b23e97c37760a2013e1393aa2899,1,0 +681a38b1c1fd8410fd9cbc5d7251fc9f,1,0 +68329855f1d25a7017bd2cf89386d8b2,2,8491396 +683518ceb90478f1ea11944dc90ee75c,1,0 +684496d17e051e6932a66b6961783e0f,1,0 +68545d6d1fa27f425f08acdad9a5287b,1,0 +685e0c4fc178e646602aa7bd99a69cc4,1,0 +6868afecd784c04d19d7f39d9b887c82,1,0 +6893483f7750d75aebfd33ac45974c4d,2,4422 +68a9053192bea4c5fc7e3a4d23cd93fd,2,3969 +68cc2ae38d52da467cad56df42e73406,1,0 +68ceef85ed1fe7444aea3d0787112199,1,0 +68dbc6fd679efb56735f2b7bd3b91ad0,1,0 +68e5d74355ae86050a75c7c6f4818adb,1,0 +68e8f54ed68f96516cb8c9e6ad1f84db,2,2652 +68f142dece3e129296957faa10e121e0,1,0 +68f26ed115e0706e994d66a12716e356,1,0 +68f606e13d88a05ec93afbaf51790431,1,0 +68f9df17537bfbc7a1e5d0b32a4caad2,1,0 +691344189661f516fdf99b47ced951cb,1,0 +691d8d4f9d8e09390edc1408f6fdd55c,1,0 +6923c28b39fb264a6b04fd38063216a7,1,0 +6942dbb5e441ae10b528da67b78cf3ef,1,0 +696a734aae1d689f3d56fad325b4c199,1,0 +6980219e98954f3d4de1d6f585e55462,1,0 +698870b436965a5b0c88f49ae83c1830,1,0 +6989938a73c22164dda4ed7715c5615f,1,0 +69962e049391406579082591bf25197f,1,0 +6998f48c83cdcda3d81b5237486b42ad,1,0 +699f10e3428b9232c772f8234f609884,1,0 +69a1ce27f827df92ee919b5968037eca,1,0 +69ac85ba69997df008bc407e40f9fcb7,1,0 +69b2b6445f2f3261eca57478617f5c03,2,30625 +69b3ac34dff20b60f9050c8f3d598e1c,1,0 +69cde16b34563623db0e0dbc105730de,2,256 +69d29f83578e1c7a2745199492ec905f,1,0 +69d5668c10d13a3b4098d0cca5a3a5f7,1,0 +69d5b0295c6be5332360ff3fb3da9dbe,1,0 +69d74d6c8b7b7f08ca83664a80adfc0f,1,0 +69d887b21dd9281f958442eb9f72b90d,2,12996 +69de1b0cbe05f981b4fbd674c5864807,1,0 +69e0c0e754a5e5ecd02f579c4d5ad5f7,2,14400 +69e6a6d433ddf5a43ede599bd1fb9148,1,0 +6a03405971e60e62aea6168cec3c8c9d,1,0 +6a0708e893a51b2827394a80e79ee82b,1,0 +6a08c5e46459a1bfc043581d84478179,1,0 +6a28d725f7961782d7afd9dd68f1ecf2,1,0 +6a3c8818a4abffdecf09377bf5ec425e,1,0 +6a4a115e5753bf914ef8e0a6b9bc5560,1,0 +6a7a4d9a4d44e1c166090f2cb61c8866,2,28900 +6a8f51112e80d35d77dd56c7ce3bd541,1,0 +6a9952edd12f91bd585d6dc426d174b5,1,0 +6aa82945c4a32e917b335e4a8e1b6ece,1,0 +6ab92e404e3015ca4242bacfeb3100d6,2,64 +6ac57f9a279dc478704cfa2edf765e4a,1,0 +6ad9503703bd7d2b6b6e5a5ac0b943e9,1,0 +6adb775a0eb64fa79f1e0becff32a247,1,0 +6ae97504f850b371d7652c15266fffc0,1,0 +6aecad8c9f22c438aabfd2ef36f151b3,1,0 +6aee1f9ce04bc1f914416f68aa86690c,1,0 +6b3e9b6b21207e960246c001e3635848,1,0 +6b4c9eabfa73e777ec01a673762175c5,1,0 +6b5bc78aaebf52df41143b88aa533a13,2,8190 +6b79ac6fd68b1c89dd41a55e5de5d28d,1,0 +6b805dd35df06392d573013b2b4be30b,2,37636 +6b869e3b798dbdee6c51ae262a100c34,5,322355 +6b89ab9cbb9fadd759d5ab89337b7703,1,0 +6ba0d7d4c37caa4c5557fb99c9441147,1,0 +6bb5f71cb4d8b7c65dd68f1e0a9f301e,1,0 +6bb80f26bbd7ff93f8147e1d7a454ab6,1,0 +6bc5df673fa019fdcdc9c778a5e173fa,1,0 +6be4758871155b3666b56d3828a5d643,1,0 +6be91069a484181c1fb3bf7502118a82,1,0 +6bf8d48029e0f27cbe0ce2af40a75814,1,0 +6c16155607dc1cb89a061a2c11f7a314,2,0 +6c20f0d606ab1bfa89dfccb57bf41343,1,0 +6c282f8b39f86d534f73e8056bd24162,1,0 +6c3bb7232fada649345debea8e5ebfa9,1,0 +6c45a7bbc90561802ee15b79e5f67610,1,0 +6c59109a8458bc24daa2738bdfd9afad,1,0 +6c68070394fb3f1e3b5f977e7f5be7cd,1,0 +6c7566c2c9874c08fc461536b6a9bd40,1,0 +6ca6dd7e526d4ada5b75a80a212cf9a2,1,0 +6cbaa7dbfee36b9d205e3c6c8710a4d1,1,0 +6cbfe7e737808ac9eb94976e934f25d0,1,0 +6ccd3fb1af4286209eea26a0d8b738c4,2,6 +6cea2e104ec85f0dd826620e7e9644e9,1,0 +6cee432019274198dc1972c40a38214f,1,0 +6cf886d9994e45f61320a25bf8bc9c60,2,64 +6d0b828a5f780d9df4837b0a9633c02e,1,0 +6d0c88f8167434fcab5a7b9f330f0885,2,0 +6d111f1a879a3c039d73657ccfe74005,1,0 +6d1ebe448310ccf0f310b0236a9992d5,1,0 +6d30ec00cea682d3aadfab28a2665e39,1,0 +6d31a51a06785af8acc76099922e6c77,1,0 +6d3a1f35383f5a21e69f0477bfe8ba3b,2,11923209 +6d3ac65f88396d25753aafd4abbf6b0c,1,0 +6d4d5d9c75d2257f0e85ea3be702e300,1,0 +6d6c6fe48f0767f5278559bd92502fb9,1,0 +6d7ff5ac8a89bfc2485bd74e967380e7,1,0 +6d818eafc9dbcb4e0d58c3ce608dd6c5,1,0 +6d9505c72ae137fc201007c1ce759b12,1,0 +6db0d878f1144644c1f789252a5f9aba,2,450912 +6dccd3dd9309aa1c87e06354ffd800e9,1,0 +6de3b6fc72c74d553423be7799a381dd,1,0 +6dee428d5a5ff293d6bbfd4620c56331,1,0 +6e13a0f0dcb84ae1c1acdd867f0c82aa,1,0 +6e13f16da2c7487e0852ee29b79ce9d4,1,0 +6e158abfc815a183a28f4e269ed9d1bf,1,0 +6e17e3298b676f63b49219270731348a,1,0 +6e2edc974a792696160d2d4a00454581,1,0 +6e2ef82d6886e62c6af1ad0b3fcc2b4b,1,0 +6e38ee396debf441cfa8e577c470f448,1,0 +6e4effa3356e58ea32c0defbfd6db657,2,48180 +6e528335f756cc4b81d3749c70a484fd,2,961 +6e597760beaea420e189f6ccdfac37e9,1,0 +6e661a94c054c91838a109cae6dbbcc0,1,0 +6e7a0c2423947f624419a1a2ffe13012,1,0 +6e865ef92fb6f796e3af7ee6180cb7d0,1,0 +6e9f62bf7c285276a2ce450d7dbfc694,1,0 +6ea2a99e7f857a79c77ac3b15e9aa067,2,17030 +6ea71e3f25ba969fbc67826ac7eef939,3,13271612 +6eac5b03a71c7ac2b7dd89bd6c191b6d,1,0 +6ee9ba625326a5ad9cd42db1212d9755,2,2450 +6ef1b150922ae7b3dd5ed4a142710449,1,0 +6efa7407e4bc2a6b37798502b52c0ac4,1,0 +6efd75ded065fb6d7644505dac5c932e,1,0 +6f03d8182d8400026d36581480021222,1,0 +6f0de3ee3e2abab711c7c87dd4784af6,1,0 +6f0e33666b1d3d85a53a508c91fb41ae,1,0 +6f195b9ca1ebc80fa390e03924fddd64,1,0 +6f253a0daf7c4234f47950e5844f5812,1,0 +6f2d6eb158578f8c32c5594687ed559e,2,342 +6f30821385211f84566084f313495b50,1,0 +6f548230d488496003dde6d20e622460,1,0 +6f71ec47b13803e267a7204ced0ee8a0,1,0 +6f75ea62e4efa3b3948873d80955db52,2,1122 +6f7a31bbe43dba661d5986793ff3e468,1,0 +6fac5a50d88776da27fdd158f92c9768,1,0 +6fb47af860211c51e933ee22c9ddec24,1,0 +6fc14a592fc9ece944ca3c3eb00b43d7,1,0 +6fd265d3adfe07133acbc756c4b84912,1,0 +6fde373e4c8f330b3a3758c3dae58fdd,1,0 +6fdf019959a7220121619f6cec5f85a6,1,0 +6fe72ce2d164da00f997f8f4c290744d,1,0 +7004da5f2c9a512466d3872ff5f6f404,1,0 +700c3e4c038dafe54302f4ae00dad588,1,0 +700ffffbaa93eb687b196eb8de9146d1,1,0 +70187f6bedd3672922ec2b309da23600,1,0 +701a884fe35e14e695e5dd0241ffff7d,2,16770 +701e38db04ee2c42bc3d48961381be2e,1,0 +706ab9c8d2e1007e39108db1344b3a4e,1,0 +707fabf1da8efada0679cc78499e45e1,2,1521 +708a71da873b8b5d15c42a41a3d8fef2,1,0 +708ff656ca8dcf2f52eff31181f184c8,1,0 +7092f074326287ee298093f3fc26abd1,1,0 +70a1f31994b6fc5e7bb2e615ad94637d,1,0 +70b25dafe939468a4c36ff646ebe2c84,2,14280 +70bc06e57a57024cce9802a53aace6a7,1,0 +70be170c3080d4c9cf85a55b559853c3,1,0 +70d445010c6b1f78b8c31f929c2596c4,1,0 +70fae7fa92e3bbfd94cdeb0d3a177df6,1,0 +70fb1c0d120e4b7c13310a597fd8a700,1,0 +7103ed8ff5e2b0e87ea82fabc8e88b7d,2,342 +7109d6d6de81f9a7910adeceaf51b735,1,0 +710e2006ea57662b62a586d13adb4be1,1,0 +7132d57407941ae0235ee8bdef6606fe,1,0 +716640e45c180fe54de268574e7faa20,4,1683003 +7183b297d51ea66ee7ee68e79c081fd2,1,0 +71853e492e2829f4411adcf417185946,3,11234570 +718ad5a7fb0e6f32749db7e0fdfa50d8,3,12970 +719347c1494fcb723b19ffc1759b1fab,1,0 +719a34f502e11f2f53cfd800b4443fd8,1,0 +71a291180db5ba5379a31bfb0cf3af5b,1,0 +71a461f5405a12c1e13e2660ada283cc,1,0 +71ab33098974880dee90b426c064f92c,1,0 +71b1751f38d827c9bb3b1573783b409f,1,0 +71c13bfeabfecc85379abc6e0b9918ae,2,110 +71c4a121a62028692be515d03a9cb7a8,1,0 +71d5b0ab52e5da5e3c05d7df1b8827f8,2,24180 +71dfc5aae6816283bdea3324f38345a4,1,0 +71e779a8ffccb89212817697f9021743,2,140625 +71e80f9e809f5a4e9681917dd5d9a776,1,0 +71eee442b9d32bf146e016326b4b966f,1,0 +71f4fb1aa3946b77a6227985983f2d5b,1,0 +72064262811d4e160e8719b946bd06d1,1,0 +72274227bfc4b4c4f65ec2d112b663a8,1,0 +7228f366f398d3cb2e98fd0c04a58d67,1,0 +723156a3a715ee6e8a9f6775a9b89e73,1,0 +723899e3acfcfdfec73d6a4a5bdbcf8b,1,0 +7254b8830775a1f03bee700df3224f5d,3,17976 +7262629907750e2ba29624e359bd68c2,1,0 +7265fdf21e9bc22a29f1e0d3dbe2c425,2,20880 +72734c2bec9dc45e2a147b0c1dd580d8,1,0 +72886114be7fcce70a5411927fa8282f,1,0 +729b1dc6237b31afb39626eafbb95b92,1,0 +729cfe6cd732667f4525042fbcf351b8,1,0 +72a41a2a209b6bdd8c199fe6fd5ea3ae,1,0 +72af1b191b9cc6b1d4d8586e1643186e,1,0 +72afef18dfa6bb5be81261394c36c879,1,0 +72b3341cd4380a06e726e54ce215df79,1,0 +72bc2f8e169c7c43a009c3432a29ae2d,1,0 +72d81ea6fe764eac2702fe48bb3762bd,1,0 +72de2bafd7474fee816ddcbcd3d9faf6,1,0 +72ecaa6dbb934be4f2524df6a543703e,1,0 +7305ac70009d1c6253ebf16080f0345b,1,0 +73629c8e0e3c78d24121d25bfe5254f2,1,0 +7366285d837921c76989d9f797c1f0c7,2,3364 +736ba758ea3bddea61655031fcac9620,1,0 +736f6ef9b25b16508d1c8c85417b15da,4,102412 +739584d7aee4c547320e35e357da4457,1,0 +73aa7fec8faa51621fc3ac992c549816,1,0 +73bb40c2188f99cde2e89bfe4af1c7f8,1,0 +73c213ea3057cc8090ad906c80ae7028,1,0 +73d4f329dfa2c62b41fb434ce4301cf5,2,9312 +73d989d7186a1d3f71c7369ce5207762,2,1482 +740a3a71e6431c09a56237901d99d823,1,0 +742d8bf425f69c84e27c349d5623dcd8,1,0 +74422f12c555f9ef5575da01fef59dbc,1,0 +744cfd4f381e19399057f936ade52feb,1,0 +744e81f63b7468dc02be89c96808cdce,2,930 +745caf4c96f86199b1a6a0d4415f1053,1,0 +74a504a95fa2f238cb7e1c531b04e766,1,0 +74b9527558abb05a8e1cb79e14de75bd,1,0 +74c29ef298b020c4db28b55fdf45719d,1,0 +74da75c005b6e373c12138c79a31b28f,1,0 +74f3f21bbe153d410846b6879c7e55ee,1,0 +74fa1a62adb4c2ddebd6b09751fdb5ed,1,0 +74fcf146f2a9bd351008675ba886108f,2,16641 +75035e1769bc99c1294ce13b2f431969,1,0 +750d917e0c338e391564a015dcb9f961,3,9902018 +75320c4b65cb67641080a4f508e71c56,1,0 +75479b97e6d30fca4062c9fb3547d9ff,1,0 +754d1b87ccb6d58274ca8dae1512f073,1,0 +754f31a7392990b440fdb9c843a0e81f,1,0 +755f69311f5fe827029d892ed86e57a6,1,0 +7579bfe4843e24bf16ef43cf65b0f3f7,2,4489 +757b3c586d36ffdb5a68b24d387ecc36,1,0 +757f0229ef93b28412f2b856e7cbcc28,1,0 +75a6ab166980c3f09e37cfb65aed567b,1,0 +75bb294948933a9f8664c2cc75ce07fc,1,0 +75bedebe2a1fbf3e3a8c122092b05747,1,0 +75c3bfc966cd2a2f90451be1ce5d4990,2,267289 +75c7b1f2d4b806ee3168d3699cb5f292,1,0 +75df783460f4b34883ed7b1b5f9e947e,1,0 +75edde7f88bc3d520a2d4676f0bf2674,1,0 +75f6e3006d19dbe2bb3d8fb87028106f,1,0 +7613bad2e09c0af0811b458f778be113,1,0 +7619f4f76ab648607a28609e320b70a9,3,167950 +7634e1cb4988d1f976a8a981eaca1cfd,1,0 +7645cf38d6b65332831aef9538e3dbe5,1,0 +765ab873599ffbb48e89ab27e9f4bddb,1,0 +765d108f5b628d7d0a6f32e68f41be26,1,0 +768ead7933ec9f687fdc6bc53c891394,1,0 +76b4e3c08ff0b1a7f9fe3ac19ab9831a,1,0 +76beae241fc29b54d5245c068edb2360,1,0 +76c000bad2d77a5ef2b8eff1437b3c92,1,0 +76cbfc2b524d700c74a855df53398d57,1,0 +76d00662fc5d2aa0bc498a954abd5d72,1,0 +76d2d7b139c4a44a1a84b85f086df522,1,0 +76d3900a6e0ef74bab8946e1d021d139,1,0 +76f55e0353d041e74f86f43ba94b1817,1,0 +7704736861907127aebb56623d13eac1,1,0 +770deb8f939b2aca4bfe16e0dd7c1abf,2,49952 +77200e8999ab47f6c8957478747b1dda,1,0 +772326abe1a27d8ef8f922f2aef61c6d,1,0 +7730dcc616303845043cb327f1656585,1,0 +7748fbc7adeae3233dbb3d7a5a038b56,1,0 +7749a1ff837fd9238463d52ccb108822,1,0 +776c135bf0198c649c2a423629662c0e,1,0 +776f3bb05add2f71399ffdb41fe8ce90,1,0 +77812224c4cb3ba32d08652c404926a5,1,0 +7788fe5fbcbbcde0ae8be428392806f5,2,385641 +778c87600ec1c3eb39a925c2eae779b7,1,0 +778f0d9dac89702109c9c19440a213d1,1,0 +778f60b6584607186f9d3b87f428ff37,1,0 +77aff78a9445983a72c2d7a71b74cbf2,1,0 +77b8415553679360ff34183212aadd2a,2,15840400 +77bdccb8e8e3e827a19cb642a27515d1,2,16770 +77cdf579e5da3e58803abf30ee7b9888,1,0 +77cfca3e929cfbe9c3c3de336d1bf591,2,12210 +77eba33d0f79fb8bd442f3a1f2eed323,1,0 +77ee435e81a6ed974d2d23d5ad92d758,1,0 +77f36d03b8b0972966f784ede18df036,1,0 +7803029edad1118c42361b90838021ff,1,0 +7808268fc06dc358047e06d04131dae6,2,34225 +780e3fcb605b33a5293dc71d295e4f38,1,0 +7818ebbfce480f11d9c91b9fdfeae9d7,1,0 +78202b56af66040afa4b19d23164168b,1,0 +782eb4a2f73284782ceb6de98b886998,1,0 +7851ac33b5194f5e0e660db012a86154,1,0 +785e2ee53447c4b1d120a187ce8e00cf,1,0 +785eb4be19acc126e3613e6b3c5b4024,1,0 +7883bce123aff82e1ab3bc5987aa1207,1,0 +788c534189735fd7917ef749fdabfa59,1,0 +789d13747320ee5cbe1ee6c1ad494377,1,0 +78d452e410037bc81da9eb8f8da72857,1,0 +78d69e9adde1d6705b84f288337cb856,2,90 +78d9915b3b424cc490aa43c6155d1b02,2,552 +78df5fc03aa0cf22de8ad46162db7188,1,0 +78e0c3dc0c569447242193b4558cdac4,1,0 +78fb87db822d078b43ee4f7f5472dfe3,1,0 +78ff8f69e69093e8676bd9e190a7891b,1,0 +79135301eb4871d040738a77062f6329,1,0 +794b4986f81959d2c4e7e68418acd51a,2,930 +79557d01bd51a7f91abe7c510af2d1e3,2,0 +796527c102298fa94ce8b2040c38e6ca,1,0 +797f527c63ed1e6a0927e09757a5c788,1,0 +798c34e317c1b2a37e23c077d1c105da,1,0 +799a44210bfe931f678aa6ee01571b20,1,0 +79a2d91edd65593257893a716e13fd88,1,0 +79b2227989d8f6fd03098b55beff0d4a,1,0 +79baf7f88bb2c268d8eb9ab46c676ed0,1,0 +79c615b5fbb4b653b8dfb8eb5cb6fcd2,1,0 +79dde30590e13e396d564c8cdc41a140,1,0 +79de261a25ef6f69c505d6a971eb7151,1,0 +79e0d4f42d3f40adb1d9ec29974b0b75,1,0 +79ea3013ff1d8f4081e29fe2e163fab5,1,0 +79ef6129bc55f358acef3738cd671411,1,0 +7a10b73b43ec7529e506edcb357e8277,1,0 +7a15a5a3f3d0d3323af3af4cfc5d0e82,1,0 +7a1a5e5ead2d613f9089784f909544ec,1,0 +7a1a8c5d508a75e8c302045efae08348,1,0 +7a1b249e50ed701519038ca559e8d3eb,1,0 +7a2b6d2250d470ba37a85048fee2bc00,2,13225 +7a5221497074f3d0b28cb62b9fd0bf4c,3,10751772 +7a56d533b013cfb4777e4c4accde6a00,1,0 +7a6388ec56812a61d8d1b965094ce555,1,0 +7a71c95fb8c85a8608c49227e50c5562,1,0 +7a8e1dc7f5cefb0ffcb78af9853c83b8,1,0 +7aa18e7359b36b9c0cfb7f7ed7aca166,1,0 +7ab60a01fcdc5845824846d06fbffceb,1,0 +7ab99d1a3e11c343481aa1a30987b83b,1,0 +7ade6acf4f777dd5ae459ffcab0a0190,1,0 +7ae5fb777c00dbb26af75a35cc2b3a86,1,0 +7af7ad3bcc96e6abca82bb95a68a7954,1,0 +7b0086590c2003b3ea83cd49f2d2b986,1,0 +7b00f9fa6761fd52428fe170a9c2ca74,1,0 +7b0f7536f949e30b64b8496f49445c2a,2,1 +7b11b7e3b6131453f2dd03e266502153,2,100 +7b132f32d32f58300bd50bd78ad6a738,2,3136 +7b14c69b56c1ee1b522987d197cde7a9,1,0 +7b40cb69019ef2d472808e332deb5107,1,0 +7b520b525904288f7e088061cd36a47b,1,0 +7b5300271a576a6fadd822cb4523d852,1,0 +7b56888c4462d7c9929c2256bd351140,1,0 +7b8827aa79b618636ab39189caafcb43,1,0 +7b888ad44e9d59f87f0b8f7d84c197ae,3,45866 +7b901f15a9bcf559b6939e6c55bcde3f,1,0 +7b9b5376d5f27b06430edd988ce6aada,1,0 +7b9b599fedb828a9579eb195c5a2b639,1,0 +7baf011be1dc7136d7c5a4857483c407,1,0 +7bd5afdac3ba3cd48d3f10f7f93714db,1,0 +7bd6ce77e2bea180e1bd7c328e41832e,1,0 +7bdbf1083ff585896438b256d1e497c4,2,67600 +7c113098c1b6cc8c138a1bd255cd2127,1,0 +7c1df3e55e4573454dd1ced46f8a791c,1,0 +7c32ea38aaf5480a482e54fdc48639c6,3,22755 +7c3579902487ac0d122ca33f9b7aff86,2,12544 +7c4bff574b71e8747b9f78dd84125229,1,0 +7c4c08622cb1d3d70ff75b0f8ce10b3d,2,41006 +7c5670f0e4038d6d3a3f68255618fef9,2,156 +7c6ae9dd9d80bb471d918fd8c6da5764,1,0 +7c89f541cd5e67309e80372674526be3,1,0 +7c8a433698ca65891589ce16d9c42d35,1,0 +7caf5b4686622ea0e4ba47bd95a6e180,1,0 +7caf70b2c3f50e4ccf843bef7e3f9936,1,0 +7cb396cb5e7cb729eb85132dd74f848d,1,0 +7cba071d868708fc7c2744d5fad916ba,1,0 +7cbe6c6030d821dbfdfaf2b7210ae409,3,2135562 +7cc1e8bb3557ba84c2287a68a52c03f9,1,0 +7cd501746a948787e052a31e36072399,2,0 +7ce08a322b4a8619e63d2c016ff25d28,1,0 +7ce9a5b9df0911393246313c58d2b128,1,0 +7cfed671f1d8dd92fc1370e0f95b2598,1,0 +7d0167129522ab33a426fcdcd0e6db9d,1,0 +7d0c6d7aed53ee5cfbafef7aa4fc5966,2,900 +7d31d1249dc7330d6cbde0514e887c10,1,0 +7d3296f4471de2cce5b0c73cc838d078,1,0 +7d4a847c9592f5a36f449d1bceff9fec,1,0 +7d4cadef53972470143ac162dc1b2a8e,5,527 +7d4d02c6035906b642147427993e8af9,1,0 +7d52c18dfef8fdee50a66e8b3acfbeee,2,2209 +7d586490c83de88c6a8fd1718adca37f,1,0 +7d682e2be2573d5b0ca5367d4fe51fcb,1,0 +7d69854657d06c82384f9d3483c388ab,2,787656 +7d7c687e31b525af78532c2dd1e4def9,3,88088 +7d86822d8763b30708038b0bc6c69a37,1,0 +7d8f1a7c2d3d6069acd3463df5779df5,1,0 +7da74ad406e5daa73057862898c851d4,2,76729 +7db52b6755ae33463a61da344e395573,2,1262252 +7dcea05343e01e5f51ec55a05299c6e2,1,0 +7dcede1438087320682a36c038d55d2e,2,324 +7dd5e9d7330bb6c5e69788beb5a41675,1,0 +7dd94d83bc513c10f6eaa395e2dbfc2a,1,0 +7de3cb7d789c1b2f92e91d24a90c8f6c,1,0 +7de50f8345745668a0379845272dfdcd,1,0 +7e09b1016c49007498f6185d297ad6b1,2,16900 +7e13a22f577ddb25816e8f5c3a439dbc,1,0 +7e2b43ef37e59e46595fe8f1b06e3596,1,0 +7e5ac1024b878f244dc7a68557aa9dea,2,400 +7e6d2c07a9b1a29f667127c197b7df9c,2,380 +7e8f61eae3132362f9d2c9c83da51e30,4,11342 +7e91ba78987d1b92cf8e1a60fa325cc4,1,0 +7e9f5e81029e5c0ffc489fe56e41e621,1,0 +7ecfb57643ebe679e4595ff7d98dba63,1,0 +7ed7cc2da2a5c86ec492ca0eab8c7aff,1,0 +7ee0c17e9a0ce8879fd714ab285bb497,1,0 +7ee4ce4084e63672ae55811fa6bb99c9,1,0 +7eef0b97113f49f8ad8d2698af818107,1,0 +7ef1e446000752f4e5a188f943fe001d,1,0 +7efa85a0b6642eca801cc42480462d45,1,0 +7f00c1011acf8a3955307e8c3aa536c2,2,19321 +7f3e22d6d81f74ebd5edbdf966adb90a,1,0 +7f3ffe4327e95d8ab2f8ff9c7458f62e,1,0 +7f470c5b18784b542e4afb9bf1b86497,1,0 +7f5b34f241905de10a0e8fb50a90fce3,2,10404 +7f622525b7bf652342aed4d1370a2221,1,0 +7f895754a303dc55d49f9a6b5e41ac3a,1,0 +7f8a85a74371ebbfd4e30298e41a6e95,1,0 +7f916401c66fe5f6191a59ad31fb97e0,1,0 +7fc44aa86feff6d736fe70c5a5b71868,1,0 +7fc54d0bfb8aca6c52a7b5fd26da90d2,1,0 +7fc5a1e0d8070351648baf8efa6b79b3,1,0 +7fc82aaa55c4948ac5c0acfa1d6b809d,2,90000 +7fc8f28accd2e65bcb9d43d80cb072b9,1,0 +7fec144d4b632c9ecc7a2cf449f69a7e,2,212521 +7ffe8c87309f3d1a46a686c87abfd72c,2,27060 +8002a5be6150d0fd437a33e30b80a3fa,1,0 +800fa7bd337532e69a204d5985e0ea71,1,0 +80205b4fd6f1084aec7263b0a50f72b9,1,0 +802827027a10ae34f408c481f229ed96,1,0 +8037f0e4e50757fe3afc7a959f0661a2,1,0 +805cc5f46a3b17da3dd8489154230f53,1,0 +80607535dcb76fdcc8f6a8d07df8fb7a,1,0 +806ab235301bf0c71ad8cabf1c04b15b,1,0 +8071089a0ce8bda7680f5fb4a829b7ac,1,0 +807fae578faa32e789a59647909f550a,1,0 +808255961bd2cd69ada085757150b913,1,0 +808b82b9297c4ab6bbd366c4e189962c,1,0 +80ad76b20162a20c96fd28c1a0fd1554,1,0 +80b35862e48198d457d850237619a1be,1,0 +80bfcbb8cabb6d518bd218a09f72d280,1,0 +80d45c7ecee2bf6045d135f0b149a218,1,0 +80f0a1007c7e471ed1bfff1373ba6b53,2,756 +80fa5496449616eb4d43f9363be5437c,1,0 +81252c710b69be6444fbfdfe3d2ad8de,2,256 +812a834e70820961985e7ff767bde250,1,0 +812defb37f18bd4c6d946e03ea19fe04,1,0 +8133f2519c60fcf53bbbdd000ceca195,1,0 +8161dca402af23dddbefd97e7fe814f2,1,0 +818a07eff45ae712917372f093178b13,2,27225 +81d32640b634456f6a40c18cf5505069,1,0 +82163ca8ab080fc08fa0ca41be4d8535,1,0 +823bd2ca4748b0ec68f78d5d846c35b3,1,0 +82839c99b92697daa6d5e69afb7a6ed8,1,0 +828f6669083d640cfac8e570a2e2aec0,1,0 +829581add1553d0b8d8060f3bca72fd0,1,0 +82ab59325eb79b4c27106fadcd253704,1,0 +82bd0a90b1933dc84a49642d7d226689,3,244906 +82c72d88193144045d1d50ac55aabf98,1,0 +82cd372a9a8b779b50f0293c66effbb0,1,0 +82d302157dc4df18139b53fd3a8faccf,1,0 +82db7db90c4ecf4f4a1936db670597f6,1,0 +82f8354d24cf18c42fd25129738acaea,2,40200 +830ab266f59695fa9fe578860b7f427b,1,0 +832f090060507142d1fc30c85fdddd04,2,400 +83305a7557faa49be5d1f353a3a2fc27,1,0 +833450e7371df795e5266bc25e695c14,1,0 +833def02e7ac708c751304a983ebc287,1,0 +8341318de86ee669aa9bce9daf27ab1d,1,0 +8349209a1c3fe5c73045906fe33aee28,1,0 +83607b6ec158dff3c5fadf0653847abc,1,0 +83678868501e163ce5cd8b4ce83d4412,1,0 +83689b62c5614106d490b046f64b87ea,1,0 +8381df19410259f4fcac201be167256d,1,0 +839cb6302098c4eab90d64d0ba5ee8eb,1,0 +83aa96c29a4b7e1376c53c8f0ac24bab,1,0 +83b54f7feb9a2026db71e583cb7fd80b,1,0 +83cf3b361f4da93e4f4bea2d55cbdded,1,0 +83d2dc4962a43af289e1c57c0543b2fc,1,0 +83dda964856b2c0437a47678bf648646,3,2654533 +83ddf73eed4f61375375eb72e33380d2,1,0 +83e511c5acd8e7699b099afb9348de65,1,0 +8406a06a0c996be43412b6d5010d375d,1,0 +841738a64046050d5fd68e3cb6de6316,1,0 +841c867115d4a3e8786e732c15cfc5b9,1,0 +842aa3a39391bbb9d60b0bfe18de0b7a,1,0 +8439c7faf10b79588f99d00e7e2380ac,1,0 +8440255c426adfa79bee24eca38739ef,2,42 +845a3071b689228b1f5ef28c007acb36,1,0 +8463e4abb813f12d343cae1fddf196b4,1,0 +846f30d2c5dd0abbcea27fc15364f82a,1,0 +84870cd7d20ba704693bf22d64e2a643,1,0 +84880f0404744341d7ee2ec1e353e2ac,1,0 +849089bcb8ada83b4276caa44ac7fe55,1,0 +84b189dbb459ba65506e242d53b94f4c,1,0 +84bcddefc95c77dd836cb6501422f6b8,1,0 +84e38e8af8eecfbfc97f26ba99deb56d,1,0 +84f290d20e4bcde43731309e54143345,1,0 +851536466f2669021e6b349ba97a905a,1,0 +854a5d749367bed3444d487c244fbf68,1,0 +855e617e36e6e0ea21f6ea1a05850c6a,1,0 +857fb0142edbb31537b010288f4a5639,1,0 +858ad104cbde44d201f039f8009907c4,1,0 +85a0e95786fd2b5996b7301a7340f7e3,1,0 +85a40a9d457913d6611705c87d52ca7e,1,0 +85c003d038efadf8a9969aa90f7644d4,1,0 +85d1abab53c6b344a7770ae87f682fb6,2,3481 +85d58662286cf3687b5a1b104be69edc,1,0 +85e17db5bfdb6a41d4bbfe3638f5f258,2,19740 +85eb39e2f21dfe54b3b42e1a1a71c8a6,1,0 +85ef6403a14fd3b6cdf037ef7fbc1d40,1,0 +85fe45fa0fb782ed8dc6136abfe88c26,3,35630 +860d0faca8663646796c08d76d5359b3,1,0 +860e4544726a0f0b511f2f395c6d7cce,1,0 +8615077030778ed8ad86b117d8a7d69e,1,0 +864140e45f3c32ca7de200ca16b64982,1,0 +86499e2c41e23bf108d88d5b88768d7f,1,0 +86575d6831f8fcf905a7a1211ef2c2fa,1,0 +865c43072c811009f4da22ee0525dd8a,1,0 +86662df0ffaffef90bc3a5148f5e2de8,1,0 +8672f30b07050392198c25cf8ab568fd,1,0 +867cd61bae65718bcc20e210c6b2234e,2,324 +867f7b009007b84c4f8882a07f9a4d55,2,20449 +868c30a0d203e41ffa05cb3b1810bb7c,3,690770 +869253e021bfbdfc79ffb385cf2678ec,1,0 +869743cd04b2350a33a60805ea762f66,1,0 +86a0a172a13ebe9b482905232a938bbb,1,0 +86a4356ebab825698e2351a3da82531a,1,0 +86d3e0b0a09ac0ff9a7b86304eddd6ea,1,0 +870246ef780cb6f8d9c4205be83551d4,1,0 +87074961a3c7652160242eb2902989ad,1,0 +87636068173f2c50cb62004918ef673a,2,3422 +8774705d643a77800df2ef7fdfcf7b63,1,0 +8799f0bfa9757aa20f9963f7d145a9f7,2,29756 +87bbdd5329c23d245b186a037d6618cb,1,0 +87c523d94d65e648176dbb3ed1977447,1,0 +87ce0ba540449d5f322f25b501361f60,1,0 +880762c9a285d24653f79746dfac0587,1,0 +8813cb252ffc59fc39da68ab929d75bb,1,0 +883461e472b9049cf54d453cbfd46072,1,0 +88351b66d2b33c6c7944eb5d7ec55ca0,1,0 +883a49498ac8ef8de20fd046fae083fd,1,0 +883cc24bf9bde694e11665d701d1065b,1,0 +884dec69c4c59d08adec30839a170aca,1,0 +884e18ded2dfcfee34e8ae8e899932b9,2,4 +885718d03ad82b285015965ed745f435,1,0 +885a4a2df4fc84cc8eee108990baf346,1,0 +886cd0dcdf7a8bd1d7e8aab66adce2b4,1,0 +887df4b00454daadf5e57e30494d64d5,1,0 +8885d0571a1524928d8800da082adb48,1,0 +88a1a6dc41aad2752f37c80ec7c6a4ce,1,0 +88a4fec3e48a9c5729a3bca0822f73c3,2,19600 +88b0f7195335d59906386ca7207589d6,2,15376 +88c18c7afbba0798bb212454dd2c856d,3,121624 +88e2face7d36366b021f73525b69b748,1,0 +88e812b0490eb9dfe947b48587088c64,1,0 +88ebf97ad8c820bb315b80a338194eaa,1,0 +88ef1b2c224bd04f627ba1a4dda4b084,1,0 +89060f016bf36d86dcb67b02a43486e0,1,0 +891153f586016ceda293e5259432ab58,1,0 +891e20c5ba047f87f89e2c2212a36400,5,0 +892abfb2001529c714df228e55d04651,1,0 +896404ca162493a1bbca2dd047f890f0,1,0 +897e00024500888cf6b2a44cd989e547,1,0 +89b68f8015a48cd7a6d13550a42e0665,1,0 +89ba7fd262af06cb0c37be4a7fbe3b18,2,4 +89d0cb3ddbe6537f75b10977d378ebab,1,0 +89f00ecb09cbb78771892c26f9789826,1,0 +89f4e1f984eb2c5d76a7f8de63abcc38,1,0 +8a057af80e82da742d2d8385ecc5b1e6,2,30625 +8a108463d99a2474724da6425ff74801,2,20 +8a273dcbffc426b5fda2e302ab3f02ec,1,0 +8a2de6e4171cac3a7779f8c5983fa7aa,1,0 +8a34443fe20f07a69ca1cb17004f6da8,1,0 +8a4acf49a75cc94452799f291c44f545,1,0 +8a64225cb09fbaa68be5c16c3ce5792f,1,0 +8a6dee53c71ad48b3717c2e45e6ca699,1,0 +8a7bcbdb4782ba4a74b72ad5eef8b2d0,1,0 +8a83e2cfeaa421f38f3f0c39dce5e8fd,1,0 +8a849333b4d6c93eee04cccf05fca3bb,1,0 +8a8918bc143adc2ed59da923f073417d,1,0 +8a8b5f5fee4e46cd417f856b042d24c4,3,43438 +8a8c4846253b55a9fa83a5bf0bfa53fd,1,0 +8a9a03ad4d26548d6ac25f573130c41d,1,0 +8ac2e2cac13b3ea1194200d239a0f9a5,1,0 +8ac3075988e3aee46bdac48411a7d54e,2,0 +8ad9713af6c0241f3ec18c076cd91f83,1,0 +8ae26222181ec04bbecb1f461e0345cb,1,0 +8ae509a04d870088045196a7ea68d609,2,3600 +8b2fc7694317a991e09d181912fa301a,1,0 +8b306db4372b7013df6afa049059566b,1,0 +8b3a50a5647d2bb043628a2bfad6595e,1,0 +8b44eb7f537a89392e1a64eb9179b94e,1,0 +8b524ac433074f184d8bd39da3b2dc70,1,0 +8b52549eb78925390bb17e21cf9849ec,2,11342 +8b5ca14f43161f0ccccfc06c38bb9c84,1,0 +8b65d2cdf92b86bcf8fbe08792704b88,1,0 +8b660a6f3cca9878d3149f2ced36a8d6,1,0 +8b727e4dc33524f679d2c9fb39624a16,1,0 +8b7896ffce0cd7c60ef781f17475656d,1,0 +8b869620b6640208145f3e11e0ad73ae,2,62500 +8b888d77fe06a86015fd6aff220c30f7,4,772896 +8b8d40ed7310689ea422cf3d90658d28,1,0 +8b902e84c49883addb4f3b46c997faa8,1,0 +8b916ff2365a573a2668daef8a62f03b,2,17161 +8b9882de94058bf1725e283373ad8286,1,0 +8ba383d8e6d23268bb73420404ac0bd2,1,0 +8bb98cd6c6e76f2a3c1bc2216b46f733,1,0 +8bc9fb06178ecbf156d6e8b889404303,1,0 +8bdc4b75b5ece0e4549b17f87ac24877,2,1425636 +8bdcc17b73ddd3729d3178cd71c00d58,1,0 +8c153e005ce3005a42167abcb645a2f4,2,34040 +8c15de988d113611c2f8255675a8f658,1,0 +8c1b14c9adc338587b521561c6a8453a,1,0 +8c1b6a1242916aadb64ef7de6c4ac163,2,9801 +8c1e04eb92ea711cb9dc958222e31c0b,1,0 +8c23abce7f389eb70fa88e25f73451fd,3,0 +8c44331cb17b8a6445f3502e885f1634,1,0 +8c46cb0bd7d6e57f390224b13f6d8da2,1,0 +8c4ec6df86e3e1a1ae124a7b47b384f4,1,0 +8c5f95daa45b303d3d1ba927feae8144,1,0 +8c718f4c10874f2ba8f8e340bd094eb0,2,8100 +8c7425c1243d9efd7c0233de8feb2e43,1,0 +8c7b8ff90f2bafcd9b162d17bc789f15,1,0 +8c887ab078bd8492a3a3e599e3aadb46,1,0 +8c8e14fdf699eca6f52d874d530bd9f4,1,0 +8cbb784be07b0f244459d8a8adf7047c,1,0 +8cc2110f87f98dfee620d8a8af8ec9ef,1,0 +8cc739f4a4b275bf946dc156a0b6e5a1,1,0 +8ccc140c97152638b9b89e012a9b8803,1,0 +8ccde36c4019c9a6704325e3af29ee62,1,0 +8ce1176acdecfc8e584e83dff751d4d7,1,0 +8ce482b6459b27826445e338c0cd2b53,1,0 +8ced74a3b0950ffd124cea34fa5197ce,2,20 +8d0414c6c0afdf7989d9f9be1a69c3ff,2,2209 +8d0b90f64904b5899fca764aef3cd3cd,1,0 +8d0e3e4fb0fcc93d960c9dd2702b0499,1,0 +8d382a0ab56b5c38bd13627d4b3ede04,1,0 +8d4145840004e1d616bb3f479f98489a,1,0 +8d420138de49849eb92fbe2d911ce6d5,4,5187706 +8d53611d90e5b57e4e9cc42e57d09ebd,1,0 +8d6d4c6159594fecf44811c6a3c10632,1,0 +8d9682e73de30c116dcd306c8b94efc0,1,0 +8da71bcb9803ef79eedcf8412f5fbaf9,1,0 +8db8fac9c8dcb1787fa9f6c05bc1e5a7,1,0 +8dbf8bc8a092c4f63cf9ca08956eac37,1,0 +8ddbe72501b14943d63c90a58e432b89,1,0 +8df251e889dbdcfe2588101ac4ab88b9,1,0 +8dfba43a5a47a8169092c879c0a09ab3,1,0 +8e09197670a70622a2181fec85e0f792,1,0 +8e1c4d7c0a8fdecfd84a364ff6c16fa5,2,4900 +8e38287ae1a68f80a18c3f186ddabab8,1,0 +8e3869b6ebf441b97d0b1856baae2f39,1,0 +8e444410fe4438c42bc6fca447400fac,1,0 +8e55a791857bba2c2e712c9abfd20c62,2,54990 +8e70f9ad8e7340351b160d3e0de02abc,1,0 +8e97ad7e21cccf76736082e41302353b,2,2256 +8e9b166c999570a3c54f52794acecd4b,1,0 +8ebaad9d7d3b1d0fe54467f747b7500a,1,0 +8eca6195def7fe3b070213c526e8e0b3,1,0 +8ed671b156aeebc404cf788e754b347a,1,0 +8ee799a639dc1ed25c0a56120636d196,1,0 +8ee85a8030a26eeeab22667d4870077f,1,0 +8ef2dabcf71e01ab066864ae2945c389,1,0 +8effeda4b8a7f5e634d5d4a39b929753,1,0 +8f004cfa1675529b37e25c0539f32d61,1,0 +8f0a6693b33f2c747198f0496a56a4fa,2,0 +8f2ac79d60dec5fa696ae14ca8e9b984,1,0 +8f4b49b05df73a020d9534f5d450cc57,1,0 +8f4d2c490c286204737a71438bd922b8,2,361 +8f62b4615553f51b57c1ad13d47fad31,1,0 +8f6bad7d7ef1e16da2bcd8b007a2286a,1,0 +8f6dbb34a0d6a079df53c7e43ae6929b,1,0 +8f6f762cf826e4b3ab197be028d28787,3,2857224 +8fa511223d29e3ebadddbc1de470c640,1,0 +8fadbbdae33257e0df6a95e91bccf868,1,0 +8faef5405127ed46e5bf9f8fa4546ed9,1,0 +8fafddc689ed1481dd1a5599827bed1a,2,4422 +8fcc091f2dc689b451ea55290bf2ab80,1,0 +8ff6a50c006851b2da67c58db67a4980,2,8836 +900205c3956e67bf3848702dc89820ff,2,0 +900e476deca5eba22a158987446ecce7,1,0 +904edacf0c332af8314e0e27c28f88b8,1,0 +906595e76de08a11124d31cd1536c736,1,0 +908fb47feb5eb59a1e5c55dc56cecc51,2,0 +90aa65b4ba9b72710f12e80ece6a0bb3,1,0 +90b893ec97bdff0d8fd4af78346626fa,1,0 +90d1e620368df5cd5079f20d2f203677,1,0 +90d2953321ea4cd7c10ccc9c754cabf8,1,0 +90d9ff5eeb93039563679e8202a15bf0,1,0 +90da9af204ee2f56e7e8d607733a9216,1,0 +910567e669490b014eb5bf57e6b69457,1,0 +91069460c05e64b3a5dc93a86c261255,1,0 +9122022034036e3f8d3ce696b93b6984,1,0 +9126b0a19901fb89fa950a8b3a57b036,4,90130 +913bcc7cc43f21d59effb5ec8d9393df,1,0 +91418349372e98ac344a2a7179e0e749,1,0 +914850479a62ab1a892698670be81acf,1,0 +914fbe23b79e02c4daca5edb05b51c63,1,0 +915dcb972e6a339aa6a41481fca0bf8c,1,0 +916286089452237e34c5c77bfecf6e75,1,0 +9169db4425d4a2d43a2e4c6b4e06b9da,1,0 +917f3ebdd44c250400c356a82d027764,3,105198 +91802590d86aa02624765bd7722a2262,1,0 +9182d087e31f1093962a3d7f5ca0c8d4,2,6241 +9187e9d990d0c692af86660330b6c2dc,1,0 +918d482229bd3c40100cb847427a7fad,1,0 +91981aff974a1f7e9d57df342d810e3c,1,0 +919953222756361728ef159a94cf1468,1,0 +91bafceec90d9e7f056b620a7a5e1118,1,0 +91bca3bfb24d267d6adca3ccc065dfda,1,0 +91c215cb4941fa929a931a010fa7c263,2,650 +91dba133082a83b9642eb4946da3186b,1,0 +9204df353e3d2c807276ee9bc56abc60,1,0 +92055fbfc47a30401e43f1e7a4c98513,1,0 +920ea085ee7a93fbae7f8f48282d10e7,1,0 +92147504f0f49a8738b5c1d38f75a738,1,0 +921df551df0a26d7dc7b09c9ff74f3e6,1,0 +9228e1ac32290bf2a2f8dc157998f233,2,9120 +92461c23202a91720af4571b8c204b77,2,56 +9248ed2c2730c99faacd43372f835dad,2,102400 +9259d747320b9ad545f67a00353efd68,1,0 +9261229c24b477b215be7d0966114eb9,1,0 +929132d5a8681fa2fe43ef7409fe2c2e,1,0 +92a0d452ace2dc032a552cd0fa9b76ab,1,0 +92ad03955e591e2c12dcc31b5bc434cb,1,0 +92b4ac5f9ae96c047146647321839a1d,1,0 +92c5704db13eae618e836f69e7f29ffb,1,0 +92cdea00063b7e58e0a3a4444fafa3b4,1,0 +92f009a6c04ce9920bf779a228c3f01b,1,0 +92feaf862131f6d07a9a5bec9deed287,1,0 +93120e5b27c522a45fff85698276a529,1,0 +93280659cd407540de78ed9f281a37f1,1,0 +933c7eaf2568fe5e55f8d94d71afcba5,2,4096 +93480c5078f96be7a9728a087ae41453,1,0 +935051ee6e7124da779e6d50f5293afd,1,0 +93558d162adfee2d4830ec26b41c83be,1,0 +93649f824855e6672ce33fe306c5ed42,1,0 +93701a6fbd383543ff97898444e113f1,1,0 +9372309fe6b41f6398a19699e0a00785,1,0 +9372e02d81e4f2960178f342c97a0d81,1,0 +93800e45a045fa3621ca3dcb44a1f26c,1,0 +9380e2a20c9eddd57b96da3673848123,1,0 +93b3bf1022296f36b4a5421bee9fee11,1,0 +93bb8e007e740c6e6ccf5e035140f543,2,272 +93caaff6c71733df3f0ec35f373ffbee,1,0 +93d067e39bdc6b99a13214e7811dd4d7,1,0 +93d0bfa831775bd9cd789cc7077de413,1,0 +93d46ff190df9da350c4229bd39e218f,2,34782 +93d8d00cc5345beb50915aa20fc46925,1,0 +93e7d3d265525e6a78d2872b004cb01a,1,0 +940245aada039e7d476cfcd48d322ad8,1,0 +940446872a4a20cc118fa2606444bf60,1,0 +940db494ea91693a3caccc2a842931d9,1,0 +94169970e4f9901daee6d975ed6e39d4,1,0 +94198d0141ccc404dafbdb50e941c64a,1,0 +942365e7ac2221d8e899bc45c63c7fb1,1,0 +942ae5f2f4f2aeb5bff82a20801e1ea9,1,0 +943afabed0868ef0f28d11147686590d,2,13924 +94448b9f13a109fd848d04d4be2b22d3,1,0 +9456fcc1f22f6f265ec76ab12a34bec5,1,0 +9458a0a3094027db1c334536a8bc2f3f,1,0 +945d96f63934c7343999fab1369387be,1,0 +94a4de8844bf2b2192ad21988eef0ab0,1,0 +94a59af24bc6e8b774ee773bc829b259,1,0 +94cad158a5139b9d62baf10feb052cf1,1,0 +94dd60fa8738dfb309faa0ba759e9fd6,1,0 +94ea42d044252d9c7cbafe09ce60358a,1,0 +94eac43d93fd1f47e5c170a2ddd3e088,1,0 +94f0a97fdbcccca0db3014fb1b5183d2,1,0 +94f764c81b6a59954c5e426362e2ebba,1,0 +9508cb5a38f3c4b03529a0c39b7311a6,1,0 +9519a31f446fc411024bb9b91d50371a,1,0 +95371e04db6bf38a162d8c7fff5a4c9b,2,5700 +955c2ca526b60dec07aed01dd3c36153,1,0 +957e5e3344d6a686e34a88a46b0bcfdc,3,2225892 +9580fcba94a46ce2cde719a611f591cf,1,0 +95a8f6d4b17dfc3ab40d133e3d60fe6e,1,0 +95c3724a5d80f3cef3361eb777abd648,1,0 +95de700e89e3513bcc30e9801eb5d55e,1,0 +95e651f8f26ccc2b447bc458fcc7ede4,1,0 +95f9cb717b30cf2db5cf65042d10c330,3,826 +95fe07242795d75811e9febddba4ad35,1,0 +96085c932b742a2d3d61b4de6473b0f8,1,0 +9618b4a0e335af38619230d93e80f8f2,1,0 +9619e37b2a2269dea061f9b2b7134552,2,11130 +961fa7942751ea2f05bf992b7d37b2cc,2,16770 +964faf6c332bb88c6e363795765b5a79,1,0 +965c261547a86d48ea3515268a1c3f55,2,930 +966332426856b82eee9e9f826aef1598,1,0 +96743ae91bb2c43ed008534746390260,1,0 +9675bf3aa220b34ce86f37154d92dee8,1,0 +9675e309eba2867a7468a73752e1fb72,1,0 +96770089ba83cd0eeec62ce63b62a853,1,0 +967cf264704b2606c050f407aa0412f4,2,784 +9681dad714a44a7dbb8defd95382a52d,2,2304 +96949f1e889f52807c6d3bafcff3129c,1,0 +969ddd9f884cce6ed616083ac0377a42,3,8388411 +96a55d7beb90808330f65c1410c44fc3,1,0 +96a79f831388ac32a7b8018fd4696888,1,0 +96c1930e097a8198434b3752a13eb733,1,0 +96de9e62c1544e5d9480576804072752,1,0 +96e020e0c70405be76200a7668d73fe7,1,0 +96e92cf36499c58baff546504900441a,1,0 +96f4ef08d4f769e051e60bb5cebe7491,1,0 +9700ec946417a4ef56daf97bb46a5bc4,1,0 +9703c3d7725b1b7e914b0ab015afddad,1,0 +974da28a18d6e653f6a9e199f403cfe7,1,0 +9768a0030974c0fd28b78535a819b800,1,0 +9776ed2cd060f2ec977b6fdff3d948bc,1,0 +977bbc264dc6122b636682c2a9a165f0,2,1936 +97866e4be40012908c4ad4fd8a0a9d1a,1,0 +9791c937fce12fa5c3dac6f9e453ea0e,1,0 +97a136b55275930f15b7ba4a62c75ff4,1,0 +97ac47afe30c126d3330ea812d0b1ef0,1,0 +97b7dad91b8185b06cf8d46ad17391d3,2,72 +97bdb802189bdbd001648cc9d2b03e29,1,0 +97e207b8c7d2bc8da6b54ecedd0f9df3,3,2579658 +97e7cbbd074457b824ba799d0418f1e7,1,0 +97f5f8e2891615bc0ddc8901fb50a97d,1,0 +97f781fb711f6ea219444c45453396b9,1,0 +97ff41edd833d9033258f669d7963552,1,0 +981fdfc38420d38d10d97872feaef72c,2,961 +982f138520b4f60e5ae36a6e9629e5b5,1,0 +98322feac68c5808621d1476a1521345,1,0 +984418084e79053af0acadf01005699f,1,0 +984edb05966e96b610f07cedff8e22f5,1,0 +9857d9364017a24c2021854da5bd4196,1,0 +9858d08809772904f8b0a9e6371060ef,1,0 +9862f496fe6606a84f15834e421d8f73,3,36270 +986d17c2dc8257301561a212ac523a74,1,0 +98a0743d467ffd07e10b0ef6f11b4300,2,25600 +98a36c73722f8984445b9a62034abf8c,1,0 +98b7dea94ff4d847997e4a590345ecdd,1,0 +98ba93a27de999f95c25b3bcd46eeedb,1,0 +98ec42f2f2e331afe9a9c631114a7a9d,1,0 +98f8f8d9127ef5d522c61fb47e4e92bb,1,0 +99000f039893e0720eef00a65944de96,1,0 +990560ae1cd93efa019a11cd682bc52c,2,0 +99132fd6652efdecbc20710785812006,1,0 +9920d20e7ed2be2b2a5162c3e1238f01,3,10766 +99320175a3b4b5970ca5a0bb0c75637a,1,0 +99329e53f04f7b24c5a8aaf540c1e81a,1,0 +99360f30197dde40e214c79e258d5e76,1,0 +9950076e65552ea074be695fe9f7e8ac,1,0 +995f1b8b280aa1fb4ad34709b4b56417,1,0 +9985a1aedd6cdc7fb9ddb6b3dfaabf05,1,0 +99944397010dc4ffc7f699b2945e5b8c,1,0 +99abc899122e54fc5e60f825c98a20a4,1,0 +99b37e7124f8a7e4623f208cce2052cf,1,0 +99b66f012dd1b966628beccc2ef5bc17,2,3422 +99c60bfb53b761538429c889f54e41c4,1,0 +99d411bebd22b67e0d9a997ec629d6fe,1,0 +99d6af3e76c4c65e2b31a4319e459fa5,1,0 +9a10c548efc0a4683f1e03273fa780b4,1,0 +9a312a61b695a9a0ffda987320a5300a,1,0 +9a52b80fd9e8d17a451621fcc3351ac6,1,0 +9a70089213e5e9fb8a3829e68b2f179e,1,0 +9a9f177fa8fed3003de712310da1d068,1,0 +9abd92f2d09b53f689cee54ea73449cb,1,0 +9ad05f21be39341f42bfede52ef353c8,1,0 +9ad068429596a5f0f7fcfaf327f876a3,3,41344 +9ad36f87de2203f7e5ea72f59d798e4f,3,15678933 +9add3fe8175b23cb776a00613b14924d,1,0 +9af9b9ac98cfaf7cc7bd36790a631ad8,1,0 +9b0eb43b59048a9cf1d612d5d73f0086,1,0 +9b1062f1549f26ff6c0482949e1c335a,1,0 +9b1cf327e17103d070d96ca74a918c06,1,0 +9b1ef582c5d44f58e253fe673e6584d9,1,0 +9b34a775b90030774c21fb47dafd5beb,1,0 +9b564420cc50596a79ec99a292db06b5,1,0 +9b5ea7eb4bbcb23603b93d5fc56bc033,1,0 +9b5fc66f47a6101b8eb8ea417e67c62d,1,0 +9b60146cf86cd84569f56cdce87070ae,1,0 +9b60c2eb0d0cf51f9ea5f3f648229772,1,0 +9b6af83c87e6f8b143372de80ae6288a,1,0 +9b718d5227851efd7f8b090dd2111823,1,0 +9b82eda309ee737e53a30050cf0b25c3,1,0 +9b8c192cf125bbb0d92bcedd37d62177,4,10123651 +9b95269f0d32cfef0f5dd405766c9a63,1,0 +9b96c4dbcd958014502327686e9ab3e3,3,21162 +9bb9473afa3fd3d54ffc0eeffdb55d30,1,0 +9bc248714838773fbaa2813936d6fd6a,1,0 +9bf16c77adce8bf9e538f783cee3b23d,2,1369 +9c0bd0b0ad2027fb49a586fc1619806e,1,0 +9c1acca34975b711d86acc93f070527f,1,0 +9c28a01c3a87497f32d2c0220e0794a8,1,0 +9c2b587ccc5e1ff34d7b76a64ecb94a5,1,0 +9c317a60ee2684599d5a6c4194489375,5,422 +9c3e58f3b38dbe9c1a5d2d26c0826669,1,0 +9c8bb90888b9a2aaeefad4417b7feb5e,1,0 +9c8f9b6279409d6cfdea6e23dbfbdfbc,1,0 +9c90a6edc351e613cc58cbfbb789ae36,1,0 +9cb8d9a4cfeb758182f90a22e0e4ef7c,1,0 +9cc06daf53e4f973ca95a730b9f2c84c,1,0 +9cd086d7383a7c9e7cdfa3961d4e6424,1,0 +9ce19bcc04b2e0f132225a35dd7647b4,1,0 +9cfc31eea726d9763d68bf5d3f2cd370,1,0 +9d105e3fde9b79c56034d1439fd0ebf9,2,306 +9d11ec92faa414e0f5b35476679b80a0,1,0 +9d1815e84809cc29675219e525932e9f,1,0 +9d20db0dcdde5b687436b5c5c2dedcce,1,0 +9d22230c007257b7ddfbdfcd52738598,1,0 +9d2614d0a63325434888ffdbc043203d,1,0 +9d29ff35bfbdff1fc29729f7c511fde8,1,0 +9d578daaf66ef7de93186aef97485fcf,1,0 +9d843c860877943d635f258875d9b1bb,1,0 +9d9f67c3448765dc214eb88fe1c377c1,1,0 +9da9a2185fb2766d5161535069b6bc1d,2,7744 +9dac9c2aba060e4f4c02901a3bbdf5cc,1,0 +9db30546a98d674166f6b32890158497,1,0 +9dc43da2b7e9a579323ac1f34ef92b44,1,0 +9dd250133083bccb6dd95e6bce6275fb,1,0 +9dd2a0e9a4ca14bef524a6b98cd465dd,1,0 +9dd2f971746df8af63e976f1b27c0654,1,0 +9def82a711757eb5cd02070188b65785,1,0 +9df933f61006b6e9140d4d58cfd56e3c,2,0 +9e04b031fc46363e9a3981d95038195f,1,0 +9e0e8bbe3844357bbffcb06958152cd7,1,0 +9e143735c4a3fd0252d2b2e53ac34379,2,6290064 +9e1bdd2911fd6d817d914b7f723c6e4d,1,0 +9e24269c0856f15217c60cf0fb236f96,2,20592 +9e29c2c2e08f7ab7cdf6994039deef30,1,0 +9e2a86dc8498f9d624ae07d6effde5f0,1,0 +9e520a48dfd70f936ed5f0fd14bdbb59,2,3422 +9e6ca8398c7ed98f3a4c57ef2636c8c8,1,0 +9e787e408f9d73262fb176e1985db20c,1,0 +9e8d3aaa9d96a3949a827907cc26adad,2,1764 +9e8e43201357c9277e2789a1909bdfab,1,0 +9ea13d9daa4458ec20a4fbec44a03a93,1,0 +9ea9ef5c7702e405221db06aff84fed7,1,0 +9eab314b92fab8f9fd5494286160aeb0,1,0 +9eaf9cea96ddad3a0ec5027c4ae7994b,1,0 +9eb0bdb5c7d55a601a9573e6bd30571b,1,0 +9ec9a1e51f0554a5448021c98a8d42a3,1,0 +9ecc428808db51ba6705aa2fdecb4a43,1,0 +9ee48699de56e0090f48b7bf274dc665,10,21504 +9ef535e7a6cc0332a1166e38ecfd43ae,3,12970 +9f02b3839f7d0c9ca085b599eb9ae984,1,0 +9f06d97a0c8501f9c23eca4a4aaa85ba,1,0 +9f0da261d140b7d0862000da05a31006,1,0 +9f1256752eff6533f6b44cb1c1a0b639,1,0 +9f2b5306fa25f4048259a24a9e558ab8,4,26851 +9f306221054d1f625ad51902e04aa637,1,0 +9f4c1af281054f877264e1dfe3a3e846,2,7482 +9f53d95b50760e78e0366ef4c7a63ef5,3,16490654 +9f678e4d556b1da7c52e4769b6ff4b7a,1,0 +9fb393eb0133650dec0ab1961fb7ad1b,1,0 +9fbe433f7f6799672a02db56b8be9fd2,1,0 +9fde030604298e22ed72225dd5a567d1,1,0 +9fe94dfc14cc6e81e3580bb3a675e3d9,1,0 +9fee3fcda1554b4a1217481ba0636062,1,0 +9ffc94ff34c73ed55957c8884d97336f,1,0 +a00b50b0eee6d886d8ea670d4b4c412f,1,0 +a0653a74dda0913c5e0bbbbe6ee801a4,1,0 +a077e991964f8ab0feba461a2aa9f4d4,1,0 +a07bd1e2e9452f84351be70fe0bd0445,1,0 +a08d75d1137f430dd90c5ae4e67fe55b,1,0 +a094b8859a54355895f1208679cc31f2,1,0 +a09a703e0773a66f8dc8efb08784cd1c,1,0 +a0aecb82eff87ed4d17f4d51fd05ab67,1,0 +a0b4c3bbe9a2291db25a2fac2172b6d5,1,0 +a0cb8d92706aca8b3c8a3c94343c941d,1,0 +a0f5aa7204a02717f4c079d2937575a4,1,0 +a10ab13234971a3b010b7ea536300567,1,0 +a11344e4c9dd46adf3d5ad5e6755d33d,1,0 +a1173f4270bcd2f934b4b6aa4d092f91,1,0 +a1312f92d4d371b8a251eb2713da6591,2,19321 +a14636906e030c9a350d2db8b4f29af2,1,0 +a149e61e39445cb310febbabdc688bd4,1,0 +a14de79e62273ce6b1281b7512609a64,1,0 +a15ed07d7a11c46b96d077b23213c966,2,3306 +a16dbb38de0ef98bdce4d00f4031927b,1,0 +a1718243703a53ab3cabd6f76e2430e7,1,0 +a17abc07af9cf7e04ea493631ea075a5,1,0 +a17bd9cd28efe4d687cc9764a23c7886,1,0 +a185448fd3d8ba6f596a2ca4d8ede65b,1,0 +a18df2e78c2006b0e3b5c40e375e0bdf,1,0 +a1a47ce91a9683caae00f42f61f8b908,1,0 +a1a857eba8fd4efa2d42128379294ea0,1,0 +a1b9de90112b3f397d4bdb5f843e13ec,1,0 +a1bfb219268b4fc3cc0cba225b46da89,1,0 +a1dd11a2c0f6887207a34f1413dea3d1,1,0 +a1fa96f631f84b9de619bb6ecbc5b552,2,65025 +a24668cd188d0d8e177bc20aca9df0e0,1,0 +a25007d3ace81f5c2b1798ea9d4b20b7,1,0 +a2523b196b8b24b2b291da03b65d0e00,1,0 +a26803fa805490e3a05bb9b1069f15cf,1,0 +a26d65914ab837eed26afab849689277,1,0 +a273783308d4ff42c356f71bb0bb514d,1,0 +a2787b5480ba0724a5544b8a4a5ed230,1,0 +a29930c3ef18ec604a36056cfe9a7d4f,1,0 +a2a1701dd6b099770c9ccc71a30458ba,2,34410 +a2b19ce8b289916ad7544d0bed28e03d,1,0 +a2c167c4c57c932ae0b5c273027d31db,1,0 +a2e0b8eda082e46e787a44885a11f9a0,1,0 +a2e310077dd0e7664d8f7dcfc24c9072,1,0 +a2e6abbc01007d2ce25993af102a476f,1,0 +a2efb854ec946895fdfc91634a7b90c2,1,0 +a2efd264d2d876f187788a546c67da0c,1,0 +a3189d7e3c36a92c311ad081230683ca,1,0 +a31b51c823d5d14e97f49ff880ad51cf,1,0 +a3399f22c0e313f08a48d421d4f6dd7e,1,0 +a344aadb3c5e62f9c4da4db9dbab197f,2,7225 +a348535bb085e82a205c998aa97de0ad,1,0 +a349c6fd87a946009f414ac0369dbea4,1,0 +a34b48bec784a7cf6a56975c2380cf4c,1,0 +a360fa7e6d29dabc4c3351cd910d2835,1,0 +a3634b3cdbe78517baa26015dadbf82d,1,0 +a36ec3634a0b78abf477fb468c82929a,1,0 +a3820703a3ae015ba1f4288279c89a31,1,0 +a385a293aaef5796efc6a8748a714b16,1,0 +a38c71dc14cc38329fe3e54e788c1a7e,1,0 +a39a381be879c28b4edf9a6f59897e82,1,0 +a39a439fbfcb2cf325d78a136e546b66,1,0 +a3caed5d8a3564a9b0225e69321a9de1,1,0 +a3cb1212d48a3e149e9e8af92f38993c,1,0 +a3ce775d26ac8be3439ad24b24289f7e,1,0 +a3dddf09e71c503bc692f33ed332e5d1,1,0 +a3e3c130372bee11d670de991210c9af,1,0 +a3f95b935375913e85f66e3cb6480a9d,1,0 +a403a7d8ed1e7ba344e9a814dc938960,2,1521 +a413a12acaf8fc5b8cc5118d76c0ebce,1,0 +a4158880f12e267d4120f1c99e90b04b,1,0 +a41d7001551662ca358cf917b4fa71f5,1,0 +a424fd77c944ee0bd0557b9fc4d3798b,1,0 +a42bfeebb707ac234591969f5d1f2cbf,1,0 +a44593d1f1ad1011acdc49741c8ec650,1,0 +a44f85a4e8c72fd938ad4445a57ec85c,1,0 +a44fe0faff5b36e543e664cd5719f084,1,0 +a46cbf03a93fba05b43c3e11ec736013,1,0 +a474ba5af1be05714a4b1f043f13eb32,1,0 +a482864cbfef22b9ff6befd85037c8d3,1,0 +a4861689d8b8d3347ded767efe7c6836,1,0 +a49f98d5ca3683a9110b87d520f24b82,1,0 +a4b730e014959e823b93ab45f3aa1949,1,0 +a4baacb841090bc25d6770a3a108b791,2,1722 +a4badafaf6d61589315219b5b86d712d,1,0 +a4d1b22bd88ba0311fb42d2c06735993,1,0 +a4e8c2d7bb8e21c07d5d5bae9a48e4d6,1,0 +a4fd5a590aaa3f655ba15495467d6f70,1,0 +a4ff6a3aaf181e8d271f83f5f54c08f0,1,0 +a519050b60f3a28945c3af20e54c98e5,1,0 +a52ed384032d0d764c40c5b198b0cfe1,2,13110 +a5328f72f09fcc8322081db3107d25de,1,0 +a534bd597a5e786f47acade9b5189bb0,1,0 +a536b666854eead81fb1bf325fedcf9a,1,0 +a55a321fdf7de1c2a1e247cce4f5e343,1,0 +a564daaf587906cef7f91685432d6294,2,16256 +a574096546703b126c351d2beb8b7240,1,0 +a576a78014039641c980eb73f1826616,1,0 +a5884af4def4ac0cb52386dd3e7a9169,1,0 +a594b266c643b661a73b2e1b3f472c26,1,0 +a5b7d6e843df79867d422e4df7a3703b,1,0 +a5d5be5c7860f46121fbf1cb6bd9bb9d,1,0 +a5d6c152df8c6966ed3b39588106079f,1,0 +a5ec92541060f2793041970dd5de10c3,1,0 +a5efd1b0c6ca442b1c7a59bf00938d3e,1,0 +a60d82e7aaff19e99d10de4cc5444356,1,0 +a6301dc72697cfd7e96312f0b33f51ac,1,0 +a631d607f7a57e526b5c1fe63bab1a62,1,0 +a632234c51a55c0ff877973a0198fcba,2,992 +a6354eea25581f1805f09ffcd40eabe8,1,0 +a645f0cbd9d370d529e21102b6650d1b,3,351168 +a651ee18d8b98a57d8663ed8868ff44c,1,0 +a65cbb282d15e1de56f3f6b64847083e,2,1190 +a665b2589e5a067ec87177b7e125602e,1,0 +a669515f75c6275352a4721674d45a94,1,0 +a68ae93c76205955a8639637e3943b89,1,0 +a68e179aceda7601629848cae5afcfdd,1,0 +a692cfff6d41d88083cd68c5a02fe34c,1,0 +a6a3175648640da7e7e34b3bcf7eaf16,1,0 +a6a60c8ee869a3b6f898cb9c2c2c6f91,1,0 +a6c1a06ae9fd2123717adb93b6794e80,1,0 +a6dce6b3fac2fdef2e4eb8fcecf9a605,1,0 +a7005eaa41143c5745b4f15bf68f6581,1,0 +a7045c177f28b66c34a99bb7e6c1ca53,1,0 +a70dd0652de4997ad92d50ba0044f09f,2,383780 +a724324879978157edfdc60ba80e7842,1,0 +a73c7b4ed7b82515fec0d745ae54bdbb,1,0 +a742624569e5a459c1ec6acf05e5284d,1,0 +a745a27f41dbe2cc15edd22c920dcbf2,1,0 +a745bca7ffc095abbeff28f44924ea61,1,0 +a749b369dc0cec4864ffaf958a625463,1,0 +a758e86a11d8d823cb2aac2c7672ee4c,1,0 +a76a8769009393c9b4440008399166bf,1,0 +a76e7e133c5118a9bef0862845d41e45,1,0 +a78e01a376eed7e8fcc5e5819669e68b,1,0 +a79a3e6bcbaeb67714ac02c6186f11a8,1,0 +a79e8edaba9cfb199f00786aa999f9ee,2,22500 +a7b43bd8af2ed03466aff701670ed905,1,0 +a7c32aa43ce141a8efdb86f724a70249,1,0 +a7c36a076b28e4cda3d1011c50c33015,1,0 +a7d633f9bccd7184111d1cd224c3e46c,2,0 +a7f7a88692446816e29e18b9b6c3ea9b,1,0 +a7f9fc4bbd2882aa39c34af2c294341b,1,0 +a7fbb784795328cb68c653521567fd29,1,0 +a80693161f8b056c37307fd566982636,1,0 +a81322af89f5ccd40e40e992a5bbd4fb,1,0 +a816273c855282b2a0cf7d230be715bd,1,0 +a81a0eb3e735e9f75d508d6df0a3aecb,1,0 +a8394f0df3448abdbc216d0b2a026a6b,1,0 +a83e88ee094f8f0305bc9e2692157d0b,1,0 +a848fe3f05e35954c7ff1b3ac8e8ecf3,2,1478656 +a84ccfad5fbd5b25c1936f4c4951ae95,2,0 +a87526b2fa224408e932f2a52f632270,1,0 +a88368bf99493a6932b2f95f7599531d,1,0 +a88fe8665c06eaa85c42063f707824a5,1,0 +a8ae150219eb5be539b9a5e982bb6cc8,1,0 +a8b3cb18b8a6ab934b3822333ac42a2e,1,0 +a8b400d8aef6c488703249becd9b293b,3,18288456 +a8baa80336a3f7799f67d75b56706f88,1,0 +a8ce07dfcf68918f62fe006fdd4e2123,1,0 +a8d355a97fe9359f998901899125564b,1,0 +a8df0a7e00e3627fef599719af67e8d0,6,4497586 +a8f4cfc856ccdba7fac54d706cae29a3,1,0 +a8f9f349cc3a30cb703a9158e52647f3,3,36440 +a90a1512baefad9a2c28efde1435ac06,2,961 +a910ad6639fd43910f3d9e384d005295,1,0 +a95233784728c23082095ce29572f982,1,0 +a9751b89dd682bb0fb4527e889d8115d,2,4489 +a97ceeebc957af1532d17d1784f127b4,2,1122 +a97fb48bdbb337cd6287de68b4b49774,1,0 +a98999488fa695cea5fde74859d6a1e3,4,0 +a9a32d4293bf8c66f2605221a09ac596,1,0 +a9ad99d2f6001c8b2551143a43ad3b9c,2,8100 +a9c207319e9c13b07f5dfa8468b57e80,1,0 +a9c4cc94254e0516448c2ef1da627259,1,0 +a9cd6ee84f6b6f0f282c1e3fbc3f8d3c,1,0 +a9cf88c9d960e5f2dd9ac6026b0e064b,1,0 +a9cfde92ab99cfdcb92383e8cbf881ff,2,0 +a9f63308fde132d3d9309503ca562fa9,1,0 +aa014345da67f6814dcdaffb421ecc7a,1,0 +aa07c0073e8c407f6b2309e6757b535e,1,0 +aa2365b2ed8ecfceaa98417fce30b716,1,0 +aa486f5bf3085618a89d431a8c421f89,1,0 +aa5a63370f4df6f6b91dad0f764e603b,1,0 +aa61078582a91f873b41ae8a6a4abe79,1,0 +aa6a81f675b4698b4cabe5f623240e6f,2,1936 +aa6b71b0104a74ce1418164144a3ee58,2,39800 +aa979a4831d4533a34dc01bd714fe653,1,0 +aaee32ceac8f055ab8da2226cd454b00,1,0 +ab0cc6c9454af0738e478e66a25224e5,1,0 +ab0e7a5c3225b675632f611f4e8cb529,1,0 +ab319eb0473abbe517e52ead26007e9d,2,42230 +ab3b1c260096541d4b6b2c0039fe28b6,1,0 +ab43ed3fa54d623175d5b28019c31319,1,0 +ab47749b81ef91adb192c8e12dbc70c4,1,0 +ab51f10fdd2a474f6764d802cb5da2eb,1,0 +ab555bbbd49151f8ba54ce0909d32075,4,14828904 +ab5bf7d5840fe7fa56529f666e09f15f,2,30800 +ab5d89243b28752cd4715679a536217e,1,0 +ab744fec3cae04e3bebce28e248899e4,2,1024 +ab75190434128fd0534b910dcf5e6ef5,1,0 +ab80a763ee97d3a8a23a5eb2602d0fcf,1,0 +ab8ff4be87204d1b96355a7483c899f3,1,0 +ab9adb7a99dfc3d4b80d083a86f2f2ae,1,0 +aba87d77c62dec94db2a7e6c0fffa3ba,1,0 +abb0453a6d3702952eadaededbe9e8c4,1,0 +abd0128689dad928f507b7fe7e11a193,1,0 +abd57ef21d646f61ca5a9a33a20cc36f,1,0 +abd856a8c4f425784930433da14ca881,1,0 +ac04800912fdbe12d091e6ac53b109cd,1,0 +ac04843b693227695cb5f1b4eedb4214,1,0 +ac0774e3e576dd5bd0d8133a31fd7aff,2,72 +ac0818a2918c2e93eff436c41d801114,1,0 +ac0e3f934a0d37b8d77d815aa20dac6a,1,0 +ac12b614309b5aeebc9924f29b371f05,1,0 +ac1efea78919983cdff214de1541001e,1,0 +ac1f070e76271a3127a1afe6ae6d88bd,1,0 +ac21de092c1dc561b42b8f8116ab3369,1,0 +ac2a7ebf1e811d9995cec9777a102d53,2,9900 +ac383e30e581372dfa6d614487c93a61,1,0 +ac3d32c66ac41b998c33d2e39f3b08fe,1,0 +ac532b7cb2d3c57f456c1dca76cfb3c0,1,0 +ac5894191492fd93c0b7ca94f68be366,1,0 +ac5f45eadcfddb7b7ac51e1383400d63,1,0 +ac7c29b1c70d745bf3232fec1ba43e9a,1,0 +ac8af9b5f0e99b5383dc9d1b568c54da,1,0 +ac9a55f8cd4f5ffc0fdba31430b51988,1,0 +ac9dfbf748bd4376790d98715d69ee1b,2,5550 +ac9eecc42996698e57ae3f4bb7d27d1b,2,16002 +aca7fdc10cb64ba59d49dbaf30db8d75,2,90 +acab98f452f8b8a262435c40beeda615,1,0 +acb9fe1568054c608c85846e324db053,1,0 +acbb657b915f72ef780ac0230d777b4c,1,0 +acbeadee96d20b90baa7fe9cabcf0d87,3,8712 +acc21a7f8c9bc9ccb3061e43457b2996,2,804609 +acc3d01c713b100321cc4d72067704f3,1,0 +acc43fb24a791224adf7bfe31b32ed44,1,0 +accfdb3a353ea6c183026a137bdf356f,1,0 +ad031d6fd4052bc415cd3139995f9719,1,0 +ad0723c19db4a769d335266213ac1c5b,1,0 +ad0cbd69b08f2ef53b1b73cb0532a624,1,0 +ad228828498ecc39f0dc8a615e079300,2,1296 +ad47466ed5264d990af031a3014b8025,2,6806 +ad55a1435a4b3b04c751e9bbc8905c80,1,0 +ad5bcb9ea1ec143865d4c4b8bb8ce7de,1,0 +ad72d2553693c6e3a483b379a603f9d9,1,0 +ad996f9413678956dcd1d2ebe67a2077,1,0 +adb39ecbdcb845f05a940ba45f604bfd,1,0 +adca5796278bb482f4cdb393c3fe59fc,1,0 +addcca789467fbe3c81f6777a2cf1962,1,0 +addde9fdd4962cb46b6bf33c1dd7f543,1,0 +ade90e11eae1409bd578f2f57ecf0c61,1,0 +adee55d4565f6b07a78f7e4df87ba162,1,0 +adfc3b954a70ab02b6539fe77f8a287c,1,0 +ae1e1ab6e23233115aaba14b551f5993,1,0 +ae2be94c703c264c5e50158ea608ff43,1,0 +ae4b6f3b58817637c32fb96e5937c834,2,25806400 +ae50d9eae9b2e980f1f61c95825fcde6,1,0 +ae5f041297eaf32f448d03c3e621d40d,1,0 +ae69e76bcfb563056277952a24bc760c,1,0 +ae6a3f2050557ba593e2542b2110032e,1,0 +ae72eea7d3afda2b0ee9f925ccfdd18d,2,529 +ae9fa2c829b7efdd1b4e471b9e8006a1,1,0 +aea8b701cb863fcde290758bc41e1c1d,1,0 +aeb406bd2988bd5a9595680269d94cbb,1,0 +aeb8179ba0cbd19526cb8a795f9bd638,2,1722 +aec030a5aaf64ba75bf9b26c0f5c405d,1,0 +aec95faf997546f202338bd6a19e2cf4,3,5301166 +aefa83606a936435e35f8b80176cdf9e,1,0 +af04921d4e6b9efd99e58e9661f68b68,1,0 +af1f21fdd330b462201ddadcc7a71a46,1,0 +af2dafa925eeb18a76f5a93ef472aadf,1,0 +af2e1cd8f3ad6be762accd9233114a59,1,0 +af35024e9497f6acb4e9a4031608c10a,1,0 +af3c33f8007b632d5013cfbe53bc383c,2,45796 +af3f1c56256a3b337db10fdd66eeae9f,1,0 +af43282fa9c27b842c792bdb59c3aa44,1,0 +af5414f9c670750db6af484f610b4185,3,221866 +af5d41948d40e3241a5412e75e5b62c6,1,0 +af63039f2eaebd832adc38de7314895b,1,0 +af718d8e1dee107b253e7c0e3c57b6b9,2,67600 +af88b086b028d3c972dc3a63d73d14bf,1,0 +af9ce79a63306b9afe8e298058368012,1,0 +af9e18191b7d86009c30b1a88a88f82a,2,13924 +afcf3d02d04c4e14f20ee9206eb773f3,1,0 +afd340fd1db50f62cea8fe8219f330fc,1,0 +afdc1e5ccd7cb344fe3e2d6395896c26,2,2844282 +afe7ffb1f0c596924fab2a3d3cd3bca3,2,124962 +afe82686f800749adfc6eb13778a6bb8,1,0 +afea3328620147789d47b433c86fde2c,1,0 +b00ea65a910e3dd0118177315f07180a,1,0 +b0224491fc31ee18889d73456855bb94,2,870 +b0575930d777ae6178a5555d42e8b5dc,1,0 +b057a36ffd1832a29e1d765eb903df03,1,0 +b05ece7b4e073e667c9dba8926b2941e,1,0 +b05f1260c3cc5bcd9f70eb12e554ef7f,1,0 +b07f7b3e8133ed7673e7b3714ff04605,2,16129 +b081ff4e46738fbdaa048210c9f27516,1,0 +b096a6e37e9e8a492dea8df7e2b410d8,1,0 +b098cd1d35db2072f865678bcc7e24cd,2,7744 +b0a24f34dd3d7ea28c2c96634563aa85,1,0 +b0a9531273719c854025678adcf055c3,1,0 +b0c9bf2d8171ef9598823939ba90b5b6,1,0 +b0d8256a029b2f84a41933ed85dd0ba2,1,0 +b0e11fefd62d32688501f4772a5d8630,1,0 +b0e53c3fe0cd5583562e536e77fd3873,1,0 +b0e5912085c69faf374f105184da966c,1,0 +b0f7e84f09fd5df689beee8a32908609,1,0 +b1056cdbb8cdf64a36993e0b56407c59,1,0 +b12a89f84b0d5cd501426dbb5d3197bf,2,1560 +b16dae1b6d7cbf0f3a616e965abd7181,1,0 +b17978fad62aea8c62a47fd20beec268,1,0 +b17d126249ccbe48962744a29f4230ea,2,10816 +b18f89c228a8beaa2e7c35f1383cb129,1,0 +b1b2974cf8551790a36bc6cd7cb48c9b,2,4032 +b1b92098b383445648e2f1a6463c51ad,2,35156 +b1c036ce0e1c0b21530f025dc2f90284,2,8649 +b1e2323bc926aa31d56278f42a42f8a9,1,0 +b1f3f6afe3508214a39f0304c5995ad8,1,0 +b1fc2f5d386a60296219b0d0dc783c06,1,0 +b2005d43476789b62174bc7932d76eb3,2,0 +b225d43575baf7d71da927f0ed91a511,1,0 +b2335d2ad29e8ce81c7604ee27e05df3,1,0 +b2389b714bffa8bd98f8e5cbd85d7f95,1,0 +b23d7976298ab126e9da6a36d74c57bb,1,0 +b245f6ed9f34e6d9634c24982c5e8506,2,4225 +b24a96211cbde8aa771604864a493043,1,0 +b26724cc4652d34c5b2da8f8809e8fe1,1,0 +b2801a8071b8f20c422665939655940a,1,0 +b28432a6af4b9492b2ddb58f4672a9b4,1,0 +b288a99454c6e18574061b70965b539d,1,0 +b291031264044b5cbee87a608ccd1d2d,1,0 +b299deb70983f7f35255a7bcb1bab89d,2,49 +b2a6b917d8fdef1738d9a2aeb2853df9,1,0 +b2a95c629cce3a456cf17a28c9d3f0c8,1,0 +b2b471cc07938582298bdcd2be9254c3,1,0 +b2cbcd1a314d62b6f46e285bcf7b7be6,1,0 +b2d563627c2dd1be9564c5e9172aedf0,1,0 +b2d664809a45898eac61f717ecde10dc,1,0 +b2f424862e9970cf937f68e887298d6c,1,0 +b3286da6a5a3959097a4655419062d08,1,0 +b3318e50b0b47cc9e6e55eec292aca27,1,0 +b3441c9a34ca7de6f4a22b8e44632704,1,0 +b34ff55cd3553dfe6df0b510ca2b3147,1,0 +b35c55b6791ed01dcc470f41a1f78e29,1,0 +b363fba5a7a33ad7eb1264b974d0a0c9,1,0 +b372f352f264af05e460b406d9804e02,2,88804 +b38d7cd60d2f955ad5cb00c2eb85d2cc,5,1622136 +b39137e05e28d99a0dae488ae87188f3,1,0 +b3953afa42831fd4574a9cf40447fea6,2,1980 +b3a222041fbfd2acbb5c6dedec0167e0,1,0 +b3cf295b110e66c5cc332ceb155650fc,1,0 +b4120e07ce346e6a02ffc9ba074c5267,2,24492 +b4165a27f008a520bf07d5fc3e43fa9d,1,0 +b41c7e7258df26e79e1b28650347fd56,1,0 +b423880b10399351279cab60c68b443a,1,0 +b43ea437eab701da97ed33706e1f9293,1,0 +b44f0911fc7103f5d5edc01897b29c26,1,0 +b454b36210ef97a7af01230d18ab2e6e,2,26082 +b45d470b27445daba17f93572e5675fd,2,1764 +b47070b87d435dc69829bd9099cdefb4,1,0 +b48094a36f09d0270396724d598ffd06,1,0 +b493a315c502cc9ff6aa13871b672888,1,0 +b4d72c9ad05d71f9cc8801434875f72e,2,1482 +b4dd2a43f3b00943ec40539b0a428485,1,0 +b50aa9e14c5fd53b1232ebfb9d9459a1,1,0 +b517221a2f58d3729ab96c4d40c21b98,1,0 +b51e75da1b8ced13c481e37ed56e0d9f,1,0 +b544c2873124131ea902f9953a4360dd,2,978121 +b570131e0333d4dd7e900eb7b06986bf,1,0 +b5748951600502ca21d82d1f94a0161e,1,0 +b588a88717cceace47c076e1cadac849,1,0 +b59d32b0bf9b00b5b84f1be80c1d066f,1,0 +b5b56dd8b74f2043ba080432d2753913,1,0 +b5c5ded50f33308783d232de354fe772,2,0 +b5c87eea65d2e473b16c59c3fdf89a04,1,0 +b5ca783c24c0ad8ab9e919e836274ab0,1,0 +b5da9697d431abb6378d342b10957653,1,0 +b5dc256ff63dd1ac9207dcb0d002d872,1,0 +b5de44b8248ad74637af9b02b8731fa3,1,0 +b5e9b8b1a8cb68a2cfac4e21c3e372f1,2,21025 +b602f9e6057cc54932fbcd71064ae7a6,1,0 +b60a9305d41f2ea475072891562b6037,1,0 +b60dd093185e2b05257370046d0907b3,2,1849 +b61c6c4b1511efacabde6a9d65449b11,1,0 +b62945e79a31d402350b6f3f403ff6c9,1,0 +b63b3f38b8aacb47901564bfccee469a,1,0 +b63ba56765da96a530a96ff05549c187,2,4692 +b63ca407773922128120a1bc959d01a4,1,0 +b63ccbd80cf96f951f53fae7667bf0e3,1,0 +b655df93a39b4ff663f768ef1eee02ac,1,0 +b65f1d4aad2f8fe5f29c85da6002b50c,1,0 +b666bdfe74fcb14e02dd66e06d527eca,1,0 +b681e330983bd1e525ec3bd7d489b502,1,0 +b68710fe3da0cfb68a7441bb7e2d85ea,1,0 +b68bd3870389cab5d85b5097c39bbd92,1,0 +b6938c68e89c4b286ac1f425820f6196,1,0 +b6a7e4fa9183e74b5767952cdca8f010,1,0 +b6ab2b40ec4109094efe68832736596f,1,0 +b6b9f338b315e419a4a90c5ecbf5d1a8,2,22500 +b6d5ce9c0f1aaaa50b95f9da2b882ea8,1,0 +b6f9dd84a6411ee18487982a1393ed69,1,0 +b7108981ca19261d51ecf4950916e1a7,1,0 +b710e87a91432855f73094e4050789ca,1,0 +b7177306c27e50bc9130ca96b44383fe,1,0 +b71bab93e55b23a08f3d2cc512050257,1,0 +b73aee35d6201c9f43f9ed65d22e04c3,1,0 +b743f1c54cfb9fa21e84dd98b49db000,1,0 +b7582a6fe8166e2f0e8f34bdeac304d2,1,0 +b75a8cd468b134b40b936a6166e0e9ab,1,0 +b761963a769d84601bc05dbbbe2861d3,1,0 +b7662921df829b2b334d16aed35eeeff,1,0 +b78f5e1a5bdcca8846293b51317ef89d,1,0 +b7af14afe532035753a42293d0ad1a65,1,0 +b7bd39f9ec8fbcef0086b266e498ba61,2,930 +b7bf9164b0ec74fed596442effa26359,1,0 +b7ee1747c149d9121e7eaaa526efd8b3,1,0 +b7f318ce1885530b07bc9aca2ebccf70,2,35156 +b7f5889c29ffd63d17a5f5b00f3f47fb,1,0 +b7fd2d883931106292cf065f1464ec43,1,0 +b80eda2f1b353e16adef99fc43b81fda,4,3046292 +b82173108a40f2072c06b3aa7bc9919f,1,0 +b8305d80e25d3f2ec57cb92866a2beb7,1,0 +b838dd9bbfea9d29fb01dd679f23d59c,1,0 +b840610f7110fcbb24f01676dda52c87,1,0 +b869437f87c9a86aad1a76d9d3fa8bc8,1,0 +b86f50bf4d15947286a09798d93ec257,1,0 +b88c7a2351de28aee6716b9cff24f881,1,0 +b89760266cbb36fdc266096ada960a48,1,0 +b8aeb54a75a38c029111451386c12f51,1,0 +b8bde258959f11dbb2ccb7f3362351c1,1,0 +b8c1acb302cdaa31df2312d7e2b17907,1,0 +b8cc34794c9d78472b9da8e3c31f7ca5,1,0 +b8d455f760646c55a3c3fbe511acd959,1,0 +b8d6940a281f24abe00148c2df1f00a2,1,0 +b8eb9e66693c38c71f3a2e43461103f1,1,0 +b911fe0118f344ec71500e97bb4d2795,5,10218 +b914c373432568d14496a6fd786ab8a5,2,978121 +b92874b4b100035b5f2e3d9974f11f20,3,25486 +b94a87fa463dff48fc0278a1580d7fd4,1,0 +b956cbaf78e232c07d33994638cf5b25,2,256 +b9580d3f78fa465c0574a3ee7625f2dc,1,0 +b9582800b91bd2ef7aa3284f0ca2e72a,2,2809 +b95a560d49589539381c8db26fd3f1cb,1,0 +b971be138036b84194a755c54de9fbd3,1,0 +b97ff3823d2cc7ee368602f9c70f440b,1,0 +b98696eed74e4af81b090ec5b486357d,1,0 +b9992b1517291cdb7859b574a28c617e,1,0 +b9a03de704ea426f63bf03b8b27347ef,1,0 +b9cfccccef002c5baa8a87868ac91f4d,1,0 +b9d0383856c3494ff7c8aa29ebd98dd9,3,0 +b9e7add90ebe31ab6e88d6cb6c14a39f,1,0 +b9e99ea638f598caa9dc04a367cb825f,1,0 +b9f931947710f608c476840d5cd32e8a,1,0 +ba02e2f37f13d80099a67e0e0fc7f242,1,0 +ba2b3ad4da6626552eb8357483a97cb2,1,0 +ba334ceffc12a363b21dbd507dc1e105,1,0 +ba4120887dc6af91028e20fad869091d,1,0 +ba477ac80fe11c296ef5db8198bf288c,1,0 +ba4af972c3cce600e2a89afb67a41576,1,0 +ba4d923ff836b832c730b5ac6cde038b,1,0 +ba5c72b9740211b560326bcdc45809da,1,0 +ba7975bb3b969a36b8c7978b4e5d1188,1,0 +ba9db7741094e3f84417f9d313d2cabd,1,0 +babefa94a7b82bacbd035e662451acc9,1,0 +badc912ed05a0e591cb51aaddbc32ad1,1,0 +bae7822c468ba303cdb62a03ed3d6e8a,1,0 +baece3c7eda8103c1365f4abcc1e2757,1,0 +baf7ebc276478e8bda1cb73749ce8ccc,1,0 +baf89d460bd1c0b7ce21d0fa83cf8da9,2,16900 +bb008fa7b181df68b8fd1f7d167a97a3,2,16641 +bb066fa597df8a76ae620dc7b0116022,1,0 +bb25f0fc6cddc01991921d0d7db3f675,1,0 +bb376ebac2942e14373965b30876f33b,1,0 +bb5633696285f5a42d4f8b89a31e874c,1,0 +bb60a1f3fd3a8f1ad4c3acf08c439eb6,1,0 +bb6c9830fb2a8fcc55e12d705aa09b0a,1,0 +bb713bf959483817b2d47f5220623c3f,1,0 +bb9c2f4d57a01e6c74a25b90b9c929c9,2,79806 +bba9ca73b8eb3aa828549faa6ebb171d,1,0 +bbb6d21655c6ccd9b6f3bbc6ea9dca78,1,0 +bbc13f4a9843398a131eb029cffe5aa5,1,0 +bbd1ebfbf9c265e136c26df200b3c5e3,1,0 +bbd3aabf4b15f6af503a7b9f980ae4f6,1,0 +bbde0ef1a7c7e817ece73d3be15a6ac5,1,0 +bbe7dfe9215d037fda80e6029ef8b531,1,0 +bc0fff5430944ef7955b73e2e11ce1b7,1,0 +bc16b8f6e4577aba5058f2c96695d148,1,0 +bc2497a0d4639c3245e5480a1079db81,1,0 +bc304f0347ad62af107d7cddf6747fdd,1,0 +bc46fd29b4646612fe0ebc7d42f73c76,1,0 +bc4732fabc753ffbc1c25dc195476a60,1,0 +bc5433842f60c54256dbea595e5332b5,1,0 +bc6c22d23caa4cfa4f9c1ec186ecb464,1,0 +bc7570dff0ab21af870017f8be25282f,2,2256 +bc7d15157115094cb23160d4df6dafd4,1,0 +bc8f5e35cd51f79526c5ee16845e4f0e,1,0 +bc9dbfe40ae3960fdefdc6a626361062,2,729 +bcac0b82d5ced17308aa34b87cc67eb2,1,0 +bcc3bfce52744184bc339bbf7d207a9f,1,0 +bce5c8e0dc3540072a9228b75ebb3590,1,0 +bcf0512a1158930c8d95d13b16b2309b,1,0 +bcf103fdfbd9549c101d99cf7584177a,1,0 +bcf68241e122a6373e6e77f2bdcbeef9,1,0 +bd290afba73d74fd08c0b0316f84d691,1,0 +bd3a240db70ff672f1740c039e615852,1,0 +bd5345a4c6cd948e83bc26ba7115aa99,2,136161 +bd5561e2ce80ada0cc17e6dd9d55e697,1,0 +bd5a6a1df954e5500d6f766f7518fe19,1,0 +bd6272761405e3e8856c4b82efa0d5ee,1,0 +bd64186c9ee0891fcd8a5e709f79e640,1,0 +bd6d27671cef7ed07af3750d700281ff,1,0 +bd738e5bfd5121046a68585f31cb03b1,1,0 +bd7397566600346cf73c7f3eb7f6372e,1,0 +bd7eaba543e4acf26b739042d008df84,1,0 +bd821107cb928a221a6c6aae16b30502,1,0 +bd93c0e140de0905f42bdb34f6fbcc1c,1,0 +bda8e836e6fb352e766d4fb9d17c7d16,2,6 +bdadbeec9c38b9690e15dfeb461d0113,2,1 +bdb5c2a514536efe1b1c526648545eee,3,33507 +bdba6cd081c5091e5c0af1e477fa2f2e,1,0 +bddb64063aa9085330b2b85283975afa,1,0 +bde032b0cc473c411ad372eb1d9a59a7,1,0 +bde4a40e0691fa636fafcc54eb91b074,1,0 +bdee0440e1df5e96e6b224d5eaa9d436,1,0 +bdf0eda8c21824bb05e52407255eb45f,1,0 +bdf34ddbaebf6dc97f61681d47f90fa8,1,0 +be0e073ca162ebfeaaecf630fbe502bc,1,0 +be2c5f641024b406d201b61c85e09022,1,0 +be32edeb201a551ed98279e91b89f1f8,1,0 +be43a1efa6de23e58f2fcf94ab9c73a7,1,0 +be445c24736a3c48d97a64c498b2b9b5,2,24180 +be464771d6f3338ae8168938a569c226,1,0 +be4c764e92dda55322399ec699c25fd6,1,0 +be52c89dff039897756f5b10a8aa4c76,1,0 +be5b4f213e9d4805cb0347071ede303a,1,0 +be7c5fde56a6a92afa0face4384be696,1,0 +be8dbf960fc5384154476dca7f79a8ea,2,1024 +be928d8bda64337532bc1612bf885f63,2,100 +be95a3bca96fe80840b46e7c95c54508,1,0 +beb9349f4c770ce2691afcf91e2e8511,1,0 +bec0a916d6ca06bb31a9de6e9b273ecd,2,8100 +bec9506078214592e0c0a8e0a61b9ed4,1,0 +beceb6cdc0166dac679a916e5388aa36,1,0 +becf8f0178eea25a70c1d50107a1bcdf,1,0 +bed0a6d9efbbba850459701a4324a1b2,1,0 +bed3d1301419f796779a41603e66e5dd,1,0 +bedb98c7349c44dbd8d38a52b1805465,1,0 +bee331995f71f58f88087789d71f10d3,1,0 +bf21e26efc1a3b14d29df7410f6ed463,1,0 +bf3115893b0f31d253dd2e3a6278e90f,1,0 +bf3f3342bbe77a7dadb7a995f737ffcd,1,0 +bf43c79ea7bfd29ef011d070fe161b63,1,0 +bf504b6507bb7df1bf2acc4016d93e8f,1,0 +bf61843dd311be92508f2290cd314d33,1,0 +bf828d8269703d49dd2446bee41738bc,1,0 +bf8600d84892fe5871041050adf8802e,1,0 +bf96757dbdc1dc4492fcf86dcd01841f,2,1190 +bfafb03761f08fd192dbeb4288d9d088,1,0 +bfbdd3f5d1075814b4cb2b56411f5d7c,1,0 +bfd980576a57f49bd874b46590649ead,1,0 +bfdc31b91f69cae56fc72ec6dd81cf00,3,84460 +bffbe0ad8647d98f4637328be8d758a9,1,0 +c007002c9ea028a58c567e163d80bab4,2,930 +c007ca09106370f3d90e77627d4bfc6e,3,121624 +c024fec8ccd2b2eb409026c35f36108e,1,0 +c04474021e1872b1b28f07afb1a2c9a7,1,0 +c0463d63effc54c521b62561e8be2660,1,0 +c04d4d8542063cac5fd0f23b841a8482,2,84390 +c07d65fbd73e72e8782aeac6e2847f1d,1,0 +c09bbbeab6d89c8fe7c851d5ad6e3d16,1,0 +c0c2cd8d516dbb67d7ebeff99e22b171,1,0 +c0c3db34554ea199f5b4983f0f71a2e5,1,0 +c0c73d8d01c3f6dbd3d3e15eebc0d3bb,1,0 +c0d1fae5286f918a047724dd7d5e9f28,1,0 +c0df65b660b3d07769763c82fcdcb65d,3,12550050 +c0e3f860f9e6f89485ae80f63178aeca,1,0 +c0e908b85f06ad4e6c29c810b8d28d02,1,0 +c0ee6e0f5c0d01c7d2ab0b1743621c02,1,0 +c0ff21c7760641cce8e9171e37d80461,1,0 +c10190c0aab2e19a3c15872a04af309e,1,0 +c108d5f38f1cd9364c5de8166b55483f,2,37249 +c109fd0a6996233451b23ac3bdfded06,1,0 +c1105ac004db60eadb516d89cb173f9e,1,0 +c11e95cebd9295711467e41c0b82eaf9,1,0 +c12ae409fcaae5400801c9aa3e86480f,1,0 +c144d6dbf310fa477fe3b12746f66009,1,0 +c160e17666522f175ee88b9093a18174,1,0 +c1631001d534f1c3e27c158fea475f98,1,0 +c18ab92fb29c9b8d5714401e73b7b6f3,5,237109 +c18f806a86f94c637dbe0a922d6d9ff3,1,0 +c19729fb78807e5f8c3ac879f5db04e0,1,0 +c1a2340ec188c63b48f0b3bc5dfeb5b2,1,0 +c1a7359ddce1dbcee886ec798ef87d51,1,0 +c1b09dd8b52b480085ad4648e46ddd68,1,0 +c1c04ac18f5f1f4994041f0d00ec7e96,1,0 +c20a1d5bd6dd8d9e9a85c43dafbb9aea,1,0 +c260f52580baa15e8afebf90cb51bba4,1,0 +c28a32d645cd9c0a08b690af4a589f87,6,5971423 +c2a08d24d1f5d28a092bb91e1cf96237,1,0 +c2b17ae11c477186db044b9595d6cc5f,1,0 +c2b26e5e3585a10fb6e08f978187380a,1,0 +c2c75e25fd3ac4a12abd2ebed80bb897,1,0 +c2c858834c938169eed3929eb781fc34,1,0 +c2ccd77fd0a1ed9eb07289df0a229a0e,1,0 +c2d1ec1a70fb90b3eb866be969841e42,2,7921 +c2f60f453dc7c2d08e4efa573edf3a78,1,0 +c3035e240177ca535a52f79594b48e61,1,0 +c306e22646f6729e748664ece2db083b,1,0 +c30c9b69e031e32bd3eb97d3b42a784e,1,0 +c312315221beb9bb1c4fbb6200375ff6,2,22650 +c31c212d263e8b8fdd4ee2ef3a914a99,1,0 +c33e0bb6f8ae7881374b12ddc7127a1f,1,0 +c34bfd5becb0d2571722d7031d618373,1,0 +c3546d39847e9ce45ffa19278cc6a13f,1,0 +c355af61b6d47960aee73e76c75fff7c,2,0 +c35bdb4877489fac1be626273089abf2,1,0 +c36d0144f1aff9f59876229e2e16a15e,1,0 +c3703aeaad97e8f777c2c87ab3fe0f14,1,0 +c37950b6393b01342057f6a51e2fcba7,1,0 +c37e079e59a1616ecee0031fe966cb5e,1,0 +c3833bfbdafe3576a08b9b5bb5c21dcc,1,0 +c38a9f35bf527a58b7e9ec284cb8467f,1,0 +c38c7473d9690b5a45b15d4d6f91b530,1,0 +c3913305bf411f403e175df720275596,1,0 +c39ae010b33e39fb1c84f9e8218d3a88,1,0 +c3b08bc1ac73b8f5bc7c76ee019d1fa7,1,0 +c3babf87fb51308b87e4726122d325ef,1,0 +c3c94fb30e4930878c88f14dd05815d7,4,15596 +c3e5e184d8ec968d3c3e7172dc35172c,1,0 +c40c42049548ae89392517327ff87eaa,1,0 +c417cfc533aeb06c7b6879bd90652120,2,252004 +c420226e90d42750c9eb6eb348065f94,2,763876 +c43de6096643982faeb4c845fc0bdfb8,1,0 +c4624aa86385a77aac0eb460d600a059,1,0 +c4901e8428afbfa2a50483cef521131a,2,62250 +c4944c0d57da1c906416ada73ed36cc3,1,0 +c49bbe45bc5e61d5ddcba3d5aa1161b6,1,0 +c4a24b4e74d7a3446a8febc30e284f01,2,400 +c4a4fa982dab39c21f0a38a5bb440a2d,1,0 +c4d17089e2a7eb817535beacf191a551,1,0 +c4ebb35889ac41dc3345b4fbf58b43bb,1,0 +c4fca2b4d8f3628e618e0ab60a339ad0,1,0 +c513867b9f7a48bda65b468348505291,1,0 +c5249b4214d3ce78a80231667991ebe2,1,0 +c54328e5c462e949e515082894cb3e3d,1,0 +c543955efe9fad7d2b01432f7b226508,1,0 +c5718b54b56d2e376ef6971bed50787f,1,0 +c57432d44e42f2f2bb257007033a97b9,2,12656 +c58c4b4cf8fe79a587f90b30b02b825c,1,0 +c58fd7a2783da5f24c7d013af2c14095,1,0 +c59d87d147f2d9b6fef1da4dc8ba034e,1,0 +c5c4b669770b8803fc0a86ff1fad80c3,1,0 +c5e72e2780568a5914ff8c74b7a85abc,2,8447742 +c5ffb86674f9e5a7ec086d2f96c73d61,1,0 +c6156a958a0372a9d8fd95ad0e14c875,1,0 +c62795d45ee36ccc731db2a19973fbf4,1,0 +c63f76f8209ef1ca0effaccf1145b356,1,0 +c65362c312a5cb72b302a8eaed0bdb7a,1,0 +c656af735c38470210b9fdf8756e1901,2,44732 +c65bff913d7b01be2feaf8f5295872a3,1,0 +c6817c2e5f566cbb8a13c6d2958f49b0,1,0 +c682ac42523a6eed85b9ed87287a2e79,1,0 +c69632734a8122df44a3c5f7fc0a5b36,1,0 +c6a3f3cfc30f9dc1f508d7ff5dff30e5,1,0 +c6abc015f7b59ae4f3b440079f38fea7,1,0 +c6c21973be5e6396a33f7b2e19f2e2df,3,41497 +c6d25e5c694a9ebd48381e4c39e7c943,1,0 +c709a7003176ebe42d9ec0e3797e6393,4,20945718 +c70dffe2d9e3679ac67d4d51bd13f8a2,1,0 +c70fff35015c7856fb37309ab22c6119,1,0 +c7154581202deb9590d4e8c07ac3fe09,2,380 +c71c8a25efc5b806c10e8e22a3e3e46c,1,0 +c71f22f0e863a4153d622455abe48dd2,1,0 +c71f60155dcd36c16dd2b85f22935c62,1,0 +c7425ea0b20848cc297a59c2c6e1f584,1,0 +c749d85764410d02557868477f2837ad,1,0 +c74dd6e81c39c3bd14164b32aa4a51c8,1,0 +c7594e523a00ac51e7360905af39768e,2,5491992 +c76849a895f6dcf8c6a48bc8848e0e93,1,0 +c776272987a8a324888f948ade5898c7,1,0 +c782340f2b2127158fa41a9707b36fb1,1,0 +c7aa3532255f540c81f1a2c1cec0c913,1,0 +c7c67894f1832c68aca91b72ce784be1,1,0 +c7d0b4245f6854e5bb66d17459a737a1,1,0 +c7d208e6e817fcffafbce1ddbf7b63a8,1,0 +c7f12d1174e4a5d2e7ae805ee474f1e5,1,0 +c815b00347d8cd3d889ce9c5be12b8f8,1,0 +c830e04c546b2bc74c62faa95ea7e8d7,1,0 +c836b97742eff6b1996167e83c48b451,1,0 +c840bb8191109d2ca4f83db009567dc3,1,0 +c84d5ea9a3b2b3a210f80cf73cf4df39,3,6292296 +c851b85cd2992e6254e1ea5e4ca0c609,1,0 +c854b1f9a31ad9cbb156684c90309ce0,1,0 +c857e9d35624f78a3bcd6875586e024b,2,3347070 +c85950339ac13f54d133fbce52966059,1,0 +c85e0f296cae2a97d1131f48a51106eb,2,41412 +c870e1ec79d03f3e37946dfe001e2bd8,1,0 +c8806cacdfa8879bf0057b350c017a5d,2,19600 +c889801cef9cf21ded9672b2fa300561,2,200704 +c88db2575f5d26717b2952abd7450020,1,0 +c89617229bd26d03084c969de1a65fad,1,0 +c8a0969e82ef3bb1aff602991067f0cf,1,0 +c8b831cf9e0c0f83c042a1be951adad7,1,0 +c8c8e7510c0b53f4dbed676bbb61da75,1,0 +c8cd16255e23f77db9f4d212106d5130,1,0 +c8d7db989046276ea139f602dcc5f42b,1,0 +c8da098f187ed0f780465f64e2981ed0,1,0 +c8f28f17d526d55b8001bd22bd0e1971,1,0 +c924405f9680573e30cade45b285ab5b,2,992 +c9480f4dc6dd7aabbb07de35d07a6ec7,2,3364 +c94dde2ee554e9e73f585b69b9b66af0,2,21462 +c98b36cb2ee00dc7ed59b1ce4826e391,1,0 +c99d157cd6ce6831c4ed818569af3508,1,0 +c9bfff64f44fc4e2e9356a7e8e5436a7,1,0 +c9c9f57123e6fb2008f18dc9137271ad,1,0 +c9ebf883d4f4b9dbfd09c4be427d9662,1,0 +c9fbaa797a824132a06cfc90ab343f37,1,0 +ca0735b261c5b9a84df637d6142ca817,1,0 +ca080cefbfd39fe68bf86f7ebc4f01dc,1,0 +ca1858eb405c276a2f581edc9e925d0e,1,0 +ca33a4681e3965efac4d528d4e963970,1,0 +ca43e866f15ab4bb1ba94dfc86f91f4b,1,0 +ca4c3d831be10a2e65c811c97cd69d73,1,0 +ca50d00d35d5c71482518d9c80bd1c81,3,2688304 +ca7a7b9af3e30c04f8901da75034ed22,4,78675 +ca9be49d364851cdf6cd4223137ff053,1,0 +caac1dd22e2c2bf98539d59d5e111abe,2,16512 +cab3336c171094a26f363ba324e6a3a4,1,0 +cac04abb22c1c2c0d2f67213775c3d98,1,0 +cac80906264ab465814cafdc05e30a21,1,0 +cac80fc408a739e35b7cf7eeb9eddf42,1,0 +cad9f001771070202effdbbcb49ffc35,1,0 +caf004d9ffc8f5c0fc3b5bf2b9f591cd,1,0 +caf303f43fc8443a0d815a8b83c26daf,1,0 +caf6b12f9eb01d02583d5a9a81e054dd,1,0 +caf9a8c0994a091a9285d9193dcf5c1c,1,0 +cb054b2f20650fef3ab947b0e7712395,1,0 +cb111784cee244ac8758749e476a7508,1,0 +cb1775ed735c551a7e71b2f4fbd82a9f,1,0 +cb28f086f99b5b7b61b087870fd71493,3,1615388 +cb2de61a521a8547b7c4dc2662826362,2,12656 +cb326fe9f7af2b81c53a4b69e6aa4c24,4,19200 +cb4760e2c76a3dc58e32ebe7fc4e2640,1,0 +cb4c2b2b257520977e5f0636dbc76b8f,1,0 +cb4c7e7256d481a71f63d7b9bc2895d8,1,0 +cb4ce3610c2a0cf23381d4fdb23f80f2,1,0 +cb6031b833653f3727c797f6ab95e368,1,0 +cb90a825560958eee6bada1fc3461c7e,1,0 +cb980c805f19cf88ec46ad46798e43cc,1,0 +cba5446d897420cdc035ce57d889cc5d,2,6162 +cbbfae8d22d90f72f2565d8913c45282,1,0 +cbc9a3e18950b67f88c8ed76e9ab432a,1,0 +cbe05d0ba268a7188af6db536a5651a9,1,0 +cc0fc417883144a376ff6ccf157f25bb,1,0 +cc113a8e922020506c11c6594fc0bc8a,1,0 +cc1cb463e2a1fa44d0d6942552810d60,1,0 +cc242d99b88ad949dc63b880353ce3b3,5,0 +cc2c84a81648ca2bac1f40c8b9dfcd5e,1,0 +cc3350b52fb1608da8744bfcb7ec961a,1,0 +cc46c27915f2e1acaf5c17050c073c0a,1,0 +cc52f91485015b404e90b92ff1114625,1,0 +cc7955b38a7dc49eaba0d50745bec001,1,0 +cc8849096f9bd9b76cbe22e65c0dd13d,1,0 +cc9a5f6c7bdded630dc998a82c414e5c,2,5329 +cca568629d15194302e4a90aa27dbac8,1,0 +ccad7be645451ac0b506f8a6faa4f143,1,0 +ccb52ae2f8dc26ebb40f7f55d944682f,1,0 +ccd54b43efe2c929753bf5a825835844,4,4485252 +cd1ba58fdd74f24040005fb79c77e9d1,1,0 +cd2916b0070d1373e833f6d5ad8b0794,2,10712 +cd36efdd8939dd7a575d5dc0ac391c48,1,0 +cd3ca2360df86c48854348d3fd48904d,1,0 +cd3eedab22df362049d76c9f91323db3,1,0 +cd45a5cbeaa69eedf2fbe33a76f3ba7b,2,23562 +cd5d94d2c916baccfe5f9dd53e6d7dcd,1,0 +cd616bb29fd521aea5e285da574ccafa,1,0 +cd64a25d839965870a1da0e0890773d8,1,0 +cd6c05deaa91ddfb7e6bc4306ebac1cc,2,21462 +cd75109a757b9255b56e198ba5e4e394,1,0 +cd8e9e7e5feb23bd9ccbe8857ad9abdc,3,5688 +cd9fa43062cb9bb6b08c0e03f908e60f,1,0 +cda665c6ac2ee1289cf793561d443756,2,24806 +cdc0400dd14bf9f6e21c20c0a77da9a3,2,8476832 +cddf365ee8850be26e6d22bc00794dce,1,0 +cdffa137899694c3786d12462795e19b,1,0 +ce0f496d574709c06f6e0d2ba24216cb,1,0 +ce198b46e87c632b1944f774db26f86f,1,0 +ce28d9f86f51924779020f03d1349fc1,1,0 +ce2b82c15d95ffde90ad38e5b287fe37,2,0 +ce37fb5ff9387c72b027103bba8677aa,1,0 +ce59330ec0c9c8c86e940d712ff63573,1,0 +ce5a31ddda35d895fbdf77b6e19a3cf7,2,2970 +ce5bceb908078b0393332d1fd3682390,2,27889 +ce808a12a5746259d108bb7aba47aee9,1,0 +ce824e0178be69da4a67da325fd738b2,1,0 +ce8308ab5ff468fda4211ffc4e6809a3,1,0 +ce88a8d7fc1479e2b23fe0a9e30d59e3,1,0 +ce9ea0ccccd502401172739aa0a79928,1,0 +cea0f41020ee1174864d2414ee7790f0,1,0 +cea70304a5c4a9b654164cd70557cd8a,1,0 +cecb087df5faeffcd4e6551f8b39e151,1,0 +ced0ce7771760f238c14b84025c84f16,1,0 +cee89834047195f849ace58d7900c0b8,1,0 +cefae75274dc3e1ffeaff5635eee0f62,1,0 +cf2c2f8e58511b48193186d0a858d7ff,1,0 +cf3a7710faef1cc4d63d1fda9cdeac25,1,0 +cf4d33f33f88d177476780cf0f4d4136,2,188790 +cf52f354e99094e4f1280c80ab97f289,1,0 +cf5d3efee1d5996ff670eccefdd8c8c4,1,0 +cf6c9e450532cd18a8ee0e3186336947,1,0 +cf6eaff128e759b4a181aa09f887c9b3,1,0 +cf85b4ef43701bc35b61cdd5b45c05b1,1,0 +cfac033866a51bc45580a112c99721c6,1,0 +cfbe74ea632a5dc7535536f13260d75f,3,4677 +cfc4b256cdea1e6690466b9f13b34cef,1,0 +cfc60d3d8ec650a24cddfbf1ce965ca6,1,0 +cfc9a621edc4d96df95b0a43ca4cecda,2,15006 +cfd7967141a3c9b2100547f3846ed8e0,1,0 +cfee99f90b1762970976942425e2d82e,1,0 +cff36649dc23f785755a6937298a5818,2,462 +d00353f42bddf1226cd4f8092ccf872f,1,0 +d00d66a115ba20eec69d3c90b935652d,1,0 +d0144b7065f9c7c4c8b9cf783336017b,1,0 +d0165fb4c6cc11ee5e8b2735a4e54317,1,0 +d03d3be9cae8e26de7c29b369d2a44b3,1,0 +d0403e916ab5b01762eb94ff6d7e646d,1,0 +d04a636b4f788dd68d40c527ca9565ce,1,0 +d04bc348be5c51c6ae4992769c066fe3,1,0 +d054ccb453867ad94679dfe8d636ef9a,2,13924 +d066ddffe015f7f9c17d17ac5d30bdd9,1,0 +d0695c627c313d194f4ce3e14bfdfdd3,1,0 +d0697cc298f3fd499513198d706d32c1,1,0 +d0779b74ba8edb4ef5dead4ce065c99e,1,0 +d078638e276ed43752a9b0e2770ad6b3,1,0 +d083e8eed5a98da16c8726048e6589c8,1,0 +d08866971a046f44ca285c6beb32718f,1,0 +d091fe364eddf33c3514db8db701dcf5,1,0 +d0a71818e4a664e94ff10f8eb40937a4,1,0 +d0b437657d7b188d216668d5a9abbfda,1,0 +d0b7d75014136ebea2b9dfffbfabdc34,1,0 +d0c53f58ab1315d145d72357ebfc294e,1,0 +d0d84ef5a07fe5a8a181b445771522bf,1,0 +d0db5afe2191963e7d4332ebf7f85b27,1,0 +d0efe6d5522001320a4372da93769920,1,0 +d10e78eff303de831aff0a556a536a0f,1,0 +d11076dc6cd4720a1fe9add55d2281aa,1,0 +d1239d721e49347c9804bed0a6db56ab,1,0 +d12f9cb4e8c278ab3286ae03ea30313a,2,39204 +d130d596db644f016ca8529c8abf46cc,1,0 +d138dfe2bd5abdd66b951e505e6ce634,1,0 +d144251f58433c0af02fa1a09ce64d30,1,0 +d152387e19e8c4ffc403803d9ba2fad8,1,0 +d155109973f1f96a599a7835d302ee37,1,0 +d15c30900ba10388c9e7501d49b86ebd,1,0 +d18ae2c685fba1415289085e29172043,1,0 +d18c1a0afca1f801ae54383719bfe773,1,0 +d1ae57632783583165bfabadb3e79806,1,0 +d1c2837458740224831474440913e1ab,1,0 +d1d641f642bfb6860370fe6951d7c016,1,0 +d1ea28c116c1622da06782aa3284a342,1,0 +d1ea5151fe3985e86efc005320ce5430,1,0 +d1f68986838c7c4d632616adf8a760a8,1,0 +d21593034fb6164181ffd394e7ab1b99,2,29929 +d2265a7dad91fc1a7ee6a094e7b60a14,1,0 +d230f77d933175b69f4d3e6989a423f1,3,5031000 +d23a79cac4a5490c345f9863233c0abe,1,0 +d23ec0ce3816137b00894851f276d3dd,2,1521 +d24e9b1ed5138a5dd3ca548ed52d7c46,1,0 +d2509132d2c82619d2c7f308788d0af4,1,0 +d2698aadbd96863bd3bd2628e6014a36,1,0 +d27dbae89c0628e3715eab0bbfd1406d,1,0 +d297752ebf22627f909f2a5500bf2ea6,1,0 +d29ce110c934f09614e651ac38a88d8e,3,611760 +d2befd5eec5dc7084406e8e9f232823e,1,0 +d2c046a25844b3574ee462690619c2f3,1,0 +d2e23679ef2789bd05fdcc1ce2f504d8,1,0 +d2e9cd9c82aa7c0eee9785cfa4ff1299,1,0 +d2ee7e6a8d4a004033c157e12922126a,1,0 +d2fe267c26dc470113058ea48015af79,1,0 +d31d6f77b244b3114e7d37a9630897bd,1,0 +d3209748ff443621d40efe2629b1ced2,2,42642 +d33f481dca9396aff63be2ebfbbe789e,1,0 +d3428b2c0f1684230f5e93eb97cef440,2,4160 +d345c6ede0a6e399b1921e6e0d09771b,1,0 +d35b204200c059c702d16639cafc039d,1,0 +d3727580e16c5d00c8fe894992f982dd,1,0 +d3a52afd9fa04043e90575e6e1b01f06,2,506 +d3c37074ddb58c94e5955674ae994e36,1,0 +d3c8d10a93ee25028cae4520659ffee4,1,0 +d3ce80a17be91b35737ce6964de65f7b,1,0 +d3d3ac90213ec9a8b659ea678866678f,2,95790 +d3e162ccd42cceda49e15bab20b0a14a,1,0 +d3f293cc1263d2f81fc45fb78ec9bcbb,1,0 +d3f48514d7c8d253cf5a2706f9827125,1,0 +d3fdc38ef5f3f8d537ff13f056cccd35,2,28730 +d403c37d53c5df5f3d5aa1d3ce44bcdd,1,0 +d417a6e1758a7e321461881924f8e4b1,1,0 +d4186796e44b7902b7e6f54c0d7afddb,1,0 +d41b470235f30fa6816fecea4aca7a12,1,0 +d41cc4a7dbdf57d9438b8d5cd95dc51b,1,0 +d41e05d3f9df1ed2de84a50c0caa5ffb,1,0 +d442070efa4f87142edb9f629b5c3b04,1,0 +d45882c7e2dbe1ae49182bc9f7657297,1,0 +d46c26cea4af6bb841f2b9d7002c8b0f,1,0 +d46e5e60473530db2e8f1ffd9437ffdb,1,0 +d471596adbc31e076e657ec4d12e5d3f,1,0 +d484e0790a22aa4dd9d57ddee472502a,1,0 +d488530062b3ef9a08754a4b9a6e4e70,9,1015787 +d4b02dd76ff488652e24086a540c6f0e,1,0 +d4bf6d99b6147efb6c0e3f0b89a29c4b,1,0 +d4c8f43ec3278006a389275d37077208,1,0 +d4c992bda7979b23cb1620f702e83f60,1,0 +d4d27fdfa20da0728ac2e1beb54eb695,2,3364 +d4dcbecf0342153677596b6c4b6a2185,1,0 +d4dcdeb612d98d99ba9beaf778bf5a1e,2,13340 +d4e0dcd9dbdc53795274fb80d1b704ff,2,49 +d4e1358d7a95fd32ba38e7c11e37529f,1,0 +d4e89123275e68043ff39c7507daae94,1,0 +d4ea29cb034046f9f178e66fed78c7bc,1,0 +d4f341998d259611b82b8f38da50e414,1,0 +d4f95ba06ca2cc78caef334675b5d2d5,1,0 +d4f96f0af7a1136071dc10c8b41a045e,4,0 +d51656afd8b7f5e0323747bdf6345173,2,8836 +d5167600987df4a3b73a9a25bbde8786,1,0 +d52005c3b8202ef39293460fd6d2a985,1,0 +d525233a05ce3d88948b9b57fb6827a2,2,2809 +d5336d69db887c8d3c38b18101cd9bda,1,0 +d53d915868c0d49f53d73f2ef4d6cb91,1,0 +d541eab8de2c66a44cd70e2385bd9846,1,0 +d54a1d8b04b17d6b4b7513fe787e36c6,1,0 +d55f18ae2cbd7bb6fbd415a863f1b860,2,110 +d56f3d629cb60650d5c0b267a3a42258,1,0 +d587286a28cb62589de8aaf6fc12e373,1,0 +d59f3e80138e0f13ac69ed2173851f41,1,0 +d5a4a3fd6d88acbeaf0c27c6d32d8e26,1,0 +d5b46acb635f46d7bdc44948f9327fad,1,0 +d5b8652088eda254f62e3ed42de4909e,1,0 +d5f60197d5d93abec153e1bdd18fe2a5,2,14884 +d5fc0b56bc2667504db44a28b89ecf6a,1,0 +d61a217f381bca745c08297eb1870520,1,0 +d64e39eabcb981a3a8659d876064cbd2,1,0 +d66d40bf92bd7d1cb2ab1a925595d5c9,1,0 +d66f92d67d7985cd502f7cb27fa21b45,1,0 +d6a40fefede868417d94d88604fe4f8d,1,0 +d6ab9cd42490bd5820ee4b6e90b4ffc7,4,321489 +d6c0c2add84275c5c0e0688ee772ab89,1,0 +d6e5161cb0d0d9a98cfe79210abe899e,1,0 +d6e99d3f6b084423c2182686f923879a,1,0 +d6ee75da9d933a159dcad86218188e2c,1,0 +d6f9c9cf2e24d02f82757d6338d3695b,1,0 +d7036d2f0c2853ff6d0914f155493b8f,1,0 +d712b0884f9bb07fcf4bcb4ad3fc760c,1,0 +d726262b0658d57b458edd4c4e5ee8c4,1,0 +d72f85f7a985d067309a2a9c262c30ef,1,0 +d7420a241c1d4d35cdc87ae1c86a88c3,1,0 +d7581c4077d98e38d0563601b73066e7,2,576 +d761219e01bbe2f4da25f988b8096ac2,1,0 +d776c917f38e5c7676bfc4c7fdc88e03,1,0 +d7871f7c9f92ba8c2f885c62b31d1227,1,0 +d7a916d68f49ab767ba60abcf4712059,1,0 +d7acfbe449fad0be5f3ff7f450f0e134,1,0 +d7bb718f219b5265711fb0087abaf983,1,0 +d7d1bf2f060ebd8f779235440718ca1c,2,19460 +d7ed6c8242a358241c959cea6c91f659,2,19600 +d80ea19e95e04087c4c24d2837fdd909,1,0 +d80fd68109f6fb7640cf5c454cf1708f,3,160 +d813742b8f80cd2b4b8055c3c4d8a413,1,0 +d819c2646fe709ee8dda8e23ab4c2fd8,1,0 +d81c5bddb60c47b5d7fde5a21a43f583,1,0 +d832da066b21d47bb880dc19b4776630,1,0 +d83819f1cccfac2fbca58facc73b18dc,1,0 +d864ffabf4780f4ea958e18548a1d5c3,1,0 +d8713e12ba064c63ab09366fd1fb09a5,1,0 +d87c44528ff5f2d8d79d49537f4ef5bf,1,0 +d882e196d476c8557f3bb0108faeda9a,1,0 +d8872c4a66bef21a1db6bf5946986a8a,1,0 +d88d4175acfc3d1f00ad6fb8badede42,1,0 +d895750aeecfa93900d107867845d76b,1,0 +d8af325f7eddf18a43a402192ed8faf0,1,0 +d8e7b875ca96ceba87ca7828579e7887,1,0 +d8f72cafd6079fe4305a2905f868e402,2,600 +d93b68db3eadeb7cda440e8436fbafa9,1,0 +d950826d963b6f0e7cdc43bc6198487b,1,0 +d950b3ca1d2f97def2aaeacc84b68f16,2,361 +d95fc7002ca2836b3f468a1a39d7aa9b,2,5576682 +d9600b4ae3faf8eeb71702a56f6810a1,1,0 +d969428c22d3dec78be86832aa86c57b,1,0 +d9797734297846aa3fd0bd3c0dfff5ae,3,2818755 +d984058e611a50ae59abbc0d3d022a08,2,484 +d988845385ff83c57c0bb8c97be4658a,2,8010 +d99e3a0e6c796f26639c9532573a4398,1,0 +d99f188738b2964dd763728964485fcb,1,0 +d99f2e16db4624c90062f8f88bd1c041,1,0 +d9c52f7f087e423a7f5ff4d025c55cad,1,0 +d9c9c85316195a77174f29ad7c5b4022,2,24649 +d9dda9089bc4e3833b2dd170e4ac9b10,1,0 +da04810164fc021b1592dc8b1fed6401,1,0 +da30bfae6a9a5a83cadc7eec05eeda03,1,0 +da660877a6d6b415aefc442798798ccb,4,22909716 +da69840b381127b1528ecb3aff6341ee,1,0 +da6d9a2e56d9ef2ce69d4d8c33688963,1,0 +da7a9e5d5e8c6ee725b402ef1b22f12f,1,0 +da7e34ded4fc882308b2ab69ee328a79,1,0 +da86287bf6f81a4014cc04934f38f13a,2,182 +da99c8b8ff8440250ef1fa93d0581b72,1,0 +da9facf0b7ca756ff233e33c248e0052,1,0 +daefb6676e7e71354cf8a14a3d30537c,1,0 +daf2c306db9c40d152376a6788f65fc5,1,0 +db0ad3f333b32a47a00b8eb295df23b3,1,0 +db114fe0f3de5f895236c38b9560ad6b,1,0 +db2aa73217a315e54cd7084c9a118091,1,0 +db68071c82eff62fbd6fc2ba356e4f67,1,0 +db7a17f3366bbc77d019a2229b01ebc9,1,0 +db95e831d743734d7f37afb30808ae81,2,625 +db9c4b2f7d9b0bb96f604fb263fde1be,1,0 +dbaea7466c75a46a6d0fcfc33ffbe3a6,1,0 +dbce959f532e41416186031bcfb5ad74,1,0 +dbf088a8f45b3e0a1e4aa9c9272f55c7,1,0 +dbf21c0b87f38c8c6461730fce7edaac,4,10607620 +dbf5a17b7ad0a4d52e06612eca5e916b,1,0 +dbf6501e8cd61770ae1b8e1ec7554b3b,2,930 +dbf6cc4459569592597ac196a48ac6ef,1,0 +dbfcccd0bf6a234c253d45679ccca9f9,1,0 +dc0ffbfcb32fc657e44f99fa4f304db8,1,0 +dc19cfd76c4ecedeaeaf5cd4b3ff5095,1,0 +dc1eae0a49229cca6a5c2eb965c96217,1,0 +dc21984937eb73e4c4de7f6ca257756c,1,0 +dc2e512ba93701b3b74575ba52a382f8,1,0 +dc41ae9685ad80115c6f870bda3f3529,1,0 +dc44525442f32dbcec8c833f65d50bb3,2,5625 +dc460fdebf798b7c6363a4beeb4c15f7,1,0 +dc576e47a9ac3ffbce94042556644c9f,1,0 +dc8d7e00a4db5417969124f892012df4,1,0 +dc94ccc2dafd32cc89e891d143e29bfe,1,0 +dc9737ca1f92510793b36d8ae7cb5e3d,1,0 +dcaca1dd153991ec35057c6d4fee3486,1,0 +dcc277e172757d58122d2ccb930f8c4b,1,0 +dcf2491716b475d4ecbd6cc3982a415e,2,1156 +dcf5b5a83a9848963949ab6a6ba6abd7,4,5688550 +dd0a4b2010a740c448bd83907d2980ea,1,0 +dd0b36c45e6dd7c0bbca1132041a2bc8,1,0 +dd10cf63e03f3226d61c074d9d8e1caf,1,0 +dd24f8cede11d6722e4fa5a34ffd0f92,1,0 +dd5dcec91f88d9e518cc5386b69e1ee5,1,0 +dd655a5bf318ca48d36010fce2709553,1,0 +dd74f550bb177a933b62b5d2836fa4ac,1,0 +dd8191420604dcedf2ec59a470b09b4b,2,6642 +dd897cf7eea6d6a7cc0380f78f29ba4f,1,0 +dd9218a4b66b8a0378dc16a8fba27f67,2,28561 +dd9fb38020ae211a57e53460275d0669,1,0 +ddaa30c4e2af2de865dda0e017d98665,2,110 +ddd908a2c90918db7e76f544b2a35883,1,0 +ddf298c24e5a0ff4ff50ca83a39db475,1,0 +ddfe5e2ab26e3b6ad8d55a5af15268d9,1,0 +de2e21f95835b3770227e768ae403cd1,1,0 +de36ba97894b937cd640ed6dfdee03d3,1,0 +de39f2ffbc41779287ac9ddbc3295290,1,0 +de669f3b08724cccece034b12e008651,1,0 +de6ae8c67e385b1002abb4eaec24d062,1,0 +de7066d4feb9b4002562dd6aaf6e1096,2,3062500 +de72285e220f8eda85df00c2e9ff8ad3,1,0 +de743fd318a1ae113f8a3e074f070eae,1,0 +deacc83ffebe122abb7241cd2c117dd7,1,0 +deb3a0f1d990fca2642c22f78b2394f9,1,0 +debd449f0841b79c26eb97a16ca44f07,1,0 +dec1409cb858bcf7432ea149e83ebb2c,1,0 +dec3650e71ebe7b02b6658c2cdcedc42,1,0 +deccfa6b69b800b071c387508f7464f8,1,0 +decd4980585a441914aab2d882d8fdb4,1,0 +decfdb2fbc713ecf4f530978bf4d3206,1,0 +def6aea85211cb5eacbc7847c13b6c87,1,0 +df1c19f9eca950bc0f5e15d0c5bb142b,1,0 +df3f6413806be8493d43fef87f53910a,1,0 +df42c6fcbf2badc1ea0d2e3d8256335f,1,0 +df473c09d78fb26c0e64fd42e4e80619,1,0 +df7c9713385a5882e1db0b8144973010,1,0 +df80153ba362e20438da0639d141996e,3,22755 +df85e19628c4d338b8faefc5dac5169b,1,0 +df89c202d38fdb235ca1f96b0cc9cbef,1,0 +df95028615882266460863f03e89dc80,1,0 +dfaab40f4ad9594a381436bc75c65c97,1,0 +dfabb551e93632c3d7665811abec418f,2,1936 +dfdafbcde9f27a277c51d20ad3650227,1,0 +dfe0e4da3af992090fba300c6b414f73,1,0 +dfe581b4d11d9ddaa0b6a707530e1edd,1,0 +dfeaf4b88400fdad352121de7430e1df,1,0 +dff453937db421e9559d1318fb2715ae,1,0 +e0073431273e66849f2ee7da8667f223,1,0 +e02168f5b0841adb0faa6d75e43d6cd1,1,0 +e026264f4fca64664efff6100ccd0e3d,1,0 +e039709b5ad9bc5c76b3cbb8ff179e82,2,3306 +e053e146bedd9e93e337fa1a290abcde,1,0 +e087187fb0b78b0de276cf90f4b1f9a0,1,0 +e0924dab13885ce4fbb580c19ed6a60b,1,0 +e0b56811bc48e41fc8297a9d71b8b324,1,0 +e0bc256b9029ffeefb081674ceed347b,1,0 +e0cd5e236bc86c5f524b2ab82c4abf77,1,0 +e0f11d0133663dba8f9e39e6e7e46598,1,0 +e1002aa1e5daf4354491c2684d181b7c,1,0 +e108f9ad0a0e6093a9b7e300e6edf8f8,1,0 +e1214c4abbb63002ab826e159465f774,1,0 +e1293fb6bdf4e33f29a104f4582e8d46,1,0 +e1370dd7306b0eef9c2366318852e8e5,1,0 +e13d432df441a669ceace62b43a7b3a3,1,0 +e140b24b0b630ccd07e1cf8e31bf1aad,1,0 +e14769a7659515438fd954e0114e8ea1,1,0 +e1536a4b906e74eff7047ff1020b4857,1,0 +e156aba6bdd6cc9cdfb721f4c65513b8,1,0 +e15ea76e82154fa195536f70d2a82701,1,0 +e176b772843edd4dd5fac0343556d907,1,0 +e19300d01c02b394a1d6ce9426b0b02e,2,11130 +e1972a2a2b035091a32409cdffd12a3c,1,0 +e19d52c2cb104c9df3ba61aed3291fcc,1,0 +e1a05568e5daf21005c1007ee6af8551,1,0 +e1b55fcb5037fb90494e53d2c1e00bde,1,0 +e1c0d1632e64ce6ac6eb6027a818a232,1,0 +e1d5121c29965202b3e756aa5e05d8ef,1,0 +e1f54e1e49b676112c57f268f4fbe5fe,2,12656 +e2064787c1901dfc55ee03a6f3c670aa,1,0 +e20aaae20d8270c67b2ffae2e915049f,1,0 +e24062babb6825ab21c7c50b553c4cdc,1,0 +e2488d99ddc55aec2320c592b8f8f874,1,0 +e24fb111d83c6aa91bba7d38e422dc05,1,0 +e284fc44c686c23e33a2ce35d2413d26,1,0 +e291defd1ca38ff9f4f09203d1826a5d,1,0 +e2c04657628d57c241bce2d5676bd092,1,0 +e2d7ddae7308ac34ff9f3c2e3b9fabfc,1,0 +e2dc7c096a2e37ae71a42b5a1a920d24,1,0 +e2f2f08fce62b44ec7f7b9ab85eacb37,1,0 +e2f3c18403935178aae829e807b69652,1,0 +e2f61c5089cc56ee0142d7f81b658e2e,1,0 +e2fb4aebe1be617828667f5c682ce542,2,529 +e3121d2ea8b3d0755604000fb019d2f8,1,0 +e31669d4255ba059d2da8030f54f6bbf,1,0 +e31b76fcd0a5df40c15270c8dd9cbd3e,1,0 +e321fb186791ca6bbd5012d028899c92,1,0 +e33779560c348242ef5d5c41ad98cb5e,1,0 +e34686729b78dd809dd87c48b8d49d7d,1,0 +e35bc04881df836cb147a8407102c4da,1,0 +e35c0e64babb75c9939688c30b0a80d0,1,0 +e3602efec10d9e439fa109365cbb9cc1,1,0 +e36c0fadf4421dcfdd56ce4137d907c9,1,0 +e36c5a01c7a05eb8b535cfd49dc524ca,1,0 +e385a6bcf5aa346beaa6efb66561db80,1,0 +e38e6fbc4147c66cd6bed4e93d46f80f,3,737148 +e39efc9706582b212f66dba86b3e0ca6,1,0 +e3af6229865c76e595d3bd5ced875123,1,0 +e3b064d92e639a84840805f2ddc80269,3,8197526 +e3bb64f89a7f0f590fcc8f528e95666a,1,0 +e3c340d1357616a6a2e1a5d4dc693ec3,1,0 +e3c6a7706cf8158aafcfe6c284d0f435,1,0 +e3ce602a25f713a40637d9103d071994,1,0 +e3d81262a6f728995a4864a53be1f993,1,0 +e3dc090a5d71a0b4453d93784032651a,1,0 +e3ff5b6b43b08a098efede97e79e6f4b,1,0 +e4072906f522410b26cc8b3da13953e0,1,0 +e4115d5f2f8b46db59e5747b6bb1f073,1,0 +e41bccdc657903c52278e8e81d366a46,1,0 +e41e76d55c4229fdcbd8f0aabd0fa0d8,1,0 +e4213e5fb853bf26b8fc3e3e91b49094,1,0 +e432c2ea113dfff58bd7dc42caaa50e1,1,0 +e44a34c25391326dd860413863e77f05,2,30450 +e4951d2abfe2b1cc4924dc30ac061cb3,1,0 +e49813d30fcd9e570e07b22e5b746495,1,0 +e4a22113989928226620ab848b9fe2d7,3,12970 +e4a5964e998a0f16ea05583f751f39ce,1,0 +e4a87b0f9565ea458a9ae2e77dc11524,1,0 +e4aba13d7605ab92532833dbdf173eea,1,0 +e4ad31f7645c0da24c90a0d81119c892,1,0 +e4af6ec8526050a7195d1ad56e9afa2c,2,2304 +e4bf4d9df27bb1ac408de0082c5961ba,1,0 +e4c9bf6839195c8f43bda70d559fc6d9,1,0 +e4db0ef455a8aa556bde655675187520,1,0 +e4e520e0f51992b4868437b5f17fd939,1,0 +e4ff7ab51547800114de8373a93d6a84,1,0 +e501c9d9a13c5ce3c9b3fd00fa4e2f2e,1,0 +e501d3a1a984d1ce8a3483aab099012f,1,0 +e5091a741c62c5ed1d89817a5c679335,2,5929 +e5251a64493e8d7d77e920485b875402,2,14280 +e53dd4a6bbad0f84da2cc13f5264e3f2,1,0 +e56914d862f22bbf3444a4104bcbca3a,1,0 +e570c2d303e8c32680b5a4ed88de2c00,1,0 +e583fc9238046d12e7688ee558865ff6,1,0 +e58efee8be26e7a1f3f70dd0a71877a2,1,0 +e59197411e345a596dd06961a67a595a,1,0 +e59d9464122b7bdeaffede305deb71a3,1,0 +e59e214ba46e7ac099c0f94f58e3c942,3,10160 +e5a9d7b49698b1d06eeae3ba9a072b62,2,6806 +e5abf7641c7d55740fe6b91740675aec,1,0 +e5b6b7c1623767c4dd7dc47b3525d4e4,2,4489 +e5b91510121d8cd22a27292841cfc6c5,1,0 +e5e064a7345f449b4cf1a5d32250f011,1,0 +e5e5d96235251eab4c0d2b411a478849,1,0 +e5e7eaf1f475ed96400b9efe329029a3,1,0 +e604b257e3ca44e8a9a44018f7d1a62a,1,0 +e60e8aec6a85fcbebb626540bc085dbb,1,0 +e60fde485115db2660aac8acb8569a4f,1,0 +e6106a41074ef9e4eee8211588321700,1,0 +e61ff3b8ef8efd0a5082d2813cc13888,2,3136 +e629a4b0441aa2668d86b8ed2b415e69,1,0 +e62fa5f8afa8238a2407c82769ee12dc,1,0 +e635b4f5b8dad066a4d3fdd2bb95dd9a,1,0 +e63c485e983d29be8bf17432e47d4907,1,0 +e64593c52458ca29d8d3da1868848fa3,1,0 +e652c13ac1495f6144b4c8919f7d108e,2,1849 +e65f358b4792818988a1bee539720f2f,1,0 +e662a3bcad748f7f5d5e92b20c3a60e1,1,0 +e669b908eb863ffc8ee9b3fa26c11be8,1,0 +e66af1b9b3b0d5f88d8dfeea807de9d4,1,0 +e67a488423bbd3df80962986c887830f,1,0 +e6abf5800653b457dd35166b14a80fe4,1,0 +e6cc732c3bf7bcdbcec391e27122ae8f,1,0 +e6f283fdebbd737d0a7a0d715eaf5452,1,0 +e72d86866e865dee9577beda844f1aa4,1,0 +e7329268130d910cc3fd2cce6801f24c,1,0 +e732baa99c182b1f082945e60dd457a7,1,0 +e7373c770de122d3958a04ed176f8281,1,0 +e77c6603ad72e5c64c6b29be48183f80,1,0 +e77e75ff18c7d7ea12424e238737b007,1,0 +e782276ef4a82a7438dc861c5507e5c2,1,0 +e78755e353afa0ee0006a4bcc1c185ac,1,0 +e787f7103211c519eea70f022436c08a,1,0 +e78efa42f02eed6758c276771e040a34,1,0 +e79428b675045d775a8c5ddb831fd9f7,1,0 +e7bafd6b79791c997780df259f74f0a8,1,0 +e7c5d616f2bf53a38201bd6fe63ede4c,1,0 +e7ce49052d1b481395fc314783cc4432,2,35344 +e7ced8ad83c78b7444f9e435215eb123,1,0 +e7d547f4a27f1cc9e2deae64bffe6acf,2,30625 +e7db60ae5af75bcf3a396dd309a7f562,1,0 +e7e2c807709067d472e42218a39c1ea1,2,304704 +e7e66b3751235216c9203c541cd6a42f,1,0 +e7f242ddaa1e48789d42ad6fa0761cf8,2,342 +e8039b14de52cf6e2ed80efe944dbd56,1,0 +e81dbca1a37b006477ea92411f11fbcd,1,0 +e83783d03f3810844fbca24eb6fcd3ea,2,0 +e856eeafd1ebd105950ddc1217b23c1a,1,0 +e868fac92a9424bb61d3370269b9c899,1,0 +e86e94f808ad6ba87178b1b788233185,2,22500 +e87f686f9b20412422d3cebe2830ce7d,1,0 +e886f1eb5772308cf9ef39c0eff803b6,1,0 +e88c30255f7f210c280bcef682b1e939,1,0 +e8903181d494fff2d21e731e3909dc81,1,0 +e89c63aaada1a64a9c8369342a7dea92,1,0 +e89e826a1fcc9a9e819da887afc57f15,1,0 +e8a24fbd8577fbdc2378624620983747,1,0 +e8aee2b04afbf572a6bcdc02e4f0e0fc,1,0 +e8b6090367cb50c7f253d67b3791448e,1,0 +e8c6c9c1f274cf9d364c4e3ad08b7077,3,247730 +e901dca3e49a1d8d48ec66f782969d5c,1,0 +e934c8d17d82bdad313efb5b4c5c8f92,1,0 +e94caf3089e85fbf96366c7ec6490a42,1,0 +e9564fedfa062f7aa3f20d50fde3f5f9,1,0 +e96d9d94df9a629badd3fbefee205f24,1,0 +e9834342804ce0c76136bfd90b81a672,2,16770 +e999aa8c709b5d7fd720aaf7866c8e98,2,28900 +e99df067bc3c0d9271f9625e7041b07a,1,0 +e99ff313a7f639efe81d6e997f91da5a,3,16796116 +e9a7933ad1da087d9c50e2e680cb3931,1,0 +e9c359a6c93bec1961b298cc0977a8b5,1,0 +e9cb86999770aa8f853972fac17c3b06,1,0 +e9d5e9df22da59b4f852058721db3663,1,0 +e9f36742653fd6f427d01db37c7fbb84,1,0 +ea121630a2189c3c95f076e55e4f7d69,2,6320 +ea12be1c9c071b3614ecdafbed46cce4,1,0 +ea266831e9477cce0b85e20b13aa1f80,1,0 +ea34cb8db18f0013c9def40a8ef77fa2,1,0 +ea3b0e88bbb5bc8b619c374d71922f4e,2,19881 +ea3d98fed8ae69ce0f7d783ed4bd5af6,1,0 +ea7122ae9954678d540f9b751e7332d1,2,303050 +ea80be7cc0e28b418054440bef9af100,1,0 +ea8a581abae0dc3e269d0ffc7e6ab65f,1,0 +eabe5412040e26fb2b47f6d7bf08bd4b,1,0 +eacf25c832163cc3c02cc8ef67e5ac81,3,45684 +eae143840bf7f0fc86e134802c7dc547,1,0 +eaf265fc1e76d003d97acb83e904fae7,1,0 +eaf774f16798d781d477621ac7d6de69,1,0 +eb1934e0749f5f3590d3c11681d1419a,1,0 +eb1b8254469a093c705f2db28e6cb7dc,1,0 +eb4d0557c0463ef8930dbd504a6e9c1b,1,0 +eb6620d4059d9f9ba6b0fb70fce45e05,1,0 +eb6be5f80f126271dd01d9f59123b47a,1,0 +eb88faa0c78ec2914a13d893356f29cf,2,42 +eb96c714c7af9d4a037f5141d0834f32,1,0 +eb9ffb39ec6f225443ee538a61b5e000,1,0 +ebb8c548687da035439bce1ff33303ba,1,0 +ebc419eef405b71a70868e19c6876551,1,0 +ebcdc2d601c279924dbe93caaadb462f,1,0 +ebe2ce468a28666c46dc7b115f87571b,1,0 +ec11e5e0754b944cd435c08ffc15b243,1,0 +ec18f6b607a3adecb437c1dd34190b89,1,0 +ec4fd317a97acb2ed228a7c826adca2f,1,0 +ec5592f1376bb71cb9c3aa751529d0c9,1,0 +ec6d0c467f2a7ba4985f50a163bcee86,1,0 +ec778df8e9a746b846276f4e834edf0f,2,2500 +ec796392debc32cfe344a08e5f1950d4,3,7265766 +ec9160e1ace8195aebf30d8280cf93d4,1,0 +eca1e4ae09e18ddd559a91c9643d0f58,1,0 +ecc0fe4f6f88c4ec453e9e96af146096,2,17065161 +ece1579e5961c057a7ceb1a0ecb22bcc,1,0 +ece4e6a01bc6f79a928ab56e2caee9ff,1,0 +ed1d321edc4bb344ef06c0c6f20bc81e,2,198916 +ed1f2b399b1d7e136c6fd706478aa118,1,0 +ed555d93ef84927bfa7d5aebe4a0e2b0,1,0 +ed6bb9bd08f0250981d2a13b7e9f30f7,1,0 +edab97bca074238ea6371cb40549b450,1,0 +edad420847443e8a55cf9009e4c349bd,1,0 +edddcd3fe9808caa040ed0a4086328bd,1,0 +edf573b62397a382fcfc3691d6cbb310,1,0 +ee0f4185b7c389f30cdd87ed01235b4a,1,0 +ee2a02f945ff1451eabf0f27dab509fe,1,0 +ee42d9e3bd0189c2d45b4cee62eb1044,1,0 +ee47e433701d8ec8af25794e51361217,1,0 +ee583890792d12a9a8177553b3390d32,2,2500 +ee63b8ec4fb811711abbb4024051b04b,1,0 +ee783d35047d7e6ed6902d6aa7cf657a,1,0 +ee827e9fa1ffea04267c2edd80aea15b,1,0 +ee888e69cf3c2cdee32b1f0abb14b3e0,2,33489 +ee8d3b422df1f7110531f7465ec5fa0a,1,0 +eea76afaa83b1c92654f4863d971476a,1,0 +eeb14b9d24ffc04f1382a8fc821ea3c5,1,0 +eeb45297c563f31ef0813c47516b9dbf,1,0 +eec4c038d3d03c3a8ca81e276563d04b,1,0 +eed88af51c6ab627d1e366c068d8b062,1,0 +eedd88981119a10f3e6d892cd554a076,1,0 +eeddf672d72dbf56e335ddedc25798bc,1,0 +eefc1572bff1456e4e032f9bcf0228a2,1,0 +eefd153f24eb03e4e0533c1d62fd63e2,1,0 +ef06350c70df4a9108433d372ccfd31c,1,0 +ef0805936724e83adda881b2e8eaf408,1,0 +ef140fcd5dd3cd75f445f93bcff977f2,1,0 +ef3c7a97edad12162bc2f0bbf4e2b910,1,0 +ef3ec0b920bb04d36a47c86a114d1eee,1,0 +ef41dfce86de698d79d0b817ceb6da3c,1,0 +ef4f3b79626e7a5de77f16645c7ade8a,1,0 +ef50008b01c3c0618d5cd5c1135360e5,2,7921 +ef66aa583619fe215d5cc467d762d5f4,1,0 +ef79ddad1458fdb8af477cc28c65988a,1,0 +ef7a2f75c14a73bff5b4178d47da6727,1,0 +efb3e12fa99c1d6cd9a0e460a9d034e2,1,0 +efc0d6e26a916e63bdfbb7d5698d7893,1,0 +efc18de5b670e8326250a5ff51f7dbd3,1,0 +efdced1ea23989d43a2290ff81bf1430,1,0 +efe05133af11fc44a6e86d2f1b708d12,1,0 +efe20f8cc5028407b274a9b06f1282ec,2,2970 +efe9b9a26fecb47cd10b3ad30fb5ce9e,1,0 +f002f83c693617b88d4956ef6339429e,1,0 +f008aa0d347961133f95f22483315187,1,0 +f010450822fd0601d645506441aaef60,1,0 +f01735660e9e99618c02b4c4d015b889,1,0 +f020541f2a5856110efe23ec56db8194,1,0 +f02ae75618a1e98ee4ff5c745e21cb44,1,0 +f03871aa7a96f03ed4f1cb10b206a2e5,1,0 +f038d17860582c75d144fa789bae5ff1,1,0 +f041ced5d24340efcbadb5978085ea90,1,0 +f0606ab9d5621544a21365c3e53b4488,1,0 +f064f2006d92d60ac291c381ae5a7a2a,1,0 +f067fb18505fea47942de9ad90a5d427,1,0 +f06bf2fedd376cbdcc466726768c2f7d,2,5926790 +f079d80d860507ab1aa7bb92ae526a72,1,0 +f08330481f9656b42c0dce2cd80068ad,1,0 +f08b9c00692934a367258751b727083c,1,0 +f08ea377661fc81e1fac59e94936ff93,1,0 +f0acf5eb35c2a943c7a1a3fdb858bc91,1,0 +f0dd894e70cb82b1c88de1fb6223a29a,3,701864 +f0f37463d2e1144811ac1c2c3662132f,1,0 +f0fd1e03be7555a02eea5d79ea0a7c7e,1,0 +f0fe327f8b3176b7867c2044d7e08d06,1,0 +f12142bac4cfaf780e3317f305a682cd,1,0 +f125284815902a95f2b269682ae934df,1,0 +f13f4d794e285eba9986020acc57efd9,1,0 +f1bb0b259cbf67102e99d39780ea3cdc,1,0 +f1c4b8ad200cfe4f2d0eeed82b318331,2,484 +f1c7addaea687341e80e435a5bb61158,2,10000 +f1e055eeb38111740d36b23f81b094d2,1,0 +f1f0062af20955cb726d6fde55b579fc,2,702 +f20dd5dbeb2e08dc0718b5812c850e76,1,0 +f21e2669c7664a0bc28055caf8a3463a,1,0 +f2240b7cb28314c74e724b880d57aa03,2,930 +f246da1b383565e51d637e5538addbbc,1,0 +f262f422a73795fa5be2c6a06e0b1c4f,1,0 +f268bbd464d7dd13841025308273ae8b,2,9025 +f2b0b5e9a6c1b6873a391e85ebf0c2a1,1,0 +f2c328d9a369b94c3113b588f2bef2f3,2,10816 +f2c877d791d81d751a9e4bc755aeec25,1,0 +f2c8c0bd5499249c0714ebb09af58449,1,0 +f2c91e912f2a65edf1b7d781b94cead7,1,0 +f2e7708fcc53b052ad7123ef4a517916,1,0 +f2e915f8ec84846d8a1f337436cd9169,1,0 +f30e578d1d10622eb356c6cacf1ef560,1,0 +f317342d5bf89c38ca799784939e0b98,1,0 +f324914ded4573fe3b855f10ced64e90,1,0 +f334175525f720c6e37cb6b8a79d705a,1,0 +f33ee1a7c2ded560424c2e391a9731bd,1,0 +f33fecc9ec95a20733e987c300bab375,1,0 +f34280233cee5867bf6c627b2ad1c4b4,1,0 +f3497396956f759cd9bd371c4784cb5c,5,1786418 +f371b2e823c11bc210f827202c9179b0,1,0 +f3a6c18066d81a492db046c4922c7e3e,1,0 +f3b6d834ffd25a3c21ddb1de11c136fd,1,0 +f3cb77747048e484f768813bed2ed007,2,5476 +f3d6077ac898fbfc2555f958274986fd,1,0 +f3e2c1367ff235983aae981812e7d5ff,2,18906 +f3e35220f1830dd4f1b69776da90f0bc,1,0 +f3eaba7a20c9a80bc3a66704ee33493b,2,4900 +f3ee9480c80e7bda77784dc843ec8dcb,2,5041 +f4041e5ce0890e9f41f418a131a6f436,1,0 +f415ce23ea5917a5415fb10a656990cf,1,0 +f453a4581cf7450938e3c48eb99cd767,1,0 +f4652034aae93bf8a9a6a6857c77ac44,1,0 +f489312319b1567c6e9bbd012582bcda,1,0 +f49ed0526c51afe1db40e88e201c27d6,1,0 +f4b297419037c53cbe99eadd1e6b50e7,1,0 +f4b38f3d0548717990e815611bca0ce2,5,239718 +f4bd79bf0e4f638a48e813b99ee178d5,1,0 +f4d56c9d8d13ea5b40d1380aabbe8b47,1,0 +f4eeb94adc588bf9ca741bb75989ecf2,1,0 +f50f0f806dfed3f4d5debdae04435c59,1,0 +f510bdc01af793a32713d833809edf68,1,0 +f515001a0f03e171c1d92cd099f71bdd,1,0 +f518ad54f8fcf2de0c6810ac7c0d121b,1,0 +f527771e78e565bcae53cd63a04b435a,1,0 +f539f4c9c7ca32f5cc8e1d851478c7b5,1,0 +f55244c56464e0b9b03f8d19e678fac6,1,0 +f55cefb0d979a0cf5910b5b29e702717,1,0 +f561d58bc43c039b3158ef211b60d489,1,0 +f567b11013bcd929db7ef7349cc59c4c,1,0 +f59673e61d54bd0243d553771e177184,1,0 +f5a59066ca3c0f3f7748528b32f68c3b,2,5776 +f5e0bc270f5f2d1ae67509e9bfb77026,1,0 +f5e52d5eb44caf9179a27e29575777db,1,0 +f5f2702790f0d279f25dcecfcf3c0188,1,0 +f602a6a488834d59e4f5195bd6ba3d2f,3,184624 +f627b4aad2c323e18d8ba80de60cedcf,2,25600 +f62a39fe608159a89a726d70e05d4876,1,0 +f62a992daaac7f28843ecf3c1977cd46,1,0 +f62f7c974de8096658594a8c8c57a901,1,0 +f632db3597f2e100c4e45a6ddb2ced82,2,7056 +f639d9d84396c7af4f974c7429d8a879,1,0 +f6496a9bd9b5f8212e702329c0d84921,1,0 +f654d2df00a5fa48052a6e0196198df1,1,0 +f65735de401fa39e32d4c5f93d12c814,1,0 +f65ba804093d327fab6a00542299b31f,1,0 +f65dbb3cc91910b1b3b839a7b14484a7,1,0 +f666b6db5c10e854d89e5b4ed58ea5d2,2,992 +f671b136f3f8299e037cb4b0c46b0e82,1,0 +f67a490339d435f368cb7ecce3365e52,1,0 +f6b6ac47ca618ffe37b44848b372aad5,2,13176900 +f6c12690c413517ea5773884d143af7d,1,0 +f6e584b58a6f9cbc976a02e915dff93a,1,0 +f6eb900c4f1f885178da95d8e64f0860,1,0 +f726f589615ca49ac877a7cdf5ee2baf,1,0 +f729b1b35f0e290f11ca4577e5a6648c,2,15129 +f731882cb4e3f8aa1d63e5699a9bad65,1,0 +f7859a8d58d7e4b51677aecfd81d3abe,1,0 +f7961b5f75c02f93fbe16084e8af1212,1,0 +f79a66820843458dcfa393f9e4671b94,1,0 +f7a91b3d76b05c775c33e4f4b61a90ca,1,0 +f7ad960f891996077057fbb929a36626,1,0 +f7bd764ff908455dec78fb72145e06c5,1,0 +f7c37ec04b1b572d393203852280a786,1,0 +f7d300dd9c05d7bb658ab899731d0506,1,0 +f7f47e3a2f0a955e864ee3f778b6f8c5,1,0 +f81ae8a5fbcefcd313f6eb33174d907c,1,0 +f81e3a5ac35f0e40ab763e7f7fa26cb3,2,6924792 +f81ecca4e56569f7cf1d7a60b7387259,2,380 +f82fea4dc25ad4dc865eabe09f4bdd7e,1,0 +f84558f5184d3775ebfbf03c750964f9,1,0 +f861252fafa357ac6f67c986de4a0517,1,0 +f876d30e92fd0801c768b2519333c008,1,0 +f89dddd4e957cb6c155c1d853858cc17,2,256 +f8adf28c9ce27dda7344ec33bd865828,1,0 +f8af3752e9c341664c8c5a1c3780a373,1,0 +f8b0e8d5c35103ba5e696d42838badd6,1,0 +f8b29aff237b6d8ca7a49aaa6df458ff,1,0 +f8b56c69668b43472503252eb0dd0ccf,1,0 +f8c34f13429881d41c73b7f5cd911ab4,1,0 +f8c8cb9099a58417f05c47a2a5615aad,1,0 +f9010c2f0ce82d3b9ee423b2c849cbc9,1,0 +f9047396aefd7c798b681cf43d3e79f6,1,0 +f9081064b59d65e888d2645402ca60e9,1,0 +f9190310a4fe0563b6d30865e3846142,1,0 +f92327aa3ac2a6e566bbd6b0fc4acea9,1,0 +f93af10df3db8919d6380d4f4676236e,1,0 +f94569988ddc094725e018721a55b47d,1,0 +f952e54189f2876032fcf94df5ef5b11,1,0 +f954bcef9217d2c66cf213e8e3a7de0a,1,0 +f99111ab7bef8c993cb0a07133059ce1,1,0 +f999251af259cc02349b53e07479a852,1,0 +f99d946fc9a26535618ec1f3bf516f20,1,0 +f9ac32edc1f73fe3d6a4f85fbad3ba1b,1,0 +f9b5a24df1b48d08b0760057247ffbfe,1,0 +f9bb2da5dc8e9ce5737b4d2a0844a127,1,0 +f9bc261bff1062f5e1812f811b9042c8,1,0 +f9e0952f324ae0b981c23e90c09e53b5,3,48451 +f9e89c86938d57b6856462281df4cc4f,1,0 +fa282789ba3c9f7f6b1ac5cb5425f476,2,3969 +fa31c3f0b6de31f387eafe05a80f9069,1,0 +fa3ef81597a405e855064c2fd162bd3f,1,0 +fa4b5647c4c9de485b58c4fe6f062440,1,0 +fa54912cc3e9fc55d5075030725b4b6d,1,0 +fa5d56025029f9186c294df58ff37795,1,0 +fa5d9ae6b63e9d33769081f7d4f2b115,1,0 +fa74eadd074843a8c78542d7602c31d4,1,0 +faa914e796a804997c19804300db0204,1,0 +faae756f0de0eef0384474255db1e662,1,0 +fac6c548649f983888821cb370e87966,1,0 +fad39d2e603bae2ac15387a3662de7ff,1,0 +fae22f77df7666ed2fdc5757bd78ed07,1,0 +faec3db769a11d268cd4845fb3966167,1,0 +faee345be639ffc4228431a7b7cf16c5,1,0 +fb04a4505543eb07055ef41020f4c169,2,81796 +fb14adb3d28aad0e8e049efa304df6ed,2,0 +fb24632278756c8b4191b82fed4c379c,1,0 +fb2f4991f1ad068040fb2ed2e78def8d,1,0 +fb51afa0acbf1742f6b695fca66b3b21,1,0 +fb5dc358582664020750bd092629ffa2,1,0 +fb6bb5fce5528a2ddbadd5524e3126cf,1,0 +fb7e133759b30c5709b747a362376cbf,1,0 +fb9377c0ddfa4aee5808e739ebc0e506,1,0 +fba5bbe27b120d7761f776895ff75514,1,0 +fbdc137aeb292526a0a176dbdd38ebfe,1,0 +fbe6281d576b82696506ee3ecc6a2352,1,0 +fbebab7401c7fe5e9b406c35c9439cff,1,0 +fc12a124fa503c14fb0fbde1599bea51,2,2500 +fc202b0e3b682b8ddcec66357b133187,1,0 +fc27de61afd0ccefa0e74034971453c5,1,0 +fc2976df569ea742285cf72dd34cc05d,1,0 +fc384ed3e6c2c8318214bc994a89ba2a,1,0 +fc656901c459e8756497809521e57339,2,27225 +fc73a7a33d1754e6a1477b5ed09e2f08,1,0 +fc9d68575c3591440ce7ab19e0389ca8,1,0 +fca9f248d1485818da411faf80b243bf,1,0 +fcb181254bb6c60ae02302c671065386,1,0 +fcb5a252fc912fa3736c90348c222981,1,0 +fcb75644dc47a7232329ec41122c1bc6,1,0 +fccb9e61e76a8947c805e4b31e180c9f,1,0 +fcd99f7a69df6a3bdf9c50f5dec21fde,2,7225 +fcdae1efce9c41a6a390e7100d443015,1,0 +fd050e15e9a62d79d6f3d9b6c70e654a,1,0 +fd13b23efe45af3ce2a96538c3e9bb72,1,0 +fd2ab97064f0c535f52398987d5c4015,1,0 +fd5ae93d5c24884af440c6077daf34f0,1,0 +fd752b87b8333955d409bd54f91730ac,1,0 +fd82a328ac70197e94a67a983e8c3b2b,1,0 +fd847921e894361e7873824c43f350f5,1,0 +fd8615b3f2dd43709e97cbe553c842d0,1,0 +fd940e6eb28a1a3ea2f79904b8823c45,5,71136 +fd9a4b98b43ff6e30af5bdfe58bde1cc,3,77356 +fd9d30e13c970c153bd6c820aa675124,2,68121 +fdb52ade15b71a0bea3b60d491c4f071,1,0 +fdb85392ac12524dba84354f34b12406,1,0 +fdcbcb4b2d489692326cf3fec4ee868f,1,0 +fde32799bdbdb30af7d84f97d9a95c09,1,0 +fdfacf137e62697d4b4404de66e30c1f,1,0 +fdfcb575f113032b3c5659efef383ca2,1,0 +fdfdf872baad91d7f72fe0a5fc2a08b8,1,0 +fdff0e99f8aa221052ef6dab782b9939,1,0 +fe04c4f6c4cc856be01232b35acdeb0a,1,0 +fe04f81744573a0fe0e9d15d810a7287,1,0 +fe081e9496e5d118a5be166986130d26,1,0 +fe15fa42a35ae2668e1311ba5ca5f39a,1,0 +fe1d71d6821d08d163179a93ff51ae72,1,0 +fe230ed9e43dc37ea1aa21f350495be3,1,0 +fe5dcb071f7ccaa135567015ede50052,2,5550 +fe68383c10bec69c42453060a117221e,1,0 +fe86728c5c926d3edc109970707c21b7,1,0 +fea500bc3333d4cd61a772ea4eff4f29,1,0 +feb4e424bfdaad0e2e0996f9477c5847,2,2239512 +feb920824339702965d0d972455f2a21,1,0 +fec4c5cee25105ccb92bd81e3de16cb9,1,0 +fec8c54eec8fb2c65ea80222bd53c1bd,1,0 +fee37666b4e9dfc012cf247c08c843ce,2,25600 +fee83d78e2f24638d08b9e5ca1d81538,1,0 +fee89965e7e6ee6d5752a425c76087df,2,2449225 +feface92ffa841ecec8259f439d79874,1,0 +ff03f3f30e675301fda512414a458e6d,1,0 +ff1304f1d9c4d48370a9e8493b82ac72,1,0 +ff1840fa436207a10de43cbc72a23758,1,0 +ff1cf5b77f5954f694f4fad7dc32618a,1,0 +ff25a3d0f76c5f77cb049b894da0dd3d,1,0 +ff2a3cdc18fd0508d27ee9bd9fa25cc0,3,148764 +ff53dad8ae0048b61c85a12051bff323,1,0 +ff551458dc59f34a428baef330afb285,1,0 +ff5ac2e5b4a3bc28a910eead81196f0c,1,0 +ff6be5226619bba2551036a0dac99290,1,0 +ff8faaa392d74a080d9a44a41ac79ff0,1,0 +ff9a02c4a580d84e54798bbac348ebca,2,1806 +ffa1c4171acd2d3d369b94f24ab650a2,3,1375972 +ffcba0d0b8df978c07f42428a20c9be4,2,169 +ffd9461983351399dfedaae7bcadc965,1,0 +ffe8f1bc3fd5947736f4f190cb0b6587,1,0 +fff4498d84d151692c0c2c26d65e8044,1,0 +fffbd7e9286f9e80e1c756e91d6d2625,1,0 From e05d1e48a3e8ad1c81fe4bee84c726eb5945cd1a Mon Sep 17 00:00:00 2001 From: Doug Wright Date: Sun, 27 Aug 2017 15:48:22 +0100 Subject: [PATCH 2/9] Start adding proper docs --- docs/Makefile | 20 +++++ docs/conf.py | 171 +++++++++++++++++++++++++++++++++++++++ docs/getting-started.rst | 67 +++++++++++++++ docs/index.rst | 25 ++++++ docs/installation.rst | 18 +++++ docs/principles.rst | 31 +++++++ 6 files changed, 332 insertions(+) create mode 100644 docs/Makefile create mode 100644 docs/conf.py create mode 100644 docs/getting-started.rst create mode 100644 docs/index.rst create mode 100644 docs/installation.rst create mode 100644 docs/principles.rst diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 00000000..f913fa90 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = python -msphinx +SPHINXPROJ = BoxPacker +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 00000000..d66d7ae3 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,171 @@ +# -*- coding: utf-8 -*- +# +# BoxPacker documentation build configuration file, created by +# sphinx-quickstart on Sun Aug 27 14:14:09 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = ['sphinx.ext.githubpages'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'BoxPacker' +copyright = u'2017, Doug Wright' +author = u'Doug Wright' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = u'1' +# The full version, including alpha/beta/rc tags. +release = u'1' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# This is required for the alabaster theme +# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars +html_sidebars = { + '**': [ + 'about.html', + 'navigation.html', + 'relations.html', # needs 'show_related': True theme option to display + 'searchbox.html', + 'donate.html', + ] +} + + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = 'BoxPackerdoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'a4paper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'BoxPacker.tex', u'BoxPacker Documentation', + u'Doug Wright', 'manual'), +] + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'boxpacker', u'BoxPacker Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'BoxPacker', u'BoxPacker Documentation', + author, 'BoxPacker', 'One line description of project.', + 'Miscellaneous'), +] + + + diff --git a/docs/getting-started.rst b/docs/getting-started.rst new file mode 100644 index 00000000..98d43592 --- /dev/null +++ b/docs/getting-started.rst @@ -0,0 +1,67 @@ +Getting started +=============== + +BoxPacker is designed to integrate as seamlessly as possible into your existing systems, and therefore makes strong use of +PHP interfaces. Applications wanting to use this library will typically already have PHP domain objects/entities representing +the items needing packing, so BoxPacker attempts to take advantage of these as much as possible by allowing you to pass them +directly into the Packer rather than needing you to construct library-specific datastructures first. This also makes it much +easier to work with the output of the Packer - the returned list of packed items in each box will contain your own objects, +not simply references to them. + +Similarly, although it's much more uncommon to already have 'Box' objects before implementing this library, you'll typically +want to implement them in an application-specific way to allow for storage/retrieval from a database. The Packer also allows +you to pass in these objects directly too. + +To accommodate the wide variety of possible object types, the library defines two interfaces ``BoxPacker\Item`` and +``BoxPacker\Box`` which define methods for retrieving the required dimensional data - e.g. ``getWidth()``. There's a good chance +you may already have these defined. + +If you do happen to have methods defined with those names already, **and they are incompatible with the interface expectations**, +then this will be only case where some kind of wrapper object. + +Examples +-------- + +Packing a set of items into a given set of box types +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: php + + addBox(new TestBox('Le petite box', 300, 300, 10, 10, 296, 296, 8, 1000)); + $packer->addBox(new TestBox('Le grande box', 3000, 3000, 100, 100, 2960, 2960, 80, 10000)); + + /* + * Add items to be packed - e.g. from shopping cart stored in user session + */ + $packer->addItem(new TestItem('Item 1', 250, 250, 12, 200)); + $packer->addItem(new TestItem('Item 2', 250, 250, 12, 200)); + $packer->addItem(new TestItem('Item 3', 250, 250, 24, 200)); + + $packedBoxes = $packer->pack(); + + echo "These items fitted into " . count($packedBoxes) . " box(es)" . PHP_EOL; + foreach ($packedBoxes as $packedBox) { + $boxType = $packedBox->getBox(); // your own box object, in this case TestBox + echo "This box is a {$boxType->getReference()}, it is {$boxType->getOuterWidth()}mm wide, {$boxType->getOuterLength()}mm long and {$boxType->getOuterDepth()}mm high" . PHP_EOL; + echo "The combined weight of this box and the items inside it is {$packedBox->getWeight()}g" . PHP_EOL; + + echo "The items in this box are:" . PHP_EOL; + $itemsInTheBox = $packedBox->getItems(); + foreach ($itemsInTheBox as $item) { // your own item object, in this case TestItem + echo $item->getDescription() . PHP_EOL; + } + } + +Does a set of items fit into a particular box +--------------------------------------------- diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 00000000..e1eec7f2 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,25 @@ +Welcome to BoxPacker's documentation! +===================================== + +BoxPacker is an implementation of the 3D bin packing/knapsack problem i.e. given a list of items, how many boxes do you need to +fit them all in. + +Especially useful for e.g. e-commerce contexts when you need to know box size/weight to calculate shipping costs, or +even just want to know the right number of labels to print. + +License +------- +BoxPacker is licensed under the `MIT license`_ + + +.. _NP-hard problem: http://en.wikipedia.org/wiki/Bin_packing_problem +.. _MIT license: https://github.com/dvdoug/BoxPacker/blob/master/license.txt + + +.. toctree:: + :maxdepth: 1 + :caption: Contents + + installation + principles + getting-started diff --git a/docs/installation.rst b/docs/installation.rst new file mode 100644 index 00000000..7a4d0ef7 --- /dev/null +++ b/docs/installation.rst @@ -0,0 +1,18 @@ +Installation +============ + +The recommended way to install BoxPacker is to use `Composer`_. From the command line simply execute the following to add +``dvdoug/boxpacker`` to your project's ``composer.json`` file. Composer will automatically take care of downloading the source +and configuring an autoloader: + +.. code:: + composer require dvdoug/boxpacker + +If you don't want to use Composer, the code is available to download from `GitHub`_ + +Requirements +------------ +BoxPacker is compatible with all versions of PHP 5.4+ (including PHP 7 and HHVM) + +.. _Composer: https://getcomposer.org +.. _GitHub: https://github.com/dvdoug/BoxPacker/releases diff --git a/docs/principles.rst b/docs/principles.rst new file mode 100644 index 00000000..b82c4b4e --- /dev/null +++ b/docs/principles.rst @@ -0,0 +1,31 @@ +Principles of operation +======================= + +Bin packing is an `NP-hard problem`_ and there is no way to always achieve an optimum solution without running through every +single permutation. But that's OK because this implementation is designed to simulate a naive human approach to the problem +rather than search for the "perfect" solution. + +This is for 2 reasons: + +1. It's quicker +2. It doesn't require the person actually packing the box to be given a 3D diagram + explaining just how the items are supposed to fit. + +At a high level, the algorithm works like this: + + * Pack largest (by volume) items first + * Pack vertically up the side of the box + * Pack side-by-side where item under consideration fits alongside the previous item + * Only very small overhangs are allowed (10%) to prevent items bending in transit + * The available width/height for each layer will therefore decrease as the stack of items gets taller + * If more than 1 box is needed to accommodate all of the items, then aim for boxes of roughly equal weight + (e.g. 3 medium size/weight boxes are better than 1 small light box and 2 that are large and heavy) + +Limitations +----------- + + * Items are assumed to be shipped flat (e.g. books, fragile items). The algorithm as implemented therefore considers + simple 2D rotation of items when determining fit but will not try turning items on their side + * The algorithm does consider spatial constraints in all 3 dimensions, plus consideration of weight + +.. _NP-hard problem: http://en.wikipedia.org/wiki/Bin_packing_problem From 73f7a3243b46ead5ac469bdffeb5d030850e0c77 Mon Sep 17 00:00:00 2001 From: Doug Wright Date: Sun, 27 Aug 2017 16:07:50 +0100 Subject: [PATCH 3/9] RTD theme --- .gitignore | 2 ++ docs/conf.py | 6 +++--- docs/getting-started.rst | 2 +- docs/installation.rst | 1 + 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index a2230111..3b5ece13 100644 --- a/.gitignore +++ b/.gitignore @@ -161,9 +161,11 @@ pip-log.txt # Mac crap .DS_Store + /.idea /tests/coverage /vendor +/docs/_build /composer.lock diff --git a/docs/conf.py b/docs/conf.py index d66d7ae3..0a4cea16 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -54,9 +54,9 @@ # built documents. # # The short X.Y version. -version = u'1' +version = u'version 1' # The full version, including alpha/beta/rc tags. -release = u'1' +release = u'version 1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -82,7 +82,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'alabaster' +html_theme = 'sphinx_rtd_theme' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the diff --git a/docs/getting-started.rst b/docs/getting-started.rst index 98d43592..4dbc2f4e 100644 --- a/docs/getting-started.rst +++ b/docs/getting-started.rst @@ -64,4 +64,4 @@ Packing a set of items into a given set of box types } Does a set of items fit into a particular box ---------------------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/installation.rst b/docs/installation.rst index 7a4d0ef7..59f4310c 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -6,6 +6,7 @@ The recommended way to install BoxPacker is to use `Composer`_. From the command and configuring an autoloader: .. code:: + composer require dvdoug/boxpacker If you don't want to use Composer, the code is available to download from `GitHub`_ From bed9d7da46896b74daa08d7063b2cf5f3855f60b Mon Sep 17 00:00:00 2001 From: Doug Wright Date: Sun, 27 Aug 2017 17:47:39 +0100 Subject: [PATCH 4/9] More doc work --- README.md | 114 ++------------------------------------- docs/advanced-usage.rst | 50 +++++++++++++++++ docs/getting-started.rst | 19 ++++++- docs/index.rst | 9 +++- docs/installation.rst | 6 +++ 5 files changed, 86 insertions(+), 112 deletions(-) create mode 100644 docs/advanced-usage.rst diff --git a/README.md b/README.md index f9563e06..7e357958 100644 --- a/README.md +++ b/README.md @@ -7,117 +7,13 @@ them all in. Especially useful for e.g. e-commerce contexts when you need to know box size/weight to calculate shipping costs, or even just want to know the right number of labels to print. +See [documentation](http://boxpacker.readthedocs.io/en/1.x-dev/) for more details. + [![Build Status](https://travis-ci.org/dvdoug/BoxPacker.svg?branch=master)](https://travis-ci.org/dvdoug/BoxPacker) -[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/dvdoug/BoxPacker/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/dvdoug/BoxPacker/?branch=master) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/dvdoug/BoxPacker/badges/quality-score.png?b=1.x-dev)](https://scrutinizer-ci.com/g/dvdoug/BoxPacker/?branch=1.x-dev) [![Download count](https://img.shields.io/packagist/dt/dvdoug/boxpacker.svg)](https://packagist.org/packages/dvdoug/boxpacker) -[![Download count](https://img.shields.io/packagist/v/dvdoug/boxpacker.svg)](https://packagist.org/packages/dvdoug/boxpacker) - - -[Wikipedia](http://en.wikipedia.org/wiki/Bin_packing_problem) says this is NP-hard, and there is no way to always -achieve an optimum solution without running through every single permutation. But that's OK because this implementation -is designed to simulate a naive human approach to the problem rather than search for the "perfect" solution. - -This is for 2 reasons: - -1. It's quicker -2. It doesn't require the person actually packing the box to be given a 3D diagram - explaining just how the items are supposed to fit. - -Principles ----------- - - * Pack largest (by volume) items first - * Pack vertically up the side of the box - * Pack side-by-side where item under consideration fits alongside the previous item - * Only very small overhangs are allowed (10%) to prevent items bending in transit - * The available width/height for each layer will therefore decrease as the stack of items gets taller - * If more than 1 box is needed to accommodate all of the items, then aim for boxes of roughly equal weight - (e.g. 3 medium size/weight boxes are better than 1 small light box and 2 that are large and heavy) - -Constraints ------------ - - * Items are assumed to be shipped flat (e.g. books, fragile items). The algorithm as implemented therefore considers - simple 2D rotation of items when determining fit but will not try turning items on their side - * The algorithm does consider spatial constraints in all 3 dimensions, plus consideration of weight - -Installation ------------- -If you use [Composer](http://getcomposer.org/), just add `dvdoug/boxpacker` to your project's `composer.json` file: -``` -composer require dvdoug/boxpacker -``` - -Otherwise, the library is PSR-4 compliant, so will work with the autoloader of your choice. - -Usage ------ -BoxPacker is designed to integrate as seamlessly as possible into your existing systems. To use the library, you will -need to implement the `BoxPacker\Item` interface on your item/product objects and `BoxPacker\Box` on the objects you use to to represent a box. -These interfaces are quite minimal, but provide a standardised way for the packing process to obtain the dimensional information it needs in order to work. - -Basic usage then looks something like the below: -(although you'd probably want to do something more useful with the results than just output to the screen, and your dimensional data would hopefully come from a database!) - -```php - - use DVDoug\BoxPacker\Packer; - use DVDoug\BoxPacker\Test\TestBox; // use your own implementation - use DVDoug\BoxPacker\Test\TestItem; // use your own implementation - - /* - * To figure out which boxes you need, and which items go into which box - */ - $packer = new Packer(); - $packer->addBox(new TestBox('Le petite box', 300, 300, 10, 10, 296, 296, 8, 1000)); - $packer->addBox(new TestBox('Le grande box', 3000, 3000, 100, 100, 2960, 2960, 80, 10000)); - $packer->addItem(new TestItem('Item 1', 250, 250, 12, 200)); - $packer->addItem(new TestItem('Item 2', 250, 250, 12, 200)); - $packer->addItem(new TestItem('Item 3', 250, 250, 24, 200)); - $packedBoxes = $packer->pack(); - - echo("These items fitted into " . count($packedBoxes) . " box(es)" . PHP_EOL); - foreach ($packedBoxes as $packedBox) { - $boxType = $packedBox->getBox(); // your own box object, in this case TestBox - echo("This box is a {$boxType->getReference()}, it is {$boxType->getOuterWidth()}mm wide, {$boxType->getOuterLength()}mm long and {$boxType->getOuterDepth()}mm high" . PHP_EOL); - echo("The combined weight of this box and the items inside it is {$packedBox->getWeight()}g" . PHP_EOL); - - echo("The items in this box are:" . PHP_EOL); - $itemsInTheBox = $packedBox->getItems(); - foreach ($itemsInTheBox as $item) { // your own item object, in this case TestItem - echo($item->getDescription() . PHP_EOL); - } - - echo(PHP_EOL); - } - - - - /* - * To just see if a selection of items will fit into one specific box - */ - $box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000); - - $items = new ItemList(); - $items->insert(new TestItem('Item 1', 297, 296, 2, 200)); - $items->insert(new TestItem('Item 2', 297, 296, 2, 500)); - $items->insert(new TestItem('Item 3', 296, 296, 4, 290)); - - $volumePacker = new VolumePacker($box, $items); - $packedBox = $volumePacker->pack(); - /* $packedBox->getItems() contains the items that fit */ -``` - -BoxPacker is designed to run calculations as efficiently as possible, the 4500+ tests in the test suite run in 11.9 -seconds in the Ubuntu VM on my workstation, giving a rate of approx ≈385 solutions/second which should be more than sufficient for -most e-commerce stores :) If you do wish to benchmark the library to evaluate performance in your own scenarios, please -disable Xdebug when doing so - in my experience the unit tests take 4.5x longer (11.9sec->54 sec) when Xdebug is loaded. - -Advanced Usage --------------- -For more advanced use cases where greater control over the contents of each box is required (e.g. legal limits on the -number of hazardous items per box), you may implement the `BoxPacker\ConstrainedItem` interface which contains an -additional callback method allowing you to decide whether an item may be packed into a box given it's existing contents. +[![Current version](https://img.shields.io/packagist/v/dvdoug/boxpacker.svg)](https://packagist.org/packages/dvdoug/boxpacker) +[![Documentation](https://readthedocs.org/projects/boxpacker/badge/?version=1.x-dev)](https://boxpacker.readthedocs.io/en/1.x-dev/?badge=1.x-dev) Requirements ------------ diff --git a/docs/advanced-usage.rst b/docs/advanced-usage.rst new file mode 100644 index 00000000..30d9d318 --- /dev/null +++ b/docs/advanced-usage.rst @@ -0,0 +1,50 @@ +Advanced usage +============== + +For more advanced use cases where greater control over the contents of each box is required (e.g. legal limits on the number of +hazardous items per box, or perhaps fragile items requiring an extra-strong outer box) you may implement the ``BoxPacker\ConstrainedItem`` +interface which contains an additional callback method allowing you to decide whether to allow an item may be packed into a box +or not. + +As with all other library methods, the objects passed into this callback are your own - you have access to their full range of +properties and methods to use when evaluating a constraint, not only those defined by the standard ``BoxPacker\Item`` interface. + +Example +------- + +Only allow 2 batteries per box +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: php + + insert(new TestItem('Item 1', 297, 296, 2, 200)); + $items->insert(new TestItem('Item 2', 297, 296, 2, 500)); + $items->insert(new TestItem('Item 3', 296, 296, 4, 290)); + + $volumePacker = new VolumePacker($box, $items); + $packedBox = $volumePacker->pack(); //$packedBox->getItems() contains the items that fit diff --git a/docs/index.rst b/docs/index.rst index e1eec7f2..05cfbdc9 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -9,7 +9,13 @@ even just want to know the right number of labels to print. License ------- -BoxPacker is licensed under the `MIT license`_ +BoxPacker is licensed under the `MIT license`_. + + +.. warning:: + + You are reading the documentation for BoxPacker v1. Although still supported with occasional backports from newer versions, + all users are recommended to upgrade to v2 which removes the "always keep flat" limitation on items. .. _NP-hard problem: http://en.wikipedia.org/wiki/Bin_packing_problem @@ -23,3 +29,4 @@ BoxPacker is licensed under the `MIT license`_ installation principles getting-started + advanced-usage diff --git a/docs/installation.rst b/docs/installation.rst index 59f4310c..c7b1d1f7 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -15,5 +15,11 @@ Requirements ------------ BoxPacker is compatible with all versions of PHP 5.4+ (including PHP 7 and HHVM) +Versioning +---------- +BoxPacker follows `Semantic Versioning`_ + + .. _Composer: https://getcomposer.org .. _GitHub: https://github.com/dvdoug/BoxPacker/releases +.. _Semantic Versioning: http://semver.org/ From e3d21794f51d197860087b5fe10b4c8b19193b5f Mon Sep 17 00:00:00 2001 From: Doug Wright Date: Sun, 27 Aug 2017 18:57:22 +0100 Subject: [PATCH 5/9] Add details of used/remaining space to docs --- docs/advanced-usage.rst | 42 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/docs/advanced-usage.rst b/docs/advanced-usage.rst index 30d9d318..eef0e5b5 100644 --- a/docs/advanced-usage.rst +++ b/docs/advanced-usage.rst @@ -1,6 +1,41 @@ Advanced usage ============== +Used / remaining space +---------------------- + +After packing it is possible to see how much physical space in each ``PackedBox`` is taken up with items, +and how much space was unused (air). This information might be useful to determine whether it would be useful to source +alternative/additional sizes of box. + +At a high level, the ``getVolumeUtilisation()`` method exists which calculates how full the box is as a percentage of volume. + +Lower-level methods are also available for examining this data in detail either using ``getUsed[Width|Length|Depth()`` +(a hypothetical box placed around the items) or ``getRemaining[Width|Length|Depth()`` (the difference between the dimensions of +the actual box and the hypothetical box). + +.. note:: + + BoxPacker will always try to pack items into the smallest box available + +Example - warning on a massively oversized box +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: php + + getVolumeUtilisation() < 20) { + // box is 80% air, log a warning + } + } + + +Custom Constraints +------------------ + For more advanced use cases where greater control over the contents of each box is required (e.g. legal limits on the number of hazardous items per box, or perhaps fragile items requiring an extra-strong outer box) you may implement the ``BoxPacker\ConstrainedItem`` interface which contains an additional callback method allowing you to decide whether to allow an item may be packed into a box @@ -9,11 +44,8 @@ or not. As with all other library methods, the objects passed into this callback are your own - you have access to their full range of properties and methods to use when evaluating a constraint, not only those defined by the standard ``BoxPacker\Item`` interface. -Example -------- - -Only allow 2 batteries per box -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Example - only allow 2 batteries per box +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: php From fa93b468f36491731af79f4a2d58cf856c67e0bf Mon Sep 17 00:00:00 2001 From: Doug Wright Date: Mon, 4 Sep 2017 20:17:06 +0100 Subject: [PATCH 6/9] Ensure item width/lengths match the orientation of the box. Fixes #86 --- PackedItem.php | 2 +- VolumePacker.php | 46 ++++++++++++++++++++++++++++++++++++-- tests/PackerTest.php | 12 +++++----- tests/VolumePackerTest.php | 22 ++++++++++++++++++ 4 files changed, 73 insertions(+), 9 deletions(-) diff --git a/PackedItem.php b/PackedItem.php index 937042d3..864830ce 100644 --- a/PackedItem.php +++ b/PackedItem.php @@ -60,7 +60,7 @@ class PackedItem * @param int $length * @param int $depth */ - protected function __construct(Item $item, $x, $y, $z, $width, $length, $depth) + public function __construct(Item $item, $x, $y, $z, $width, $length, $depth) { $this->item = $item; $this->x = $x; diff --git a/VolumePacker.php b/VolumePacker.php index 03f8694a..42b279ed 100644 --- a/VolumePacker.php +++ b/VolumePacker.php @@ -54,6 +54,12 @@ class VolumePacker implements LoggerAwareInterface */ protected $remainingWeight; + /** + * Whether the box was rotated for packing + * @var bool + */ + protected $boxRotated = false; + /** * Constructor * @@ -70,6 +76,12 @@ public function __construct(Box $box, ItemList $items) $this->remainingWeight = $this->box->getMaxWeight() - $this->box->getEmptyWeight(); $this->skippedItems = new ItemList(); $this->logger = new NullLogger(); + + // we may have just rotated the box for packing purposes, record if we did + if ($this->box->getInnerWidth() != $this->boxWidth || $this->box->getInnerLength() != $this->boxLength) { + $this->boxRotated = true; + } + } /** @@ -159,7 +171,7 @@ public function pack() } } $this->logger->debug("done with this box"); - return PackedBox::fromPackedItemList($this->box, $packedItems); + return $this->createPackedBox($packedItems); } /** @@ -188,7 +200,7 @@ protected function getOrientationForItem( 'maxWidth' => $maxWidth, 'maxLength' => $maxLength, 'maxDepth' => $maxDepth, - ] + ], ] ); @@ -302,4 +314,34 @@ protected function rebuildItemList() { $this->skippedItems = new ItemList(); } } + + /** + * @param PackedItemList $packedItems + * + * @return PackedBox + */ + protected function createPackedBox(PackedItemList $packedItems) + { + //if we rotated the box for packing, need to swap back width/length of the packed items + if ($this->boxRotated) { + $items = iterator_to_array($packedItems); + $packedItems = new PackedItemList(); + /** @var PackedItem $item */ + foreach($items as $item) { + $packedItems->insert( + new PackedItem( + $item->getItem(), + $item->getY(), + $item->getX(), + $item->getZ(), + $item->getLength(), + $item->getWidth(), + $item->getDepth() + ) + ); + } + } + + return PackedBox::fromPackedItemList($this->box, $packedItems); + } } diff --git a/tests/PackerTest.php b/tests/PackerTest.php index 7df495b2..61e0ea6f 100644 --- a/tests/PackerTest.php +++ b/tests/PackerTest.php @@ -369,8 +369,8 @@ public function testIssue52B() $packedBoxes = $packer->pack(); self::assertEquals(1, $packedBoxes->count()); - self::assertEquals(368, $packedBoxes->top()->getUsedWidth()); - self::assertEquals(310, $packedBoxes->top()->getUsedLength()); + self::assertEquals(310, $packedBoxes->top()->getUsedWidth()); + self::assertEquals(368, $packedBoxes->top()->getUsedLength()); self::assertEquals(32, $packedBoxes->top()->getUsedDepth()); } @@ -387,12 +387,12 @@ public function testIssue52C() $box1 = $packedBoxes->extract(); $box2 = $packedBoxes->extract(); - self::assertEquals(285, $box1->getUsedWidth()); - self::assertEquals(160, $box1->getUsedLength()); + self::assertEquals(160, $box1->getUsedWidth()); + self::assertEquals(285, $box1->getUsedLength()); self::assertEquals(70, $box1->getUsedDepth()); - self::assertEquals(297, $box2->getUsedWidth()); - self::assertEquals(210, $box2->getUsedLength()); + self::assertEquals(210, $box2->getUsedWidth()); + self::assertEquals(297, $box2->getUsedLength()); self::assertEquals(4, $box2->getUsedDepth()); } diff --git a/tests/VolumePackerTest.php b/tests/VolumePackerTest.php index cf30de9a..dfdbe97f 100644 --- a/tests/VolumePackerTest.php +++ b/tests/VolumePackerTest.php @@ -176,6 +176,28 @@ public function testIssue75() self::assertEquals(1, $packedBoxes->count()); } + + public function testIssue86() + { + $packer = new Packer(); + $packer->addBox(new TestBox('Box', 22.5, 27, 13.5, 0.2, 22.5, 27, 13.5, 30)); + $packer->addItem(new TestItem('Item 1', 11.2, 22.2, 2.2, 0.075),3); + $packer->addItem(new TestItem('Item 2', 10.8, 21.5, 2, 0.102),4); + $packer->addItem(new TestItem('Item 3', 6.2, 17, 1.8, 0.03),3); + $packedBoxes = $packer->pack(); + + self::assertEquals(1, $packedBoxes->count()); + + /** @var PackedBox $packedBox */ + $packedBox = $packedBoxes->top(); + self::assertEquals(22.2, $packedBox->getUsedWidth()); //23.2 + self::assertEquals(23.2, $packedBox->getUsedLength()); //22.2 + self::assertEquals(10.2, $packedBox->getUsedDepth()); + self::assertEquals(0.3, $packedBox->getRemainingWidth()); + self::assertEquals(3.8, $packedBox->getRemainingLength()); + self::assertEquals(3.3, $packedBox->getRemainingDepth()); + } + public function testConstraints() { TestConstrainedTestItem::$limit = 2; From 423a53b907177400fbd9bd85039c70eae8753707 Mon Sep 17 00:00:00 2001 From: Doug Wright Date: Mon, 23 Oct 2017 21:29:56 +0100 Subject: [PATCH 7/9] Fallback to sorting by item description when all other things are equal. Fixes #87 --- ItemList.php | 6 +++++- tests/ItemListTest.php | 39 ++++++++++++++++++++++++++------------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/ItemList.php b/ItemList.php index af3f9fbc..c67a5e75 100644 --- a/ItemList.php +++ b/ItemList.php @@ -30,8 +30,12 @@ public function compare($itemA, $itemB) return 1; } elseif ($itemA->getVolume() < $itemB->getVolume()) { return -1; - } else { + } elseif ($itemA->getWeight() !== $itemB->getWeight()) { return $itemA->getWeight() - $itemB->getWeight(); + } else if ($itemA->getDescription() < $itemB->getDescription()) { + return 1; + } else { + return -1; } } diff --git a/tests/ItemListTest.php b/tests/ItemListTest.php index faaf8614..856f63ef 100644 --- a/tests/ItemListTest.php +++ b/tests/ItemListTest.php @@ -4,7 +4,6 @@ * @package BoxPacker * @author Doug Wright */ - namespace DVDoug\BoxPacker; use DVDoug\BoxPacker\Test\TestItem; @@ -14,21 +13,35 @@ class ItemListTest extends TestCase { function testCompare() + { + $item1 = new TestItem('Small', 20, 20, 2, 100); + $item2 = new TestItem('Large', 200, 200, 20, 1000); + $item3 = new TestItem('Medium', 100, 100, 10, 500); + + $list = new ItemList; + $list->insert($item1); + $list->insert($item2); + $list->insert($item3); + + $sorted = iterator_to_array($list,false); + self::assertEquals(array($item2, $item3, $item1), $sorted); + } + + function testDifferentItemsSameDimensions() { - $box1 = new TestItem('Small', 20, 20, 2, 100); - $box2 = new TestItem('Large', 200, 200, 20, 1000); - $box3 = new TestItem('Medium', 100, 100, 10, 500); + $item1 = new TestItem('Item A', 20, 20, 2, 100); + $item2 = new TestItem('Item B', 20, 20, 2, 100); + $item3 = new TestItem('Item A', 20, 20, 2, 100); + $item4 = new TestItem('Item B', 20, 20, 2, 100); $list = new ItemList; - $list->insert($box1); - $list->insert($box2); - $list->insert($box3); - - $sorted = []; - while (!$list->isEmpty()) { - $sorted[] = $list->extract(); - } - self::assertEquals(array($box2, $box3, $box1), $sorted); + $list->insert($item1); + $list->insert($item2); + $list->insert($item3); + $list->insert($item4); + + $sorted = iterator_to_array($list,false); + self::assertEquals(array($item1, $item3, $item2, $item4), $sorted); } } From 2f7d8470ddbe74f9e306fa9a36c1b0d036b00d9d Mon Sep 17 00:00:00 2001 From: Doug Wright Date: Mon, 1 Jan 2018 18:01:42 +0000 Subject: [PATCH 8/9] Match folder structure of v3 --- composer.json | 2 +- Box.php => src/Box.php | 0 BoxList.php => src/BoxList.php | 0 ConstrainedItem.php => src/ConstrainedItem.php | 0 Item.php => src/Item.php | 0 ItemList.php => src/ItemList.php | 0 ItemTooLargeException.php => src/ItemTooLargeException.php | 0 OrientatedItem.php => src/OrientatedItem.php | 0 OrientatedItemFactory.php => src/OrientatedItemFactory.php | 0 PackedBox.php => src/PackedBox.php | 0 PackedBoxList.php => src/PackedBoxList.php | 0 PackedItem.php => src/PackedItem.php | 0 PackedItemList.php => src/PackedItemList.php | 0 Packer.php => src/Packer.php | 0 VolumePacker.php => src/VolumePacker.php | 0 WeightRedistributor.php => src/WeightRedistributor.php | 0 16 files changed, 1 insertion(+), 1 deletion(-) rename Box.php => src/Box.php (100%) rename BoxList.php => src/BoxList.php (100%) rename ConstrainedItem.php => src/ConstrainedItem.php (100%) rename Item.php => src/Item.php (100%) rename ItemList.php => src/ItemList.php (100%) rename ItemTooLargeException.php => src/ItemTooLargeException.php (100%) rename OrientatedItem.php => src/OrientatedItem.php (100%) rename OrientatedItemFactory.php => src/OrientatedItemFactory.php (100%) rename PackedBox.php => src/PackedBox.php (100%) rename PackedBoxList.php => src/PackedBoxList.php (100%) rename PackedItem.php => src/PackedItem.php (100%) rename PackedItemList.php => src/PackedItemList.php (100%) rename Packer.php => src/Packer.php (100%) rename VolumePacker.php => src/VolumePacker.php (100%) rename WeightRedistributor.php => src/WeightRedistributor.php (100%) diff --git a/composer.json b/composer.json index 0be67ab5..61f48265 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,7 @@ }, "autoload": { "psr-4": { - "DVDoug\\BoxPacker\\": "" + "DVDoug\\BoxPacker\\": "src/" } }, "autoload-dev": { diff --git a/Box.php b/src/Box.php similarity index 100% rename from Box.php rename to src/Box.php diff --git a/BoxList.php b/src/BoxList.php similarity index 100% rename from BoxList.php rename to src/BoxList.php diff --git a/ConstrainedItem.php b/src/ConstrainedItem.php similarity index 100% rename from ConstrainedItem.php rename to src/ConstrainedItem.php diff --git a/Item.php b/src/Item.php similarity index 100% rename from Item.php rename to src/Item.php diff --git a/ItemList.php b/src/ItemList.php similarity index 100% rename from ItemList.php rename to src/ItemList.php diff --git a/ItemTooLargeException.php b/src/ItemTooLargeException.php similarity index 100% rename from ItemTooLargeException.php rename to src/ItemTooLargeException.php diff --git a/OrientatedItem.php b/src/OrientatedItem.php similarity index 100% rename from OrientatedItem.php rename to src/OrientatedItem.php diff --git a/OrientatedItemFactory.php b/src/OrientatedItemFactory.php similarity index 100% rename from OrientatedItemFactory.php rename to src/OrientatedItemFactory.php diff --git a/PackedBox.php b/src/PackedBox.php similarity index 100% rename from PackedBox.php rename to src/PackedBox.php diff --git a/PackedBoxList.php b/src/PackedBoxList.php similarity index 100% rename from PackedBoxList.php rename to src/PackedBoxList.php diff --git a/PackedItem.php b/src/PackedItem.php similarity index 100% rename from PackedItem.php rename to src/PackedItem.php diff --git a/PackedItemList.php b/src/PackedItemList.php similarity index 100% rename from PackedItemList.php rename to src/PackedItemList.php diff --git a/Packer.php b/src/Packer.php similarity index 100% rename from Packer.php rename to src/Packer.php diff --git a/VolumePacker.php b/src/VolumePacker.php similarity index 100% rename from VolumePacker.php rename to src/VolumePacker.php diff --git a/WeightRedistributor.php b/src/WeightRedistributor.php similarity index 100% rename from WeightRedistributor.php rename to src/WeightRedistributor.php From 42e76885fe970c4b1a6c7b8c22690741b8445716 Mon Sep 17 00:00:00 2001 From: Doug Wright Date: Mon, 1 Jan 2018 18:01:59 +0000 Subject: [PATCH 9/9] Apply fixes from StyleCI --- src/Box.php | 40 +++++++---- src/BoxList.php | 10 +-- src/ConstrainedItem.php | 14 ++-- src/Item.php | 28 +++++--- src/ItemList.php | 16 +++-- src/ItemTooLargeException.php | 17 +++-- src/OrientatedItem.php | 46 ++++++------ src/OrientatedItemFactory.php | 79 +++++++++++---------- src/PackedBox.php | 84 +++++++++++++--------- src/PackedBoxList.php | 33 +++++---- src/PackedItem.php | 12 ++-- src/PackedItemList.php | 24 ++++--- src/Packer.php | 59 ++++++++++------ src/VolumePacker.php | 81 ++++++++++++---------- src/WeightRedistributor.php | 35 +++++----- tests/BoxListTest.php | 28 ++++---- tests/ItemListTest.php | 23 +++--- tests/PackedBoxListTest.php | 8 +-- tests/PackedBoxTest.php | 8 +-- tests/PackerTest.php | 96 +++++++++++--------------- tests/Test/TestBox.php | 22 +++--- tests/Test/TestConstrainedTestItem.php | 7 +- tests/Test/TestItem.php | 7 +- tests/VolumePackerTest.php | 42 +++++------ 24 files changed, 437 insertions(+), 382 deletions(-) diff --git a/src/Box.php b/src/Box.php index 34544fb5..f9a44e38 100644 --- a/src/Box.php +++ b/src/Box.php @@ -1,75 +1,85 @@ batteries per box + * Hook for user implementation of item-specific constraints, e.g. max batteries per box. * * @param ItemList $alreadyPackedItems * @param Box $box @@ -24,6 +24,4 @@ interface ConstrainedItem extends Item * @return bool */ public function canBePackedInBox(ItemList $alreadyPackedItems, Box $box); - } - diff --git a/src/Item.php b/src/Item.php index 995cfe21..c00b4345 100644 --- a/src/Item.php +++ b/src/Item.php @@ -1,51 +1,57 @@ getWeight() !== $itemB->getWeight()) { return $itemA->getWeight() - $itemB->getWeight(); - } else if ($itemA->getDescription() < $itemB->getDescription()) { + } elseif ($itemA->getDescription() < $itemB->getDescription()) { return 1; } else { return -1; @@ -40,7 +40,8 @@ public function compare($itemA, $itemB) } /** - * Get copy of this list as a standard PHP array + * Get copy of this list as a standard PHP array. + * * @return array */ public function asArray() @@ -49,6 +50,7 @@ public function asArray() foreach (clone $this as $item) { $return[] = $item; } + return $return; } } diff --git a/src/ItemTooLargeException.php b/src/ItemTooLargeException.php index 6ae89f13..297b5085 100644 --- a/src/ItemTooLargeException.php +++ b/src/ItemTooLargeException.php @@ -1,21 +1,19 @@ item = $item; parent::__construct($message); } @@ -33,8 +32,8 @@ public function __construct($message, Item $item) { /** * @return Item */ - public function getItem() { + public function getItem() + { return $this->item; } - } diff --git a/src/OrientatedItem.php b/src/OrientatedItem.php index 710eaa45..54b5b741 100644 --- a/src/OrientatedItem.php +++ b/src/OrientatedItem.php @@ -1,19 +1,19 @@ item = $item; $this->width = $width; $this->length = $length; @@ -49,49 +51,53 @@ public function __construct(Item $item, $width, $length, $depth) { } /** - * Item + * Item. * * @return Item */ - public function getItem() { + public function getItem() + { return $this->item; } /** - * Item width in mm in it's packed orientation + * Item width in mm in it's packed orientation. * * @return int */ - public function getWidth() { + public function getWidth() + { return $this->width; } /** - * Item length in mm in it's packed orientation + * Item length in mm in it's packed orientation. * * @return int */ - public function getLength() { + public function getLength() + { return $this->length; } /** - * Item depth in mm in it's packed orientation + * Item depth in mm in it's packed orientation. * * @return int */ - public function getDepth() { + public function getDepth() + { return $this->depth; } /** * Is this orientation stable (low centre of gravity) - * N.B. Assumes equal weight distribution + * N.B. Assumes equal weight distribution. * * @return bool */ - public function isStable() { + public function isStable() + { return $this->getDepth() <= min($this->getLength(), $this->getWidth()); } } - diff --git a/src/OrientatedItemFactory.php b/src/OrientatedItemFactory.php index aed1e3de..224c81f2 100644 --- a/src/OrientatedItemFactory.php +++ b/src/OrientatedItemFactory.php @@ -1,18 +1,19 @@ getPossibleOrientations($item, $prevItem, $widthLeft, $lengthLeft, $depthLeft); $usableOrientations = $this->getUsableOrientations($possibleOrientations, $box, $item, $isLastItem); @@ -50,7 +53,8 @@ public function getBestOrientation(Box $box, Item $item, PackedItem $prevItem = asort($orientationFits); reset($orientationFits); $bestFit = $usableOrientations[key($orientationFits)]; - $this->logger->debug("Selected best fit orientation", ['orientation' => $bestFit]); + $this->logger->debug('Selected best fit orientation', ['orientation' => $bestFit]); + return $bestFit; } else { return false; @@ -58,20 +62,22 @@ public function getBestOrientation(Box $box, Item $item, PackedItem $prevItem = } /** - * Find all possible orientations for an item - * @param Item $item + * Find all possible orientations for an item. + * + * @param Item $item * @param PackedItem|null $prevItem - * @param int $widthLeft - * @param int $lengthLeft - * @param int $depthLeft + * @param int $widthLeft + * @param int $lengthLeft + * @param int $depthLeft + * * @return OrientatedItem[] */ - public function getPossibleOrientations(Item $item, PackedItem $prevItem = null, $widthLeft, $lengthLeft, $depthLeft) { - + public function getPossibleOrientations(Item $item, PackedItem $prevItem = null, $widthLeft, $lengthLeft, $depthLeft) + { $orientations = []; //Special case items that are the same as what we just packed - keep orientation - /** @noinspection PhpNonStrictObjectEqualityInspection */ + /* @noinspection PhpNonStrictObjectEqualityInspection */ if ($prevItem && $prevItem->getItem() == $item) { $orientations[] = new OrientatedItem($item, $prevItem->getWidth(), $prevItem->getLength(), $prevItem->getDepth()); } else { @@ -82,7 +88,7 @@ public function getPossibleOrientations(Item $item, PackedItem $prevItem = null, } //remove any that simply don't fit - return array_filter($orientations, function(OrientatedItem $i) use ($widthLeft, $lengthLeft, $depthLeft) { + return array_filter($orientations, function (OrientatedItem $i) use ($widthLeft, $lengthLeft, $depthLeft) { return $i->getWidth() <= $widthLeft && $i->getLength() <= $lengthLeft && $i->getDepth() <= $depthLeft; }); } @@ -90,20 +96,21 @@ public function getPossibleOrientations(Item $item, PackedItem $prevItem = null, /** * @param Item $item * @param Box $box + * * @return OrientatedItem[] */ public function getPossibleOrientationsInEmptyBox(Item $item, Box $box) { - $cacheKey = $item->getWidth() . - '|' . - $item->getLength() . - '|' . - $item->getDepth() . - '|' . - $box->getInnerWidth() . - '|' . - $box->getInnerLength() . - '|' . + $cacheKey = $item->getWidth(). + '|'. + $item->getLength(). + '|'. + $item->getDepth(). + '|'. + $box->getInnerWidth(). + '|'. + $box->getInnerLength(). + '|'. $box->getInnerDepth(); if (isset(static::$emptyBoxCache[$cacheKey])) { @@ -118,6 +125,7 @@ public function getPossibleOrientationsInEmptyBox(Item $item, Box $box) ); static::$emptyBoxCache[$cacheKey] = $orientations; } + return $orientations; } @@ -158,12 +166,12 @@ protected function getUsableOrientations( */ if (count($stableOrientations) > 0) { $orientationsToUse = $stableOrientations; - } else if (count($unstableOrientations) > 0) { + } elseif (count($unstableOrientations) > 0) { $orientationsInEmptyBox = $this->getPossibleOrientationsInEmptyBox($item, $box); $stableOrientationsInEmptyBox = array_filter( $orientationsInEmptyBox, - function(OrientatedItem $orientation) { + function (OrientatedItem $orientation) { return $orientation->isStable(); } ); @@ -176,4 +184,3 @@ function(OrientatedItem $orientation) { return $orientationsToUse; } } - diff --git a/src/PackedBox.php b/src/PackedBox.php index 6c598e48..397503be 100644 --- a/src/PackedBox.php +++ b/src/PackedBox.php @@ -1,81 +1,92 @@ weight += $item->getWeight(); } + return $this->weight; } /** - * Get remaining width inside box for another item + * Get remaining width inside box for another item. + * * @return int */ public function getRemainingWidth() @@ -120,7 +135,8 @@ public function getRemainingWidth() } /** - * Get remaining length inside box for another item + * Get remaining length inside box for another item. + * * @return int */ public function getRemainingLength() @@ -129,7 +145,8 @@ public function getRemainingLength() } /** - * Get remaining depth inside box for another item + * Get remaining depth inside box for another item. + * * @return int */ public function getRemainingDepth() @@ -138,7 +155,8 @@ public function getRemainingDepth() } /** - * Used width inside box for packing items + * Used width inside box for packing items. + * * @return int */ public function getUsedWidth() @@ -147,7 +165,8 @@ public function getUsedWidth() } /** - * Used length inside box for packing items + * Used length inside box for packing items. + * * @return int */ public function getUsedLength() @@ -156,7 +175,8 @@ public function getUsedLength() } /** - * Used depth inside box for packing items + * Used depth inside box for packing items. + * * @return int */ public function getUsedDepth() @@ -165,7 +185,8 @@ public function getUsedDepth() } /** - * Get remaining weight inside box for another item + * Get remaining weight inside box for another item. + * * @return int */ public function getRemainingWeight() @@ -174,7 +195,8 @@ public function getRemainingWeight() } /** - * Get volume utilisation of the packed box + * Get volume utilisation of the packed box. + * * @return float */ public function getVolumeUtilisation() @@ -189,9 +211,9 @@ public function getVolumeUtilisation() return round($itemVolume / $this->box->getInnerVolume() * 100, 1); } - /** - * Legacy constructor + * Legacy constructor. + * * @deprecated * * @param Box $box @@ -214,8 +236,7 @@ public function __construct( $usedWidth, $usedLength, $usedDepth - ) - { + ) { $this->box = $box; $this->items = $itemList; $this->remainingWidth = $remainingWidth; @@ -228,7 +249,8 @@ public function __construct( } /** - * The constructor from v3 + * The constructor from v3. + * * @param Box $box * @param PackedItemList $packedItems */ diff --git a/src/PackedBoxList.php b/src/PackedBoxList.php index be50c9bd..473eefd6 100644 --- a/src/PackedBoxList.php +++ b/src/PackedBoxList.php @@ -1,27 +1,29 @@ getWeight() - $boxB->getWeight(); } + return $choice; } /** - * Reversed version of compare + * Reversed version of compare. * * @param PackedBox $boxA * @param PackedBox $boxB @@ -58,16 +61,17 @@ public function reverseCompare($boxA, $boxB) if ($choice === 0) { $choice = $boxB->getWeight() - $boxA->getWeight(); } + return $choice; } /** - * Calculate the average (mean) weight of the boxes + * Calculate the average (mean) weight of the boxes. + * * @return float */ public function getMeanWeight() { - if (!is_null($this->meanWeight)) { return $this->meanWeight; } @@ -77,11 +81,11 @@ public function getMeanWeight() } return $this->meanWeight /= $this->count(); - } /** - * Calculate the variance in weight between these boxes + * Calculate the variance in weight between these boxes. + * * @return float */ public function getWeightVariance() @@ -94,11 +98,11 @@ public function getWeightVariance() } return $weightVariance / $this->count(); - } /** - * Get volume utilisation of the set of packed boxes + * Get volume utilisation of the set of packed boxes. + * * @return float */ public function getVolumeUtilisation() @@ -120,7 +124,8 @@ public function getVolumeUtilisation() } /** - * Do a bulk insert + * Do a bulk insert. + * * @param array $boxes */ public function insertFromArray(array $boxes) diff --git a/src/PackedItem.php b/src/PackedItem.php index 864830ce..d0a06a13 100644 --- a/src/PackedItem.php +++ b/src/PackedItem.php @@ -1,19 +1,19 @@ depth; } - /** * @param OrientatedItem $orientatedItem * @param int $x @@ -149,4 +148,3 @@ public static function fromOrientatedItem(OrientatedItem $orientatedItem, $x, $y ); } } - diff --git a/src/PackedItemList.php b/src/PackedItemList.php index 9a5b2660..468d1496 100644 --- a/src/PackedItemList.php +++ b/src/PackedItemList.php @@ -1,19 +1,19 @@ getItem(); } + return $return; } /** - * Get copy of this list as a standard PHP array + * Get copy of this list as a standard PHP array. + * * @return ItemList */ public function asItemList() { - $return = new ItemList; + $return = new ItemList(); foreach (clone $this as $packedItem) { $return->insert($packedItem->getItem()); } + return $return; } } diff --git a/src/Packer.php b/src/Packer.php index cf22ef21..01b76301 100644 --- a/src/Packer.php +++ b/src/Packer.php @@ -1,9 +1,10 @@ logger->log(LogLevel::INFO, "packing completed, {$packedBoxes->count()} boxes"); + return $packedBoxes; } /** - * Pack items into boxes using the principle of largest volume item first + * Pack items into boxes using the principle of largest volume item first. * * @throws ItemTooLargeException + * * @return PackedBoxList */ public function doVolumePacking() { - - $packedBoxes = new PackedBoxList; + $packedBoxes = new PackedBoxList(); //Keep going until everything packed while ($this->items->count()) { $boxesToEvaluate = clone $this->boxes; - $packedBoxesIteration = new PackedBoxList; + $packedBoxesIteration = new PackedBoxList(); //Loop through boxes starting with smallest, see what happens while (!$boxesToEvaluate->isEmpty()) { @@ -148,7 +156,7 @@ public function doVolumePacking() //Check iteration was productive if ($packedBoxesIteration->isEmpty()) { - throw new ItemTooLargeException('Item ' . $this->items->top()->getDescription() . ' is too large to fit into any box', $this->items->top()); + throw new ItemTooLargeException('Item '.$this->items->top()->getDescription().' is too large to fit into any box', $this->items->top()); } //Find best box of iteration, and remove packed items from unpacked list @@ -169,51 +177,60 @@ public function doVolumePacking() } $this->items = $unpackedItemList; $packedBoxes->insert($bestBox); - } return $packedBoxes; } /** - * Pack as many items as possible into specific given box + * Pack as many items as possible into specific given box. * * @deprecated + * * @param Box $box * @param ItemList $items + * * @return PackedBox packed box */ public function packIntoBox(Box $box, ItemList $items) { $volumePacker = new VolumePacker($box, clone $items); $volumePacker->setLogger($this->logger); + return $volumePacker->pack(); } /** - * Pack as many items as possible into specific given box + * Pack as many items as possible into specific given box. + * * @deprecated + * * @param Box $box * @param ItemList $items + * * @return ItemList items packed into box */ public function packBox(Box $box, ItemList $items) { $packedBox = $this->packIntoBox($box, $items); + return $packedBox->getItems(); } /** - * Given a solution set of packed boxes, repack them to achieve optimum weight distribution + * Given a solution set of packed boxes, repack them to achieve optimum weight distribution. * * @deprecated + * * @param PackedBoxList $originalBoxes + * * @return PackedBoxList */ public function redistributeWeight(PackedBoxList $originalBoxes) { $redistributor = new WeightRedistributor($this->boxes); $redistributor->setLogger($this->logger); + return $redistributor->redistributeWeight($originalBoxes); } } diff --git a/src/VolumePacker.php b/src/VolumePacker.php index 42b279ed..07f53665 100644 --- a/src/VolumePacker.php +++ b/src/VolumePacker.php @@ -1,27 +1,28 @@ box->getInnerWidth() != $this->boxWidth || $this->box->getInnerLength() != $this->boxLength) { $this->boxRotated = true; } - } /** - * Pack as many items as possible into specific given box + * Pack as many items as possible into specific given box. * * @return PackedBox packed box */ @@ -93,7 +97,7 @@ public function pack() { $this->logger->debug("[EVALUATING BOX] {$this->box->getReference()}"); - $packedItems = new PackedItemList; + $packedItems = new PackedItemList(); $prevItem = null; $x = $y = $z = $rowWidth = $rowLength = $layerWidth = $layerLength = $layerDepth = 0; @@ -141,7 +145,7 @@ public function pack() $this->logger->debug("doesn't fit, skipping for now"); $this->skippedItems->insert($itemToPack); } elseif ($x > 0 && $packingLengthLeft >= min($itemToPack->getWidth(), $itemToPack->getLength())) { - $this->logger->debug("No more fit in width wise, resetting for new row"); + $this->logger->debug('No more fit in width wise, resetting for new row'); $layerWidth = max($layerWidth, $rowWidth); $layerLength += $rowLength; $packingWidthLeft += $rowWidth; @@ -153,7 +157,7 @@ public function pack() $prevItem = null; continue; } else { - $this->logger->debug("no items fit, so starting next vertical layer"); + $this->logger->debug('no items fit, so starting next vertical layer'); $layerWidth = max($layerWidth, $rowWidth); $layerLength += $rowLength; @@ -170,7 +174,8 @@ public function pack() } } } - $this->logger->debug("done with this box"); + $this->logger->debug('done with this box'); + return $this->createPackedBox($packedItems); } @@ -195,7 +200,7 @@ protected function getOrientationForItem( $this->logger->debug( "evaluating item {$itemToPack->getDescription()} for fit", [ - 'item' => $itemToPack, + 'item' => $itemToPack, 'space' => [ 'maxWidth' => $maxWidth, 'maxLength' => $maxLength, @@ -213,16 +218,16 @@ protected function getOrientationForItem( /** * Figure out if we can stack the next item vertically on top of this rather than side by side - * Used when we've packed a tall item, and have just put a shorter one next to it + * Used when we've packed a tall item, and have just put a shorter one next to it. * - * @param PackedItemList $packedItems + * @param PackedItemList $packedItems * @param PackedItem|null $prevItem - * @param int $maxWidth - * @param int $maxLength - * @param int $maxDepth - * @param int $x - * @param int $y - * @param int $z + * @param int $maxWidth + * @param int $maxLength + * @param int $maxDepth + * @param int $x + * @param int $y + * @param int $z */ protected function tryAndStackItemsIntoSpace( PackedItemList $packedItems, @@ -256,10 +261,10 @@ protected function tryAndStackItemsIntoSpace( } /** - * Check item generally fits into box + * Check item generally fits into box. * - * @param Item $itemToPack - * @param PackedItemList $packedItems + * @param Item $itemToPack + * @param PackedItemList $packedItems * * @return bool */ @@ -273,9 +278,9 @@ protected function checkConstraints( /** * As well as purely dimensional constraints, there are other constraints that need to be met - * e.g. weight limits or item-specific restrictions (e.g. max batteries per box) + * e.g. weight limits or item-specific restrictions (e.g. max batteries per box). * - * @param Item $itemToPack + * @param Item $itemToPack * @param PackedItemList $packedItems * * @return bool @@ -292,9 +297,9 @@ protected function checkNonDimensionalConstraints(Item $itemToPack, PackedItemLi } /** - * Check the item physically fits in the box (at all) + * Check the item physically fits in the box (at all). * - * @param Item $itemToPack + * @param Item $itemToPack * * @return bool */ @@ -302,13 +307,15 @@ protected function checkDimensionalConstraints(Item $itemToPack) { $orientatedItemFactory = new OrientatedItemFactory(); $orientatedItemFactory->setLogger($this->logger); - return !!$orientatedItemFactory->getPossibleOrientationsInEmptyBox($itemToPack, $this->box); + + return (bool) $orientatedItemFactory->getPossibleOrientationsInEmptyBox($itemToPack, $this->box); } /** - * Reintegrate skipped items into main list when nothing left to process + * Reintegrate skipped items into main list when nothing left to process. */ - protected function rebuildItemList() { + protected function rebuildItemList() + { if ($this->items->isEmpty()) { $this->items = $this->skippedItems; $this->skippedItems = new ItemList(); @@ -327,7 +334,7 @@ protected function createPackedBox(PackedItemList $packedItems) $items = iterator_to_array($packedItems); $packedItems = new PackedItemList(); /** @var PackedItem $item */ - foreach($items as $item) { + foreach ($items as $item) { $packedItems->insert( new PackedItem( $item->getItem(), diff --git a/src/WeightRedistributor.php b/src/WeightRedistributor.php index 90a6939c..dfe88815 100644 --- a/src/WeightRedistributor.php +++ b/src/WeightRedistributor.php @@ -1,9 +1,10 @@ getMeanWeight(); $this->logger->log(LogLevel::DEBUG, "repacking for weight distribution, weight variance {$originalBoxes->getWeightVariance()}, target weight {$targetWeight}"); - $packedBoxes = new PackedBoxList; + $packedBoxes = new PackedBoxList(); $overWeightBoxes = []; $underWeightBoxes = []; @@ -67,18 +68,18 @@ public function redistributeWeight(PackedBoxList $originalBoxes) do { //Keep moving items from most overweight box to most underweight box $tryRepack = false; - $this->logger->log(LogLevel::DEBUG, 'boxes under/over target: ' . count($underWeightBoxes) . '/' . count($overWeightBoxes)); + $this->logger->log(LogLevel::DEBUG, 'boxes under/over target: '.count($underWeightBoxes).'/'.count($overWeightBoxes)); foreach ($underWeightBoxes as $u => $underWeightBox) { - $this->logger->log(LogLevel::DEBUG, 'Underweight Box ' . $u); + $this->logger->log(LogLevel::DEBUG, 'Underweight Box '.$u); foreach ($overWeightBoxes as $o => $overWeightBox) { - $this->logger->log(LogLevel::DEBUG, 'Overweight Box ' . $o); + $this->logger->log(LogLevel::DEBUG, 'Overweight Box '.$o); $overWeightBoxItems = $overWeightBox->getItems()->asArray(); //For each item in the heavier box, try and move it to the lighter one /** @var Item $overWeightBoxItem */ foreach ($overWeightBoxItems as $oi => $overWeightBoxItem) { - $this->logger->log(LogLevel::DEBUG, 'Overweight Item ' . $oi); + $this->logger->log(LogLevel::DEBUG, 'Overweight Item '.$oi); if ($underWeightBox->getWeight() + $overWeightBoxItem->getWeight() > $targetWeight) { $this->logger->log(LogLevel::DEBUG, 'Skipping item for hindering weight distribution'); continue; //skip if moving this item would hinder rather than help weight distribution @@ -90,7 +91,7 @@ public function redistributeWeight(PackedBoxList $originalBoxes) $newLighterBoxPacker = new Packer(); //we may need a bigger box $newLighterBoxPacker->setBoxes($this->boxes); $newLighterBoxPacker->setItems($newItemsForLighterBox); - $this->logger->log(LogLevel::INFO, "[ATTEMPTING TO PACK LIGHTER BOX]"); + $this->logger->log(LogLevel::INFO, '[ATTEMPTING TO PACK LIGHTER BOX]'); $newLighterBox = $newLighterBoxPacker->doVolumePacking()->extract(); if ($newLighterBox->getItems()->count() === count($newItemsForLighterBox)) { //new item fits @@ -102,13 +103,13 @@ public function redistributeWeight(PackedBoxList $originalBoxes) $newHeavierBoxPacker->setBoxes($this->boxes); $newHeavierBoxPacker->setItems($overWeightBoxItems); - $this->logger->log(LogLevel::INFO, "[ATTEMPTING TO PACK HEAVIER BOX]"); + $this->logger->log(LogLevel::INFO, '[ATTEMPTING TO PACK HEAVIER BOX]'); $newHeavierBoxes = $newHeavierBoxPacker->doVolumePacking(); if ($newHeavierBoxes->count() > 1) { //found an edge case in packing algorithm that *increased* box count $this->logger->log( LogLevel::INFO, - "[REDISTRIBUTING WEIGHT] Abandoning redistribution, because new packing is less efficient than original" + '[REDISTRIBUTING WEIGHT] Abandoning redistribution, because new packing is less efficient than original' ); return $originalBoxes; diff --git a/tests/BoxListTest.php b/tests/BoxListTest.php index c0b9eb55..afd6267a 100644 --- a/tests/BoxListTest.php +++ b/tests/BoxListTest.php @@ -1,7 +1,7 @@ insert($box1); $list->insert($box2); $list->insert($box3); @@ -29,15 +27,15 @@ function testCompare() while (!$list->isEmpty()) { $sorted[] = $list->extract(); } - self::assertEquals(array($box1, $box3, $box2), $sorted); + self::assertEquals([$box1, $box3, $box2], $sorted); } - function testIssue14A() + public function testIssue14A() { $box1 = new TestBox('Small', 21, 21, 3, 1, 20, 20, 2, 100); $box2 = new TestBox('Large', 1301, 1301, 1301, 1, 1300, 1300, 1300, 1000); $box3 = new TestBox('Medium', 101, 101, 11, 5, 100, 100, 10, 500); - $list = new BoxList; + $list = new BoxList(); $list->insert($box1); $list->insert($box2); $list->insert($box3); @@ -45,15 +43,15 @@ function testIssue14A() while (!$list->isEmpty()) { $sorted[] = $list->extract(); } - self::assertEquals(array($box1, $box3, $box2), $sorted); + self::assertEquals([$box1, $box3, $box2], $sorted); } - function testIssue14B() + public function testIssue14B() { $box1 = new TestBox('Small', 21, 21, 3, 1, 20, 20, 2, 100); $box2 = new TestBox('Large', 1301, 1301, 1301, 1, 1300, 1300, 1300, 1000); $box3 = new TestBox('Medium', 101, 101, 11, 5, 100, 100, 10, 500); - $list = new BoxList; + $list = new BoxList(); $list->insert($box3); $list->insert($box2); $list->insert($box1); @@ -61,8 +59,8 @@ function testIssue14B() while (!$list->isEmpty()) { $sorted[] = $list->extract(); } - self::assertEquals(array($box1, $box3, $box2), $sorted); - $list = new BoxList; + self::assertEquals([$box1, $box3, $box2], $sorted); + $list = new BoxList(); $list->insert($box2); $list->insert($box1); $list->insert($box3); @@ -70,6 +68,6 @@ function testIssue14B() while (!$list->isEmpty()) { $sorted[] = $list->extract(); } - self::assertEquals(array($box1, $box3, $box2), $sorted); + self::assertEquals([$box1, $box3, $box2], $sorted); } } diff --git a/tests/ItemListTest.php b/tests/ItemListTest.php index 856f63ef..67dfc666 100644 --- a/tests/ItemListTest.php +++ b/tests/ItemListTest.php @@ -1,9 +1,10 @@ insert($item1); $list->insert($item2); $list->insert($item3); - $sorted = iterator_to_array($list,false); - self::assertEquals(array($item2, $item3, $item1), $sorted); + $sorted = iterator_to_array($list, false); + self::assertEquals([$item2, $item3, $item1], $sorted); } - function testDifferentItemsSameDimensions() + public function testDifferentItemsSameDimensions() { - $item1 = new TestItem('Item A', 20, 20, 2, 100); $item2 = new TestItem('Item B', 20, 20, 2, 100); $item3 = new TestItem('Item A', 20, 20, 2, 100); $item4 = new TestItem('Item B', 20, 20, 2, 100); - $list = new ItemList; + $list = new ItemList(); $list->insert($item1); $list->insert($item2); $list->insert($item3); $list->insert($item4); - $sorted = iterator_to_array($list,false); - self::assertEquals(array($item1, $item3, $item2, $item4), $sorted); + $sorted = iterator_to_array($list, false); + self::assertEquals([$item1, $item3, $item2, $item4], $sorted); } } diff --git a/tests/PackedBoxListTest.php b/tests/PackedBoxListTest.php index 18d3b823..18d7fbcd 100644 --- a/tests/PackedBoxListTest.php +++ b/tests/PackedBoxListTest.php @@ -1,7 +1,7 @@ getVolumeUtilisation()); } - function testWeightVariance() + public function testWeightVariance() { $box = new TestBox('Box', 10, 10, 10, 10, 10, 10, 10, 10); $item = new TestItem('Item', 5, 10, 10, 10); diff --git a/tests/PackedBoxTest.php b/tests/PackedBoxTest.php index 09dfa167..e8837f50 100644 --- a/tests/PackedBoxTest.php +++ b/tests/PackedBoxTest.php @@ -1,7 +1,7 @@ getRemainingWeight()); } - function testVolumeUtilisation() + public function testVolumeUtilisation() { $box = new TestBox('Box', 10, 10, 10, 10, 10, 10, 10, 10); $item = new TestItem('Item', 5, 10, 10, 10); diff --git a/tests/PackerTest.php b/tests/PackerTest.php index 61e0ea6f..5a0faee8 100644 --- a/tests/PackerTest.php +++ b/tests/PackerTest.php @@ -1,7 +1,7 @@ addBox(new TestBox('Le petite box', 292, 336, 60, 10, 292, 336, 60, 9000)); $packer->addBox(new TestBox('Le grande box', 421, 548, 335, 100, 421, 548, 335, 10000)); @@ -197,7 +190,6 @@ public function testIssue1() public function testIssue3() { - $packer = new Packer(); $packer->addBox(new TestBox('OW Box 1', 51, 33, 33, 0.6, 51, 33, 33, 0.6)); $packer->addBox(new TestBox('OW Box 2', 50, 40, 40, 0.95, 50, 40, 40, 0.95)); @@ -209,7 +201,6 @@ public function testIssue3() public function testIssue6() { - $packer = new Packer(); $packer->addBox(new TestBox('Package 22', 675, 360, 210, 2, 670, 355, 204, 1000)); $packer->addBox(new TestBox('Package 2', 330, 130, 102, 2, 335, 135, 107, 1000)); @@ -219,7 +210,6 @@ public function testIssue6() $packedBoxes = $packer->pack(); self::assertEquals(1, $packedBoxes->count()); - } public function testIssue9() @@ -361,11 +351,11 @@ public function testIssue52A() public function testIssue52B() { $packer = new Packer(); - $packer->addBox(new TestBox('Box',370,375,60,140,364,374,40,3000)); - $packer->addItem(new TestItem('Item 1',220,310,12,679)); - $packer->addItem(new TestItem('Item 2',210,297,11,648)); - $packer->addItem(new TestItem('Item 3',210,297,5,187)); - $packer->addItem(new TestItem('Item 4',148,210,32,880)); + $packer->addBox(new TestBox('Box', 370, 375, 60, 140, 364, 374, 40, 3000)); + $packer->addItem(new TestItem('Item 1', 220, 310, 12, 679)); + $packer->addItem(new TestItem('Item 2', 210, 297, 11, 648)); + $packer->addItem(new TestItem('Item 3', 210, 297, 5, 187)); + $packer->addItem(new TestItem('Item 4', 148, 210, 32, 880)); $packedBoxes = $packer->pack(); self::assertEquals(1, $packedBoxes->count()); @@ -377,10 +367,10 @@ public function testIssue52B() public function testIssue52C() { $packer = new Packer(); - $packer->addBox(new TestBox('Box',230,300,240,160,230,300,240,15000)); - $packer->addItem(new TestItem('Item 1',210,297,4,213)); - $packer->addItem(new TestItem('Item 2',80,285,70,199)); - $packer->addItem(new TestItem('Item 3',80,285,70,199)); + $packer->addBox(new TestBox('Box', 230, 300, 240, 160, 230, 300, 240, 15000)); + $packer->addItem(new TestItem('Item 1', 210, 297, 4, 213)); + $packer->addItem(new TestItem('Item 2', 80, 285, 70, 199)); + $packer->addItem(new TestItem('Item 3', 80, 285, 70, 199)); $packedBoxes = $packer->pack(); self::assertEquals(2, $packedBoxes->count()); @@ -396,7 +386,8 @@ public function testIssue52C() self::assertEquals(4, $box2->getUsedDepth()); } - public function testIssue79() { + public function testIssue79() + { $packer = new Packer(); $packer->addBox(new TestBox('Bundle', 75, 15, 15, 0, 75, 15, 15, 30)); $packer->addItem(new TestItem('Item 1', 14, 12, 2, 2)); @@ -452,30 +443,29 @@ public function testCanPackRepresentativeLargerSamples2D( $packedItemCount += $packedBox->getItems()->count(); } - self::assertEquals($expectedBoxes2D, $packedBoxes->count()); self::assertEquals($expectedItemCount, $packedItemCount); - self::assertEquals($expectedWeightVariance2D, (int)$packedBoxes->getWeightVariance()); + self::assertEquals($expectedWeightVariance2D, (int) $packedBoxes->getWeightVariance()); } public function getSamples() { $expected = ['2D' => [], '3D' => []]; - $expected2DData = fopen(__DIR__ . '/data/expected2d.csv', 'r'); + $expected2DData = fopen(__DIR__.'/data/expected2d.csv', 'r'); while ($data = fgetcsv($expected2DData)) { - $expected['2D'][$data[0]] = array('boxes' => $data[1], 'weightVariance' => $data[2]); + $expected['2D'][$data[0]] = ['boxes' => $data[1], 'weightVariance' => $data[2]]; } fclose($expected2DData); - $expected3DData = fopen(__DIR__ . '/data/expected3d.csv', 'r'); + $expected3DData = fopen(__DIR__.'/data/expected3d.csv', 'r'); while ($data = fgetcsv($expected3DData)) { - $expected['3D'][$data[0]] = array('boxes' => $data[1], 'weightVariance' => $data[2]); + $expected['3D'][$data[0]] = ['boxes' => $data[1], 'weightVariance' => $data[2]]; } fclose($expected3DData); $boxes = []; - $boxData = fopen(__DIR__ . '/data/boxes.csv', 'r'); + $boxData = fopen(__DIR__.'/data/boxes.csv', 'r'); while ($data = fgetcsv($boxData)) { $boxes[] = new TestBox( $data[0], @@ -492,42 +482,40 @@ public function getSamples() fclose($boxData); $tests = []; - $itemData = fopen(__DIR__ . '/data/items.csv', 'r'); + $itemData = fopen(__DIR__.'/data/items.csv', 'r'); while ($data = fgetcsv($itemData)) { - if (isset($tests[$data[0]])) { - $tests[$data[0]]['items'][] = array( - 'qty' => $data[1], - 'name' => $data[2], - 'width' => $data[3], + $tests[$data[0]]['items'][] = [ + 'qty' => $data[1], + 'name' => $data[2], + 'width' => $data[3], 'length' => $data[4], - 'depth' => $data[5], - 'weight' => $data[6] - ); + 'depth' => $data[5], + 'weight' => $data[6], + ]; } else { - $tests[$data[0]] = array( - 'test' => $data[0], + $tests[$data[0]] = [ + 'test' => $data[0], 'boxes' => $boxes, - 'items' => array( - array( - 'qty' => $data[1], - 'name' => $data[2], - 'width' => $data[3], + 'items' => [ + [ + 'qty' => $data[1], + 'name' => $data[2], + 'width' => $data[3], 'length' => $data[4], - 'depth' => $data[5], - 'weight' => $data[6] - ) - ), - 'expected2D' => $expected['2D'][$data[0]]['boxes'], - 'expected3D' => $expected['3D'][$data[0]]['boxes'], + 'depth' => $data[5], + 'weight' => $data[6], + ], + ], + 'expected2D' => $expected['2D'][$data[0]]['boxes'], + 'expected3D' => $expected['3D'][$data[0]]['boxes'], 'weightVariance2D' => $expected['2D'][$data[0]]['weightVariance'], - 'weightVariance3D' => $expected['3D'][$data[0]]['weightVariance'] - ); + 'weightVariance3D' => $expected['3D'][$data[0]]['weightVariance'], + ]; } } fclose($itemData); return $tests; } - } diff --git a/tests/Test/TestBox.php b/tests/Test/TestBox.php index 6535090a..66e55f55 100644 --- a/tests/Test/TestBox.php +++ b/tests/Test/TestBox.php @@ -1,7 +1,7 @@ maxWeight; } } - diff --git a/tests/Test/TestConstrainedTestItem.php b/tests/Test/TestConstrainedTestItem.php index 63d45fb4..a4b9c221 100644 --- a/tests/Test/TestConstrainedTestItem.php +++ b/tests/Test/TestConstrainedTestItem.php @@ -1,7 +1,7 @@ asArray(), - function(TestItem $item) { + function (TestItem $item) { return $item->getDescription() === $this->getDescription(); } ); @@ -36,4 +36,3 @@ function(TestItem $item) { return count($alreadyPackedType) + 1 <= static::$limit; } } - diff --git a/tests/Test/TestItem.php b/tests/Test/TestItem.php index 5a3866ec..eb554948 100644 --- a/tests/Test/TestItem.php +++ b/tests/Test/TestItem.php @@ -1,7 +1,7 @@ volume; } } - - diff --git a/tests/VolumePackerTest.php b/tests/VolumePackerTest.php index dfdbe97f..d5e88e96 100644 --- a/tests/VolumePackerTest.php +++ b/tests/VolumePackerTest.php @@ -1,7 +1,7 @@ insert(new TestItem('Item 1', 250, 250, 2, 200)); $items->insert(new TestItem('Item 2', 250, 250, 2, 200)); $items->insert(new TestItem('Item 3', 250, 250, 2, 200)); @@ -32,10 +31,9 @@ public function testPackBoxThreeItemsFitEasily() public function testPackBoxThreeItemsFitExactly() { - $box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000); - $items = new ItemList; + $items = new ItemList(); $items->insert(new TestItem('Item 1', 296, 296, 2, 200)); $items->insert(new TestItem('Item 2', 296, 296, 2, 500)); $items->insert(new TestItem('Item 3', 296, 296, 4, 290)); @@ -48,10 +46,9 @@ public function testPackBoxThreeItemsFitExactly() public function testPackBoxThreeItemsFitExactlyNoRotation() { - $box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000); - $items = new ItemList; + $items = new ItemList(); $items->insert(new TestItem('Item 1', 296, 148, 2, 200)); $items->insert(new TestItem('Item 2', 296, 148, 2, 500)); @@ -63,10 +60,9 @@ public function testPackBoxThreeItemsFitExactlyNoRotation() public function testPackBoxThreeItemsFitSizeButOverweight() { - $box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000); - $items = new ItemList; + $items = new ItemList(); $items->insert(new TestItem('Item 1', 250, 250, 2, 400)); $items->insert(new TestItem('Item 2', 250, 250, 2, 500)); $items->insert(new TestItem('Item 3', 250, 250, 2, 200)); @@ -79,10 +75,9 @@ public function testPackBoxThreeItemsFitSizeButOverweight() public function testPackBoxThreeItemsFitWeightBut2Oversize() { - $box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000); - $items = new ItemList; + $items = new ItemList(); $items->insert(new TestItem('Item 1', 297, 296, 2, 200)); $items->insert(new TestItem('Item 2', 297, 296, 2, 500)); $items->insert(new TestItem('Item 3', 296, 296, 4, 290)); @@ -95,10 +90,9 @@ public function testPackBoxThreeItemsFitWeightBut2Oversize() public function testPackTwoItemsFitExactlySideBySide() { - $box = new TestBox('Le box', 300, 400, 10, 10, 296, 496, 8, 1000); - $items = new ItemList; + $items = new ItemList(); $items->insert(new TestItem('Item 1', 296, 248, 8, 200)); $items->insert(new TestItem('Item 2', 248, 296, 8, 200)); @@ -110,10 +104,9 @@ public function testPackTwoItemsFitExactlySideBySide() public function testPackThreeItemsBottom2FitSideBySideOneExactlyOnTop() { - $box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000); - $items = new ItemList; + $items = new ItemList(); $items->insert(new TestItem('Item 1', 248, 148, 4, 200)); $items->insert(new TestItem('Item 2', 148, 248, 4, 200)); $items->insert(new TestItem('Item 3', 296, 296, 4, 200)); @@ -126,10 +119,9 @@ public function testPackThreeItemsBottom2FitSideBySideOneExactlyOnTop() public function testPackThreeItemsBottom2FitSideBySideWithSpareSpaceOneOverhangSlightlyOnTop() { - $box = new TestBox('Le box', 250, 250, 10, 10, 248, 248, 8, 1000); - $items = new ItemList; + $items = new ItemList(); $items->insert(new TestItem('Item 1', 200, 200, 4, 200)); $items->insert(new TestItem('Item 2', 110, 110, 4, 200)); $items->insert(new TestItem('Item 3', 110, 110, 4, 200)); @@ -142,10 +134,9 @@ public function testPackThreeItemsBottom2FitSideBySideWithSpareSpaceOneOverhangS public function testPackSingleItemFitsBetterRotated() { - $box = new TestBox('Le box', 400, 300, 10, 10, 396, 296, 8, 1000); - $items = new ItemList; + $items = new ItemList(); $items->insert(new TestItem('Item 1', 250, 290, 2, 200)); $packer = new VolumePacker($box, $items); @@ -169,21 +160,20 @@ public function testIssue75() { $packer = new Packer(); $packer->addBox(new TestBox('CONTAINER (20 x 12 x 10)', 20, 12, 10, 0, 20, 12, 10, 2500)); - $packer->addItem(new TestItem('B (12 x 12 x 5)', 12, 12, 5, 8),2); - $packer->addItem(new TestItem('C (8 x 12 x 5)', 8, 12, 5, 8),2); + $packer->addItem(new TestItem('B (12 x 12 x 5)', 12, 12, 5, 8), 2); + $packer->addItem(new TestItem('C (8 x 12 x 5)', 8, 12, 5, 8), 2); $packedBoxes = $packer->pack(); self::assertEquals(1, $packedBoxes->count()); } - public function testIssue86() { $packer = new Packer(); $packer->addBox(new TestBox('Box', 22.5, 27, 13.5, 0.2, 22.5, 27, 13.5, 30)); - $packer->addItem(new TestItem('Item 1', 11.2, 22.2, 2.2, 0.075),3); - $packer->addItem(new TestItem('Item 2', 10.8, 21.5, 2, 0.102),4); - $packer->addItem(new TestItem('Item 3', 6.2, 17, 1.8, 0.03),3); + $packer->addItem(new TestItem('Item 1', 11.2, 22.2, 2.2, 0.075), 3); + $packer->addItem(new TestItem('Item 2', 10.8, 21.5, 2, 0.102), 4); + $packer->addItem(new TestItem('Item 3', 6.2, 17, 1.8, 0.03), 3); $packedBoxes = $packer->pack(); self::assertEquals(1, $packedBoxes->count());