liumiaomiao 1 Minggu lalu
induk
melakukan
8cb50e7fd1
54 mengubah file dengan 12273 tambahan dan 172 penghapusan
  1. TEMPAT SAMPAH
      lib/__pycache__/detail_url.cpython-38.pyc
  2. TEMPAT SAMPAH
      lib/__pycache__/es_tools.cpython-38.pyc
  3. 29 0
      lib/detail_url.py
  4. 2 0
      lib/es_tools.py
  5. TEMPAT SAMPAH
      oss/__pycache__/pb_pb2.cpython-38.pyc
  6. TEMPAT SAMPAH
      oss/__pycache__/pb_pb2_grpc.cpython-38.pyc
  7. 327 0
      oss/client.py
  8. 43 0
      oss/pb_pb2.py
  9. 183 0
      oss/pb_pb2_grpc.py
  10. 29 0
      oss/proto/pb.proto
  11. 6 19
      tools/test.py
  12. 0 0
      tools/临时/spidercodes
  13. 2 44
      tools/从es导出数据/es.py
  14. 8183 0
      tools/从mongo库导出数据execl/_id.csv
  15. 62 0
      tools/从mongo库导出数据execl/bak.py
  16. TEMPAT SAMPAH
      tools/从mongo库导出数据execl/bidding_results.xlsx
  17. 22 17
      tools/从mongo库导出数据execl/mongo_to_execl.py
  18. 85 0
      tools/从mongo库导出数据execl/mongo_to_execl_多包.py
  19. TEMPAT SAMPAH
      tools/从mongo库导出数据execl/output.xlsx
  20. TEMPAT SAMPAH
      tools/从mongo库导出数据execl/output_fujian.xlsx
  21. 54 0
      tools/从mongo库导出数据execl/根据mongoid导出数据.py
  22. TEMPAT SAMPAH
      tools/周报/周报表格导出/mongo_data_statistics_combined1.xlsx
  23. 49 55
      tools/数据抽样/fix_site_data_export.py
  24. 12 7
      tools/数据抽样/sample_data_export_new.py
  25. 53 0
      tools/数据抽样/完全随机抽样.py
  26. TEMPAT SAMPAH
      tools/数据质量监控平台/kb-数据问题统计/kb_tasks_export.xlsx
  27. TEMPAT SAMPAH
      tools/数据质量监控平台/kb-数据问题统计/kb_tasks_export_with_stats.xlsx
  28. TEMPAT SAMPAH
      tools/数据质量监控平台/kb-数据问题统计/kb_tasks_特定条件_export.xlsx
  29. 25 0
      tools/数据质量监控平台/kb-数据问题统计/kb错误原因及占比统计.py
  30. 1 1
      tools/数据质量监控平台/kb-数据问题统计/task_kb.py
  31. 137 0
      tools/数据质量监控平台/kb-数据问题统计/task_kb_根据条件导出kb数据.py
  32. 188 0
      tools/数据质量监控平台/kb-数据问题统计/task_kb_每周汇报.py
  33. 195 0
      tools/数据质量监控平台/kb-数据问题统计/错误原因.csv
  34. TEMPAT SAMPAH
      tools/数据质量监控平台/kb-数据问题统计/错误原因统计.xlsx
  35. 2 2
      tools/数据质量监控平台/标讯基础信息分析结果入库.py
  36. TEMPAT SAMPAH
      tools/标讯数据重复率分析/main_with_repeatids_grouped.xlsx
  37. 43 21
      tools/标讯数据重复率分析/repeat.py
  38. 253 0
      tools/标讯数据重复率分析/repeat_v2.py
  39. 207 0
      tools/标讯数据重复率分析/repeat_v3.py
  40. 268 0
      tools/标讯数据重复率分析/repeat_v4.py
  41. 75 0
      tools/标讯数据重复率分析/repeat_v5.py
  42. TEMPAT SAMPAH
      tools/标讯数据重复率分析/repeated_with_source.xlsx
  43. 300 6
      tools/标讯数据重复率分析/test.py
  44. 44 0
      tools/标讯数据重复率分析/导出重复数据.py
  45. 49 0
      tools/标讯数据重复率分析/导出重复数据_v1.py
  46. 54 0
      tools/标讯数据重复率分析/导出重复数据_v2.py
  47. 138 0
      tools/标讯数据附件为空数量统计/统计附件缺失数量.py
  48. 203 0
      tools/标讯数据附件为空数量统计/附件缺失率第二版.py
  49. 321 0
      tools/标讯数据附件为空数量统计/附件缺失率第二版_新.py
  50. 289 0
      tools/标讯数据附件为空数量统计/附件缺失率第二版_新_bak.py
  51. TEMPAT SAMPAH
      tools/爬虫数据质量二期/spider_anomalies_2025-07-03.xlsx
  52. 311 0
      tools/爬虫数据质量二期/spider_quality.py
  53. 29 0
      tools/生成三级页地址/生成三级页地址.py
  54. TEMPAT SAMPAH
      tools/高质量站点第二版/.~spidercode_stats.xlsx

TEMPAT SAMPAH
lib/__pycache__/detail_url.cpython-38.pyc


TEMPAT SAMPAH
lib/__pycache__/es_tools.cpython-38.pyc


+ 29 - 0
lib/detail_url.py

@@ -0,0 +1,29 @@
+import base64
+
+
+
+class SimpleEncrypt:
+    def __init__(self, key):
+        self.key = key
+
+    def do_encode(self, bs):
+        tmp = bytearray(self.key.encode())
+        i = 0
+        while i < len(bs):
+            for j in range(len(tmp)):
+                if i >= len(bs):
+                    break
+                bs[i] = bs[i] ^ tmp[j]
+                i += 1
+
+    def encode_string(self, s):
+        data = bytearray(s.encode())
+        self.do_encode(data)
+        return base64.b64encode(data).decode()
+
+    def decode_string(self, s):
+        data = bytearray(base64.b64decode(s))
+        self.do_encode(data)
+        return data.decode()
+
+SE3 = SimpleEncrypt(key="entservice")

+ 2 - 0
lib/es_tools.py

@@ -35,6 +35,8 @@ class EsUtil:
             results = []
             mongo_tools.MongoSentence.insert_many(coon, save_bulk)
             print(count, "数据已保存")
+
+    @staticmethod
     def get_es(**kwargs):
         """
 		获取es连接

TEMPAT SAMPAH
oss/__pycache__/pb_pb2.cpython-38.pyc


TEMPAT SAMPAH
oss/__pycache__/pb_pb2_grpc.cpython-38.pyc


+ 327 - 0
oss/client.py

@@ -0,0 +1,327 @@
+import grpc
+import pb_pb2 as pb
+import pb_pb2_grpc as pb_grpc
+import time
+import random
+import string
+from concurrent.futures import ThreadPoolExecutor
+import argparse
+import statistics
+import matplotlib.pyplot as plt
+from tqdm import tqdm
+
+
+class ServiceClient:
+    def __init__(self, host='127.0.0.1', port=50051):
+        self.channel = grpc.insecure_channel(
+            f'{host}:{port}',
+            options=[
+                ('grpc.keepalive_time_ms', 10000),  # 10秒心跳
+                ('grpc.keepalive_timeout_ms', 5000),  # 5秒超时
+                ('grpc.keepalive_permit_without_calls', 1),
+                ('grpc.http2.max_pings_without_data', 0),
+                ('grpc.max_reconnect_backoff_ms', 5000)
+            ]
+        )
+        self.stub = pb_grpc.ServiceStub(self.channel)
+
+    def download(self, bucket_id, object_name):
+        """Client-side streaming download"""
+        request = pb.DownloadRequest(bucketID=bucket_id, objectName=object_name)
+        responses = self.stub.Download(request)
+
+        received_data = bytearray()
+        for response in responses:
+            if response.errorCode != 0:
+                print(f"Error: {response.errorMsg}")
+                return None
+            received_data.extend(response.data)
+
+        return bytes(received_data)
+
+    def upload(self, file_data, bucket_id, object_name, gzip=False):
+        """Server-side streaming upload"""
+
+        def request_generator():
+            # Split data into chunks (simulate streaming)
+            chunk_size = 1024 * 1024  # 1MB chunks
+            for i in range(0, len(file_data), chunk_size):
+                yield pb.UploadRequest(
+                    stream=file_data[i:i + chunk_size],
+                    gzip=gzip,
+                    bucketID=bucket_id,
+                    objectName=object_name
+                )
+
+        response = self.stub.Upload(request_generator())
+        if response.errorCode != 0:
+            print(f"Upload error: {response.errorMsg}")
+            return False
+        return True
+
+    def get_bid_detail(self, bucket_id, object_name):
+        """Client-side streaming for bid details"""
+        request = pb.DownloadRequest(bucketID=bucket_id, objectName=object_name)
+        responses = self.stub.GetBidDetail(request)
+
+        details = []
+        for response in responses:
+            if response.errorCode != 0:
+                print(f"Error: {response.errorMsg}")
+                break
+            details.append(response.data.decode('utf-8'))
+
+        return details
+
+    def close(self):
+        self.channel.close()
+
+
+class StressTester:
+    def __init__(self, host, port, num_threads=10):
+        self.host = host
+        self.port = port
+        self.num_threads = num_threads
+        self.results = {
+            'upload': {'times': [], 'success': 0, 'fail': 0},
+            'download': {'times': [], 'success': 0, 'fail': 0},
+            'bid_detail': {'times': [], 'success': 0, 'fail': 0}
+        }
+
+    def _generate_random_data(self, size_kb):
+        """Generate random data of specified size in KB"""
+        return ''.join(random.choices(string.ascii_letters + string.digits, k=size_kb * 1024)).encode('utf-8')
+
+    def _test_upload(self, client, size_kb):
+        """Test upload operation"""
+        start_time = time.time()
+        try:
+            data = self._generate_random_data(size_kb)
+            bucket_id = f"stress_bucket_{random.randint(1, 1000)}"
+            object_name = f"stress_object_{random.randint(1, 1000)}.txt"
+
+            success = client.upload(data, bucket_id, object_name)
+            elapsed = time.time() - start_time
+
+            if success:
+                self.results['upload']['success'] += 1
+                self.results['upload']['times'].append(elapsed)
+            else:
+                self.results['upload']['fail'] += 1
+        except Exception as e:
+            self.results['upload']['fail'] += 1
+            print(f"Upload error: {str(e)}")
+
+    def _test_download(self, client, size_kb):
+        """Test download operation"""
+        start_time = time.time()
+        try:
+            # First upload a file to download
+            data = self._generate_random_data(size_kb)
+            bucket_id = "stress_download_bucket"
+            object_name = "stress_download_object.txt"
+
+            # Upload then immediately download
+            if client.upload(data, bucket_id, object_name):
+                downloaded_data = client.download(bucket_id, object_name)
+                elapsed = time.time() - start_time
+
+                if downloaded_data is not None and len(downloaded_data) == len(data):
+                    self.results['download']['success'] += 1
+                    self.results['download']['times'].append(elapsed)
+                else:
+                    self.results['download']['fail'] += 1
+            else:
+                self.results['download']['fail'] += 1
+        except Exception as e:
+            self.results['download']['fail'] += 1
+            print(f"Download error: {str(e)}")
+
+    def _test_bid_detail(self, client):
+        """Test get_bid_detail operation"""
+        start_time = time.time()
+        try:
+            bucket_id = "detail"
+            object_name = "67c123333309c0998b619793"
+
+            details = client.get_bid_detail(bucket_id, object_name)
+            elapsed = time.time() - start_time
+
+            if details is not None:
+                self.results['bid_detail']['success'] += 1
+                self.results['bid_detail']['times'].append(elapsed)
+            else:
+                self.results['bid_detail']['fail'] += 1
+        except Exception as e:
+            self.results['bid_detail']['fail'] += 1
+            print(f"Bid detail error: {str(e)}")
+
+    def run_test(self, test_type, num_requests=100, size_kb=10):
+        """Run stress test for specified operation"""
+        print(f"Starting {test_type} stress test with {num_requests} requests...")
+
+        with ThreadPoolExecutor(max_workers=self.num_threads) as executor:
+            futures = []
+
+            for _ in tqdm(range(num_requests), desc=f"Running {test_type} tests"):
+                client = ServiceClient(self.host, self.port)
+
+                if test_type == 'upload':
+                    futures.append(executor.submit(self._test_upload, client, size_kb))
+                elif test_type == 'download':
+                    futures.append(executor.submit(self._test_download, client, size_kb))
+                elif test_type == 'bid_detail':
+                    futures.append(executor.submit(self._test_bid_detail, client))
+
+                # Close client after test
+                client.close()
+
+            # Wait for all tests to complete
+            for future in futures:
+                future.result()
+
+        self._report_results(test_type)
+
+    def _report_results(self, test_type):
+        """Generate and display test results"""
+        results = self.results[test_type]
+        total = results['success'] + results['fail']
+
+        if results['success'] > 0:
+            avg_time = statistics.mean(results['times'])
+            min_time = min(results['times'])
+            max_time = max(results['times'])
+            std_dev = statistics.stdev(results['times']) if len(results['times']) > 1 else 0
+        else:
+            avg_time = min_time = max_time = std_dev = 0
+
+        print("\n" + "=" * 50)
+        print(f"Stress Test Results for {test_type}:")
+        print(f"Total requests: {total}")
+        print(f"Successful: {results['success']} ({results['success'] / total * 100:.2f}%)")
+        print(f"Failed: {results['fail']} ({results['fail'] / total * 100:.2f}%)")
+        print(f"Average time: {avg_time:.4f}s")
+        print(f"Min time: {min_time:.4f}s")
+        print(f"Max time: {max_time:.4f}s")
+        print(f"Standard deviation: {std_dev:.4f}s")
+        print("=" * 50 + "\n")
+
+        # Plot histogram of response times
+        if results['success'] > 0:
+            plt.figure(figsize=(10, 6))
+            plt.hist(results['times'], bins=20, edgecolor='black')
+            plt.title(f'Response Time Distribution for {test_type}')
+            plt.xlabel('Time (seconds)')
+            plt.ylabel('Frequency')
+            plt.grid(True)
+            plt.show()
+
+    def run_all_tests(self, num_requests=100, size_kb=10):
+        """Run all available tests"""
+        self.run_test('upload', num_requests, size_kb)
+        self.run_test('download', num_requests, size_kb)
+        self.run_test('bid_detail', num_requests)
+
+
+def main():
+    parser = argparse.ArgumentParser(description='gRPC Client with Stress Testing')
+    parser.add_argument('--host', default='localhost', help='Server host')
+    parser.add_argument('--port', type=int, default=50051, help='Server port')
+    parser.add_argument('--test', choices=['upload', 'download', 'bid_detail', 'all'],
+                        help='Type of test to run')
+    parser.add_argument('--requests', type=int, default=100, help='Number of requests')
+    parser.add_argument('--size', type=int, default=10, help='Data size in KB (for upload/download)')
+    parser.add_argument('--threads', type=int, default=10, help='Number of concurrent threads')
+
+    args = parser.parse_args()
+
+    if args.test:
+        tester = StressTester(args.host, args.port, args.threads)
+
+        if args.test == 'all':
+            tester.run_all_tests(args.requests, args.size)
+        else:
+            tester.run_test(args.test, args.requests, args.size)
+    else:
+        # Interactive mode
+        client = ServiceClient(args.host, args.port)
+
+        try:
+            while True:
+                print("\nOptions:")
+                print("1. Upload file")
+                print("2. Download file")
+                print("3. Get bid details")
+                print("4. Exit")
+
+                choice = input("Enter your choice: ")
+
+                if choice == '1':
+                    file_path = input("Enter file path: ")
+                    bucket_id = input("Enter bucket ID: ")
+                    object_name = input("Enter object name: ")
+                    gzip = input("Use gzip compression? (y/n): ").lower() == 'y'
+
+                    try:
+                        with open(file_path, 'rb') as f:
+                            data = f.read()
+
+                        start_time = time.time()
+                        success = client.upload(data, bucket_id, object_name, gzip)
+                        elapsed = time.time() - start_time
+
+                        if success:
+                            print(f"Upload successful in {elapsed:.2f} seconds")
+                        else:
+                            print("Upload failed")
+                    except Exception as e:
+                        print(f"Error: {str(e)}")
+
+                elif choice == '2':
+                    bucket_id = input("Enter bucket ID: ")
+                    object_name = input("Enter object name: ")
+
+                    start_time = time.time()
+                    data = client.download(bucket_id, object_name)
+                    elapsed = time.time() - start_time
+
+                    if data is not None:
+                        print(f"Downloaded {len(data)} bytes in {elapsed:.2f} seconds")
+                        save = input("Save to file? (y/n): ").lower() == 'y'
+                        if save:
+                            file_path = input("Enter save path: ")
+                            with open(file_path, 'wb') as f:
+                                f.write(data)
+                            print("File saved successfully")
+                    else:
+                        print("Download failed")
+
+                elif choice == '3':
+                    bucket_id = input("Enter bucket ID: ")
+                    object_name = input("Enter object name: ")
+
+                    start_time = time.time()
+                    details = client.get_bid_detail(bucket_id, object_name)
+                    elapsed = time.time() - start_time
+
+                    if details:
+                        print(f"Got {len(details)} bid details in {elapsed:.2f} seconds")
+                        for i, detail in enumerate(details[:5]):  # Show first 5 details
+                            print(f"{i + 1}. {detail}")
+                        if len(details) > 5:
+                            print(f"... and {len(details) - 5} more")
+                    else:
+                        print("Failed to get bid details")
+
+                elif choice == '4':
+                    break
+
+                else:
+                    print("Invalid choice")
+
+        finally:
+            client.close()
+
+
+if __name__ == '__main__':
+    main()

+ 43 - 0
oss/pb_pb2.py

@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# NO CHECKED-IN PROTOBUF GENCODE
+# source: pb.proto
+# Protobuf Python Version: 5.29.0
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import runtime_version as _runtime_version
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+_runtime_version.ValidateProtobufRuntimeVersion(
+    _runtime_version.Domain.PUBLIC,
+    5,
+    29,
+    0,
+    '',
+    'pb.proto'
+)
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x08pb.proto\x12\x02pb\"7\n\x0f\x44ownloadRequest\x12\x10\n\x08\x62ucketID\x18\x01 \x01(\t\x12\x12\n\nobjectName\x18\x02 \x01(\t\"S\n\rUploadRequest\x12\x0e\n\x06stream\x18\x01 \x01(\x0c\x12\x0c\n\x04gzip\x18\x02 \x01(\x08\x12\x10\n\x08\x62ucketID\x18\x03 \x01(\t\x12\x12\n\nobjectName\x18\x04 \x01(\t\"=\n\x08Response\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x12\x11\n\terrorCode\x18\x02 \x01(\x03\x12\x10\n\x08\x65rrorMsg\x18\x03 \x01(\t2\x9c\x01\n\x07Service\x12/\n\x08\x44ownload\x12\x13.pb.DownloadRequest\x1a\x0c.pb.Response0\x01\x12+\n\x06Upload\x12\x11.pb.UploadRequest\x1a\x0c.pb.Response(\x01\x12\x33\n\x0cGetBidDetail\x12\x13.pb.DownloadRequest\x1a\x0c.pb.Response0\x01\x42\x07Z\x05../pbb\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'pb_pb2', _globals)
+if not _descriptor._USE_C_DESCRIPTORS:
+  _globals['DESCRIPTOR']._loaded_options = None
+  _globals['DESCRIPTOR']._serialized_options = b'Z\005../pb'
+  _globals['_DOWNLOADREQUEST']._serialized_start=16
+  _globals['_DOWNLOADREQUEST']._serialized_end=71
+  _globals['_UPLOADREQUEST']._serialized_start=73
+  _globals['_UPLOADREQUEST']._serialized_end=156
+  _globals['_RESPONSE']._serialized_start=158
+  _globals['_RESPONSE']._serialized_end=219
+  _globals['_SERVICE']._serialized_start=222
+  _globals['_SERVICE']._serialized_end=378
+# @@protoc_insertion_point(module_scope)

+ 183 - 0
oss/pb_pb2_grpc.py

@@ -0,0 +1,183 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+import warnings
+
+import pb_pb2 as pb__pb2
+
+GRPC_GENERATED_VERSION = '1.29.0'
+GRPC_VERSION = grpc.__version__
+_version_not_supported = False
+
+try:
+    from grpc._utilities import first_version_is_lower
+    _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
+except ImportError:
+    _version_not_supported = True
+
+if _version_not_supported:
+    raise RuntimeError(
+        f'The grpc package installed is at version {GRPC_VERSION},'
+        + f' but the generated code in pb_pb2_grpc.py depends on'
+        + f' grpcio>={GRPC_GENERATED_VERSION}.'
+        + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
+        + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
+    )
+
+
+class ServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Download = channel.unary_stream(
+                '/pb.Service/Download',
+                request_serializer=pb__pb2.DownloadRequest.SerializeToString,
+                response_deserializer=pb__pb2.Response.FromString,
+                _registered_method=True)
+        self.Upload = channel.stream_unary(
+                '/pb.Service/Upload',
+                request_serializer=pb__pb2.UploadRequest.SerializeToString,
+                response_deserializer=pb__pb2.Response.FromString,
+                _registered_method=True)
+        self.GetBidDetail = channel.unary_stream(
+                '/pb.Service/GetBidDetail',
+                request_serializer=pb__pb2.DownloadRequest.SerializeToString,
+                response_deserializer=pb__pb2.Response.FromString,
+                _registered_method=True)
+
+
+class ServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def Download(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Upload(self, request_iterator, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetBidDetail(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Download': grpc.unary_stream_rpc_method_handler(
+                    servicer.Download,
+                    request_deserializer=pb__pb2.DownloadRequest.FromString,
+                    response_serializer=pb__pb2.Response.SerializeToString,
+            ),
+            'Upload': grpc.stream_unary_rpc_method_handler(
+                    servicer.Upload,
+                    request_deserializer=pb__pb2.UploadRequest.FromString,
+                    response_serializer=pb__pb2.Response.SerializeToString,
+            ),
+            'GetBidDetail': grpc.unary_stream_rpc_method_handler(
+                    servicer.GetBidDetail,
+                    request_deserializer=pb__pb2.DownloadRequest.FromString,
+                    response_serializer=pb__pb2.Response.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'pb.Service', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+    server.add_registered_method_handlers('pb.Service', rpc_method_handlers)
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Service(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def Download(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(
+            request,
+            target,
+            '/pb.Service/Download',
+            pb__pb2.DownloadRequest.SerializeToString,
+            pb__pb2.Response.FromString,
+            options,
+            channel_credentials,
+            insecure,
+            call_credentials,
+            compression,
+            wait_for_ready,
+            timeout,
+            metadata,
+            _registered_method=True)
+
+    @staticmethod
+    def Upload(request_iterator,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.stream_unary(
+            request_iterator,
+            target,
+            '/pb.Service/Upload',
+            pb__pb2.UploadRequest.SerializeToString,
+            pb__pb2.Response.FromString,
+            options,
+            channel_credentials,
+            insecure,
+            call_credentials,
+            compression,
+            wait_for_ready,
+            timeout,
+            metadata,
+            _registered_method=True)
+
+    @staticmethod
+    def GetBidDetail(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(
+            request,
+            target,
+            '/pb.Service/GetBidDetail',
+            pb__pb2.DownloadRequest.SerializeToString,
+            pb__pb2.Response.FromString,
+            options,
+            channel_credentials,
+            insecure,
+            call_credentials,
+            compression,
+            wait_for_ready,
+            timeout,
+            metadata,
+            _registered_method=True)

+ 29 - 0
oss/proto/pb.proto

@@ -0,0 +1,29 @@
+syntax = "proto3";
+
+package pb;
+
+option go_package = "../pb";
+
+service Service {
+  rpc Download (DownloadRequest) returns (stream Response);
+  rpc Upload (stream UploadRequest) returns (Response);
+  rpc GetBidDetail (DownloadRequest) returns (stream Response);
+}
+
+message DownloadRequest {
+  string bucketID = 1;
+  string objectName = 2;
+}
+
+message UploadRequest {
+  bytes stream = 1; // 客户端将文件数据传递过来
+  bool gzip = 2; //是否压缩
+  string bucketID = 3; //桶id
+  string objectName = 4; //对象名称
+}
+
+message Response {
+  bytes data = 1;
+  int64 errorCode = 2;
+  string errorMsg = 3;
+}

+ 6 - 19
tools/test.py

@@ -1,21 +1,8 @@
-from pymongo import MongoClient
+from datetime import datetime, timedelta
 
-client = MongoClient('mongodb://172.20.45.129:27002/')
-db = client['data_quality']
-collection = db['bidding_202505']
+# 定义一周的时间范围,转换为Unix时间戳格式
+end_date = datetime(2025, 7, 10, 12, 0, 0)  # 需要创建datetime对象
+start_date = int((end_date - timedelta(days=7)).timestamp())
+end_timestamp = int(end_date.timestamp())
 
-# 删除 comeintime 在 [1747152000, 1747238400] 范围内的文档
-# result = collection.delete_many({
-#     "comeintime": {
-#         "$gte": 1747152000,  # 大于等于 from
-#         "$lte": 1747238400   # 小于等于 to
-#     }
-# })
-count = collection.count_documents({
-    "comeintime": {
-        "$gte": 1747152000,
-        "$lte": 1747238400
-    }
-})
-print(f"符合条件的数据量: {count}")
-# print(f"删除了 {result.deleted_count} 条文档")
+print(f"开始时间:{start_date} -- 结束时间:{end_timestamp}")

+ 0 - 0
tools/临时/spidercodes


+ 2 - 44
tools/从es导出数据/es.py

@@ -21,7 +21,7 @@ def ES_bidding(es_query):
         'mg_host': '172.20.45.129',
         'mg_port': 27002,
         'database': 'data_quality',
-        'collection': 'bidding_20250515_fujian'
+        'collection': 'bidding_20250702'
     }
     query = es_query
     # 传入查询语句query 以及配置信息
@@ -29,50 +29,8 @@ def ES_bidding(es_query):
 
 def run():
     # 根据ES语句查找bidding
-
     es_query = {"track_total_hits": True,
-                "query": {
-                    "bool": {
-                        "must": [{
-                            "range": {
-                                "publishtime": {
-                                    "gte": 1747238400,
-                                    "lte": 1747324800
-                                }
-                            }
-                        }, {
-                            "bool": {
-                                "must": [{
-                                    "multi_match": {
-                                        "query": "详见附件",
-                                        "type": "phrase",
-                                        "fields": ["detail"]
-                                    }
-                                }]
-                            }
-                        }],
-                        "must_not": []
-                    }
-                },
-                "highlight": {
-                    "pre_tags": [""],
-                    "post_tags": [""],
-                    "fields": {
-                        "detail": {
-                            "fragment_size": 115,
-                            "number_of_fragments": 1
-                        }
-                    }
-                },
-                "sort": [{
-                    "dataweight": "desc"
-                }, {
-                    "publishtime": "desc"
-                }],
-                "from": 0
-            }
-    # es_query = {"track_total_hits": True,
-    #             "query": {"bool": {"must": [{"range": {"comeintime": {"from": "1747324800", "to": "1747411200"}}}]}}}
+                "query": {"bool": {"must": [{"range": {"comeintime": {"from": "1751385600", "to": "1751472000"}}}]}}}
     # es_query = {"track_total_hits": True,
     #             "query": {"bool": {"must": [{"range": {"publishtime": {"from": "1691337600", "to": "1691424000"}}},
     #                                         {"terms": {"subtype": ["中标", "合同","成交"]}}]}}}

+ 8183 - 0
tools/从mongo库导出数据execl/_id.csv

@@ -0,0 +1,8183 @@
+_id
+6699380c66cf0db42a55858b
+6699387b66cf0db42a5588ad
+6699381666cf0db42a5585c1
+6699385366cf0db42a5587b5
+66993be966cf0db42a559ee7
+66993be966cf0db42a559ee4
+66993be966cf0db42a559ee8
+66993be966cf0db42a559ee3
+6698ec0066cf0db42a547712
+6698ef0866cf0db42a549002
+669939b266cf0db42a55914c
+669937b266cf0db42a5581f8
+66992d4e66cf0db42a5562c4
+669939f266cf0db42a55932d
+6699381966cf0db42a5585ed
+66992ec166cf0db42a5565c0
+669939a866cf0db42a5590f5
+669939ee66cf0db42a5592fc
+6699391b66cf0db42a558d03
+66993b6166cf0db42a559b40
+66993aa366cf0db42a5597ce
+66993b0166cf0db42a5598c8
+66993aad66cf0db42a5597d9
+6699399e66cf0db42a559075
+66993b8a66cf0db42a559ce3
+669934e766cf0db42a556fa2
+669934dd66cf0db42a556f85
+669936b666cf0db42a557830
+669936b666cf0db42a557828
+66993be966cf0db42a559ea8
+66993be966cf0db42a559ecb
+66993be966cf0db42a559ef2
+66993be966cf0db42a559eef
+66993be966cf0db42a559ef0
+66993be966cf0db42a559eee
+66993b4366cf0db42a559ae6
+6699380c66cf0db42a558584
+66993a5c66cf0db42a5595fc
+66993a3e66cf0db42a5594f1
+66993a0666cf0db42a559354
+66993a1066cf0db42a55939d
+66993a1066cf0db42a55939f
+66993a0666cf0db42a559352
+6699331966cf0db42a556c5e
+66992e0266cf0db42a556444
+6699331966cf0db42a556c60
+669936ad66cf0db42a5577d1
+66993ad566cf0db42a5597ea
+66993aa366cf0db42a5597d1
+6699399466cf0db42a559073
+669939f266cf0db42a559310
+669933f666cf0db42a556ddc
+669933d766cf0db42a556da3
+6699387166cf0db42a5587f4
+6699382066cf0db42a558657
+66992d4e66cf0db42a5562b8
+6699250366cf0db42a5550cb
+669939dd66cf0db42a559230
+6699393366cf0db42a558d8a
+6699301566cf0db42a5567b6
+66992f0f66cf0db42a55662a
+6699343d66cf0db42a556ea4
+6699342866cf0db42a556e50
+66992ead66cf0db42a55655e
+66992ead66cf0db42a55655f
+66992ead66cf0db42a55655d
+66992ebf66cf0db42a55659b
+669934b566cf0db42a556f56
+669934a166cf0db42a556f29
+669937c666cf0db42a558302
+6699348c66cf0db42a556ee8
+66993b9466cf0db42a559ce6
+6699391166cf0db42a558c7b
+66993b6166cf0db42a559b41
+66993a0666cf0db42a559387
+669936e066cf0db42a557a45
+6699371266cf0db42a557c82
+6699387366cf0db42a5587ff
+669938ad66cf0db42a5589e1
+66992d5666cf0db42a5562d0
+66992e6f66cf0db42a556504
+6699337d66cf0db42a556d55
+66993b5766cf0db42a559b36
+66993a9d66cf0db42a5597a5
+66993a9d66cf0db42a5597af
+66993a9d66cf0db42a5597ae
+66993a9d66cf0db42a5597a4
+669936a266cf0db42a5576d7
+66993a6666cf0db42a55960a
+6699354166cf0db42a557027
+669929b166cf0db42a555ceb
+66992a4a66cf0db42a555db0
+66992a4a66cf0db42a555dae
+669932b566cf0db42a556c06
+669936cc66cf0db42a557977
+6699367066cf0db42a5574a0
+6699399466cf0db42a559070
+6699382366cf0db42a558670
+66992f2466cf0db42a556658
+66992f4266cf0db42a556672
+6699292566cf0db42a555c57
+66992ca166cf0db42a5561b1
+6699342866cf0db42a556e4d
+66993b7066cf0db42a559bbb
+6699bfff5e4bd86befa0dcd3
+6699bd015e4bd86befa0dcd1
+6672975166cf0db42ac5b0e1
+66729ae666cf0db42ac5d271
+666bf96166cf0db42ab1f0da
+666a763866cf0db42aab55f4
+6683bd3266cf0db42a0455a2
+667a7ad766cf0db42ae09aa6
+667bcc5e66cf0db42ae6e584
+666fd66366cf0db42ab9508a
+6669aea066cf0db42aa8bbf9
+661e683f66cf0db42aa3c455
+664aabf06a6f15434a5ae762
+65d851d866cf0db42acc8911
+65d8526566cf0db42acc8cef
+658ef9e866cf0db42a478287
+668d416766cf0db42a29cc1e
+666ffbe5a396ec22bd8af15c
+666ffacda396ec22bd8af155
+666ffa24a396ec22bd8af151
+666ffb5ea396ec22bd8af158
+668287e866cf0db42aff0c9a
+665d6ee466cf0db42a81c74a
+668e498d66cf0db42a2daf1e
+667a7ca666cf0db42ae0abf1
+6646356066cf0db42a2ea629
+6673812ba396ec22bd8af1eb
+668e05495e4bd86befa0db81
+66738012a396ec22bd8af1e8
+658ef93e66cf0db42a478159
+668eac6b66cf0db42a2fb693
+668eac6b66cf0db42a2fb696
+668eac6b66cf0db42a2fb691
+668eac6b66cf0db42a2fb692
+668eac6b66cf0db42a2fb697
+668eac6b66cf0db42a2fb698
+668eac6b66cf0db42a2fb694
+668e76c266cf0db42a2f2cbc
+668e805f66cf0db42a2f5447
+668e806966cf0db42a2f54d2
+668e7f9f66cf0db42a2f520e
+668e7ff066cf0db42a2f52b5
+668ead4766cf0db42a2fb80b
+668eaacf66cf0db42a2fb4fa
+668eaacf66cf0db42a2fb4fb
+668eaf6666cf0db42a2fba36
+668eaf6666cf0db42a2fba41
+668eaf6666cf0db42a2fba37
+668eaf6666cf0db42a2fba3b
+668eaf6666cf0db42a2fba3a
+668eaf6666cf0db42a2fba39
+668eaf6666cf0db42a2fba3c
+668eaf8466cf0db42a2fba51
+668eafbf66cf0db42a2fba7d
+668eafbf66cf0db42a2fba7f
+668eafca66cf0db42a2fbab2
+668eafc066cf0db42a2fba84
+668eafc966cf0db42a2fba96
+668eafbf66cf0db42a2fba7c
+668eafca66cf0db42a2fbab1
+668eafc066cf0db42a2fba86
+668ead3e66cf0db42a2fb7eb
+668eabd366cf0db42a2fb5e8
+668eae6a66cf0db42a2fb935
+668eae7466cf0db42a2fb943
+668eae7466cf0db42a2fb942
+668e6bf766cf0db42a2ef978
+668e65e166cf0db42a2ed54b
+668e880466cf0db42a2f6b29
+668e7d7766cf0db42a2f4745
+668e880466cf0db42a2f6b2a
+668e7d8b66cf0db42a2f478a
+668e6f9566cf0db42a2f0bff
+668e627d66cf0db42a2ebd66
+668e627d66cf0db42a2ebd6a
+668e628766cf0db42a2ebdda
+668e627d66cf0db42a2ebd5b
+668e623766cf0db42a2ebbd9
+668e627d66cf0db42a2ebd6d
+668e627d66cf0db42a2ebd60
+668e6f8b66cf0db42a2f0bef
+668e999166cf0db42a2f936b
+668e640666cf0db42a2ec790
+668e709a66cf0db42a2f12b0
+668e654066cf0db42a2ed0f3
+668e640666cf0db42a2ec78c
+668e647f66cf0db42a2ecada
+668e658666cf0db42a2ed314
+668e709a66cf0db42a2f12b4
+668e627d66cf0db42a2ebd64
+668eab8d66cf0db42a2fb598
+668eab8d66cf0db42a2fb58d
+668eab8d66cf0db42a2fb58f
+668eaf1e66cf0db42a2fb9ca
+668eabde66cf0db42a2fb5f1
+668ea23166cf0db42a2fa768
+668ea23566cf0db42a2fa771
+668ea68766cf0db42a2faf76
+668eae1066cf0db42a2fb8f0
+668ea10e66cf0db42a2fa571
+668ea10e66cf0db42a2fa55f
+668ea1c366cf0db42a2fa669
+668ea05a66cf0db42a2fa46c
+668ea10e66cf0db42a2fa572
+668ea10e66cf0db42a2fa573
+668ea10e66cf0db42a2fa56b
+668ea0c266cf0db42a2fa506
+668ea05a66cf0db42a2fa476
+668ea10e66cf0db42a2fa551
+668ea11866cf0db42a2fa587
+668ea10e66cf0db42a2fa570
+668ea0c266cf0db42a2fa507
+668ea05a66cf0db42a2fa46e
+668ea10e66cf0db42a2fa553
+668ea10e66cf0db42a2fa554
+668ea10e66cf0db42a2fa56f
+668ea10e66cf0db42a2fa552
+668ea10e66cf0db42a2fa56c
+668eac7466cf0db42a2fb69e
+668ea7c166cf0db42a2fb1de
+668eac7466cf0db42a2fb69d
+668ea61266cf0db42a2faf02
+668ea90c66cf0db42a2fb336
+668ea9fc66cf0db42a2fb3ef
+668ea9ca66cf0db42a2fb3bd
+668e8e1766cf0db42a2f79b9
+668e8e1766cf0db42a2f79b8
+668e8e6b66cf0db42a2f7a29
+668eafc066cf0db42a2fba85
+668ead3466cf0db42a2fb7e1
+668ead3466cf0db42a2fb7e8
+668eae6a66cf0db42a2fb91f
+668eae7466cf0db42a2fb93a
+668e9baf66cf0db42a2f99e7
+668e9baf66cf0db42a2f99e8
+668eae5666cf0db42a2fb917
+668ead1566cf0db42a2fb7ac
+668eaf5066cf0db42a2fba11
+668eae1066cf0db42a2fb8f1
+6524bac352c083c4e07bebbf
+6669254366cf0db42aa53a7a
+663b567266cf0db42afdf7b9
+6638b32466cf0db42af2c526
+6638b15466cf0db42af2bd8c
+6638b0dc66cf0db42af2bc0f
+6662dce466cf0db42a9954d9
+667bf58c66cf0db42ae875d1
+662de3c56a6f15434a5ae64b
+6613501266cf0db42a79480b
+659b850966cf0db42a5d4feb
+659f653a66cf0db42a688359
+662df8bd66cf0db42ad8a2d0
+66599e2266cf0db42a7a5616
+666c345866cf0db42ab3e633
+668bb0da66cf0db42a21ac00
+6613b19766cf0db42a7c095c
+667e6456a396ec22bd8af309
+662330348c5f5f15c79b3eee
+65669856edb1ed45a91448a7
+6566982dedb1ed45a91448a4
+655dca6eedb1ed45a914489e
+66727d1a66cf0db42ac4d526
+650c0a2149768f129a991219
+662e139c6a6f15434a5ae65c
+663211d166cf0db42ae8fd10
+6656a5cc6a6f15434a5ae7ff
+66262b73b4d6306d94b44e01
+6647240566cf0db42a3388bc
+650ac53a513e65bb3f23f0c9
+6628e10666cf0db42ac4a72e
+669eda5166cf0db42a65ab8b
+669eddff66cf0db42a65afa3
+669ebb8166cf0db42a658144
+669f1bd766cf0db42a66b8e0
+669f175b66cf0db42a6692b9
+669f11f066cf0db42a66651e
+669f12a566cf0db42a666a40
+669e827766cf0db42a651cc0
+669e82d166cf0db42a651dc9
+669f176f66cf0db42a66938e
+669e826d66cf0db42a651c88
+669f06d866cf0db42a661994
+669e82dc66cf0db42a651e00
+669ef1dc66cf0db42a65cb3c
+669ee59466cf0db42a65b8aa
+669e879866cf0db42a65296a
+669e8bf166cf0db42a653219
+669ef7b066cf0db42a65d887
+669e833466cf0db42a651e40
+669efd5666cf0db42a65e6ff
+669f0b3266cf0db42a6637eb
+669f01c466cf0db42a65fa0e
+669e82a866cf0db42a651d70
+669e82a866cf0db42a651d74
+669e911566cf0db42a653f46
+669e827f66cf0db42a651cea
+669e93e566cf0db42a654aaf
+669e854966cf0db42a65235d
+669e892066cf0db42a652c9b
+669eff0f66cf0db42a65ed8e
+669efff266cf0db42a65f16e
+669ee97d66cf0db42a65be2b
+669ef1fd66cf0db42a65cb8e
+669f147c66cf0db42a667bdb
+669f010566cf0db42a65f66a
+669eefa166cf0db42a65c5fa
+669eef9766cf0db42a65c5e3
+669eefa166cf0db42a65c60c
+669e827f66cf0db42a651cd2
+669e87b766cf0db42a652a4b
+669e828b66cf0db42a651d2e
+669e827f66cf0db42a651cd5
+669e907166cf0db42a653c52
+669f054666cf0db42a660f94
+669f055066cf0db42a660fda
+669ee3c766cf0db42a65b671
+669ee0bc66cf0db42a65b2e1
+669f0b1e66cf0db42a6636d3
+669e906766cf0db42a653c0e
+669e90b866cf0db42a653d7e
+669e908666cf0db42a653c98
+669ee1df66cf0db42a65b439
+669ef64766cf0db42a65d572
+669ef64766cf0db42a65d57a
+669e8d9666cf0db42a6536af
+669effb066cf0db42a65f051
+669e849e66cf0db42a6521f6
+669e909a66cf0db42a653cfe
+669efff266cf0db42a65f14e
+669e83c166cf0db42a651fd0
+669e917066cf0db42a6540fc
+669e9e6266cf0db42a655a9a
+669e9e6c66cf0db42a655aa9
+669e848b66cf0db42a6521bb
+669effa266cf0db42a65eff0
+669eeaf266cf0db42a65bf8f
+669f02f666cf0db42a660130
+669e860766cf0db42a65257a
+669f083766cf0db42a662382
+669f084866cf0db42a66245b
+669e855d66cf0db42a6523b6
+669e905d66cf0db42a653bbe
+669e906766cf0db42a653bea
+669e910866cf0db42a653eea
+669e918c66cf0db42a6541fe
+669e918166cf0db42a654177
+669e826d66cf0db42a651c80
+669e826d66cf0db42a651c81
+669e826d66cf0db42a651c7d
+669e827f66cf0db42a651ce7
+669e829d66cf0db42a651d5c
+669e90d666cf0db42a653e0a
+669e914f66cf0db42a65404f
+669e82d166cf0db42a651d9e
+669e86b266cf0db42a6526ac
+669e848b66cf0db42a6521a1
+669efb0366cf0db42a65dfab
+669f08ba66cf0db42a6626bc
+669ef10966cf0db42a65c88b
+669eedca66cf0db42a65c3df
+669f013366cf0db42a65f7aa
+669ee50866cf0db42a65b83e
+669e92c666cf0db42a6548da
+669f0dfa66cf0db42a664986
+669f0b6666cf0db42a66388e
+669ef17866cf0db42a65ca15
+669f177966cf0db42a6693e6
+669ef93666cf0db42a65dbcf
+6592248066cf0db42a4a9a60
+659836bc66cf0db42a5a3a38
+65a0f26e66cf0db42a6cfc4a
+65aa038d66cf0db42a7f338f
+65b39c9f66cf0db42a92f6f4
+65c0b02f66cf0db42ab18ae7
+65d80eba66cf0db42acb7bd2
+65e042e866cf0db42adb9564
+65e9461266cf0db42aef75e7
+65f1564e66cf0db42a05040b
+65f9366166cf0db42a1f4483
+65fd65cd66cf0db42a3109f0
+660436d966cf0db42a4a2314
+660a9ed566cf0db42a60f67e
+66129b4a66cf0db42a77def3
+6617934766cf0db42a8c5a4c
+661e262966cf0db42aa11e9a
+6622689966cf0db42ab42c83
+6628f42566cf0db42ac4fd2d
+662e0ee166cf0db42ad97a69
+6631458066cf0db42ae79755
+6638df2c66cf0db42af3419f
+663c3b6e66cf0db42a00752a
+663e244b66cf0db42a0a564b
+6643106866cf0db42a1f7307
+6646305266cf0db42a2e8470
+664b4da466cf0db42a3f8407
+664db0f866cf0db42a4c494b
+66500d9066cf0db42a585705
+6654514066cf0db42a647d49
+6655d44c66cf0db42a6b54d7
+66595c4f66cf0db42a787625
+665b8e5a66cf0db42a7e6941
+665efc3e66cf0db42a89b2d4
+66625b8566cf0db42a95a488
+6668080e66cf0db42aa071a6
+666a69e866cf0db42aaafcac
+666cadc766cf0db42ab51858
+667148f966cf0db42abfb697
+6673db2e66cf0db42acb2c9f
+6678c4ce66cf0db42ad6dd07
+667a8b7b66cf0db42ae14cf0
+667cda7b66cf0db42aeb5bf9
+667e9c1266cf0db42af4e188
+6683b65e66cf0db42a040f34
+66861fe466cf0db42a0f4c05
+6687e75966cf0db42a19168b
+668ce8d266cf0db42a26e09c
+668f41cd66cf0db42a30dd42
+6690f8bf66cf0db42a3954df
+6695d07f66cf0db42a4478f8
+6698b5ff66cf0db42a52b693
+669e3acb66cf0db42a6429a2
+66a083d766cf0db42a6d9531
+66a231c766cf0db42a75f7f3
+66a7046e66cf0db42a80fa08
+66a8fcbe66cf0db42a8a8482
+66ab829f66cf0db42a94e2bf
+66b080da66cf0db42aa0c871
+66b2ddef66cf0db42aa9b62e
+66b4d0bd66cf0db42ab27d2b
+66b9db5766cf0db42abfbee1
+66bed06466cf0db42ad5c3de
+66bef62266cf0db42ad65f11
+66bf0d0466cf0db42ad6fcba
+66bf1f7c66cf0db42ad7a264
+66bf369166cf0db42ad84558
+66bf57f466cf0db42ad8bc81
+6585e7816977356f559ed3b8
+6596308f66cf0db42a53eaa9
+659bb07666cf0db42a5e0a88
+659e7a0566cf0db42a6630be
+65a4a3fd66cf0db42a705c76
+65a79fb366cf0db42a792c41
+65ab0ff666cf0db42a81ecb5
+65b0832c66cf0db42a8a61ff
+65b37a6f66cf0db42a925eeb
+65b8d35c66cf0db42a9d8653
+65bc7eec66cf0db42aa87842
+65c0a37f66cf0db42ab1415a
+65c491f066cf0db42ab8f5dd
+65d5938f66cf0db42ac6a117
+65dc37b466cf0db42ad0ebd2
+65df6cb166cf0db42ad95443
+65e554df66cf0db42ae2f7a2
+65e8b3c666cf0db42aee215b
+65eee78666cf0db42afcb749
+65f4e32366cf0db42a14017c
+65f99f4766cf0db42a21c7af
+65fe81e666cf0db42a32d63e
+6603cd2d66cf0db42a472ede
+6606944b66cf0db42a56807e
+660bd53f66cf0db42a6700db
+661268d866cf0db42a76ee76
+6615175566cf0db42a82611e
+6618ad3666cf0db42a91024b
+661ded9f66cf0db42a9fc340
+6620f10f66cf0db42aadd77f
+6627319e66cf0db42abd3e0f
+662e941366cf0db42adb54c8
+663f73dd66cf0db42a1115b5
+66459bc566cf0db42a2b8f8c
+664b421666cf0db42a3f6665
+664f082566cf0db42a536172
+66553e5066cf0db42a671b9b
+66584b6966cf0db42a74f8c8
+665d987066cf0db42a8341fd
+665f3a1f66cf0db42a8a4912
+6661fe5b66cf0db42a951040
+6668261d66cf0db42aa181ff
+666ac0c866cf0db42aad6396
+666fa37466cf0db42ab85e3e
+667198e966cf0db42ac17ce8
+6674f3b266cf0db42acfac89
+667b9d6866cf0db42ae5a546
+6682819066cf0db42afec3b5
+668d2bec66cf0db42a2976bf
+66953d7866cf0db42a433ea4
+6699dfe866cf0db42a57d884
+66a0f7b566cf0db42a708bf7
+66a749c166cf0db42a829b9c
+66ab69ed66cf0db42a947e2c
+66b5b1ab66cf0db42ab5c55b
+66bec91366cf0db42ad593a1
+66bef0c466cf0db42ad64716
+66bf0eaa66cf0db42ad70caa
+66bf24ad66cf0db42ad7d081
+66bf347366cf0db42ad83955
+66bf50ee66cf0db42ad8aac0
+6592b13166cf0db42a4ab08a
+65960b5666cf0db42a532a8f
+659b585666cf0db42a5c7eef
+659d07d366cf0db42a61c522
+659fa55b66cf0db42a6990c3
+65a8e0e966cf0db42a7c5a8d
+65b114b366cf0db42a8c5342
+65b3d9f966cf0db42a933ab9
+65b8ad3f66cf0db42a9c5a87
+65bb468666cf0db42aa546f4
+65bf572a66cf0db42aade40e
+65d1c11f66cf0db42abfbdbe
+65dc3a4166cf0db42ad0f8fc
+65e1223966cf0db42add0d9d
+65e6e49866cf0db42ae98284
+65ee61a566cf0db42af9407d
+65f139eb66cf0db42a047ba2
+65f79ecc66cf0db42a1713a1
+65fa80a466cf0db42a247fbe
+660144d966cf0db42a37859b
+6603c9cf66cf0db42a471410
+6606821466cf0db42a55c377
+660bbbea66cf0db42a65f613
+6612534f66cf0db42a762aee
+6614e85866cf0db42a80b2d6
+66179a4b66cf0db42a8c9025
+661cda6166cf0db42a9af164
+661f821e66cf0db42aa78a3a
+6623339066cf0db42ab53c0e
+66277c8966cf0db42abf166a
+662a20b166cf0db42ac91d34
+662e348e66cf0db42ada849f
+66383cc366cf0db42aefb890
+6639b82266cf0db42af5d309
+663b35f966cf0db42afce4da
+663d830266cf0db42a0620bb
+6640082366cf0db42a12b0eb
+6642d77366cf0db42a1e3363
+66447ee066cf0db42a2772df
+6646e8d866cf0db42a31e565
+664b14a566cf0db42a3e5a7b
+664d548466cf0db42a4940e3
+66504ef666cf0db42a59dc03
+66728f5266cf0db42ac56160
+6674ee1466cf0db42acf7001
+66793e5666cf0db42adb23ec
+667b9dd466cf0db42ae5a793
+66822f3a66cf0db42afc342f
+6683ddd166cf0db42a05bd14
+668670b466cf0db42a11957f
+668bc68666cf0db42a2278e5
+668e4ede66cf0db42a2de79d
+6690ef4866cf0db42a38ed3c
+6696210166cf0db42a46ec29
+6698d43c66cf0db42a538fe0
+669e1ef766cf0db42a62f970
+66a198c166cf0db42a71950b
+66a7231366cf0db42a81d027
+66acaa8566cf0db42a998a2e
+66b2f69266cf0db42aaa63c3
+66baa7b266cf0db42ac1da39
+659214ad66cf0db42a4a985c
+65968a6566cf0db42a5591e2
+659d06b066cf0db42a61bc03
+65a1705066cf0db42a6e7b7a
+65a809de66cf0db42a7a3a1e
+65af2b7d66cf0db42a87599f
+65b8aae666cf0db42a9c4be2
+65c1fd9966cf0db42ab47574
+65d8014a66cf0db42acb3993
+65e1aa4366cf0db42adfa12b
+65ee559e66cf0db42af9022b
+65f3c3d066cf0db42a0fff28
+65fbe31266cf0db42a2a2a12
+6603b35a66cf0db42a46905c
+660cc81a66cf0db42a6acc07
+6616581766cf0db42a87f623
+661eb2b566cf0db42aa47a60
+6627ea0766cf0db42ac076ea
+662f6a7966cf0db42adf85e3
+663b3f7a66cf0db42afd3cc6
+6642bd2266cf0db42a1d5028
+664aec9d66cf0db42a3cfeac
+66505cbb66cf0db42a5a6986
+66596b5c66cf0db42a78adb7
+666167b766cf0db42a926959
+666a9f9b66cf0db42aac1ad7
+6671bdc966cf0db42ac1f2e4
+66792e6866cf0db42ada658d
+667e78c566cf0db42af3b2ac
+668742fb66cf0db42a14656d
+668f8a9366cf0db42a328f0d
+66977f7866cf0db42a4d9455
+66a0582c66cf0db42a6c388e
+66a8bbcf66cf0db42a8988fa
+66b2c8f066cf0db42aa92da8
+659248d866cf0db42a4aa04a
+65ae4b7d66cf0db42a862a4e
+65d2df9c66cf0db42ac153fb
+65e54f6266cf0db42ae2e086
+65f27d8466cf0db42a09c40b
+65fd545e66cf0db42a309787
+6606b8a566cf0db42a5728e3
+6613c14666cf0db42a7cb4df
+661e105b66cf0db42aa09fe2
+66277ea666cf0db42abf2daf
+6630566766cf0db42ae28bfc
+663c632b66cf0db42a017fac
+66434d0966cf0db42a21dc2c
+664c345266cf0db42a42a9cd
+66546b4d66cf0db42a655154
+665d4c7566cf0db42a812da2
+6662812a66cf0db42a96c360
+666bb7c966cf0db42ab059fd
+6678f9ab66cf0db42ad878a2
+667e663366cf0db42af308d9
+6687856066cf0db42a16505e
+66909c5166cf0db42a36ba01
+6699ccbb66cf0db42a5734ca
+66a35c1366cf0db42a7a3e00
+66adbeb166cf0db42a9c4b27
+66b99cd966cf0db42abe078e
+66bed92a66cf0db42ad5f0f5
+66bf150e66cf0db42ad7464d
+66bf3cec66cf0db42ad86430
+659530ab66cf0db42a519b83
+65a5dbfa66cf0db42a731cf2
+65b9d3a666cf0db42aa0898c
+65d2c72e66cf0db42ac107bf
+65e02ca266cf0db42adac8b2
+65eb463066cf0db42af57b40
+65fb816266cf0db42a27d3bf
+6604ee6e66cf0db42a4cd727
+6612512466cf0db42a761bd5
+661d049566cf0db42a9c974b
+66285bcc66cf0db42ac10860
+66306aa566cf0db42ae341de
+663c8c1566cf0db42a02af64
+66459ab566cf0db42a2b8afe
+664ee2d266cf0db42a522f9a
+66571afd66cf0db42a70c256
+665ee4db66cf0db42a891168
+6668fde966cf0db42aa3e55b
+66741efb66cf0db42acd7ffc
+667e687066cf0db42af318b2
+668e45d966cf0db42a2d8706
+669ccbba66cf0db42a5e8c05
+66ac58c866cf0db42a9747f8
+66becc3366cf0db42ad5a81b
+66bef7b366cf0db42ad666c6
+66bf200966cf0db42ad7a6f4
+66bf3eb666cf0db42ad86902
+6592700b66cf0db42a4aa65a
+65a7926266cf0db42a78d9e5
+65bc9a1066cf0db42aa8dc35
+65dd4cb166cf0db42ad34548
+65ee668b66cf0db42af95ca2
+65fbcdb166cf0db42a29be89
+660b7a0966cf0db42a64312c
+66190cba66cf0db42a93bcda
+66286e2666cf0db42ac18b80
+6638abdc66cf0db42af29c0c
+66432ba766cf0db42a209acd
+664ed72e66cf0db42a51f7ac
+6659969c66cf0db42a7a0359
+6667d9c866cf0db42a9f6443
+667152e166cf0db42ac01291
+667ac25066cf0db42ae2acfc
+6684bc2b66cf0db42a08a472
+668f3ea866cf0db42a30ca30
+6698d44166cf0db42a53905d
+66a351d866cf0db42a79df10
+66b082cc66cf0db42aa0d717
+66beca8e66cf0db42ad59d50
+6584a89d6977356f55996e2a
+65ad3dc966cf0db42a8397b0
+65fc3a3866cf0db42a2bfe9e
+661fe73d66cf0db42aa9e099
+667f74ac66cf0db42af698aa
+6685336d66cf0db42a0c56d3
+668b723e66cf0db42a1fd5b6
+668e6fdf66cf0db42a2f0de3
+6694e25d66cf0db42a413ce8
+6698ec1066cf0db42a547827
+669f8bd166cf0db42a6a3eee
+66a3b63a66cf0db42a7c5bb9
+66ab98fd66cf0db42a951887
+66b2313166cf0db42aa819fe
+66b6069166cf0db42ab82a10
+66bec6c266cf0db42ad583c1
+66bf2c8966cf0db42ad80d02
+66bf44ec66cf0db42ad8803f
+66bf5ddd66cf0db42ad8cafc
+6592b1d566cf0db42a4ab443
+659f92e866cf0db42a692681
+65ae002f66cf0db42a84e541
+65ba1d1c66cf0db42aa21f5c
+65d4930466cf0db42ac55aee
+65e589bf66cf0db42ae467e9
+65f3f39466cf0db42a10e38e
+6603fc9a66cf0db42a4929dc
+661504ae66cf0db42a81a681
+6622257866cf0db42ab20ea1
+662f1cda66cf0db42add5948
+6645c0e366cf0db42a2c757d
+6659a37266cf0db42a7a9358
+66700df266cf0db42abb2018
+667cd24866cf0db42aeb1348
+668b606b66cf0db42a1f551d
+6697a9bc66cf0db42a4f0409
+66a4c11766cf0db42a7de7bc
+66b08da666cf0db42aa129e2
+66bec68e66cf0db42ad581ab
+66bf0c6e66cf0db42ad6f79c
+6595bf4f66cf0db42a52c944
+65ab88d166cf0db42a82723c
+65bfb50166cf0db42aaf1ae6
+65dd1e5e66cf0db42ad2b6d8
+65ed101e66cf0db42af6f194
+65fdf26466cf0db42a321a3d
+66104ab066cf0db42a7248fb
+6623eee766cf0db42ab5f4a4
+66348fc466cf0db42aec08ac
+6647b23266cf0db42a360ce2
+6655cb8f66cf0db42a6b3563
+666329c866cf0db42a9a6dbf
+667175b166cf0db42ac0ff2d
+66807cd466cf0db42af84118
+66a088c766cf0db42a6db0ed
+66b5ed5366cf0db42ab79a7a
+66bf090e66cf0db42ad6da84
+659f931a66cf0db42a692875
+65bcb78e66cf0db42aa98cac
+65ddac3366cf0db42ad5328f
+65f2548c66cf0db42a08ae1a
+6603f50d66cf0db42a48e917
+66165a9266cf0db42a881645
+66260d5e66cf0db42ab92ce3
+663ad41166cf0db42afa492e
+664af2af66cf0db42a3d217e
+6659207b66cf0db42a76e5b9
+66696d6366cf0db42aa71dff
+667547d066cf0db42ad20388
+6685f99966cf0db42a0e10fa
+66973c2566cf0db42a4be9de
+66a8bc3466cf0db42a898c0e
+6592b56166cf0db42a4ac2a5
+65a48e6166cf0db42a6ff7ba
+65b7183566cf0db42a963e1e
+65d6c5a966cf0db42ac8d58f
+65f117ee66cf0db42a03d269
+6606a54b66cf0db42a56e1a7
+661fe7a466cf0db42aa9e0fd
+663898a466cf0db42af1f6cb
+664b02cc66cf0db42a3da29f
+6659ffd666cf0db42a7c3c42
+6670ec1166cf0db42abd586b
+6683724e66cf0db42a02375c
+669a05c066cf0db42a58a0d4
+6592353566cf0db42a4a9d91
+65b356fb66cf0db42a919208
+65e17c8c66cf0db42ade75be
+65fbf0fa66cf0db42a2a83e0
+66825d9fa396ec22bd8af332
+6747e16ab25c3e1deba0baf0
+6747d284b25c3e1deba0101e
+6747cdd8b25c3e1deb9fe149
+6747c5deb25c3e1deb9f833f
+6747e5b6b25c3e1deba0ebff
+6747e7a0b25c3e1deba107a8
+6747de4eb25c3e1deba09369
+6747dd5db25c3e1deba084fb
+6747dfaeb25c3e1deba0a43d
+6747c1c8b25c3e1deb9f5c3c
+67474432b25c3e1deb9db8d7
+6747ca46b25c3e1deb9fb8e9
+6747d1cfb25c3e1deba00a81
+6747e690b25c3e1deba0fabd
+6746baf7b25c3e1deb999973
+6747cbafb25c3e1deb9fcb00
+6747c935b25c3e1deb9faa66
+6747d193b25c3e1deba0073e
+6747d9e1b25c3e1deba05dc1
+6747e91db25c3e1deba114e5
+6747e3b1b25c3e1deba0d65d
+6747dbdeb25c3e1deba0725e
+6747c5c0b25c3e1deb9f819a
+6746b948b25c3e1deb998aac
+6747e580b25c3e1deba0e8e3
+6747f301b25c3e1deba18f00
+67469f48b25c3e1deb98cd0d
+6747da88b25c3e1deba06394
+6747d23db25c3e1deba00d9e
+6747d200b25c3e1deba00b84
+6747dff5b25c3e1deba0a8bf
+6747baeab25c3e1deb9f2eee
+6746b857b25c3e1deb99831e
+6747c3e8b25c3e1deb9f6d78
+6747d844b25c3e1deba04c35
+6747dc25b25c3e1deba0759b
+6747437eb25c3e1deb9db6d9
+6747cd55b25c3e1deb9fdd25
+6746bd2cb25c3e1deb99ae61
+6747c84cb25c3e1deb9fa108
+6746bc08b25c3e1deb99a1d3
+6747bddcb25c3e1deb9f42f7
+6747e1edb25c3e1deba0c129
+6747d8ffb25c3e1deba05511
+6747d5efb25c3e1deba036c4
+6747ed47b25c3e1deba141a8
+6747dc8ab25c3e1deba07abd
+6747c680b25c3e1deb9f8a2f
+6747d344b25c3e1deba01ae0
+6747eac1b25c3e1deba1251d
+6747e7beb25c3e1deba107f8
+6747d87cb25c3e1deba04e47
+6747c551b25c3e1deb9f7ad2
+6747d234b25c3e1deba00d78
+67474d07b25c3e1deb9ded55
+6747db0bb25c3e1deba0689c
+6747d528b25c3e1deba02fe1
+6747cd7eb25c3e1deb9fde0b
+6747c9f5b25c3e1deb9fb372
+6747ec4cb25c3e1deba13865
+6747b313b25c3e1deb9f065c
+67468ceeb25c3e1deb97f68e
+6747dd72b25c3e1deba086ee
+6747e1ceb25c3e1deba0bfbd
+6747e562b25c3e1deba0e75e
+6747e484b25c3e1deba0df97
+6747e3e3b25c3e1deba0d954
+6747cd0fb25c3e1deb9fda12
+6746ce56b25c3e1deb9a6917
+6747d029b25c3e1deb9ff94a
+6747bf59b25c3e1deb9f4903
+6747bd59b25c3e1deb9f4007
+6747e08cb25c3e1deba0b079
+67476f16b25c3e1deb9e516d
+6747e9ecb25c3e1deba11d19
+6747cb73b25c3e1deb9fc7eb
+6747d7efb25c3e1deba04864
+6746ba05b25c3e1deb9990be
+6747e08cb25c3e1deba0b016
+6747dff0b25c3e1deba0a874
+6747e691b25c3e1deba0fb18
+6747e557b25c3e1deba0e6d2
+6746b8a7b25c3e1deb998572
+6747cb23b25c3e1deb9fc4d4
+6747c1b4b25c3e1deb9f5b08
+6747d232b25c3e1deba00d53
+6747e927b25c3e1deba11587
+6746b810b25c3e1deb99806a
+6747eb79b25c3e1deba12dbd
+6746ba7eb25c3e1deb999586
+6747d4d6b25c3e1deba02c53
+6747c598b25c3e1deb9f7fe0
+6747ce83b25c3e1deb9fe900
+6747d8a4b25c3e1deba05030
+6746bd68b25c3e1deb99afe8
+6747c75db25c3e1deb9f9407
+6747d5b3b25c3e1deba03507
+6747ca13b25c3e1deb9fb560
+6746b770b25c3e1deb997ca0
+6747c4a6b25c3e1deb9f72e6
+67510322b7d67b9e15506fb0
+67511aaeb7d67b9e1551785e
+6750ef37b7d67b9e154fc5b4
+675105f7b7d67b9e15509201
+675074a5b7d67b9e154e4ded
+67511c7eb7d67b9e15518e1d
+6750fea4b7d67b9e1550348f
+67512618b7d67b9e1551fdf9
+67510d09b7d67b9e1550d902
+6750fb7fb7d67b9e15501022
+67511de0b7d67b9e1551a333
+67511f6ab7d67b9e1551b884
+6750e2fbb7d67b9e154f8883
+6751040ab7d67b9e15507d3a
+67510465b7d67b9e155081d4
+67512855b7d67b9e155216cb
+6751262bb7d67b9e1551fe94
+6751155fb7d67b9e155138f4
+6750f98ab7d67b9e15500233
+6750f988b7d67b9e155001df
+67511aaeb7d67b9e15517891
+675123dab7d67b9e1551e7eb
+67507618b7d67b9e154e5176
+67510f00b7d67b9e1550ecac
+67510cf5b7d67b9e1550d83d
+675113aeb7d67b9e1551269a
+675103f2b7d67b9e15507c9f
+67512f61b7d67b9e15527122
+67511439b7d67b9e15512c55
+6750fa01b7d67b9e155004cd
+675100a7b7d67b9e15504e8b
+675113aeb7d67b9e1551261d
+675116d3b7d67b9e1551498e
+6750ff3cb7d67b9e15503bdc
+67510a85b7d67b9e1550bd02
+67512220b7d67b9e1551d6dd
+6750fe72b7d67b9e155030a0
+67511ac2b7d67b9e155179f9
+675126e0b7d67b9e155205d9
+67510a8fb7d67b9e1550bde2
+67510f28b7d67b9e1550eef4
+67511ac2b7d67b9e1551799e
+67508015b7d67b9e154e777b
+6750da86b7d67b9e154f68d3
+6750c087b7d67b9e154f1c9b
+6750f19db7d67b9e154fd524
+67510d96b7d67b9e1550de56
+67510e4bb7d67b9e1550e51d
+675113e1b7d67b9e155127e0
+67511b13b7d67b9e15517d1b
+6751254eb7d67b9e1551f5fd
+67511541b7d67b9e155137ac
+6751057fb7d67b9e15508d2b
+67510465b7d67b9e1550817b
+67511905b7d67b9e15516467
+67511785b7d67b9e15515287
+675124e9b7d67b9e1551f1de
+67511476b7d67b9e15512e2d
+67510a67b7d67b9e1550b9ba
+675077c3b7d67b9e154e5723
+6750fef4b7d67b9e1550387c
+67511f4eb7d67b9e1551b64b
+67512397b7d67b9e1551e5cb
+6750cb53b7d67b9e154f34ab
+67510f3cb7d67b9e1550f0f7
+67507d26b7d67b9e154e65ba
+67510903b7d67b9e1550aced
+67510852b7d67b9e1550a6b9
+675100f7b7d67b9e155052b7
+67510ccdb7d67b9e1550d65e
+67511495b7d67b9e1551308e
+67511b13b7d67b9e15517ced
+6750aa9bb7d67b9e154ef84b
+675122a5b7d67b9e1551dd70
+67512932b7d67b9e1552218e
+6750e259b7d67b9e154f865a
+67512033b7d67b9e1551c1e7
+675074ebb7d67b9e154e4eae
+67510fcab7d67b9e1550f756
+6751291eb7d67b9e15521fe4
+67510c3fb7d67b9e1550cfa2
+67510a3eb7d67b9e1550b8f7
+6751204db7d67b9e1551c34d
+67503facb7d67b9e154d6f90
+67508f92b7d67b9e154ebd10
+67511c37b7d67b9e15518a77
+6750ff3cb7d67b9e15503bc4
+6750b1d0b7d67b9e154f0594
+67511785b7d67b9e15515252
+675108bcb7d67b9e1550a9ee
+67512272b7d67b9e1551daf5
+6750fff2b7d67b9e155046b0
+6751014ab7d67b9e155057d5
+67512061b7d67b9e1551c3e5
+6750edebb7d67b9e154fbf32
+67510299b7d67b9e155065eb
+6750eda5b7d67b9e154fbcf2
+67510518b7d67b9e155088d0
+6750f1dab7d67b9e154fd5a4
+6750edffb7d67b9e154fbfb1
+6750fe8eb7d67b9e155032c9
+6751277bb7d67b9e15520e09
+675104dcb7d67b9e155086ec
+6750edb9b7d67b9e154fbde3
+6750ed91b7d67b9e154fbc82
+6750ee4fb7d67b9e154fc0c9
+6750ed91b7d67b9e154fbc47
+67510de4b7d67b9e1550e095
+67510649b7d67b9e15509535
+6750fbfcb7d67b9e155014c6
+675103cab7d67b9e15507a38
+675102d6b7d67b9e15506974
+67511a49b7d67b9e15517479
+675107bfb7d67b9e1550a120
+6751081bb7d67b9e1550a45c
+6750edb9b7d67b9e154fbda8
+6750d913b7d67b9e154f6400
+6750ee82b7d67b9e154fc1ed
+6771e71f3309c0998b944ebe
+6771e8153309c0998b945018
+6771dd903309c0998b9445c6
+6771e7573309c0998b944f39
+6771e9e23309c0998b94549b
+6771e44a3309c0998b944b5b
+6771e8343309c0998b945065
+6771e92e3309c0998b945332
+6771e4043309c0998b944b32
+6771e3a03309c0998b944ab2
+6771e82a3309c0998b945044
+6771ea0b3309c0998b945505
+6771ea273309c0998b945513
+6771de9e3309c0998b94469d
+67717a1d3309c0998b93e33c
+6771e72f3309c0998b944eda
+6771e83e3309c0998b945069
+6771e79d3309c0998b944f61
+6771e8293309c0998b945021
+6771e2a53309c0998b944936
+6771e86c3309c0998b945125
+6771ef043309c0998b94641a
+6771f3733309c0998b94766c
+6771f26d3309c0998b947209
+6771f2fa3309c0998b94741d
+6771f2273309c0998b9470ef
+6771ed693309c0998b945e36
+6771f45b3309c0998b947e0d
+6771f5cf3309c0998b9485e6
+6771ebb03309c0998b94598e
+6771f1183309c0998b946bb5
+6771f3b03309c0998b9477dc
+6771f0a03309c0998b946a0f
+6771f45b3309c0998b947e04
+6771edc83309c0998b94604a
+6771edd83309c0998b9460d0
+6771f3a53309c0998b9477a8
+6771f6f23309c0998b948c54
+6771f2cb3309c0998b94734b
+6771f6c03309c0998b948ae3
+6771eafb3309c0998b94573e
+6771f7893309c0998b948fd2
+6771f2fa3309c0998b94741c
+6771f4513309c0998b947d9a
+6771f60b3309c0998b948686
+6771f76b3309c0998b948f1c
+6771f47e3309c0998b947f7f
+6771f6983309c0998b948a5b
+6771eb193309c0998b9457c1
+6771f2633309c0998b9471eb
+6771f3583309c0998b9475c7
+6771f72e3309c0998b948d0f
+6771ea653309c0998b945574
+6771f40a3309c0998b947a3b
+6771f2e63309c0998b947396
+6771f3913309c0998b947752
+6771f60b3309c0998b948693
+6771f1a53309c0998b946db2
+6771f4653309c0998b947efb
+6771f4653309c0998b947eaa
+6771f49c3309c0998b947fa8
+6771ed873309c0998b945eb5
+6771f54c3309c0998b94836d
+6771f4513309c0998b947c6a
+6771ee0a3309c0998b9461f5
+6771f66f3309c0998b94884c
+6771f35f3309c0998b9475e7
+6771f2cb3309c0998b947350
+6771f0a03309c0998b946a6d
+6771f3a53309c0998b9477a6
+6771f76c3309c0998b948f2e
+6771f4b63309c0998b9480a4
+6771f68e3309c0998b9489b5
+6771f54c3309c0998b94836a
+6771edd83309c0998b946080
+6771f7953309c0998b949008
+6771f1683309c0998b946cae
+6771f7933309c0998b948ff7
+6771f03c3309c0998b94690a
+6771efdf3309c0998b94678f
+6771f4473309c0998b947c1e
+6771f2aa3309c0998b9472c4
+6771f1c43309c0998b946ece
+6771f54c3309c0998b948372
+6771f1a53309c0998b946d8e
+6771f45b3309c0998b947e48
+6771f5cf3309c0998b9485c8
+6771f5423309c0998b948261
+6771eeb43309c0998b94639c
+6771f40a3309c0998b947a55
+6771f6153309c0998b948720
+6771f4b63309c0998b948055
+6771f4b63309c0998b948079
+6771f6153309c0998b94873a
+6771f4c53309c0998b9480f0
+6771efe13309c0998b9467cd
+6771f2703309c0998b947211
+6771f4653309c0998b947f1a
+6771ea513309c0998b94552a
+6771ed2d3309c0998b945d5e
+6771ed733309c0998b945e61
+6771f6793309c0998b9488a3
+6771efe13309c0998b9467ae
+6771f5d93309c0998b94866a
+6771f61f3309c0998b948789
+6771f4b63309c0998b94803f
+6771f4513309c0998b947c76
+6771f3043309c0998b947440
+6771f4513309c0998b947d75
+6771f0c83309c0998b946b62
+6771f0073309c0998b94682b
+6771f3d83309c0998b9478df
+6771f3a53309c0998b94779b
+6771f66f3309c0998b9487f5
+6771f45b3309c0998b947e3e
+6771ef043309c0998b94640b
+6771f7243309c0998b948cc1
+6771ed913309c0998b945f3f
+6771ec6e3309c0998b945aef
+6771eda53309c0998b945f88
+6771edd83309c0998b9460e8
+6771ef873309c0998b94667d
+6771f23b3309c0998b947147
+6771f6de3309c0998b948bf8
+6771ecf13309c0998b945c9f
+6771eef73309c0998b9463e4
+6771f5c53309c0998b948566
+6771f5063309c0998b948193
+6771ea793309c0998b9455b0
+6771f34e3309c0998b947581
+6771f7563309c0998b948ddf
+6771f4f23309c0998b94812c
+6771eab53309c0998b9456aa
+6771f2b43309c0998b9472f2
+6771f2333309c0998b947145
+6771f68e3309c0998b94899f
+6771ee003309c0998b9461a9
+6771f4513309c0998b947c42
+6771f6153309c0998b94872b
+6771f4653309c0998b947e92
+6771f5103309c0998b9481ce
+6771f1b93309c0998b946e78
+6771efe13309c0998b9467dc
+6771f3773309c0998b9476a8
+6771f2313309c0998b94712c
+6771f4a23309c0998b947fba
+6771edf03309c0998b946115
+6771f1ba3309c0998b946e90
+6771eeb43309c0998b946364
+6771ef413309c0998b94650e
+6771f3183309c0998b9474df
+6771eb233309c0998b9457dc
+6771f4f23309c0998b948135
+6772022d3309c0998b94d62e
+677204103309c0998b94e3a5
+6771fc7c3309c0998b94b539
+677203ac3309c0998b94e10b
+6772049d3309c0998b94e77c
+6771fc193309c0998b94b317
+677201973309c0998b94d3aa
+677201143309c0998b94d003
+6771fefe3309c0998b94c17e
+677201143309c0998b94cfed
+6771f9ef3309c0998b94a391
+6771f9023309c0998b949af4
+6771f91b3309c0998b949c1d
+6771fb303309c0998b94ab72
+6771f92b3309c0998b949c70
+677200193309c0998b94c9f7
+677201f73309c0998b94d4b7
+677202cd3309c0998b94d97c
+6771fb583309c0998b94ac7f
+677202163309c0998b94d56b
+6771ff463309c0998b94c3fc
+6771fc0e3309c0998b94b2f4
+6771f9443309c0998b949d4c
+677200ec3309c0998b94cf0e
+677200d13309c0998b94cebd
+677204253309c0998b94e418
+677203513309c0998b94dd36
+6771fbaa3309c0998b94b0a9
+6771faa23309c0998b94a7f2
+6771fd273309c0998b94b8b8
+677203ac3309c0998b94e10f
+677204d23309c0998b94e85e
+6771f8fd3309c0998b949a2e
+6771fe843309c0998b94be94
+6772014b3309c0998b94d0fa
+677200103309c0998b94c998
+6772022a3309c0998b94d625
+677204393309c0998b94e4be
+6772002e3309c0998b94ca95
+677204253309c0998b94e428
+6771fc903309c0998b94b5b9
+6771fca83309c0998b94b612
+6771faa43309c0998b94a841
+6771f8fd3309c0998b949aba
+6771fb443309c0998b94abeb
+6771ffb43309c0998b94c658
+677201ab3309c0998b94d439
+6772046d3309c0998b94e6a4
+6771fcf53309c0998b94b7cf
+6771fe4a3309c0998b94bdf6
+677203ac3309c0998b94e111
+677200373309c0998b94caaf
+6771ff823309c0998b94c5ad
+6771fd0d3309c0998b94b823
+677201a13309c0998b94d405
+6771f8203309c0998b9492f1
+6771f88e3309c0998b949608
+6771fb1c3309c0998b94ab15
+6771fb4e3309c0998b94ac25
+6771ffdd3309c0998b94c851
+6771fc683309c0998b94b434
+6771fe223309c0998b94bd35
+6771fb8b3309c0998b94b082
+6771fc7f3309c0998b94b592
+677203c03309c0998b94e173
+6771f8e93309c0998b949862
+677203153309c0998b94db9c
+6771f93a3309c0998b949d20
+677200b03309c0998b94cd92
+677200ba3309c0998b94ce09
+6772002d3309c0998b94ca64
+6771fa983309c0998b94a6f3
+6771ff3b3309c0998b94c3a6
+6771f9113309c0998b949b78
+6771f9d13309c0998b94a25c
+6771fac03309c0998b94a911
+6771f96c3309c0998b949f1f
+6772036f3309c0998b94de57
+6771f8e33309c0998b9497b1
+6771fac03309c0998b94a909
+677203b63309c0998b94e14f
+6771fa493309c0998b94a594
+6771fa993309c0998b94a786
+6771fb113309c0998b94aac9
+6771f8d43309c0998b94970e
+6772049d3309c0998b94e7cd
+6771fa8f3309c0998b94a699
+6771fd7c3309c0998b94ba39
+6771fab83309c0998b94a8ca
+6771f8fd3309c0998b9499fb
+6772006b3309c0998b94cbd2
+6771f9a83309c0998b94a04c
+6771f93a3309c0998b949d09
+6771fa1e3309c0998b94a4c1
+6771fc383309c0998b94b3cf
+677203153309c0998b94dbb5
+6772031f3309c0998b94dbdc
+6771f87d3309c0998b94957e
+6771ffe73309c0998b94c8fa
+6771f80b3309c0998b94923b
+6771fd593309c0998b94b981
+6771f8e93309c0998b94992d
+6771fb633309c0998b94ad79
+6771fc2c3309c0998b94b345
+677201ed3309c0998b94d4ab
+677203843309c0998b94df50
+677210933309c0998b95398d
+67720e843309c0998b952b23
+67720c6f3309c0998b951d58
+677210663309c0998b953781
+677208123309c0998b94fe5a
+677211ee3309c0998b9541c2
+67720fc83309c0998b953331
+677208bd3309c0998b95027b
+6772058f3309c0998b94ee0e
+677209c33309c0998b950b0c
+677210233309c0998b9535b7
+67720c5b3309c0998b951c79
+67720d4c3309c0998b9521a1
+67720e273309c0998b9527f1
+67720ac83309c0998b9511b6
+6772057a3309c0998b94ec81
+6772081c3309c0998b94fec3
+67720db13309c0998b952472
+6772094d3309c0998b95075d
+67720fc83309c0998b95333f
+67720a893309c0998b95105e
+6772099a3309c0998b950935
+677206253309c0998b94f0f3
+67720b413309c0998b95153c
+677205c63309c0998b94eece
+67720b7d3309c0998b951643
+67720d323309c0998b9520bc
+677209e63309c0998b950c3d
+677209d73309c0998b950b9a
+677208633309c0998b950033
+677209723309c0998b950808
+67720a633309c0998b950eff
+67720cc03309c0998b951ecc
+67720eac3309c0998b952c53
+67720d1e3309c0998b952069
+67720e643309c0998b9529e5
+6772107a3309c0998b953863
+67720c1f3309c0998b951b25
+677210343309c0998b953666
+677206613309c0998b94f281
+677210053309c0998b9534fd
+6772103e3309c0998b953694
+677207ea3309c0998b94fd44
+6772083b3309c0998b94ff14
+6772052a3309c0998b94eb86
+677205e93309c0998b94eff5
+67720da23309c0998b9523aa
+677208593309c0998b94ffda
+67720bd83309c0998b95187a
+676ca9a87ee35ef267116d1e
+677210c13309c0998b953b41
+67720f573309c0998b953095
+677213573309c0998b954b96
+677212c23309c0998b95480d
+677206393309c0998b94f198
+677208d13309c0998b9502d3
+67720f933309c0998b95319d
+677209403309c0998b9506b2
+67720f113309c0998b952ed4
+677207a43309c0998b94fb40
+677210343309c0998b95365c
+677210d53309c0998b953bc4
+6772120c3309c0998b95428d
+677208313309c0998b94ff06
+677210193309c0998b953588
+67720be23309c0998b951926
+67720be23309c0998b951927
+677208e53309c0998b950411
+677206873309c0998b94f34f
+677211223309c0998b953d1d
+67720d563309c0998b9521f7
+67720f933309c0998b9531bd
+67720c333309c0998b951b9b
+677212b73309c0998b954771
+677207493309c0998b94f829
+6772104c3309c0998b95370c
+677205343309c0998b94ec09
+67720b9b3309c0998b95174c
+67720c1f3309c0998b951b1e
+67720e523309c0998b952930
+677210df3309c0998b953bf7
+6772057a3309c0998b94ec94
+6772061b3309c0998b94f05f
+677210993309c0998b9539b3
+67720cfc3309c0998b951fe7
+67720ed43309c0998b952d31
+67720d603309c0998b9522fc
+6772069e3309c0998b94f41e
+677208593309c0998b94ffa9
+677213143309c0998b9549f3
+67720c473309c0998b951bfe
+6772111b3309c0998b953ce4
+67720f393309c0998b952faa
+677211da3309c0998b954104
+677206c63309c0998b94f567
+67720abe3309c0998b951188
+677206c63309c0998b94f576
+67720b733309c0998b95161c
+67720bd83309c0998b9518d1
+67720a783309c0998b950fc9
+67720bc43309c0998b9517bd
+67720fa93309c0998b9532b6
+6772100c3309c0998b953520
+677211da3309c0998b9540e1
+67720c833309c0998b951db4
+677209363309c0998b950608
+677209723309c0998b9507d3
+677212f33309c0998b95489b
+67720be23309c0998b95194d
+677207e03309c0998b94fcb6
+677210d13309c0998b953ba1
+677207e03309c0998b94fcca
+6772131e3309c0998b954a3f
+67720f613309c0998b9530c4
+67720e313309c0998b952833
+67720f4d3309c0998b952ff9
+677208123309c0998b94fe5f
+6772147b3309c0998b95530a
+677215563309c0998b9559d4
+677219073309c0998b9570cf
+67721f783309c0998b9597fb
+67721e873309c0998b95921d
+677215423309c0998b955951
+67721a603309c0998b957937
+6772160d3309c0998b955da0
+677218903309c0998b956d8a
+677216d83309c0998b9562b3
+67721ce13309c0998b958815
+677218cd3309c0998b956f0a
+67721c373309c0998b9582cc
+677214fe3309c0998b955620
+677217db3309c0998b956896
+67721f8c3309c0998b9598a9
+677215db3309c0998b955cfb
+67721dc83309c0998b958e25
+677213b23309c0998b954e35
+6772171f3309c0998b956391
+67721a5e3309c0998b957924
+67721fd33309c0998b959bb1
+67721c0a3309c0998b9581b3
+67721fb53309c0998b959aa9
+677214993309c0998b9553c7
+67721f8c3309c0998b9598ab
+67721e193309c0998b958fea
+67721e7d3309c0998b95919b
+67721e4e3309c0998b959059
+67721d323309c0998b9589df
+67721c043309c0998b95817f
+67721c143309c0998b958200
+67721c7a3309c0998b958549
+67721b3b3309c0998b957c66
+67721f5a3309c0998b9596bd
+677217263309c0998b9563b3
+67721fa13309c0998b9599c0
+6772159d3309c0998b955b13
+677214623309c0998b95528e
+67721ce13309c0998b958842
+67721a183309c0998b9576f9
+677217453309c0998b95651f
+677215233309c0998b95578c
+67721aa73309c0998b957a64
+67721f5a3309c0998b9596cc
+677216863309c0998b956122
+67721e733309c0998b95912e
+67721a933309c0998b957a08
+6772139e3309c0998b954d8b
+67721d973309c0998b958c3c
+6772202d3309c0998b959dad
+67721eb93309c0998b9593b9
+67721e693309c0998b9590db
+677217523309c0998b9565da
+677218363309c0998b956ae9
+67721fe73309c0998b959c43
+677220603309c0998b959f02
+67721bdc3309c0998b958091
+677218fd3309c0998b95705e
+6772145d3309c0998b955284
+6772191d3309c0998b957191
+67721f5a3309c0998b9596bf
+677214ad3309c0998b955467
+677216a43309c0998b9561a6
+67721d973309c0998b958c34
+677214493309c0998b9551a8
+677214f43309c0998b9555d4
+6772191d3309c0998b9571bb
+6772202d3309c0998b959dfe
+67721d093309c0998b958951
+677219313309c0998b95723d
+67721ccb3309c0998b9587a1
+6772174f3309c0998b9565a8
+67721f1e3309c0998b9595c0
+6772154c3309c0998b95599b
+6772202d3309c0998b959dd2
+677219d23309c0998b957569
+6772146d3309c0998b9552ac
+677218fd3309c0998b957050
+67721fa13309c0998b9599aa
+67721d503309c0998b958b02
+677218d73309c0998b956f42
+67721c0e3309c0998b9581ce
+67721ba03309c0998b957eec
+677215da3309c0998b955ca6
+67721fbc3309c0998b959ac7
+677214e63309c0998b955535
+67721e7d3309c0998b95916f
+67721baa3309c0998b957f6f
+6772159d3309c0998b955b2b
+67721ba03309c0998b957eda
+677215813309c0998b955ab6
+6772196d3309c0998b957305
+6772191d3309c0998b9571d2
+6772289c3309c0998b95d3c6
+677227353309c0998b95caa7
+6772297c3309c0998b95d92c
+67722c4a3309c0998b95e7c1
+677220ed3309c0998b95a25f
+67722af93309c0998b95e0e0
+677228263309c0998b95d10d
+67722f2d3309c0998b95f1cf
+677221153309c0998b95a3c2
+6772275d3309c0998b95cca8
+677222d03309c0998b95b060
+6772292b3309c0998b95d754
+67722a3b3309c0998b95dcf6
+67722fa63309c0998b95f369
+6772241b3309c0998b95b81d
+6772269e3309c0998b95c81f
+677228bd3309c0998b95d44a
+677224803309c0998b95bae4
+677225c13309c0998b95c193
+677225f33309c0998b95c2fd
+677227533309c0998b95cbe3
+67722c8b3309c0998b95e89f
+6772255c3309c0998b95be29
+677221293309c0998b95a4b1
+677224c73309c0998b95bb59
+67722bd73309c0998b95e5d4
+677228263309c0998b95d0c8
+677228d13309c0998b95d492
+677227ad3309c0998b95cddb
+67722e113309c0998b95ee42
+677220ed3309c0998b95a25a
+6772269e3309c0998b95c814
+6772242f3309c0998b95b954
+677227c13309c0998b95ce5c
+67722abd3309c0998b95df7c
+67722efa3309c0998b95f0fb
+677220ed3309c0998b95a2a2
+677226763309c0998b95c619
+67722b723309c0998b95e3da
+677229a43309c0998b95d9eb
+677226763309c0998b95c5b1
+677225ad3309c0998b95c039
+677224e43309c0998b95bc65
+6772263a3309c0998b95c49b
+67722e1d3309c0998b95ee88
+677225ad3309c0998b95bf58
+677228f93309c0998b95d680
+67722ae53309c0998b95e0bd
+6772217a3309c0998b95a7ed
+677222a73309c0998b95afb8
+6772242f3309c0998b95b9df
+677220d83309c0998b95a20a
+677227493309c0998b95cb4f
+67722b403309c0998b95e26c
+67722a6d3309c0998b95dda5
+6772302a3309c0998b95f52f
+677224ee3309c0998b95bc76
+677221673309c0998b95a75b
+677228e33309c0998b95d4e8
+677228303309c0998b95d1c8
+677229353309c0998b95d801
+677228603309c0998b95d29d
+67722b4a3309c0998b95e304
+677223523309c0998b95b27e
+677227a33309c0998b95cd73
+677225983309c0998b95bf0c
+677234ff3309c0998b96052f
+677239f33309c0998b961830
+677232303309c0998b95fbb0
+67723c773309c0998b9623c3
+67723dd33309c0998b9629bb
+67723dc33309c0998b962985
+67723b743309c0998b9620e2
+6772323b3309c0998b95fbba
+677237cb3309c0998b960ef7
+67723c203309c0998b9622e6
+6772328b3309c0998b95fc85
+677230d13309c0998b95f74c
+6772397c3309c0998b961704
+67723d183309c0998b96264f
+677239673309c0998b9616bb
+6772384d3309c0998b961136
+677238073309c0998b961000
+677232773309c0998b95fc47
+6772304f3309c0998b95f5a8
+67723c8f3309c0998b962440
+677238113309c0998b961079
+67723bc23309c0998b96217f
+67723c133309c0998b962275
+677239c23309c0998b9617bc
+677238803309c0998b96121a
+67723c9f3309c0998b96248b
+677237363309c0998b960d33
+67723abd3309c0998b961d15
+6772362f3309c0998b9608c1
+677237673309c0998b960d84
+677233ea3309c0998b9600de
+67723d7c3309c0998b96282a
+677233f43309c0998b9600fc
+67723d7c3309c0998b962831
+67723c813309c0998b9623f8
+677236583309c0998b9609fc
+677236bc3309c0998b960b94
+677235bf3309c0998b960776
+67723b5f3309c0998b96204a
+677232303309c0998b95fb9e
+677237693309c0998b960dad
+677239513309c0998b961636
+67723a2f3309c0998b9619e5
+677232ef3309c0998b95fd7f
+677233173309c0998b95fe51
+677235ad3309c0998b9606f3
+677239fd3309c0998b961851
+677238253309c0998b9610c1
+67723c2a3309c0998b962322
+67723b7c3309c0998b9620e5
+67723d7c3309c0998b962834
+6772494d3309c0998b96676e
+677246463309c0998b965027
+67724a0c3309c0998b966d15
+677249063309c0998b96639c
+677246c93309c0998b9652c1
+677244e93309c0998b96492b
+677248fd3309c0998b966383
+677247f53309c0998b965b16
+67724ad53309c0998b9671fd
+67723de73309c0998b962a46
+67724aad3309c0998b967106
+6772443c3309c0998b96466d
+67724ad53309c0998b9671b5
+6772496c3309c0998b966893
+67724b263309c0998b9674f7
+677246973309c0998b9651a0
+677243413309c0998b9640ea
+677248463309c0998b965d47
+677248503309c0998b965d8d
+677247923309c0998b9657fa
+677248ac3309c0998b966160
+677247eb3309c0998b965ab7
+67723f5d3309c0998b962fcf
+677248843309c0998b965f88
+677247a63309c0998b965863
+677243013309c0998b963fcd
+677241803309c0998b96379d
+67724b213309c0998b9674d4
+67724a0c3309c0998b966d1d
+677240783309c0998b96344d
+67724a0f3309c0998b966db2
+677242b43309c0998b963df3
+67723edc3309c0998b962d9d
+67723ed23309c0998b962d79
+67724aad3309c0998b9670f8
+67724a993309c0998b9670a1
+67723f873309c0998b963044
+67724b553309c0998b967690
+677244de3309c0998b9648dd
+67724b263309c0998b9674f9
+677247713309c0998b965725
+67724a243309c0998b966e03
+677244fb3309c0998b96497e
+67724af33309c0998b967378
+67724b8b3309c0998b967844
+677249e33309c0998b966b3b
+67724b633309c0998b96770b
+6772438f3309c0998b9642e9
+677247e33309c0998b965a96
+677246f73309c0998b9653f7
+6772477b3309c0998b96573d
+67723faf3309c0998b96316c
+67724b8b3309c0998b967823
+677244963309c0998b964819
+677244003309c0998b96459b
+67724a0c3309c0998b966cf1
+677243ec3309c0998b9644a7
+6772415e3309c0998b96373e
+677240b43309c0998b96352e
+677244ca3309c0998b9648b7
+677241ff3309c0998b96395b
+677241043309c0998b963618
+677241803309c0998b963797
+677243153309c0998b964032
+677243f63309c0998b96452d
+677246323309c0998b964f8c
+677247ff3309c0998b965b8d
+677242b03309c0998b963db3
+67724a0c3309c0998b966d6f
+67724aa73309c0998b9670d2
+677241043309c0998b9635f0
+6772425a3309c0998b963b94
+677247ce3309c0998b9659f9
+6772414a3309c0998b96370e
+677248f33309c0998b966353
+677243f63309c0998b964516
+677246193309c0998b964eb0
+677240643309c0998b9633f9
+67724bbd3309c0998b9679da
+677247ce3309c0998b965a11
+677248a23309c0998b966141
+677248843309c0998b966006
+67724f8e3309c0998b96a0ae
+67724c043309c0998b967c79
+67724c913309c0998b9681f4
+677251f13309c0998b96bb19
+67724eef3309c0998b969a29
+677252153309c0998b96be1b
+677259913309c0998b970352
+6772579f3309c0998b96f126
+67724bd23309c0998b967aae
+677254673309c0998b96d22b
+6772584b3309c0998b96f59d
+677253a73309c0998b96cc6b
+677252563309c0998b96c02c
+677257393309c0998b96ed7c
+67724c7c3309c0998b96814e
+677251a63309c0998b96b936
+677257573309c0998b96ee58
+67724d733309c0998b968b29
+677250a93309c0998b96ac24
+6772514b3309c0998b96b622
+677253923309c0998b96caa5
+6772510e3309c0998b96b126
+677257dc3309c0998b96f2b7
+67724ccd3309c0998b9683cf
+6772548f3309c0998b96d476
+67724dfc3309c0998b968f9b
+6772574d3309c0998b96edf8
+677251773309c0998b96b732
+677256033309c0998b96e01e
+677252e83309c0998b96c4bf
+6772509f3309c0998b96aba0
+67724e043309c0998b968fb6
+6772528d3309c0998b96c1d8
+6772591f3309c0998b96fe52
+67724d283309c0998b9686d2
+677250f03309c0998b96afc5
+677256273309c0998b96e1db
+677259a23309c0998b9703f7
+67724d733309c0998b968b2a
+67724f843309c0998b969ff5
+67724d3c3309c0998b96877b
+67724f703309c0998b969e59
+677256863309c0998b96e5e5
+67724bcf3309c0998b967a6e
+677254b83309c0998b96d6e9
+677256033309c0998b96e055
+67724d973309c0998b968bb4
+677253613309c0998b96c9ab
+677251243309c0998b96b277
+677258ce3309c0998b96fa07
+677258933309c0998b96f8d7
+67724c733309c0998b9680b7
+67724c873309c0998b9681d3
+677252c93309c0998b96c334
+677258603309c0998b96f70c
+677252473309c0998b96bfe4
+6772564f3309c0998b96e35f
+6772523d3309c0998b96bf93
+677253553309c0998b96c8fe
+677252e83309c0998b96c5a0
+6772521f3309c0998b96be6a
+67724cd73309c0998b968431
+677255ad3309c0998b96ddc0
+677255c73309c0998b96dea2
+677253ed3309c0998b96cf3f
+677259143309c0998b96fd3e
+67724c363309c0998b967e51
+67724efa3309c0998b969a61
+67724e563309c0998b9692fd
+677250613309c0998b96a874
+6772535f3309c0998b96c92c
+67724fb73309c0998b96a292
+677251a63309c0998b96b925
+677256823309c0998b96e583
+67724f6a3309c0998b969e33
+677258d83309c0998b96fab5
+6772591f3309c0998b96fe1c
+677251183309c0998b96b1ce
+67724eb13309c0998b96956a
+677254673309c0998b96d22a
+6772597a3309c0998b970236
+67724ee53309c0998b96999e
+6772548f3309c0998b96d46b
+677256683309c0998b96e4c2
+677253613309c0998b96c9be
+677259363309c0998b96ff87
+677252563309c0998b96c025
+6772515f3309c0998b96b6bb
+677258c63309c0998b96f9fb
+677255d13309c0998b96dedf
+677256823309c0998b96e56d
+677256cc3309c0998b96e845
+67724ccd3309c0998b9683e2
+677254483309c0998b96d146
+677257963309c0998b96f0be
+677250953309c0998b96ab53
+677256593309c0998b96e3f2
+6772563f3309c0998b96e2b7
+677251553309c0998b96b66d
+67724ec63309c0998b96972f
+677258733309c0998b96f803
+677251183309c0998b96b1c2
+67724fad3309c0998b96a23d
+67724c4b3309c0998b967f56
+677253933309c0998b96caba
+677252d43309c0998b96c3b9
+67724ffa3309c0998b96a57a
+6772574f3309c0998b96ee24
+6772561c3309c0998b96e1b2
+67724dd03309c0998b968d40
+67724ee53309c0998b9699b3
+67724da13309c0998b968be1
+677255ea3309c0998b96df39
+67724e423309c0998b9691d1
+677252e83309c0998b96c5df
+677257313309c0998b96ed4c
+677250953309c0998b96ab1d
+6772506c3309c0998b96a9dc
+67724c723309c0998b968059
+677253063309c0998b96c69a
+67724d973309c0998b968bbb
+6772591e3309c0998b96fdd1
+677254853309c0998b96d3fb
+67724c873309c0998b96819e
+677253b23309c0998b96cdcd
+677252973309c0998b96c26f
+67724f753309c0998b969eee
+67724fd13309c0998b96a400
+677257133309c0998b96ebe8
+67724f8e3309c0998b96a01c
+677253ed3309c0998b96cf44
+67724c873309c0998b9681ce
+677259293309c0998b96fe65
+67724c403309c0998b967e9e
+677255993309c0998b96dd57
+67724ffa3309c0998b96a591
+677253a73309c0998b96cc3a
+6772502d3309c0998b96a6ef
+6772528d3309c0998b96c224
+677258233309c0998b96f433
+677252a73309c0998b96c2ed
+67724c4b3309c0998b967ef2
+67724ca53309c0998b9682fc
+677259a63309c0998b970411
+6772528d3309c0998b96c1b0
+677259a23309c0998b9703ed
+67725f973309c0998b973b44
+67725fed3309c0998b973e16
+67725ed53309c0998b9734a3
+677262af3309c0998b975d93
+67725efc3309c0998b9735a4
+67725b533309c0998b9712c5
+677259e83309c0998b97064d
+67725f883309c0998b973a7a
+67725d4f3309c0998b97265f
+67725beb3309c0998b971b4d
+677265d23309c0998b9781d9
+677261c33309c0998b9751aa
+67725cf03309c0998b972313
+67725bb83309c0998b97193a
+67725c6d3309c0998b971eaa
+67725cac3309c0998b972092
+67725a203309c0998b9707f4
+67725b5d3309c0998b9713bd
+67725e003309c0998b972e09
+677264c63309c0998b9775b8
+67725a5d3309c0998b97092c
+67725dce3309c0998b972ba1
+677265353309c0998b977a9a
+67725d4f3309c0998b97264f
+67725b343309c0998b9711da
+6772618b3309c0998b974f7c
+67725d693309c0998b97270e
+67725cb43309c0998b9720c3
+67725e003309c0998b972ddf
+67725a4d3309c0998b970885
+677264933309c0998b97729b
+677259b03309c0998b970458
+677264603309c0998b977014
+677265053309c0998b977880
+67725dd43309c0998b972bd7
+67725cb43309c0998b9720a6
+677261f73309c0998b975358
+67725f883309c0998b973a8d
+677264223309c0998b976d83
+67725fb13309c0998b973bdb
+677265913309c0998b977eae
+67725fe33309c0998b973df8
+67725e123309c0998b972ee8
+677263de3309c0998b9769e3
+6772616d3309c0998b974de2
+67725f4c3309c0998b9738c7
+677260f63309c0998b9749a3
+67725e793309c0998b9731ee
+677263543309c0998b976448
+67725b023309c0998b970f90
+67725d453309c0998b9725f5
+67725b333309c0998b97119f
+677262f63309c0998b975fe2
+677264943309c0998b9772d3
+67725ef43309c0998b97354f
+67725a903309c0998b970b14
+677261123309c0998b974aee
+67725be03309c0998b971b15
+67725d263309c0998b972525
+677259b03309c0998b97045d
+677262403309c0998b9756d8
+67725abc3309c0998b970d56
+67725b513309c0998b971279
+67725f973309c0998b973b2e
+677266333309c0998b978621
+677262ce3309c0998b975ed8
+6772601e3309c0998b974076
+67725c813309c0998b971f8a
+677266283309c0998b978592
+677264743309c0998b977123
+6772647f3309c0998b9771b4
+677260523309c0998b97431f
+6772615d3309c0998b974da0
+677260cb3309c0998b9747ff
+67725ed53309c0998b9734bd
+67725ce63309c0998b972296
+6772659b3309c0998b977f1e
+67725bb83309c0998b971901
+677260cb3309c0998b974874
+6772633d3309c0998b9763b7
+677265be3309c0998b9780d3
+6772614e3309c0998b974ccb
+677265f73309c0998b978382
+67725dc43309c0998b972b1c
+67725b9a3309c0998b97175a
+677264893309c0998b977276
+67725a903309c0998b970b19
+6772600b3309c0998b973f94
+677263f23309c0998b976b2f
+677261123309c0998b974ac8
+677262f63309c0998b97601c
+677264183309c0998b976ce5
+677265de3309c0998b978291
+67725a673309c0998b97095a
+67725c1d3309c0998b971d32
+67725b673309c0998b971458
+67725f883309c0998b973a47
+67725bae3309c0998b971847
+67725dce3309c0998b972bc3
+67725e6f3309c0998b97319c
+67725f4c3309c0998b9738ba
+677262e33309c0998b975f60
+67725fe33309c0998b973de0
+677260e13309c0998b97495a
+677263d43309c0998b976925
+6772635f3309c0998b9764db
+677264e43309c0998b9776c8
+67725ba43309c0998b9717c2
+67725aa43309c0998b970c40
+67725a9d3309c0998b970c0b
+677264223309c0998b976d8f
+677264183309c0998b976ce8
+67725dd83309c0998b972bf0
+677262913309c0998b975c62
+67725e833309c0998b973262
+677265ad3309c0998b977fc6
+67725d8c3309c0998b9727fb
+677265ad3309c0998b977fcb
+677265d23309c0998b9781b1
+677265a33309c0998b977f5c
+677261583309c0998b974d84
+677260013309c0998b973f1f
+677263793309c0998b9765e5
+6772658e3309c0998b977e69
+677261813309c0998b974f24
+677264893309c0998b9771e2
+677264e63309c0998b977738
+67725cdf3309c0998b972245
+67725dba3309c0998b972a1c
+677264603309c0998b977011
+67725dce3309c0998b972b77
+67725e263309c0998b972f4b
+677261443309c0998b974c24
+67725c133309c0998b971cc4
+677266473309c0998b978748
+677272443309c0998b97ff64
+67726b893309c0998b97c258
+67726c7b3309c0998b97cc17
+67726a3c3309c0998b97b27e
+67726c5c3309c0998b97cacf
+67726be33309c0998b97c62c
+677268de3309c0998b97a41e
+677268153309c0998b979ca8
+6772701a3309c0998b97ed8c
+677273243309c0998b98067d
+67726ac73309c0998b97b958
+67726cfd3309c0998b97d081
+67726c203309c0998b97c7e2
+67726fb03309c0998b97e8d2
+677272263309c0998b97fdf5
+6772706a3309c0998b97efea
+677270ee3309c0998b97f4a6
+67726a283309c0998b97b1bd
+67726c523309c0998b97ca7e
+67726f873309c0998b97e76f
+677269c03309c0998b97acc9
+67726ccb3309c0998b97cf93
+677267c43309c0998b979947
+677266763309c0998b9788fe
+677273eb3309c0998b980c7d
+677266483309c0998b978775
+6772668c3309c0998b978a3c
+67726c2a3309c0998b97c81b
+677269973309c0998b97ab37
+67726ec33309c0998b97e1b2
+6772685a3309c0998b979f52
+677271993309c0998b97fa30
+677267943309c0998b979646
+67726ccb3309c0998b97cf5f
+67726a443309c0998b97b2c5
+677268843309c0998b97a158
+67726a6e3309c0998b97b4a1
+67726c3d3309c0998b97c8eb
+677268e13309c0998b97a466
+67726b253309c0998b97bd25
+677267043309c0998b978fd7
+677267043309c0998b978fa8
+67726afb3309c0998b97bbdf
+67726f873309c0998b97e76e
+67726a963309c0998b97b6e6
+6772729f3309c0998b980243
+67726de33309c0998b97d9cc
+67726b383309c0998b97be4b
+67726fa63309c0998b97e8a4
+677272ef3309c0998b9803b7
+679197783309c0998bf5dc6b
+679189903309c0998bf5b735
+679198293309c0998bf5dfff
+679189ae3309c0998bf5b772
+67919df33309c0998bf6050b
+679197783309c0998bf5dc19
+6791b39d3309c0998bf67e56
+679195bd3309c0998bf5d43f
+679184d43309c0998bf5b02c
+679189363309c0998bf5b680
+6791aef13309c0998bf66032
+6791b4cb3309c0998bf68540
+6791b4523309c0998bf6821a
+6791c43c3309c0998bf6e12f
+67919f853309c0998bf60ba7
+6791a6073309c0998bf62e62
+6791af7e3309c0998bf662cc
+6791b4f33309c0998bf685db
+679197dc3309c0998bf5de80
+6791a6113309c0998bf62e99
+6791b08d3309c0998bf66ad9
+6791b3933309c0998bf67e0f
+6791a5c23309c0998bf62d8c
+6801a22e5f834436f098d3f0
+6801a0665f834436f098ccb9
+6801a0295f834436f098cbaf
+6801a0265f834436f098cba4
+6801a0015f834436f098cb5d
+68019ffd5f834436f098cb45
+68019fec5f834436f098caf0
+68019fca5f834436f098ca75
+68019fc05f834436f098ca73
+68019fb65f834436f098ca63
+68019fac5f834436f098ca4e
+68019fa55f834436f098ca3a
+68019fa55f834436f098ca36
+68019f915f834436f098c9f6
+68019f795f834436f098c9b1
+68019f5b5f834436f098c99d
+68019f515f834436f098c994
+68019f515f834436f098c993
+68019f405f834436f098c98e
+68019f405f834436f098c98a
+68019f365f834436f098c945
+68019f365f834436f098c92f
+68019f2b5f834436f098c8ae
+68019eff5f834436f098c85a
+68019ed75f834436f098c7b4
+68019ed75f834436f098c7ad
+68019e905f834436f098c716
+68019e3e5f834436f098c5f9
+68019e245f834436f098c5ce
+68019e1a5f834436f098c56d
+68019dce5f834436f098c4be
+68019dc85f834436f098c49f
+68019d6d5f834436f098c368
+68019d685f834436f098c330
+68019d545f834436f098c298
+68019cf95f834436f098c236
+68019cee5f834436f098c1ed
+68019cb75f834436f098c190
+68019c9d5f834436f098c119
+68019c935f834436f098c10e
+68019c7e5f834436f098c0da
+68019c6a5f834436f098c089
+68019c605f834436f098c046
+68019c5f5f834436f098c03b
+68019c415f834436f098bfe7
+68019c2d5f834436f098bfa7
+68019c185f834436f098bf45
+68019bb25f834436f098be55
+68019bb25f834436f098be53
+68019b905f834436f098bddc
+68019b895f834436f098bdbc
+68019b755f834436f098bd8d
+68019b6a5f834436f098bd6d
+68019b605f834436f098bd46
+68019b355f834436f098bc8d
+68019af05f834436f098bbfa
+68019ad95f834436f098bb6e
+68019a955f834436f098bae2
+68019a8b5f834436f098bad8
+68019a745f834436f098ba78
+68019a395f834436f098ba03
+68019a385f834436f098b9f6
+68019a105f834436f098b977
+680199e65f834436f098b904
+6801996d5f834436f098b7c4
+680199305f834436f098b786
+6801991c5f834436f098b743
+680198cc5f834436f098b6b2
+680198cb5f834436f098b6a6
+680198cb5f834436f098b6a3
+680198715f834436f098b5e6
+6801985c5f834436f098b580
+6801985c5f834436f098b57f
+680198515f834436f098b556
+6801980a5f834436f098b40b
+680198005f834436f098b3f1
+680198005f834436f098b3f0
+680197f55f834436f098b3e5
+680197f55f834436f098b3e4
+680197d85f834436f098b3b7
+680197d75f834436f098b3af
+680197d75f834436f098b3ab
+680197cd5f834436f098b38a
+680197c25f834436f098b374
+680197c25f834436f098b373
+680197b95f834436f098b34c
+680197215f834436f098b191
+680196d75f834436f098b0a5
+680196cd5f834436f098b091
+680196b15f834436f098b059
+680196865f834436f098afe9
+680195fb5f834436f098aee7
+680195e35f834436f098aec3
+680195d95f834436f098aeb6
+680195c55f834436f098ae8f
+680195a65f834436f098ae71
+680194ef5f834436f098ace0
+6801949e5f834436f098ac6c
+680194385f834436f098ab6e
+680194245f834436f098ab41
+680193b25f834436f098aa01
+680193125f834436f098a8a1
+6801925b5f834436f098a699
+680192505f834436f098a65c
+6801923c5f834436f098a5cd
+680192275f834436f098a569
+680191e05f834436f098a43d
+680191d45f834436f098a3fa
+680191475f834436f098a2e7
+680190e15f834436f098a1e2
+680190e15f834436f098a1d3
+680190d75f834436f098a1c5
+680190d75f834436f098a1b1
+680190ce5f834436f098a18f
+680190c35f834436f098a14c
+680190535f834436f098a072
+680190345f834436f098a03d
+6801902a5f834436f098a021
+6801901f5f834436f0989ff8
+68018fa55f834436f0989ee8
+68018f9b5f834436f0989ed1
+68018f725f834436f0989e88
+68018f535f834436f0989e1c
+68018f495f834436f0989e08
+68018f2a5f834436f0989ddb
+68018e935f834436f0989d30
+68018e935f834436f0989d20
+68018e885f834436f0989cf9
+68018e5d5f834436f0989cce
+68018d265f834436f0989b68
+68018c965f834436f09899ce
+68018c785f834436f0989935
+68018c595f834436f09898b3
+68018c115f834436f0989815
+68018bac5f834436f0989784
+68018b8e5f834436f0989779
+68018b515f834436f0989740
+68018a905f834436f098965f
+68018a675f834436f098960f
+68018a5d5f834436f0989600
+68018a5d5f834436f09895fe
+680189a75f834436f098950d
+680189225f834436f09893fe
+680189045f834436f09893e9
+680188e55f834436f09893a5
+680188e55f834436f098939d
+680188db5f834436f0989387
+680188d05f834436f0989358
+680188a85f834436f0989345
+6801886c5f834436f09892e3
+680188435f834436f09892ba
+6801881a5f834436f0989231
+680187fc5f834436f0989226
+680187b45f834436f09891ba
+680187345f834436f09890fd
+680186ac5f834436f098901b
+680186295f834436f0988fce
+680186005f834436f0988f7b
+680184c55f834436f0988dbf
+680184a65f834436f0988d98
+680183e55f834436f0988cde
+680183d15f834436f0988cc4
+680183395f834436f0988c1d
+6801832f5f834436f0988c0c
+680183115f834436f0988bd7
+680182ab5f834436f0988b59
+6801828c5f834436f0988b31
+680181e05f834436f0988a28
+680181d65f834436f0988a1a
+680180e25f834436f09887e0
+680180915f834436f0988766
+6801804a5f834436f0988704
+680180355f834436f0988686
+68017fee5f834436f098865d
+68017fc55f834436f0988634
+68017f9d5f834436f0988606
+68017f0e5f834436f0988482
+68017eef5f834436f098840e
+68017ee55f834436f09883dc
+68017edb5f834436f09883c0
+68017e615f834436f098828d
+68017e425f834436f0988244
+68017d965f834436f09880cb
+68017cb65f834436f0987ebb
+68017cac5f834436f0987ea2
+68017c285f834436f0987d39
+68017c145f834436f0987d1f
+68017c0a5f834436f0987d05
+68017be15f834436f0987cae
+68017b725f834436f0987bba
+68017af85f834436f0987b01
+68016fb85f834436f0986b53
+68016cc65f834436f0986806
+68016a135f834436f09865cd
+680167b45f834436f098637d
+6801679f5f834436f0986369
+6801673a5f834436f0986304
+6801668e5f834436f09861e6
+6801667a5f834436f098618c
+680166155f834436f0986152
+6801655f5f834436f09860cf
+680164315f834436f0985f51
+680163ad5f834436f0985e9f
+680163ad5f834436f0985e9e
+6801608f5f834436f0985b98
+68015b815f834436f09854e5
+68015b585f834436f09854a0
+68015a295f834436f0985316
+680158c75f834436f09850bd
+680157145f834436f0984e24
+680151f45f834436f0984623
+680150995f834436f0984341
+68014c255f834436f0983c16
+68014be85f834436f0983ba9
+680145925f834436f0982f6e
+6801455f5f834436f0982f21
+680144945f834436f0982d4c
+6801448a5f834436f0982d40
+680144805f834436f0982d2c
+680144805f834436f0982d26
+680144805f834436f0982d1d
+680144805f834436f0982d0a
+680144765f834436f0982cf2
+680144765f834436f0982cd6
+680144755f834436f0982ccb
+680144425f834436f0982c51
+6801442d5f834436f0982bc7
+680140d75f834436f098242e
+6801409a5f834436f09823ea
+68013e265f834436f0981d50
+68013e1b5f834436f0981cae
+68013e075f834436f0981c61
+68013df35f834436f0981c15
+68013dd35f834436f0981b1b
+68013dd35f834436f0981b18
+68013dbf5f834436f0981abe
+68013dbf5f834436f0981abd
+68013dbf5f834436f0981abc
+68013db45f834436f0981a71
+68013d3d5f834436f09818d7
+68013b515f834436f09813e6
+68013af55f834436f09812c9
+680139225f834436f0980dd3
+680138a85f834436f0980d1e
+680137085f834436f0980903
+680136d65f834436f09808b2
+680131fb5f834436f097fa49
+680131b45f834436f097f972
+680131b45f834436f097f970
+6801312f5f834436f097f825
+6801312f5f834436f097f81b
+680130cb5f834436f097f665
+680130335f834436f097f59a
+680130285f834436f097f56f
+68012fa65f834436f097f46e
+68012cb25f834436f097eb66
+68012b0f5f834436f097e64e
+68012afd5f834436f097e628
+68012a455f834436f097e3ea
+68012a3a5f834436f097e3a2
+680129c15f834436f097e25c
+680129b65f834436f097e23f
+680129b65f834436f097e232
+680129ac5f834436f097e22b
+6801298e5f834436f097e20c
+6801295b5f834436f097e162
+680128e15f834436f097df7f
+680128985f834436f097ddd9
+680128795f834436f097dd65
+6801286f5f834436f097dd3b
+680128505f834436f097dc5e
+680127d85f834436f097dadd
+680127a55f834436f097d90c
+6801276e5f834436f097d816
+6801276e5f834436f097d815
+6801276d5f834436f097d7f9
+680127305f834436f097d67b
+680127255f834436f097d5b2
+680127245f834436f097d576
+680126e85f834436f097d4de
+680126ce5f834436f097d3e9
+680126575f834436f097d0f6
+6801263d5f834436f097cf28
+6801260f5f834436f097ce75
+680125fa5f834436f097cd63
+680125c55f834436f097ca71
+680125c55f834436f097ca6f
+680125c45f834436f097ca5a
+6800e3065f834436f0967275
+6800d6895f834436f095e3a0
+67749a173309c0998b9f5bb5
+6774a9493309c0998b9f782c
+6775f5803309c0998ba138c2
+6775ee6a3309c0998ba11aef
+6775f4a03309c0998ba13424
+6775fda13309c0998ba15bd9
+677606bd3309c0998ba19064
+67760b5f3309c0998ba1aa50
+677609903309c0998ba1a06e
+677621d83309c0998ba20143
+677622fe3309c0998ba20537
+67761d6b3309c0998ba1f6f8
+677621ec3309c0998ba2018c
+677617273309c0998ba1e84e
+67762af93309c0998ba218fe
+67762eda3309c0998ba224fc
+677658be3309c0998ba2fb5b
+677657123309c0998ba2ee57
+6776663d3309c0998ba36963
+67765bd23309c0998ba31162
+677641663309c0998ba26e89
+677642b43309c0998ba2747a
+677652593309c0998ba2ccb9
+67766a343309c0998ba382f4
+67763e823309c0998ba261a4
+6776bdbe3309c0998ba48da5
+67764bfe3309c0998ba2a6da
+677654d43309c0998ba2df63
+6776539b3309c0998ba2d4cf
+677653ba3309c0998ba2d5fc
+6776afb73309c0998ba4758a
+67764ac43309c0998ba29f7c
+6776be463309c0998ba48efb
+67762fb73309c0998ba227bc
+677637243309c0998ba241f2
+677664c93309c0998ba35f64
+677637663309c0998ba24309
+677663cb3309c0998ba35933
+67764d303309c0998ba2aea3
+67769f103309c0998ba4565c
+677673823309c0998ba3b5dd
+677638bb3309c0998ba248a9
+67764ae23309c0998ba2a040
+677651223309c0998ba2c668
+677652273309c0998ba2cb9a
+67763c493309c0998ba256e5
+6777469f3309c0998ba59017
+677745c03309c0998ba58b45
+677754963309c0998ba5d6dc
+677756053309c0998ba5df18
+6777621a3309c0998ba654fb
+677761173309c0998ba63558
+677761693309c0998ba63e3c
+6777599c3309c0998ba5f48f
+67776ed13309c0998ba709d0
+677765f23309c0998ba6934c
+6777656e3309c0998ba68b87
+677765643309c0998ba68aee
+67776a243309c0998ba6d3d2
+677765453309c0998ba6871d
+6777655a3309c0998ba68942
+67777d223309c0998ba77d16
+677780513309c0998ba789cf
+677781553309c0998ba79059
+67777fe13309c0998ba78771
+677776223309c0998ba747c2
+6777762c3309c0998ba74877
+6777798e3309c0998ba7640a
+67777ff63309c0998ba787c8
+677781af3309c0998ba79178
+67777b493309c0998ba7712c
+67778e0d3309c0998ba7dba5
+67778fe93309c0998ba7eb12
+677788823309c0998ba7bb0b
+67778c033309c0998ba7cec2
+67778f503309c0998ba7e5b5
+677792b23309c0998ba804cb
+677790793309c0998ba7f176
+677799263309c0998ba83baa
+677791983309c0998ba7fce4
+677799443309c0998ba83d11
+6777998b3309c0998ba83eed
+67779b0b3309c0998ba84edb
+677799773309c0998ba83e46
+677790a13309c0998ba7f322
+6777971a3309c0998ba82a69
+6777aa2a3309c0998ba8d5b2
+67779fa13309c0998ba87558
+6777a66b3309c0998ba8b421
+6777a2333309c0998ba88b0b
+6777acd73309c0998ba8f5c1
+6777a7b23309c0998ba8be71
+6777a3613309c0998ba89466
+6777a3613309c0998ba89465
+6777b8fc3309c0998ba95b6b
+6777ad1d3309c0998ba8f840
+6777bacf3309c0998ba96f83
+6777baf73309c0998ba970ed
+6777c2393309c0998ba99f48
+6777bfe83309c0998ba99042
+6777d0753309c0998ba9d983
+6777d0753309c0998ba9d98a
+6777e92c3309c0998baa1c8a
+67780bd53309c0998baa666d
+67780a853309c0998baa5f9f
+677869113309c0998baaf7eb
+67787e873309c0998bab16f5
+67760c893309c0998ba1b30a
+677900e03309c0998babfd7d
+67790bf33309c0998bac0eaf
+6779414a3309c0998bac5e7c
+6779433a3309c0998bac6543
+677795ec3309c0998ba81f1c
+67796dcf3309c0998bacbbc9
+677a0a523309c0998bad3f0b
+677b2a253309c0998bae816a
+677b2f993309c0998bae9d3a
+677b33193309c0998baeb50a
+677b389a3309c0998baedf7f
+677b3a7c3309c0998baee8f1
+677b43003309c0998baf1ded
+677b48123309c0998baf3d7d
+677b3f503309c0998baf0723
+677b569b3309c0998baf93f4
+677b560e3309c0998baf9055
+677b558c3309c0998baf8df6
+677b5ace3309c0998bafacd4
+677b51f03309c0998baf7ad5
+677b5af73309c0998bafafcf
+677b76d23309c0998bb0234b
+677b72c53309c0998bb01637
+677b76d83309c0998bb0239b
+677b7f5d3309c0998bb04c14
+677b83b93309c0998bb065fd
+677b84c13309c0998bb06f5d
+677b82bd3309c0998bb05e98
+677b84d53309c0998bb06fb1
+677b85053309c0998bb07181
+677b7dd13309c0998bb0437f
+677b89a13309c0998bb09e12
+677b8a4d3309c0998bb0a4d4
+677b8be63309c0998bb0b14c
+677b92c93309c0998bb0e5db
+677b91043309c0998bb0d806
+677b88d83309c0998bb09538
+677b918a3309c0998bb0dc3b
+677b963f3309c0998bb0fd4a
+677b9a083309c0998bb12286
+677b9aa23309c0998bb1288b
+677b98bb3309c0998bb1174d
+677b9dbf3309c0998bb148e3
+677b94a33309c0998bb0f4ab
+677ba6583309c0998bb1953c
+677ba77b3309c0998bb19d4c
+677bacdf3309c0998bb1c520
+677ba9823309c0998bb1acf0
+677ba30a3309c0998bb1794e
+677bacdf3309c0998bb1c512
+677ba6b73309c0998bb197d4
+677bbba53309c0998bb226e1
+677bf3df3309c0998bb2b8a5
+677c7aa03309c0998bb39308
+677c7fac3309c0998bb3adeb
+677c87c73309c0998bb3ec98
+677c8a903309c0998bb4019e
+677c8e603309c0998bb41dd1
+677c85d73309c0998bb3da90
+677c86283309c0998bb3dd19
+677c9b6a3309c0998bb4786b
+677c922f3309c0998bb4377f
+677b0b6e3309c0998bae53d2
+677c9c0a3309c0998bb47c03
+677cb4ac3309c0998bb5213b
+677cb0a03309c0998bb504f8
+677cb2463309c0998bb51136
+677cb4b63309c0998bb5219f
+677cc6813309c0998bb560f4
+677cbd2d3309c0998bb5416d
+677cd3303309c0998bb5a241
+677cd51d3309c0998bb5b0ef
+677cce8c3309c0998bb588cc
+677cd90c3309c0998bb5d37c
+677cda733309c0998bb5e265
+677cdcd43309c0998bb5f85c
+677ce0953309c0998bb61654
+677ce2b33309c0998bb625cc
+677cdf573309c0998bb60ac8
+677ce10f3309c0998bb61b5b
+677cee2c3309c0998bb68428
+677cef043309c0998bb695d1
+677cea143309c0998bb66278
+677cebac3309c0998bb66e37
+677cedbf3309c0998bb67ff4
+677ce7a43309c0998bb64d57
+677cec6f3309c0998bb674f4
+677cff913309c0998bb73f65
+677cffaf3309c0998bb740bf
+677cffc33309c0998bb74175
+677cf3503309c0998bb6d62c
+677cfe083309c0998bb7364b
+677d01da3309c0998bb757b9
+677d0adc3309c0998bb79a32
+677d0b2c3309c0998bb79c20
+677d32c43309c0998bb81ce8
+677d2bcb3309c0998bb80aa0
+677d38033309c0998bb827c6
+6777979a3309c0998ba82f4f
+677658903309c0998ba2f9c3
+67769f2e3309c0998ba456e1
+67775bc33309c0998ba5ff93
+6778cf783309c0998babaebd
+6777b96b3309c0998ba95e3d
+677dba423309c0998bb8e1f4
+677dc4a23309c0998bb8f134
+677bfb023309c0998bb2c25c
+677bd0673309c0998bb263a7
+677dc5bd3309c0998bb8f405
+677dd28e3309c0998bb92a66
+677c57aa3309c0998bb35427
+677b781a3309c0998bb02a25
+677dd2fc3309c0998bb92cb0
+677dd2fc3309c0998bb92caf
+677dce973309c0998bb91542
+677dd9b43309c0998bb95c73
+677de02f3309c0998bb98167
+677de04e3309c0998bb982de
+677debed3309c0998bb9c7b1
+677dee863309c0998bb9da39
+677deeeb3309c0998bb9dcd9
+677dece13309c0998bb9cf5a
+677de8633309c0998bb9b219
+677debed3309c0998bb9c791
+677deccb3309c0998bb9ce6c
+677ded1c3309c0998bb9d0c6
+677dee0e3309c0998bb9d7a2
+677df4b13309c0998bb9ffd1
+677df2a83309c0998bb9f219
+677df2a63309c0998bb9f1e5
+677dfe953309c0998bba4040
+677e0a7f3309c0998bba897f
+677e04fc3309c0998bba6cf7
+677e02e73309c0998bba5dbb
+677e04473309c0998bba6903
+677e02ab3309c0998bba5ba7
+677e087b3309c0998bba83e5
+677e15173309c0998bbaa6d7
+677e10e73309c0998bba9c40
+677e207a3309c0998bbad796
+677e25303309c0998bbaf15b
+677e219e3309c0998bbaddb6
+677e34623309c0998bbb71a0
+677e320c3309c0998bbb582c
+677e28553309c0998bbb06cd
+677e30183309c0998bbb49e5
+677e2dea3309c0998bbb3450
+677e42983309c0998bbbe1fb
+677e3b743309c0998bbbabe2
+677e41183309c0998bbbd74a
+677e7f313309c0998bbcea11
+677e9feb3309c0998bbd21db
+677ea8ca3309c0998bbd3954
+677efb773309c0998bbda4c4
+677ca1793309c0998bb4a251
+677c9db13309c0998bb486f6
+677d08d93309c0998bb78d66
+677cf5c43309c0998bb6ef12
+677cac613309c0998bb4e627
+677cdf433309c0998bb60995
+677cd1c53309c0998bb59956
+677c9b9a3309c0998bb47987
+677c9fe53309c0998bb49432
+677cc3403309c0998bb55586
+677cd4c23309c0998bb5aba9
+677cd7463309c0998bb5c312
+677f2f273309c0998bbe5924
+677f27b93309c0998bbe247f
+677f27e13309c0998bbe25ec
+677f2eff3309c0998bbe57ef
+677f2cca3309c0998bbe48a1
+677f29a63309c0998bbe326a
+677f38523309c0998bbe9790
+677f3fe23309c0998bbec915
+677f40833309c0998bbecd62
+677f3e573309c0998bbebc51
+677f44313309c0998bbee5a9
+677f48d93309c0998bbf0237
+677f414c3309c0998bbed310
+677f4f073309c0998bbf2ae0
+677f5d123309c0998bbf7b36
+677f50213309c0998bbf34c5
+677f529c3309c0998bbf4950
+677f592d3309c0998bbf6f17
+677f6f7f3309c0998bbfb93a
+677f79683309c0998bbff5c6
+677f79003309c0998bbff1b0
+677f70fc3309c0998bbfbfc8
+677f723e3309c0998bbfc4bc
+677f77633309c0998bbfe427
+677f7cc13309c0998bc01879
+677f7def3309c0998bc0227e
+677f7aff3309c0998bbfffef
+677f82bc3309c0998bc04993
+677f7e033309c0998bc0247d
+677f85af3309c0998bc0610e
+677f941a3309c0998bc0e77e
+677fa03c3309c0998bc14557
+677f96743309c0998bc10004
+677f95d13309c0998bc0f91d
+677fa2fd3309c0998bc15aa4
+677f9a9e3309c0998bc1220d
+677f9ffa3309c0998bc143db
+677fa5dd3309c0998bc1732b
+677fa7843309c0998bc17f41
+677fa5503309c0998bc16e4d
+677fb53e3309c0998bc1b769
+677fba9a3309c0998bc1c38c
+677fd1dd3309c0998bc1f1dc
+677fda043309c0998bc2028e
+677feb363309c0998bc217de
+677e44d63309c0998bbbf31b
+677e21633309c0998bbadc9a
+677e632e3309c0998bbca470
+677ea22e3309c0998bbd2665
+678075b03309c0998bc30bf7
+6780807c3309c0998bc35196
+6780833c3309c0998bc36371
+67808c6c3309c0998bc39f46
+678092f23309c0998bc3c96f
+67808fab3309c0998bc3b540
+67808c113309c0998bc39c7a
+678090453309c0998bc3b92a
+67809da03309c0998bc40d35
+67809d8d3309c0998bc40cd5
+67809bfa3309c0998bc4032f
+678097633309c0998bc3e7c6
+6780a3323309c0998bc428d4
+6780bc7a3309c0998bc47b2b
+6780b6df3309c0998bc46902
+6780c33d3309c0998bc49a9b
+6780beff3309c0998bc485cf
+6780c1863309c0998bc49151
+6780c1e23309c0998bc49311
+6780ca133309c0998bc4c734
+6780c7fd3309c0998bc4b614
+6780d4353309c0998bc53b99
+6780ce7a3309c0998bc4f5c8
+6780d1743309c0998bc51a26
+6780d6c43309c0998bc551ae
+6780ccbb3309c0998bc4e3ec
+6780cb7f3309c0998bc4d955
+6780d8753309c0998bc560c2
+6780cde23309c0998bc4ecb5
+6780d20c3309c0998bc522f6
+6780e4b13309c0998bc5cc6b
+6780e6fa3309c0998bc5e10c
+6780e3d43309c0998bc5c56a
+6780dcd43309c0998bc58ada
+6780df7e3309c0998bc5a08a
+6780e44d3309c0998bc5c82f
+6780e6263309c0998bc5d953
+6780e2ec3309c0998bc5bc26
+6780ec4b3309c0998bc60f71
+6780f32e3309c0998bc641dc
+6780e85b3309c0998bc5edaa
+6780f2dd3309c0998bc63f05
+6780eb1c3309c0998bc6030b
+6780f0083309c0998bc62abf
+6780fdcf3309c0998bc68c92
+67810de73309c0998bc6bb37
+6781054c3309c0998bc6a628
+67810df53309c0998bc6bb89
+678131be3309c0998bc70cc3
+677f73f53309c0998bbfce9e
+677fcacc3309c0998bc1e1f3
+6781d9783309c0998bc813d8
+6781ee993309c0998bc83752
+678119593309c0998bc6d737
+6780f42c3309c0998bc6496f
+67811abd3309c0998bc6da0c
+6780ac743309c0998bc44d81
+678116e53309c0998bc6d182
+6783414c3309c0998bc9cdb0
+6783945a3309c0998bca3483
+67843e293309c0998bcac0c2
+677f6dec3309c0998bbfb1f1
+677d29b13309c0998bb804b8
+677f778a3309c0998bbfe583
+677f8ca13309c0998bc0a0fb
+678463a33309c0998bcae83c
+678478a33309c0998bcb5700
+678492aa3309c0998bcbf658
+678495d93309c0998bcc0d6b
+67848a833309c0998bcbc928
+67848f723309c0998bcbe3cb
+678495163309c0998bcc07a4
+67848f0d3309c0998bcbe2a2
+67848d653309c0998bcbda8e
+678495cf3309c0998bcc0ca0
+678494f13309c0998bcc059f
+67849e553309c0998bcc4328
+67849e9d3309c0998bcc439c
+6784ae193309c0998bcc6f7c
+6784ab323309c0998bcc67f1
+6784a69c3309c0998bcc5c03
+6784afd43309c0998bcc7640
+6784b6813309c0998bcc9066
+6784bcfc3309c0998bccaf30
+6784b4613309c0998bcc87b2
+6784bee43309c0998bccbf1b
+6784c1293309c0998bccd2dd
+6784c80c3309c0998bcd0d55
+6784ca7c3309c0998bcd1e94
+6784ccca3309c0998bcd2fad
+6784cf3e3309c0998bcd4350
+6784d6443309c0998bcd7e03
+6784d8b83309c0998bcd90f0
+6784d83e3309c0998bcd8da1
+6784db263309c0998bcda393
+6784cec43309c0998bcd405f
+6784cd9e3309c0998bcd3618
+6784d1243309c0998bcd52d2
+6784d06e3309c0998bcd4bd6
+6784d7413309c0998bcd8548
+6784e2b03309c0998bcde585
+6784e9503309c0998bce1abb
+6784e0863309c0998bcdd4c8
+6784e8463309c0998bce0e66
+6784e4473309c0998bcdf117
+6784ded23309c0998bcdc164
+6784e8ac3309c0998bce12d5
+6784e55e3309c0998bcdfa6f
+6784e6d23309c0998bce04da
+6784e5903309c0998bcdfc1b
+6784e53f3309c0998bcdf878
+6784dd643309c0998bcdb45b
+6784f6163309c0998bce65ec
+6784f28d3309c0998bce5a5b
+6784efba3309c0998bce4e96
+6784ef053309c0998bce494d
+6784f69a3309c0998bce6827
+6784f0e73309c0998bce5355
+6784fda73309c0998bce7d6e
+67850ac93309c0998bcea0f5
+678517893309c0998bcec956
+67852b7b3309c0998bcef6e4
+6780f7a13309c0998bc664e1
+6780f1f33309c0998bc63846
+6780ed943309c0998bc61b3d
+6785b3523309c0998bcff267
+6785ca2c3309c0998bd07ebe
+6785bd913309c0998bd0262d
+6785d49b3309c0998bd0c663
+6785d16b3309c0998bd0ab2c
+6785cd173309c0998bd09074
+6785d0653309c0998bd0a5d8
+6785cd433309c0998bd09258
+6785d5df3309c0998bd0ceac
+6785e51a3309c0998bd13981
+6785db1f3309c0998bd0f7f1
+6785e5573309c0998bd13b87
+6785e4973309c0998bd135ce
+6785eab23309c0998bd16153
+6785ed773309c0998bd17ea5
+6785e7c83309c0998bd14ecc
+6785f0083309c0998bd192f1
+6785e9513309c0998bd15969
+678603af3309c0998bd1e26d
+6786009c3309c0998bd1d2fc
+6785fd293309c0998bd1c492
+6781dada3309c0998bc815eb
+677f7b8e3309c0998bc0068f
+6781193b3309c0998bc6d718
+6780983e3309c0998bc3ee37
+67860d7b3309c0998bd21639
+67821c793309c0998bc88dfa
+678604e43309c0998bd1e7fe
+67860a123309c0998bd20084
+67861dd13309c0998bd29e87
+678616d83309c0998bd26a2e
+6786182d3309c0998bd2726e
+67861c133309c0998bd2921d
+678614893309c0998bd25114
+67862bca3309c0998bd31491
+678622853309c0998bd2c5a7
+67862d0b3309c0998bd3202a
+67861f8d3309c0998bd2aa86
+67862c3e3309c0998bd31811
+678627a83309c0998bd2f12b
+678637713309c0998bd380e9
+678631473309c0998bd34a33
+6786388c3309c0998bd3889e
+678638a03309c0998bd38958
+678635413309c0998bd36fd6
+678647393309c0998bd3fe48
+6784e8c23309c0998bce13cb
+6784708c3309c0998bcb28fc
+6786458c3309c0998bd3f4da
+678641a43309c0998bd3e488
+6784ba163309c0998bcca0bc
+6784c6de3309c0998bcd05bc
+6784e5353309c0998bcdf7f0
+6784bee43309c0998bccbf1a
+6786505d3309c0998bd42447
+678662c73309c0998bd45c38
+67869f893309c0998bd4f9fc
+678710d83309c0998bd60168
+678727833309c0998bd69986
+678723773309c0998bd67e52
+678728073309c0998bd69e01
+6787257e3309c0998bd68b4a
+678720d53309c0998bd66c2c
+67871bf63309c0998bd64897
+678732533309c0998bd6e17c
+6787353f3309c0998bd6f0a4
+678737d13309c0998bd7037a
+6787332c3309c0998bd6e57a
+678736093309c0998bd6f4af
+67872ef03309c0998bd6cd94
+67873f6e3309c0998bd73984
+67873ccd3309c0998bd727fd
+67873b453309c0998bd71ecd
+678739b23309c0998bd71385
+6787422e3309c0998bd7498c
+67873a643309c0998bd717eb
+678737ed3309c0998bd704ae
+678739ef3309c0998bd7156f
+678752893309c0998bd785ab
+67874e063309c0998bd7751f
+6787603e3309c0998bd7c75e
+67875c443309c0998bd7af34
+67875b5b3309c0998bd7a944
+6787566c3309c0998bd79548
+67875b853309c0998bd7aa66
+67875feb3309c0998bd7c57d
+678769683309c0998bd81456
+678766613309c0998bd7ff20
+67876f4b3309c0998bd83e35
+67876af03309c0998bd81d8b
+67876cfc3309c0998bd82d6d
+67876c333309c0998bd827b3
+6787789f3309c0998bd8a12b
+67877c953309c0998bd8cbf6
+678772dd3309c0998bd8608f
+678774803309c0998bd87269
+678778903309c0998bd8a0f9
+67877cc73309c0998bd8cf40
+67878a803309c0998bd93eda
+6787839b3309c0998bd90b17
+678782493309c0998bd90156
+67877e133309c0998bd8dc7a
+678790363309c0998bd976c4
+67878c6e3309c0998bd95163
+678790863309c0998bd97920
+67878cbf3309c0998bd9565e
+678799fb3309c0998bd9a628
+678797563309c0998bd99d93
+6787b46c3309c0998bd9e8f9
+6787b8113309c0998bd9f3ff
+678099b53309c0998bc3f730
+677e07e33309c0998bba8127
+677f5ee63309c0998bbf808b
+677f68db3309c0998bbf9ed4
+677f6e2b3309c0998bbfb2b8
+677f76813309c0998bbfddc6
+677e52d83309c0998bbc581d
+677e2efb3309c0998bbb4026
+677d01f83309c0998bb758d6
+677d07483309c0998bb78152
+677bb8b23309c0998bb21501
+677baba23309c0998bb1bcae
+677ba5df3309c0998bb1908f
+677c9a543309c0998bb47050
+677c87743309c0998bb3e928
+677b52403309c0998baf7ccd
+677b3e7d3309c0998baf01ba
+677b2e8a3309c0998bae97b9
+6777ad643309c0998ba8fb35
+6777c41b3309c0998ba9aa40
+6777762c3309c0998ba74881
+677754aa3309c0998ba5d74f
+677600c23309c0998ba16e57
+6780a8fa3309c0998bc44223
+677f3eb33309c0998bbebe0a
+677f3ff13309c0998bbec975
+677e387e3309c0998bbb93f9
+677e409c3309c0998bbbd439
+677e2d673309c0998bbb302a
+677d43703309c0998bb8392f
+677d148f3309c0998bb7bd70
+677cd3503309c0998bb5a385
+677cd6c33309c0998bb5bdc5
+677cf4083309c0998bb6dced
+677cf43a3309c0998bb6dede
+677ceddb3309c0998bb680e3
+677cf1773309c0998bb6bded
+677b39c73309c0998baee4e3
+677b450f3309c0998baf2a8a
+677b91b93309c0998bb0dd4a
+6777abda3309c0998ba8e98c
+67777a093309c0998ba76976
+677795ce3309c0998ba81d0b
+6776449d3309c0998ba27dd1
+6787e1423309c0998bda45fd
+6784c1143309c0998bccd195
+6784d32c3309c0998bcd62af
+678861c33309c0998bdb4d67
+678872f33309c0998bdbba05
+678877a83309c0998bdbdcb9
+678871713309c0998bdbb08e
+67887ddf3309c0998bdc0890
+678881043309c0998bdc2010
+678888b63309c0998bdc51e8
+678882aa3309c0998bdc29e5
+678889933309c0998bdc5957
+6788887a3309c0998bdc4dd3
+67887cd93309c0998bdc039e
+67887f933309c0998bdc15aa
+67887fee3309c0998bdc17f8
+678888ca3309c0998bdc53f7
+678887193309c0998bdc4446
+678893843309c0998bdc999c
+67888d463309c0998bdc789a
+6788907f3309c0998bdc8f9d
+67888ea63309c0998bdc81f4
+6788b0ec3309c0998bdd0074
+6788afb53309c0998bdcfa3f
+6788b2603309c0998bdd0a52
+6788bd953309c0998bdd62fb
+6788bbf93309c0998bdd5846
+6788b8d53309c0998bdd4352
+6788b3ca3309c0998bdd161d
+6788b6463309c0998bdd2ccd
+6788b76a3309c0998bdd3510
+6788cac63309c0998bdddfd3
+6788ca5a3309c0998bddda97
+6788ca323309c0998bddd905
+6788cf5e3309c0998bde09ab
+6788cfa53309c0998bde0cd5
+6788c6223309c0998bddad66
+6788c7fd3309c0998bddc2b5
+6788dc093309c0998bde684d
+6788d0fd3309c0998bde1991
+6788dd423309c0998bde72fd
+6788d32a3309c0998bde2a93
+6788db9f3309c0998bde6552
+6786a0483309c0998bd4fcc6
+6788e67a3309c0998bdeb91a
+678738d93309c0998bd70c08
+6788df843309c0998bde8509
+678711903309c0998bd60770
+67871d7e3309c0998bd6553d
+6788e4653309c0998bdeaeb5
+67872c9f3309c0998bd6be11
+678908aa3309c0998bdf0d2c
+67892e983309c0998bdf4be8
+6789357e3309c0998bdf6486
+6789b2963309c0998be0582f
+6789cb3c3309c0998be0f7af
+6789c8043309c0998be0df45
+6789c2eb3309c0998be0c006
+6789cd663309c0998be1088a
+6789d1193309c0998be12292
+6789d4383309c0998be1394d
+6789d5753309c0998be13fe5
+6789d03c3309c0998be11c6a
+6789d6d53309c0998be147d3
+6789ce3a3309c0998be10f88
+6789dc4e3309c0998be16e37
+6789de583309c0998be17abe
+6789dab03309c0998be16292
+6789e2d13309c0998be19942
+6789f6d53309c0998be1e217
+6789f9c83309c0998be1f126
+6789f8733309c0998be1ea6b
+6789fd333309c0998be2030b
+678a11cc3309c0998be29742
+678a10ee3309c0998be291e0
+678a11163309c0998be29214
+678a11163309c0998be2922f
+678a123a3309c0998be29ae1
+678a1fa23309c0998be30514
+678a2d633309c0998be36792
+678a25ed3309c0998be33137
+678a283e3309c0998be34349
+678a2a343309c0998be3517b
+678a221c3309c0998be317e0
+678a39693309c0998be3bd25
+678a357e3309c0998be3a971
+678a3b9d3309c0998be3c5b4
+6787dbeb3309c0998bda3425
+6788c3c83309c0998bdd9122
+678a3cb63309c0998be3c9ff
+678a317b3309c0998be3893f
+678a30893309c0998be38139
+678a41cd3309c0998be3d85d
+678a52bd3309c0998be405d9
+678a64be3309c0998be432f4
+678a6b853309c0998be43efa
+678a68da3309c0998be43b06
+678b0eb53309c0998be56884
+678b12083309c0998be56f79
+678b2a313309c0998be59df6
+678b3fb23309c0998be5c9d6
+678b52153309c0998be5f054
+678b578c3309c0998be60749
+6789d9263309c0998be15629
+678bae8f3309c0998be6a14f
+678bccb53309c0998be6d0cf
+678ca4dc3309c0998be7c22a
+678ccc6b3309c0998be7eb69
+678cc77e3309c0998be7e829
+678cd54e3309c0998be7f690
+678b3c1e3309c0998be5c43f
+6785d4d83309c0998bd0c864
+6785ca363309c0998bd07eff
+678786543309c0998bd92169
+6785176d3309c0998bcec89f
+6787780d3309c0998bd89ad7
+678779823309c0998bd8aa66
+678765ac3309c0998bd7faab
+67871c4a3309c0998bd64b81
+67869d923309c0998bd4f383
+6784e8833309c0998bce112c
+678641d63309c0998bd3e580
+6787484c3309c0998bd7621d
+678d9fe33309c0998be8da9f
+678db3773309c0998be91f5d
+678db5793309c0998be927eb
+678db9033309c0998be93660
+678db9fe3309c0998be93b60
+678dca573309c0998be989ba
+678ddd623309c0998be9b492
+678df0253309c0998be9dfd6
+678e01153309c0998bea2390
+678e04113309c0998bea3208
+678e14b73309c0998bea9163
+678e15e53309c0998bea9a05
+678e0cc73309c0998bea62f2
+678e08173309c0998bea46c8
+678e0c973309c0998bea61c7
+678e0c9e3309c0998bea6225
+678e16ff3309c0998beaa0d2
+678e24033309c0998beae6bc
+678e179f3309c0998beaa50d
+678e19783309c0998beab226
+678e27f13309c0998beaf616
+678e6b113309c0998beb5742
+678e717b3309c0998beb5bb1
+678ee98c3309c0998bebf306
+6789d8cc3309c0998be154d9
+6789a65c3309c0998be01fea
+6787306d3309c0998bd6d6cd
+678870933309c0998bdba9e8
+6788bf273309c0998bdd6d95
+678d2f593309c0998be878cb
+678a88313309c0998be47c21
+678a7e413309c0998be45d1e
+678a388e3309c0998be3ba1a
+678f02b43309c0998bec3d70
+678efdc83309c0998bec28f8
+678f00133309c0998bec3157
+678f09923309c0998bec5db5
+678f1f753309c0998becca76
+678f1fe93309c0998becd021
+678f20ef3309c0998bece644
+678f28e23309c0998bed50d9
+678f295e3309c0998bed54ec
+678f27ee3309c0998bed42d7
+678f27f83309c0998bed434d
+678f26ad3309c0998bed35c3
+678f2b553309c0998bed792c
+678f25a63309c0998bed277b
+678f24d13309c0998bed1c56
+678f23793309c0998bed0e97
+678f2d6e3309c0998bed9d97
+678f31bb3309c0998bedcfd6
+678f2e173309c0998bedb002
+678f3a103309c0998bedefb6
+678f47313309c0998bee2f7e
+678f3fbb3309c0998bee07f5
+678f4a8d3309c0998bee499d
+678f44c83309c0998bee2103
+678f43803309c0998bee1a6b
+678f53f83309c0998beea1bb
+678f59103309c0998beeed49
+678f54173309c0998beea487
+678f59063309c0998beeec1d
+678f52a33309c0998bee8b19
+678f53fd3309c0998beea1f5
+678f57833309c0998beed7ac
+678f56de3309c0998beecaf9
+678f56f43309c0998beecbef
+678f67833309c0998bef6de5
+678f60303309c0998bef2fbd
+678f5d443309c0998bef18df
+678f59ea3309c0998beef8b4
+678f68f13309c0998bef7bf7
+678f6f313309c0998befab3e
+678f681e3309c0998bef73ee
+678f6a653309c0998bef86e1
+678f6acf3309c0998bef8a46
+678f6b0b3309c0998bef8bb8
+678f78a03309c0998befeec3
+678f76433309c0998befd852
+678f79053309c0998beff1e0
+678f790f3309c0998beff217
+678f841e3309c0998bf01e2c
+678f84963309c0998bf01fc9
+678f92613309c0998bf04842
+678fc2233309c0998bf0cc4d
+678e16213309c0998bea9bdb
+67903f3d3309c0998bf18ce0
+679048a03309c0998bf1b489
+6790551c3309c0998bf1fa78
+679051d03309c0998bf1e8d3
+6790629e3309c0998bf24672
+67906ff63309c0998bf2932a
+679070c93309c0998bf29801
+679067173309c0998bf262bc
+67906a823309c0998bf2795b
+679073263309c0998bf2a763
+679072ab3309c0998bf2a501
+6790792c3309c0998bf2ceef
+67907aae3309c0998bf2d7d1
+6790851a3309c0998bf2f0eb
+679092fd3309c0998bf31b41
+679099843309c0998bf33918
+6790a9953309c0998bf3aa71
+678f00e63309c0998bec34f7
+6790a01c3309c0998bf36d0a
+678f22ba3309c0998becfe4c
+678f5da73309c0998bef1c56
+678f20893309c0998bece0b7
+6790aaf43309c0998bf3b528
+67909fa03309c0998bf3695c
+6790a9d23309c0998bf3adc0
+6790aa893309c0998bf3b2d9
+6790a1013309c0998bf37405
+6790baec3309c0998bf41db9
+6790c2623309c0998bf447c4
+6790bff93309c0998bf43a69
+6790ce4d3309c0998bf494d8
+6790c6033309c0998bf45f26
+6790c60d3309c0998bf45f69
+6790d6373309c0998bf4abc5
+679119b73309c0998bf522db
+67916e5b3309c0998bf58ff3
+679193783309c0998bf5cd54
+67919c373309c0998bf5f990
+67919d833309c0998bf6028a
+6791ad5f3309c0998bf65768
+6791c3033309c0998bf6d5db
+6791bc563309c0998bf6b27b
+6791c1903309c0998bf6cd0c
+6791c1853309c0998bf6cc4a
+679067d53309c0998bf2681c
+6791eedd3309c0998bf7838a
+679046823309c0998bf1a7db
+6791ef753309c0998bf7896f
+6791f6ef3309c0998bf7b8e8
+6791f01e3309c0998bf78dd7
+6791f1443309c0998bf7961b
+6791f5c13309c0998bf7b0f0
+6791f6ef3309c0998bf7b8e4
+6791f3f13309c0998bf7a739
+6791f9243309c0998bf7c6c4
+6791f38c3309c0998bf7a48e
+6791eeee3309c0998bf783bf
+6791fd7a3309c0998bf7e1c3
+6791fcbb3309c0998bf7dcac
+679200a63309c0998bf7f2e0
+679202b53309c0998bf803fd
+679203ea3309c0998bf80b90
+6791ff2e3309c0998bf7ea9a
+6791fe253309c0998bf7e642
+6792058c3309c0998bf8151a
+67920c743309c0998bf8440d
+679216393309c0998bf891f8
+67921cc83309c0998bf8d707
+679219c93309c0998bf8b97b
+67921a7e3309c0998bf8c157
+679219283309c0998bf8b3df
+679221c03309c0998bf90194
+679217af3309c0998bf8a273
+6792207c3309c0998bf8f75e
+6792224b3309c0998bf904cf
+679219c93309c0998bf8b97d
+679220403309c0998bf8f60c
+67921fdb3309c0998bf8f300
+679221b43309c0998bf900d1
+6792224b3309c0998bf90534
+679228a03309c0998bf92d1e
+679227863309c0998bf925d6
+6792336c3309c0998bf95f12
+6792302a3309c0998bf9532e
+679233463309c0998bf95de0
+679233ef3309c0998bf962f1
+6789caa43309c0998be0f257
+6788ebd83309c0998bdeca09
+67888ec43309c0998bdc8374
+678886da3309c0998bdc4276
+6788816f3309c0998bdc2335
+6787c00e3309c0998bda068d
+67875aba3309c0998bd7a6fb
+6787382a3309c0998bd707aa
+6787829e3309c0998bd903b9
+67861f803309c0998bd2aa28
+67863fc03309c0998bd3d4be
+6785c5213309c0998bd05f46
+6784e44d3309c0998bcdf157
+6785e4bf3309c0998bd1370f
+6785bdd83309c0998bd0279e
+6784cb533309c0998bcd2464
+6784b8643309c0998bcc9839
+67849b6e3309c0998bcc30f6
+6780ebbe3309c0998bc60a93
+6780d2473309c0998bc52468
+677f39d03309c0998bbea09c
+6789cc833309c0998be100ed
+6788ba493309c0998bdd4d28
+6787dc133309c0998bda34eb
+678857563309c0998bdb15e9
+6787855a3309c0998bd9198f
+678614073309c0998bd24a48
+6786300c3309c0998bd33f29
+678663ec3309c0998bd46005
+6784dfdb3309c0998bcdcf06
+6784ea613309c0998bce256e
+67847b4f3309c0998bcb6622
+6785e6c33309c0998bd147a9
+6785dddd3309c0998bd10b82
+6784c4783309c0998bccf43a
+678139de3309c0998bc71676
+6780db833309c0998bc57c5e
+6780e11f3309c0998bc5ad7d
+6792698b3309c0998bf9d783
+6792793c3309c0998bfa0805
+6792c2c73309c0998bfa5293
+67905c3f3309c0998bf21f3d
+6792d7ff3309c0998bfa6e64
+678fc5383309c0998bf0d112
+678f46033309c0998bee287f
+679112363309c0998bf50f5d
+6791107c3309c0998bf50df1
+6790c4333309c0998bf45288
+6790bd543309c0998bf42d6b
+6790be1e3309c0998bf43249
+6790b0363309c0998bf3d72e
+6792e7413309c0998bfa9674
+6792e9823309c0998bfaa1cd
+6792f7033309c0998bfaec66
+6792f8913309c0998bfaf44a
+6792f3e03309c0998bfadb66
+6792f1a93309c0998bfacfe0
+6792f6ca3309c0998bfaeb6e
+6792f7e53309c0998bfaf0e1
+679300833309c0998bfb2158
+679305be3309c0998bfb4359
+6792ffb03309c0998bfb1d67
+679311af3309c0998bfb8d74
+679313f63309c0998bfb99a9
+679314ab3309c0998bfb9d29
+679317753309c0998bfbb57a
+6793162a3309c0998bfba770
+6793283e3309c0998bfbf33f
+67932b103309c0998bfbfb7e
+679334853309c0998bfc1a69
+679334853309c0998bfc1a80
+67933c9b3309c0998bfc43c8
+679337263309c0998bfc25f9
+679332673309c0998bfc126f
+67934c1c3309c0998bfcac26
+6793426e3309c0998bfc6e46
+67934ceb3309c0998bfcb2fc
+67934b7a3309c0998bfca737
+67934b703309c0998bfca6ed
+679348453309c0998bfc93e5
+67934b333309c0998bfca4a3
+679359e43309c0998bfd271e
+679353f53309c0998bfcef83
+679351e93309c0998bfcd825
+679350ef3309c0998bfccfb3
+679355f73309c0998bfcff43
+6793517b3309c0998bfcd474
+67935aaf3309c0998bfd2e47
+679369873309c0998bfda994
+679362113309c0998bfd7288
+6793712d3309c0998bfde332
+67936dae3309c0998bfdce29
+679372903309c0998bfde9cd
+67936bdf3309c0998bfdc035
+6793c0623309c0998bfe8e48
+679417683309c0998bfef37d
+67943a133309c0998bff28e9
+67943f523309c0998bff3632
+67920ff13309c0998bf85dbf
+6791eec63309c0998bf78311
+6794ff113309c0998b002ec1
+6795040c3309c0998b003c70
+6795039d3309c0998b003a41
+6795040c3309c0998b003c69
+6795032f3309c0998b0038a8
+679503253309c0998b003867
+67950cb93309c0998b005861
+679503393309c0998b0038d6
+679503253309c0998b003846
+679514583309c0998b008673
+67958b053309c0998b017826
+679586343309c0998b016b62
+678f6ddb3309c0998befa385
+678f3fd03309c0998bee0874
+67959bb03309c0998b01b767
+679599423309c0998b01ae65
+67959b733309c0998b01b645
+67958fba3309c0998b018a85
+67958e5b3309c0998b018438
+67959e463309c0998b01c060
+67939dfe3309c0998bfe590d
+6795ab783309c0998b01fff6
+6795a9d23309c0998b01f78d
+6795b5c33309c0998b022ed8
+6795b29f3309c0998b022156
+6795b7543309c0998b02371a
+6795ae2e3309c0998b020bc2
+6795afc03309c0998b0212a9
+6795b3053309c0998b0222d5
+6795d18f3309c0998b028e7a
+6795d17b3309c0998b028e43
+6795d17b3309c0998b028e44
+6795d30c3309c0998b02911e
+6795d1713309c0998b028e14
+6795d18f3309c0998b028e7b
+6795d86b3309c0998b029fe0
+6795d48a3309c0998b029446
+6795dfa13309c0998b02bba5
+6795d5173309c0998b0295ff
+6795e3cd3309c0998b02cd48
+6795e6f13309c0998b02dec3
+6795eb0f3309c0998b02f267
+6795e8cc3309c0998b02e799
+6795fcf23309c0998b034c44
+6795f5633309c0998b032718
+6795f6ea3309c0998b032f51
+6795fc133309c0998b0347f5
+6795f4493309c0998b032195
+6796027f3309c0998b0367ac
+679601703309c0998b036354
+6796091a3309c0998b038502
+679601153309c0998b03618b
+679609983309c0998b038719
+6796124f3309c0998b03af56
+679626063309c0998b03e006
+679631513309c0998b03f2a7
+6796b6ca3309c0998b04a55d
+67950a153309c0998b004dd1
+679508c03309c0998b0049c3
+6796dea03309c0998b04eab3
+6796e30e3309c0998b04fca9
+6796e3e13309c0998b04ffb2
+67921dd93309c0998bf8e2a3
+679202453309c0998bf80109
+6796f0083309c0998b053100
+6796fb043309c0998b0558f5
+679721f43309c0998b05bc87
+679731a03309c0998b05db0e
+679751963309c0998b062ba6
+679752eb3309c0998b062e85
+6798206b3309c0998b0715ff
+679824683309c0998b071a29
+679858663309c0998b0740ca
+6798592a3309c0998b074168
+67975ff43309c0998b06445c
+678e17dc3309c0998beaa6c9
+6789f5753309c0998be1dd5f
+678e2c1c3309c0998beb00a1
+678e19273309c0998beaaf0a
+678dbb723309c0998be942e8
+678a0ca03309c0998be27140
+6789ea243309c0998be1b9ce
+677888693309c0998bab30d9
+679daa9c3309c0998b0a6c28
+6792eb0a3309c0998bfaac20
+6792c7043309c0998bfa576c
+67920e823309c0998bf85193
+6791a9c33309c0998bf641e7
+6792fb363309c0998bfb0369
+6792e6ff3309c0998bfa94d8
+6796e3863309c0998b04fef4
+6795afd63309c0998b021349
+67937b123309c0998bfe0a01
+6793406c3309c0998bfc5d42
+6791baed3309c0998bf6a96f
+67937beb3309c0998bfe0d74
+67936f4b3309c0998bfdd7bd
+67934a673309c0998bfc9fff
+67922b7d3309c0998bf93b04
+6791ab5f3309c0998bf64b7e
+67906ff63309c0998bf292e3
+6790d5af3309c0998bf4aabe
+6790c17e3309c0998bf4440b
+6790b4383309c0998bf3f274
+67909fbe3309c0998bf36a67
+678fe3fa3309c0998bf11797
+679046963309c0998bf1a882
+678f75e53309c0998befd404
+678f707e3309c0998befb1d7
+678f6f6e3309c0998befac10
+678f49503309c0998bee3d86
+678f49313309c0998bee3c09
+678f48863309c0998bee37fa
+678f40cd3309c0998bee0dc3
+678f31203309c0998bedcd0c
+678f5d303309c0998bef17dc
+678f60353309c0998bef2fd1
+678f636f3309c0998bef4b65
+678f5a573309c0998beefe16
+678e15ef3309c0998bea9a4b
+678e20fa3309c0998beadb5e
+678e0ca13309c0998bea622b
+678f28ae3309c0998bed4ec2
+678e58543309c0998beb4643
+678d9d7f3309c0998be8d653
+678952753309c0998bdfa843
+678ae0943309c0998be511ba
+678a6e233309c0998be44325
+678880353309c0998bdc1992
+678a347e3309c0998be3a194
+678a25183309c0998be32b93
+67887cc33309c0998bdc031b
+678a09a73309c0998be255f4
+6791fbf23309c0998bf7d8af
+679204eb3309c0998bf811e6
+6790f1963309c0998bf4e331
+67911a403309c0998bf5253f
+67919b773309c0998bf5f3c3
+6791a5173309c0998bf6295e
+6790bf883309c0998bf437e8
+6790bd0f3309c0998bf42bc6
+6790c4653309c0998bf4538b
+6790d2ec3309c0998bf4a281
+6790b2193309c0998bf3e3db
+678fb4053309c0998bf0b888
+678f72223309c0998befba14
+678f4d163309c0998bee5b88
+678f63843309c0998bef4c4f
+678f15733309c0998bec9602
+678dacd23309c0998be904e1
+678a1c7d3309c0998be2e926
+678a0aae3309c0998be261a3
+67a2bb3b3309c0998b0db204
+67a2bfee3309c0998b0dbdaf
+67a2e5833309c0998b0e441a
+67a2e9aa3309c0998b0e5095
+67a2fa233309c0998b0e6912
+67a31eb83309c0998b0ed15d
+67a31bb63309c0998b0ec5bc
+67a327d23309c0998b0f0f4e
+67a326083309c0998b0ef4b9
+67a32e963309c0998b0f4abc
+67a340543309c0998b0fb41f
+67a374ba3309c0998b10218d
+67a37d353309c0998b102ad6
+67a41a423309c0998b110901
+67a4191f3309c0998b1104ac
+67a410da3309c0998b10e819
+67a41dfb3309c0998b1116cb
+67a424fa3309c0998b113096
+67a41f323309c0998b111abc
+67a432f63309c0998b1167b0
+67a430be3309c0998b115ef3
+67a42f213309c0998b11574a
+67a42f503309c0998b115851
+67a42f9a3309c0998b1159c7
+67a42f833309c0998b115936
+678f616d3309c0998bef3868
+67a44ca53309c0998b11a455
+67a4600b3309c0998b11d52a
+67a470b93309c0998b122dc7
+67a470043309c0998b122900
+67a4758d3309c0998b12483f
+67a47ce23309c0998b126eb0
+67a48a4b3309c0998b12a7fd
+67a486233309c0998b129901
+67a48b323309c0998b12aad2
+67a485ca3309c0998b129806
+67a481013309c0998b128278
+67a482df3309c0998b128aa4
+67a2d2593309c0998b0e04ea
+67a2dbad3309c0998b0e2400
+67a2c8013309c0998b0ddb7f
+67a2cbe43309c0998b0deb4c
+67a3289c3309c0998b0f187b
+67a2ceed3309c0998b0df806
+67a49e3d3309c0998b12e209
+67a49b7e3309c0998b12dbfd
+67a4b7e93309c0998b1306e2
+679e63633309c0998b0afebf
+67979e073309c0998b068be9
+679732bb3309c0998b05ddff
+6796437a3309c0998b041045
+6795d1c13309c0998b028ecc
+67934b6d3309c0998bfca6be
+67934ad73309c0998bfca243
+679353b93309c0998bfced73
+67934f313309c0998bfcc3fc
+679369e23309c0998bfdac8c
+679723863309c0998b05bff7
+6796dc863309c0998b04e03c
+6793547e3309c0998bfcf28c
+67934b083309c0998bfca334
+67935aa43309c0998bfd2d85
+679370d33309c0998bfde122
+67a53f403309c0998b139da0
+67a551613309c0998b13b32e
+67a568fa3309c0998b13fac6
+67a5721c3309c0998b142200
+67a577163309c0998b14354a
+67a58a183309c0998b147ec1
+67a496743309c0998b12d0b1
+67a5a4503309c0998b14bdf6
+67a5b37f3309c0998b14eea7
+67a5ad773309c0998b14d6fd
+67a5b3753309c0998b14ee88
+67a5c1bb3309c0998b153adb
+67a5b4ca3309c0998b14f60a
+67a5c12f3309c0998b1537c9
+67a5bc843309c0998b151ca4
+67a5ce103309c0998b157e4c
+67a5cef43309c0998b1582e9
+67a5c6a33309c0998b15539f
+67a5dcec3309c0998b15c432
+67a5d4383309c0998b159f0c
+67a5da373309c0998b15b9b6
+67a5dcd73309c0998b15c2db
+67a430193309c0998b115bfd
+67a5e22d3309c0998b15d8e1
+67a435073309c0998b116df3
+67a5e30e3309c0998b15db91
+67a602513309c0998b1611f4
+67a607e63309c0998b161cbd
+67a5fdc03309c0998b160ca5
+67a688583309c0998b16c345
+67a699ae3309c0998b16d88c
+67a6a4263309c0998b16e73f
+67a6ad873309c0998b16fa16
+67a6bc063309c0998b17313c
+67a6b41e3309c0998b171185
+67a6b9783309c0998b17272d
+67a6cb9a3309c0998b177207
+67a6dc953309c0998b17b68b
+67a701463309c0998b180baa
+67a703873309c0998b181518
+67a6fe923309c0998b180372
+67a713193309c0998b1869c9
+67a70f473309c0998b1853f2
+67a7092a3309c0998b1835b6
+67a71a313309c0998b188daa
+67a7166b3309c0998b187976
+67a713c43309c0998b186ccd
+67a714a73309c0998b187036
+67a71bb73309c0998b1895ba
+67a71fe03309c0998b18acf0
+67a719203309c0998b188768
+67a724503309c0998b18c2b4
+67a7260a3309c0998b18cd01
+67a7420e3309c0998b192a16
+67a747923309c0998b193405
+67a804033309c0998b1a3d23
+67a810813309c0998b1a60b8
+67a6f59a3309c0998b17e953
+67a9542c3309c0998b1b9fe7
+67a959ec3309c0998b1bb6f0
+67a95b253309c0998b1bbbfd
+67a958ff3309c0998b1bb358
+67a965e53309c0998b1beac2
+67a966543309c0998b1bec38
+67a96baa3309c0998b1c03f4
+67a96cf73309c0998b1c099e
+67a97b883309c0998b1c5218
+67a97d093309c0998b1c5695
+67a9738b3309c0998b1c2a0d
+67a9899e3309c0998b1c84f9
+67a9a1d63309c0998b1cc4e9
+67a76e6c3309c0998b19683a
+67a9af823309c0998b1d0a29
+67a9b2733309c0998b1d18b9
+67a9b09b3309c0998b1d0ef7
+67a9bb503309c0998b1d4844
+67a9c5d33309c0998b1d8604
+67a9d5283309c0998b1dfaf9
+67a9d6a63309c0998b1e0259
+67a9e0933309c0998b1e1d86
+67a9da663309c0998b1e0ba5
+67a9d5283309c0998b1dfa92
+67a9d5cc3309c0998b1dfdb7
+67a9e6d33309c0998b1e298e
+67a9f0393309c0998b1e3afe
+67a9f6e73309c0998b1e4718
+67aa050d3309c0998b1e5a93
+67aa202e3309c0998b1e764f
+67a707473309c0998b182785
+67a81b643309c0998b1a755f
+67a72eba3309c0998b18f2a7
+67aa9b353309c0998b1f117d
+67aab4903309c0998b1f8918
+67aab1ac3309c0998b1f75d1
+67aab2d13309c0998b1f7ce4
+67aaad683309c0998b1f6075
+67aab0963309c0998b1f6fb4
+67aaa90e3309c0998b1f4aaf
+67aabe563309c0998b1fc0ba
+67aab7c33309c0998b1f9bd8
+67aac0263309c0998b1fca8c
+67aab9423309c0998b1fa4af
+67aacd9c3309c0998b200a31
+67aac67a3309c0998b1fe936
+67aacfbb3309c0998b2015c2
+67aac6743309c0998b1fe91a
+67aacf9c3309c0998b201452
+67aacf9c3309c0998b201454
+67aac68e3309c0998b1fe983
+67a948073309c0998b1b8028
+67aadcef3309c0998b203f36
+67aaeac83309c0998b206186
+67aaea873309c0998b2060aa
+67aaef583309c0998b206ec5
+67aaf2213309c0998b2077ba
+67aaf8bd3309c0998b209430
+67aaf2853309c0998b20798f
+67ab05c93309c0998b20e441
+67aafd9f3309c0998b20b49c
+67ab15b23309c0998b21498c
+67ab16033309c0998b214b5b
+67ab16dd3309c0998b215169
+67ab235d3309c0998b21aeeb
+67ab1a993309c0998b216d3d
+67ab17233309c0998b21537f
+67ab1e843309c0998b218b0e
+67ab38fd3309c0998b21f6cc
+67abcc7e3309c0998b22bbf8
+67a9e7c43309c0998b1e2b64
+67a9ac7d3309c0998b1cfb92
+67a997ac3309c0998b1ca3c6
+67a9df263309c0998b1e18a6
+67abdbfb3309c0998b22ce41
+67abf7ef3309c0998b231177
+67abfb343309c0998b2322f1
+67ac10ba3309c0998b239386
+67ac06ff3309c0998b235d2b
+67ac0f1e3309c0998b23880f
+67ac11b93309c0998b239899
+67ac0d6f3309c0998b2380c0
+67ac1cff3309c0998b23d146
+67aab5553309c0998b1f8ee8
+67ac14f83309c0998b23aa02
+67a9aa613309c0998b1cf0c5
+67ac2c883309c0998b24096f
+67ac28733309c0998b24000b
+67ac320e3309c0998b24150c
+67ac4b383309c0998b2467a3
+67ac431a3309c0998b244433
+67ac20243309c0998b23deef
+67ac52b43309c0998b2491cf
+67ac56023309c0998b249fc9
+67ac59943309c0998b24b129
+67ac545b3309c0998b249835
+67ac54b73309c0998b2499a4
+67ac53da3309c0998b2495af
+67ac67bf3309c0998b24fca1
+67ac5c5c3309c0998b24be77
+67ac664a3309c0998b24f2a6
+67ac62043309c0998b24dd1b
+67ac6b833309c0998b2512e8
+67ac69dd3309c0998b250988
+67ac74733309c0998b2535dc
+67ac69e73309c0998b250997
+67ac78383309c0998b25484c
+67ab14783309c0998b213fe7
+67a993673309c0998b1c9ac9
+67aab5af3309c0998b1f9131
+67aa8f553309c0998b1efb9d
+67ad4b473309c0998b2687aa
+67ad4d973309c0998b2693dc
+67ad4c423309c0998b268cea
+67ab07173309c0998b20eb1a
+67ad62113309c0998b26f9a3
+67ad5f1c3309c0998b26e872
+67ad57f23309c0998b26c6d0
+67ad631f3309c0998b26fe52
+67ad71eb3309c0998b273d14
+67ad6e373309c0998b272fd1
+67ad6a2e3309c0998b27216d
+67ad9b7b3309c0998b27c617
+67ad93dd3309c0998b27a6ca
+67ad9e783309c0998b27da3b
+67ada7ad3309c0998b280cda
+67ada6553309c0998b2804c7
+67adb1113309c0998b284713
+67adac703309c0998b282b08
+67adae8f3309c0998b283a78
+67adb3583309c0998b285548
+67adc78f3309c0998b28cf12
+67adc5d53309c0998b28c376
+67adc9c23309c0998b28dd5f
+67adcac73309c0998b28e1de
+67add1f03309c0998b28f73a
+67adc8e53309c0998b28d785
+67adebd73309c0998b292fc2
+67adf9463309c0998b2944fc
+67ae1ffe3309c0998b298483
+67ac52823309c0998b249119
+67ac934f3309c0998b257fef
+67aea0ed3309c0998b2a4c34
+67ae9e4a3309c0998b2a3cd8
+67aeadf43309c0998b2a98e5
+67aeb58c3309c0998b2ac986
+67aec4ad3309c0998b2b1c0b
+67aed3cc3309c0998b2b5136
+67aec5da3309c0998b2b237b
+67aec9943309c0998b2b372c
+67aeed2a3309c0998b2baa8d
+67aeea5f3309c0998b2b9a14
+67aeecfa3309c0998b2ba911
+67aeeda33309c0998b2bae0d
+67aee5433309c0998b2b8366
+67aee50b3309c0998b2b8306
+67aefb7f3309c0998b2c0602
+67aefc2c3309c0998b2c0ba4
+67aef5693309c0998b2bdf46
+67af00fc3309c0998b2c2cac
+67aefe0c3309c0998b2c159e
+67af06d83309c0998b2c57dc
+67af10963309c0998b2ca1b0
+67af0dc23309c0998b2c8ea8
+67af22fd3309c0998b2d016a
+67af517f3309c0998b2d55e5
+67afb9293309c0998b2ddb3a
+67af13bd3309c0998b2cb399
+67b18eb03309c0998b301fbc
+67b1d6c13309c0998b306dc7
+67ad58433309c0998b26c865
+67b299b63309c0998b31a609
+67b2a0703309c0998b31cdb0
+67b2a16d3309c0998b31d3cd
+67b2aa913309c0998b321214
+67b2b5993309c0998b3255c8
+67b2b5023309c0998b3252b4
+67b2ad903309c0998b322523
+67b2be1d3309c0998b328997
+67b2bd2d3309c0998b32866a
+67b2d1283309c0998b32c813
+67b2d6063309c0998b32db30
+67b2e0bb3309c0998b331690
+67b2dd803309c0998b330229
+67b2e1c13309c0998b331bd1
+67b2e3903309c0998b332a0f
+67b2e5a53309c0998b333c3c
+67b2ed9e3309c0998b3375e1
+67b2eb933309c0998b336826
+67b2ebb13309c0998b33691a
+67b2ff303309c0998b340329
+67b2fa6f3309c0998b33dca7
+67b2f2f83309c0998b33a23d
+67b2fe883309c0998b33fe2b
+67b2f8fb3309c0998b33d169
+67b2f7533309c0998b33c337
+67b301593309c0998b3412b6
+67b30ea93309c0998b346e83
+67b3012c3309c0998b341176
+67b30c063309c0998b345966
+67b3106f3309c0998b347bcc
+67b3108b3309c0998b347bea
+67b3267c3309c0998b34cbff
+67b327f23309c0998b34d047
+67b338563309c0998b34f55e
+67b339b53309c0998b34f923
+67b33bcc3309c0998b34fc9d
+67b33a1b3309c0998b34f9d7
+67b35e2e3309c0998b3536b0
+67aea9c13309c0998b2a7fa3
+67aec0d43309c0998b2b06a2
+67aefed63309c0998b2c1d54
+67b3dfab3309c0998b363e76
+67b3e24c3309c0998b364eca
+67b3eb553309c0998b368e37
+67b3e6083309c0998b36694a
+67b3ed4d3309c0998b369aa8
+67b3f4623309c0998b36c96a
+67b3f4253309c0998b36c766
+67b4095f3309c0998b3750dd
+67b407653309c0998b374342
+67b400b03309c0998b37178c
+67b400b03309c0998b371794
+67b3ff323309c0998b370f1a
+67b425c43309c0998b37ba14
+67b425ba3309c0998b37b9f8
+67b4225b3309c0998b37add5
+67b42afa3309c0998b37cf1c
+67b435263309c0998b380755
+67b4308e3309c0998b37e9ce
+67b4348f3309c0998b3803c9
+67b42a9f3309c0998b37cd5d
+67b42aac3309c0998b37cdb3
+67b42c6e3309c0998b37d74a
+67b439093309c0998b38257a
+67b446bd3309c0998b38873c
+67b4522b3309c0998b38db11
+67b44d2f3309c0998b38b0f8
+67b445173309c0998b387bcb
+67b44bb03309c0998b38a913
+67b44f433309c0998b38c407
+67b44b733309c0998b38a7e8
+67b456983309c0998b38fb59
+67b457283309c0998b38feb3
+67b45a273309c0998b390fb0
+67b4635e3309c0998b394dd8
+67b460f83309c0998b393b93
+67b4673f3309c0998b395d0b
+67b4a6913309c0998b3a010f
+67b4d7bb3309c0998b3a7182
+67b328d03309c0998b34d2ae
+67b308673309c0998b3443d1
+67b2b5f33309c0998b325770
+67b37f933309c0998b3590df
+67b36c043309c0998b356399
+67b530763309c0998b3aee43
+67b52d493309c0998b3adcdc
+67b52c943309c0998b3ada03
+67b53c7b3309c0998b3b42a4
+67b5343c3309c0998b3b0ec3
+67b535373309c0998b3b136f
+67b53b383309c0998b3b3a62
+67b533913309c0998b3b0af8
+67b541003309c0998b3b611d
+67b5467e3309c0998b3b8f6e
+67b54fc23309c0998b3be639
+67b54fa33309c0998b3be51e
+67b571093309c0998b3c925e
+67b570913309c0998b3c9163
+67b577d03309c0998b3ca6ea
+67b585ca3309c0998b3cec7a
+67b582933309c0998b3cd771
+67b585f23309c0998b3cedc9
+67b586133309c0998b3ceeea
+67b58c0c3309c0998b3d29c9
+67b58ef53309c0998b3d3f76
+67b58f4f3309c0998b3d423e
+67b5881d3309c0998b3d03ff
+67b586dd3309c0998b3cf719
+67b587fe3309c0998b3d0314
+67b5a13b3309c0998b3dcccc
+67b59d353309c0998b3dae81
+67b596c83309c0998b3d7cf1
+67b5a3f23309c0998b3de397
+67b5a4933309c0998b3de818
+67b5ac463309c0998b3e197c
+67b5b0233309c0998b3e3301
+67b5a3de3309c0998b3de2b9
+67b5b1e13309c0998b3e3e0c
+67b5b5b03309c0998b3e54ec
+67b5e4ba3309c0998b3ebf7e
+67a2cf7d3309c0998b0df996
+67a48b3c3309c0998b12ab06
+67a5bc703309c0998b151bed
+67ac568f3309c0998b24a21b
+67ab16f73309c0998b215271
+67a4648e3309c0998b11e91d
+67a2e3b63309c0998b0e3eb3
+67a31f4e3309c0998b0ed396
+67a5b6a23309c0998b14fed6
+67a788713309c0998b199a35
+67a981b43309c0998b1c6dbc
+67aaa6d23309c0998b1f3e00
+67a9dfab3309c0998b1e1a74
+67a9d53c3309c0998b1dfb5f
+67ad8b0e3309c0998b278a11
+67ac355e3309c0998b241c50
+67ac80083309c0998b255b4a
+67a5d5973309c0998b15a516
+67a5d6d03309c0998b15ac3a
+67a5b6843309c0998b14fe35
+67a719533309c0998b1888d0
+67a5fe253309c0998b160d4e
+67a945743309c0998b1b7d80
+67adb6713309c0998b286838
+67ad85493309c0998b277e12
+67ad51523309c0998b26a644
+67ad51523309c0998b26a65a
+67abfb6d3309c0998b232480
+67a404763309c0998b10c2f5
+67a31bde3309c0998b0ec644
+67a313f43309c0998b0eabe0
+67a5cd503309c0998b15794a
+67a5624f3309c0998b13e2cf
+67a9aaee3309c0998b1cf367
+67ac67d33309c0998b24fd17
+67b5fa073309c0998b3ee6cd
+67b440b13309c0998b385ba9
+67b44b693309c0998b38a7a9
+67b3ea633309c0998b3685fe
+67b66d4f3309c0998b3f9100
+67b66e623309c0998b3f9249
+67b685563309c0998b3fecbc
+67b6927c3309c0998b40411c
+67b685603309c0998b3fed29
+67b685b13309c0998b3fef7f
+67b685ed3309c0998b3ff21b
+67b69c753309c0998b408a1b
+67b6af643309c0998b4105e1
+67b6ae913309c0998b40fe94
+67b6b0ec3309c0998b410eac
+67b6d5f53309c0998b41902a
+67b6d5a53309c0998b418e16
+67b6d5a53309c0998b418e15
+67b6e3f13309c0998b41f40d
+67b6e3323309c0998b41ef64
+67b6e5f13309c0998b42001c
+67b6deb83309c0998b41ceea
+67b6ef053309c0998b42423d
+67b6f4e03309c0998b426cc3
+67b6ebea3309c0998b422bd0
+67b6e7da3309c0998b420ed6
+67b6f9963309c0998b428f55
+67b6f5b33309c0998b427320
+67b7001a3309c0998b42b551
+67b6fbc03309c0998b429c13
+67b6fc9c3309c0998b42a26c
+67b6fc053309c0998b429d8c
+67b6f61e3309c0998b4276e2
+67b6fff23309c0998b42b489
+67b70c133309c0998b42fa9c
+67b717453309c0998b431569
+67b720973309c0998b432a50
+67b73cd73309c0998b435f43
+67b55d7c3309c0998b3c4f67
+67b3f2843309c0998b36bba2
+67b603593309c0998b3efc59
+67b54c683309c0998b3bc799
+67b45c2a3309c0998b3919d9
+67b427ed3309c0998b37c1ec
+67b7d6d13309c0998b446f3f
+67b7e1f73309c0998b44b5a9
+67b7de153309c0998b449d03
+67b7e8c13309c0998b44e6ef
+67b7ef643309c0998b45183c
+67b7ebfa3309c0998b44fec1
+67b7fdbf3309c0998b45ab85
+67b807e33309c0998b45ff88
+67b8065a3309c0998b45fb28
+67b7fb643309c0998b458d9e
+67b801c73309c0998b45e10e
+67b8052b3309c0998b45f680
+67b814093309c0998b462662
+67b828353309c0998b467fd9
+67b827413309c0998b467a79
+67b827053309c0998b467920
+67b833643309c0998b46d439
+67b835bd3309c0998b46e888
+67b829273309c0998b4686cf
+67b835293309c0998b46e328
+67b837853309c0998b46f6a4
+67b83f243309c0998b4731b9
+67b840c13309c0998b4740d3
+67b841763309c0998b4747a2
+67b842673309c0998b474fde
+67b84f9f3309c0998b47ae86
+67b853f83309c0998b47ccc5
+67b849963309c0998b478953
+67b847653309c0998b477999
+67b84f663309c0998b47ad87
+67b85ca03309c0998b47fe55
+67b862333309c0998b4811b7
+67b6e8d93309c0998b421615
+67b900943309c0998b490e7f
+67b9490e3309c0998b4992fa
+67b9531d3309c0998b49a7d0
+67b87b353309c0998b484a0e
+67baa0ed3309c0998b4b3569
+67bbc96c3309c0998b4c6ed4
+67bbcf633309c0998b4c9177
+67bbd2303309c0998b4ca098
+67bbd7a13309c0998b4cc236
+67bbd3f13309c0998b4caae5
+67bbd6c43309c0998b4cbd03
+67bbe2fa3309c0998b4d1106
+67bbdf453309c0998b4cf79a
+67bbddb73309c0998b4cee66
+67bbdbc03309c0998b4cde5e
+67bbef6f3309c0998b4d6030
+67bbfa383309c0998b4da48d
+67bbfe223309c0998b4dafcd
+67bbf8a63309c0998b4d9c3d
+67bbf58c3309c0998b4d8896
+67bbfa423309c0998b4da4cc
+67bc0c463309c0998b4dd709
+67bc0f953309c0998b4de38b
+67bc091a3309c0998b4dcbe7
+67bc105a3309c0998b4de660
+67bc136b3309c0998b4df3f0
+67bc12e83309c0998b4df1a9
+67bc1e0e3309c0998b4e3372
+67bc14c03309c0998b4dfa97
+67bc33e23309c0998b4edfaa
+67bc320d3309c0998b4ecfff
+67bc2f4c3309c0998b4eba11
+67bc470a3309c0998b4f84b7
+67bc42eb3309c0998b4f6736
+67bc46363309c0998b4f7dc4
+67bc42403309c0998b4f625e
+67bc3fbd3309c0998b4f4ff3
+67bc3d583309c0998b4f3caf
+67bc40633309c0998b4f5520
+67bc44f53309c0998b4f74b0
+67bc4d493309c0998b4fb70c
+67bc54c73309c0998b4fd8ac
+67bc495b3309c0998b4f98bc
+67bc546c3309c0998b4fd745
+67bc50813309c0998b4fc697
+67bc60503309c0998b4ffd3d
+67bc717c3309c0998b502872
+67bc812b3309c0998b5050d3
+67bd05713309c0998b5115c4
+67bd02d83309c0998b511043
+67b853383309c0998b47c781
+67b84a2e3309c0998b478d42
+67b7dfba3309c0998b44a809
+67b84bf23309c0998b479a26
+67b83e973309c0998b472dbc
+67bd19393309c0998b515669
+67bd150e3309c0998b513fd9
+67bd1e7d3309c0998b5181df
+67bd2f883309c0998b51f99d
+67bd34303309c0998b521dbe
+67bd3d7f3309c0998b5276dc
+67bd3e4c3309c0998b527e62
+67bd4d2a3309c0998b52ef02
+67bd49fd3309c0998b52dec4
+67bd5f763309c0998b532f4c
+67bd618a3309c0998b5337db
+67bd6d013309c0998b53755a
+67bd67fc3309c0998b53583c
+67bd6e2f3309c0998b537ea9
+67bd6a193309c0998b53637a
+67bd65323309c0998b534b2c
+67bd6fd53309c0998b538c6b
+67bd6d703309c0998b5378ba
+67bd71da3309c0998b539eee
+67bd73ba3309c0998b53ae87
+67bd7dde3309c0998b53fc69
+67bd72a13309c0998b53a647
+67bd84de3309c0998b543d54
+67bd7f613309c0998b540bcf
+67bd88013309c0998b54558a
+67bd7eec3309c0998b54073c
+67bd7efb3309c0998b540814
+67bd87c33309c0998b54516f
+67bd97863309c0998b54cfc7
+67bd92d93309c0998b54aef3
+67bda2353309c0998b551767
+67bd9fef3309c0998b550f1f
+67bd9a783309c0998b54e835
+67bd99053309c0998b54dd09
+67bc2f933309c0998b4ebbb1
+67bd9c713309c0998b54fa4f
+67bda93e3309c0998b55318d
+67bdaf753309c0998b5546a2
+67bdb9e53309c0998b5563ae
+67bdc8b93309c0998b558617
+67bdeeef3309c0998b55e8ee
+67bc697e3309c0998b5017c3
+67be5ab93309c0998b5695ea
+67be5bdb3309c0998b5697ee
+67be5fd93309c0998b56a21d
+67be646f3309c0998b56af9f
+67be6a783309c0998b56cc28
+67be66963309c0998b56b784
+67be71523309c0998b570b88
+67be6f703309c0998b56fcb0
+67be7fa83309c0998b5779e9
+67be86c83309c0998b57ad76
+67be7bf73309c0998b575e0e
+67be96023309c0998b581849
+67be947a3309c0998b580c06
+67be95d03309c0998b581776
+67be99be3309c0998b5832b5
+67beb3963309c0998b588da2
+67beb6bd3309c0998b589daf
+67becc5f3309c0998b592c93
+67becabd3309c0998b591dc2
+67bec3ed3309c0998b58f0ec
+67bec9263309c0998b5912f9
+67bed71a3309c0998b5985b6
+67bed7da3309c0998b598daa
+67bed7933309c0998b598aa6
+67bed4e83309c0998b597333
+67bed22f3309c0998b5956f9
+6790b9f93309c0998bf41639
+67bee5c53309c0998b59f9a2
+67bee9bb3309c0998b5a1508
+67bee8ab3309c0998b5a0a43
+67bee9b13309c0998b5a14cc
+67bd81d43309c0998b54221c
+67beed9f3309c0998b5a32a5
+67bef1f43309c0998b5a4d50
+67beeb253309c0998b5a20e7
+67bef7263309c0998b5a610a
+67bf014e3309c0998b5a85d6
+67befc9f3309c0998b5a760f
+67aee43d3309c0998b2b7f39
+67b2f9c33309c0998b33d89e
+67b449553309c0998b38996b
+67b6e0963309c0998b41d93b
+67b6e36e3309c0998b41f0c6
+67b2a98c3309c0998b320af4
+67b29cd23309c0998b31b873
+67b2bc453309c0998b327ffa
+67b45d0b3309c0998b392065
+67b4733b3309c0998b3981ac
+67b3f7c83309c0998b36dffc
+67b407513309c0998b374273
+67b551933309c0998b3bf5aa
+67b555e33309c0998b3c197b
+67b57b633309c0998b3cb3aa
+67b585a13309c0998b3ceb2f
+67b598bf3309c0998b3d8b26
+67b688c23309c0998b400373
+67b6adc83309c0998b40f93a
+67b6d5cd3309c0998b418f02
+67b6d8c03309c0998b41a5ec
+67b6c2173309c0998b4142c2
+67b760a13309c0998b43acdb
+67b7e2513309c0998b44b88f
+67b801a73309c0998b45def1
+67b802703309c0998b45e589
+67aeff123309c0998b2c1f56
+67af2c0a3309c0998b2d19e7
+67b2fc3e3309c0998b33e99c
+67b5433c3309c0998b3b7148
+67b5cfc73309c0998b3e9b44
+67b5974b3309c0998b3d8030
+67b5745d3309c0998b3c9b92
+67b52b483309c0998b3ad426
+67b702563309c0998b42c5ef
+67b44a233309c0998b389ea3
+67b29f383309c0998b31c70f
+67b3e8383309c0998b36765d
+67b6e6d93309c0998b42075f
+67bfd8a63309c0998b5c8203
+67bfd99b3309c0998b5c8a52
+67bfd42e3309c0998b5c62d3
+67bfd0313309c0998b5c4911
+67bfdb933309c0998b5ca205
+67bfe69d3309c0998b5cf612
+67bff3c93309c0998b5d4028
+67bff8503309c0998b5d5026
+67bff95f3309c0998b5d5419
+67c010713309c0998b5dc259
+67c0102b3309c0998b5dc0c5
+67c016073309c0998b5df3d8
+67c016a93309c0998b5df897
+67c0185a3309c0998b5e04c4
+67c0188a3309c0998b5e05f0
+67c017673309c0998b5dfdb6
+67c02dca3309c0998b5eadcb
+67c024673309c0998b5e6367
+67c0232f3309c0998b5e58f8
+67c026013309c0998b5e6f79
+67c022a23309c0998b5e54d0
+67c0342b3309c0998b5ee156
+67c0392e3309c0998b5effd7
+67c02fad3309c0998b5ebf85
+67c039f83309c0998b5f083d
+67c0478a3309c0998b5f5c93
+67be587c3309c0998b5690f7
+67c0520b3309c0998b5f7eca
+67c0658a3309c0998b5fabd5
+67c06e463309c0998b5fbdb8
+67c082eb3309c0998b5fe67c
+67c0895b3309c0998b5ff83b
+67c0e4153309c0998b60923d
+67bd7d313309c0998b53f683
+67bd4de93309c0998b52f20f
+67be8c8a3309c0998b57dde3
+67be4aab3309c0998b567545
+67bdab363309c0998b553814
+67bd8ab83309c0998b547150
+67bedafe3309c0998b59a767
+67c10e403309c0998b60f6ff
+67c104d63309c0998b60ccac
+67c109ee3309c0998b60ddf0
+67c114393309c0998b6128c1
+67c111ac3309c0998b61127a
+67c113d63309c0998b612653
+67c128a83309c0998b61c01b
+67c1384d3309c0998b62374d
+67c1316e3309c0998b6208cf
+67c138b23309c0998b623cb3
+67c1331f3309c0998b621772
+67c138b23309c0998b623cb0
+67c13bcd3309c0998b6253f9
+67c153183309c0998b62aca2
+67c158a13309c0998b62c8a6
+67c15e2c3309c0998b62e6f1
+67c15b943309c0998b62da4e
+67c162f13309c0998b6306e2
+67c15afd3309c0998b62d5a9
+67c167713309c0998b632ee1
+67c1699a3309c0998b633f78
+67c16c303309c0998b6352c6
+67c17e233309c0998b63eb82
+67c173e03309c0998b639106
+67c17af03309c0998b63cf74
+67bfdaa13309c0998b5c98ca
+67c187903309c0998b643c06
+67c187e23309c0998b643e95
+67c18ddc3309c0998b6471d2
+67c1804a3309c0998b64017f
+67c182c53309c0998b641691
+67c18eb03309c0998b647bbf
+67c1915d3309c0998b649399
+67c193343309c0998b64a08b
+67c1a21c3309c0998b64deac
+67c1b1bd3309c0998b650c4d
+67c1c0763309c0998b6529c2
+67c244f13309c0998b65fdf0
+67c25de73309c0998b662685
+67c2622c3309c0998b663434
+67c107493309c0998b60d38a
+67c4f22b3309c0998b693b60
+67c08eb03309c0998b600b7a
+67c02e1b3309c0998b5eb147
+67c183723309c0998b641dbf
+67b2a4493309c0998b31e6f9
+67af03e63309c0998b2c405f
+67b35c223309c0998b353183
+67c6cda63309c0998b71f2d7
+67bc1db33309c0998b4e2f78
+67bc0c1e3309c0998b4dd57a
+67be937f3309c0998b580699
+67befdf93309c0998b5a7b95
+67bee52e3309c0998b59f5a4
+67bfdddf3309c0998b5cbab5
+67b821e03309c0998b465ba1
+67bd7be43309c0998b53eafd
+67bda5ee3309c0998b5524c0
+67be8ea13309c0998b57ebfa
+67bd6d703309c0998b5378d7
+67bd9bb23309c0998b54f4cd
+67be722f3309c0998b571237
+67c009753309c0998b5d9c79
+67c134b13309c0998b622133
+67c1827e3309c0998b64148d
+67c1389d3309c0998b6239fb
+67c167713309c0998b632f08
+67c15e363309c0998b62e724
+67bf083d3309c0998b5a99fe
+67b832873309c0998b46ce24
+67bd95463309c0998b54bea1
+67bc2d603309c0998b4eac6e
+67b9cc503309c0998b4a559c
+67c011303309c0998b5dc799
+67bfe6103309c0998b5cf16b
+67bfbc723309c0998b5bd61c
+67be6e123309c0998b56ec6a
+67c035d33309c0998b5eee5d
+67c1730c3309c0998b638b24
+67c16aaf3309c0998b63486c
+67c19f853309c0998b64d7aa
+67c187e23309c0998b643ebf
+67c15f4f3309c0998b62ef2f
+67c067813309c0998b5fb120
+67c548c53309c0998b6af48c
+67c19ba93309c0998b64c931
+67c40e593309c0998b684579
+67c00c653309c0998b5daa9d
+67b2ff943309c0998b3404ec
+67bed18e3309c0998b59549a
+67b4485b3309c0998b38911d
+6776422f3309c0998ba2727d
+67c05a1e3309c0998b5f9330
+67bfbf283309c0998b5be9a7
+67bfb8033309c0998b5bbf3b
+67c185fe3309c0998b643125
+67c03cae3309c0998b5f1fd6
+67bfd2b83309c0998b5c59ce
+67bfd2253309c0998b5c5572
+6776077c3309c0998ba194ba
+6775fe4c3309c0998ba15fef
+67762af93309c0998ba218fe
+67766ecc3309c0998ba39e6d
+677645ac3309c0998ba282d5
+67764d173309c0998ba2ae04
+677749583309c0998ba59a97
+677754dd3309c0998ba5d87a
+677761693309c0998ba63e3b
+677771cf3309c0998ba7281e
+67776a743309c0998ba6d917
+677768543309c0998ba6bc20
+677774ae3309c0998ba73dcf
+6777719c3309c0998ba7220d
+67776a6f3309c0998ba6d7ec
+67777c303309c0998ba77765
+6777813a3309c0998ba78f33
+677778e33309c0998ba760e6
+677781ff3309c0998ba79288
+67777b7c3309c0998ba7739b
+67778dd13309c0998ba7d95e
+67778dd13309c0998ba7d96b
+677797e13309c0998ba8307f
+67779a4f3309c0998ba84686
+6777a73e3309c0998ba8bb83
+6777a3b33309c0998ba896f1
+6777a4ff3309c0998ba8a0b8
+6777b2e73309c0998ba92c83
+6777c1983309c0998ba99b96
+6777bb463309c0998ba97404
+6777c49e3309c0998ba9ad92
+6777bae33309c0998ba9706e
+677431133309c0998b9ec983
+6779b1fd3309c0998baced78
+677a5ada3309c0998bad8b33
+677b2a113309c0998bae80d2
+677b37db3309c0998baeda18
+677b5aec3309c0998bafaf2c
+677b5bc03309c0998bafb539
+677b75bf3309c0998bb01fc5
+677b97e03309c0998bb10e7a
+677ba6d13309c0998bb197f5
+677ba30a3309c0998bb1794e
+677bb72b3309c0998bb20d45
+677c81fd3309c0998bb3becc
+677c85d73309c0998bb3da90
+677c87753309c0998bb3ea18
+677c88343309c0998bb3f05c
+677ca5f13309c0998bb4bd58
+677caf363309c0998bb4fb21
+677cb2463309c0998bb511ed
+677caf363309c0998bb4fb20
+677caff53309c0998bb500fb
+677cb4013309c0998bb51c12
+677cd3f93309c0998bb5a71c
+677cce8c3309c0998bb588cc
+677cd2f43309c0998bb5a130
+677cdffc3309c0998bb610ff
+677cee823309c0998bb68ab0
+677cfb203309c0998bb7208a
+677cf6c13309c0998bb6fa21
+677d01cb3309c0998bb756e0
+677d38033309c0998bb827c6
+6777aa263309c0998ba8d560
+677dd2fc3309c0998bb92caf
+677dd7be3309c0998bb94d35
+677ded1c3309c0998bb9d0c6
+677dfb673309c0998bba2863
+677dfdcc3309c0998bba395f
+677e07073309c0998bba7b7b
+677e25953309c0998bbaf381
+677e37d93309c0998bbb8f60
+677e38b23309c0998bbb9512
+677e52053309c0998bbc5251
+677e52603309c0998bbc55d9
+677e57183309c0998bbc7261
+677f4f253309c0998bbf2d38
+677f55b73309c0998bbf5fb4
+677f535c3309c0998bbf5047
+677f72df3309c0998bbfc761
+677f8c103309c0998bc09a93
+677f941a3309c0998bc0e77e
+677faabc3309c0998bc19558
+677fa5f13309c0998bc173e2
+677fcc9d3309c0998bc1e5aa
+67804e373309c0998bc2b675
+678060953309c0998bc2cd4c
+67807fbc3309c0998bc34c41
+6780a7283309c0998bc43b5d
+6780c8c63309c0998bc4bad2
+6780c66b3309c0998bc4aadd
+6780c84d3309c0998bc4b769
+6780cb6a3309c0998bc4d6af
+6780f48f3309c0998bc64d8d
+6780f2c93309c0998bc63dd8
+6780fa263309c0998bc67619
+678111aa3309c0998bc6c36c
+6781fa2a3309c0998bc85423
+67808d7c3309c0998bc3a5b7
+67846f183309c0998bcb1fb9
+6784738a3309c0998bcb3ac2
+67847a0b3309c0998bcb601c
+67847a703309c0998bcb629e
+678494f13309c0998bcc05d3
+67848ebc3309c0998bcbe044
+678495cf3309c0998bcc0ca0
+6784afe13309c0998bcc7659
+6784bf633309c0998bccc190
+6784c3303309c0998bcce86e
+6784c2db3309c0998bcce435
+6784c27f3309c0998bccdf62
+6784c4633309c0998bccf1d8
+6784db413309c0998bcda459
+6784d3ab3309c0998bcd67e4
+6784df583309c0998bcdca2a
+6784f6d63309c0998bce69e0
+6784f73b3309c0998bce6bfc
+6785027d3309c0998bce8ae6
+6785ba863309c0998bd013c1
+6785bb273309c0998bd01783
+6785ca2c3309c0998bd07eaa
+6785cdaf3309c0998bd095b3
+6785e20d3309c0998bd12565
+6785e5893309c0998bd13d21
+6785e5243309c0998bd139fb
+6785e5433309c0998bd13aac
+6785e9293309c0998bd1587b
+6785ed773309c0998bd17ea5
+6785e91f3309c0998bd157cf
+67861d393309c0998bd2998f
+6786126a3309c0998bd23c15
+678616a53309c0998bd268af
+678615193309c0998bd255b4
+6786294e3309c0998bd2fdde
+6786263a3309c0998bd2e4f7
+6786388c3309c0998bd3889e
+678638a03309c0998bd38958
+6786378f3309c0998bd3818e
+67863acf3309c0998bd3a3ec
+678647be3309c0998bd40239
+67868f533309c0998bd4c8c1
+6786e4ae3309c0998bd577dc
+67872fa53309c0998bd6d1d2
+678735d73309c0998bd6f3a5
+67873b4f3309c0998bd71fb8
+67873c553309c0998bd724c0
+6787455b3309c0998bd75535
+67875e453309c0998bd7bb21
+6787670d3309c0998bd805b0
+678765b63309c0998bd7fb0d
+678762d63309c0998bd7dff2
+678763b43309c0998bd7e973
+67876b373309c0998bd81f4e
+678762e03309c0998bd7e0db
+678779963309c0998bd8ab8d
+6787724b3309c0998bd85747
+6787839b3309c0998bd90b17
+67854ae83309c0998bcf4a9b
+6787913b3309c0998bd97e33
+67878bc33309c0998bd94c71
+6787af7c3309c0998bd9decb
+67808c743309c0998bc39f62
+678079933309c0998bc327b5
+677f30d83309c0998bbe649f
+677d01f83309c0998bb758d6
+677bb7f43309c0998bb21228
+677b63b83309c0998bafe7a2
+677b27203309c0998bae7561
+6777aa813309c0998ba8d835
+677775263309c0998ba73f81
+677fa9f33309c0998bc1904f
+677f7aff3309c0998bbfffdc
+677e26eb3309c0998bbafdb2
+6784c1143309c0998bccd195
+678864b03309c0998bdb630e
+6788aac23309c0998bdce246
+6788b27d3309c0998bdd0c9d
+6788b7743309c0998bdd35bb
+6788d9253309c0998bde54a4
+6788e1723309c0998bde9771
+6788e0953309c0998bde8fe1
+6788e4a23309c0998bdeb018
+678907413309c0998bdf0a85
+6789316b3309c0998bdf58b0
+6789a6023309c0998be01f12
+6789b00c3309c0998be04952
+6789e9ab3309c0998be1b787
+6789dab03309c0998be16292
+6789e06d3309c0998be186c0
+6789f3c43309c0998be1d726
+6789eaac3309c0998be1bb99
+678a12e83309c0998be29fb6
+678a0b5c3309c0998be268b9
+678a2e413309c0998be37019
+678a30893309c0998be38139
+678a53f13309c0998be40925
+678b578c3309c0998be60749
+678cf7c03309c0998be80cc3
+67860e773309c0998bd21bd3
+6785e8823309c0998bd154d0
+678786543309c0998bd92169
+678dcf043309c0998be99831
+678df0933309c0998be9e220
+678df7973309c0998be9fa30
+678dff8e3309c0998bea1bd3
+678f179c3309c0998bec9fce
+678f20943309c0998bece260
+678f26ac3309c0998bed3587
+678f26ac3309c0998bed34ba
+678f27ee3309c0998bed42d2
+678f2ec73309c0998bedb4a1
+678f2edb3309c0998bedb753
+678f2e723309c0998bedb1f9
+678f41643309c0998bee1045
+678f493b3309c0998bee3c6d
+678f46213309c0998bee2967
+678f562a3309c0998beec5ed
+678f4c603309c0998bee5533
+678f578d3309c0998beed80f
+678f70ae3309c0998befb217
+678f77033309c0998befdeb5
+679068a93309c0998bf26c7d
+6790cd2a3309c0998bf48eb6
+6790cd343309c0998bf48f0d
+6790d0ce3309c0998bf49c25
+6790d2563309c0998bf4a107
+6790dd253309c0998bf4bbd9
+6790f2ea3309c0998bf4e5fe
+6791a2293309c0998bf61911
+6791c3183309c0998bf6d809
+6791c67b3309c0998bf6f4c1
+6791ed183309c0998bf77526
+6791ef893309c0998bf78b29
+679209bb3309c0998bf830d8
+6792110a3309c0998bf868d3
+679210603309c0998bf86219
+679217803309c0998bf89f01
+6789aff23309c0998be04875
+6789ab613309c0998be02fc3
+6788c5f93309c0998bddac39
+6788b1513309c0998bdd0259
+678610d43309c0998bd22de0
+6784ea053309c0998bce1fa6
+6781cac63309c0998bc7f95b
+6780c1133309c0998bc48e88
+678984403309c0998bdfe04d
+67926e403309c0998bf9ea67
+6792f3e03309c0998bfadb65
+679349613309c0998bfc9a80
+679375193309c0998bfdf433
+679428103309c0998bff06c8
+67944df03309c0998bff540b
+679493033309c0998bffac25
+6795a7ef3309c0998b01ee31
+6795a5ba3309c0998b01e100
+6795a6523309c0998b01e4b3
+6795a6a23309c0998b01e6fd
+6795d03a3309c0998b028a79
+6795ec453309c0998b02f774
+6795fbc83309c0998b0346a5
+679604383309c0998b036ef6
+6796e4313309c0998b0500e7
+6796e3e13309c0998b04ffb2
+678a17bd3309c0998be2c44d
+67959f233309c0998b01c3ec
+679359273309c0998bfd210a
+678f4d3e3309c0998bee5d1a
+678e052b3309c0998bea3868
+678a26003309c0998be331b3
+678a2eb03309c0998be37464
+678a80a73309c0998be46779
+67a2c67a3309c0998b0dd619
+67a2d7653309c0998b0e17e4
+67a2cee33309c0998b0df7eb
+67a339bd3309c0998b0f931c
+67a43b953309c0998b11868e
+67a45a203309c0998b11c286
+67a4696a3309c0998b120247
+67a482df3309c0998b128aa4
+67a48e8c3309c0998b12bb08
+67a4b7e93309c0998b1306e2
+67965e0b3309c0998b0436e0
+679590653309c0998b018d6d
+67934d0a3309c0998bfcb3d8
+67934ad73309c0998bfca243
+67936ca93309c0998bfdc74e
+67a2cc823309c0998b0dee64
+67a5c2343309c0998b153da4
+67a5d8603309c0998b15b2f8
+67a5e2553309c0998b15d996
+67a6d6b33309c0998b17a06b
+67a6d99a3309c0998b17aa3f
+67a6dc953309c0998b17b68b
+67a6dc9f3309c0998b17b727
+67a72e643309c0998b18f176
+67a725d83309c0998b18cb92
+67a851e03309c0998b1ab37e
+67a715e43309c0998b18772b
+67a96baa3309c0998b1c03f4
+67a9683d3309c0998b1bf2be
+67a97dd23309c0998b1c5bc3
+67a97d093309c0998b1c56b7
+67a980183309c0998b1c6666
+67a974863309c0998b1c2f95
+67a97fb43309c0998b1c6535
+67a983313309c0998b1c73f5
+67a9d1443309c0998b1ddd41
+67a9d5283309c0998b1dfaf9
+67a9d6fb3309c0998b1e03a6
+67a9fc073309c0998b1e4dfc
+67aaa2f93309c0998b1f291e
+67aaa5183309c0998b1f3558
+67aaad683309c0998b1f6075
+67aab1873309c0998b1f74be
+67aace653309c0998b200e2d
+67aac68e3309c0998b1fe983
+67aaef263309c0998b206e94
+67aaf45d3309c0998b208167
+67ab03c73309c0998b20d706
+67ab235d3309c0998b21aeeb
+67ab19563309c0998b216578
+67abcc7e3309c0998b22bbf8
+67abf4f43309c0998b2304d7
+67ac057f3309c0998b235588
+67ac20d93309c0998b23e2f2
+67ac21983309c0998b23e5e0
+67ac24a93309c0998b23f544
+67ac22963309c0998b23eac4
+67ac352c3309c0998b241bc0
+67ac4b383309c0998b246793
+67ac59583309c0998b24b060
+67ac4d123309c0998b24716a
+67ac54b73309c0998b2499a8
+67ac79b53309c0998b254d5e
+67aabde23309c0998b1fbd70
+67ab15063309c0998b21440e
+67ad30e23309c0998b263f6e
+67ad470b3309c0998b26733d
+67ad47013309c0998b267308
+67ad4c933309c0998b268f8a
+67ad4a1a3309c0998b2681b3
+67ab17923309c0998b215734
+67ad73a13309c0998b274983
+67ad71eb3309c0998b273d18
+67ad669d3309c0998b271075
+67ad9d0d3309c0998b27cd39
+67ad9bad3309c0998b27c70e
+67adc69e3309c0998b28c83c
+67adf4013309c0998b293ce5
+67aeafe03309c0998b2aa4ac
+67aeb7993309c0998b2ad5b3
+67aee2243309c0998b2b77fa
+67aef5913309c0998b2be13c
+67aef9e33309c0998b2bfb02
+67aefb743309c0998b2c0597
+67aefe0c3309c0998b2c159e
+67af00cc3309c0998b2c2b50
+67af06d83309c0998b2c5821
+67af10263309c0998b2c9d41
+67af21113309c0998b2cfbe1
+67afc2d13309c0998b2de33a
+67b0a2d63309c0998b2f0d56
+67b1a5ba3309c0998b303c6e
+67b28cf93309c0998b315e01
+67b294093309c0998b318691
+67b2e13e3309c0998b3318a6
+67b2dce33309c0998b32ff63
+67b2deeb3309c0998b330971
+67b2e5b93309c0998b333d11
+67b2f7033309c0998b33c15e
+67b303fb3309c0998b342652
+67b327f23309c0998b34d047
+67b3f8233309c0998b36e271
+67b409513309c0998b375039
+67b4225b3309c0998b37add5
+67b42f6c3309c0998b37e4d3
+67b4635e3309c0998b394dd8
+67b506ee3309c0998b3a9324
+67b328d03309c0998b34d2ae
+67b2ecc03309c0998b336ec6
+67b582383309c0998b3cd530
+67b594963309c0998b3d6e3c
+67b597553309c0998b3d80b2
+67b59d113309c0998b3dad8a
+67b597c63309c0998b3d843e
+67aad2c13309c0998b20251b
+67aaa6d23309c0998b1f3e00
+67a9d4d83309c0998b1df8b4
+67a9d53c3309c0998b1dfb4f
+67ad9e783309c0998b27da3d
+67ae9fb53309c0998b2a440c
+67ada52d3309c0998b27feb2
+67aeabf83309c0998b2a8cfe
+67b657903309c0998b3f7410
+67b6e7943309c0998b420c51
+67b6eabb3309c0998b42215b
+67b700673309c0998b42b710
+67b704c73309c0998b42d9a4
+67b7edfb3309c0998b450e8a
+67b7fe6e3309c0998b45b921
+67b7fe083309c0998b45b141
+67b7fe633309c0998b45b742
+67b827193309c0998b4679a3
+67b833b43309c0998b46d66f
+67b828e73309c0998b4684ad
+67b83f243309c0998b4731b9
+67b83d373309c0998b47222f
+67b87fdd3309c0998b485344
+67b8ff113309c0998b490c8a
+67b9a3063309c0998b4a08ec
+67b87b2b3309c0998b484a02
+67bbc9b33309c0998b4c70d8
+67bbde9a3309c0998b4cf431
+67bbda933309c0998b4cd509
+67bbf6553309c0998b4d8dbe
+67bbf8a43309c0998b4d9bd1
+67bbf7f13309c0998b4d97d3
+67bc08513309c0998b4dcad0
+67bc1d083309c0998b4e291c
+67bc16de3309c0998b4e03b4
+67bc39693309c0998b4f190d
+67bc46223309c0998b4f7c39
+67bc41f83309c0998b4f60b2
+67bd1d8c3309c0998b517a03
+67bd39693309c0998b524bfc
+67bd3d893309c0998b52771b
+67bd43aa3309c0998b52af46
+67bd4a253309c0998b52e09f
+67bd6c7e3309c0998b5370d6
+67bd6d7a3309c0998b53796f
+67bd6fd53309c0998b538c6b
+67bd704e3309c0998b53906a
+67bd6fe03309c0998b538dcf
+67bd73ba3309c0998b53ae87
+67bd80ce3309c0998b54193c
+67bd97863309c0998b54cfcd
+67bd992d3309c0998b54def4
+67bd9b7f3309c0998b54f1d5
+67bd983b3309c0998b54d4a0
+67bdc38c3309c0998b557b3b
+67bdeeef3309c0998b55e8ee
+67be44c43309c0998b566cb2
+67be6e193309c0998b56ed17
+67be7d613309c0998b5769cf
+67be7bed3309c0998b575db1
+67be85b43309c0998b57a487
+67be92c03309c0998b5802b5
+67be94de3309c0998b580e4c
+67bed4a03309c0998b597102
+67bee8f13309c0998b5a0d74
+67bef5f93309c0998b5a5c08
+67beecea3309c0998b5a2e87
+67beed9f3309c0998b5a339c
+67bf036f3309c0998b5a8d13
+67befb123309c0998b5a6ff8
+67b58ed63309c0998b3d3e9d
+67b6f71a3309c0998b427d67
+67b35dfc3309c0998b353600
+67b461ad3309c0998b393fcb
+67b44c0a3309c0998b38aaca
+67b588463309c0998b3d0949
+67b58cb33309c0998b3d2ea1
+67b6d99d3309c0998b41adbe
+67b6d9893309c0998b41ab34
+67b6d9933309c0998b41acf4
+67b6e35a3309c0998b41f034
+67bfbeaf3309c0998b5be5fa
+67bfbeaf3309c0998b5be5ff
+67bfe94c3309c0998b5d0b60
+67c018583309c0998b5e04be
+67c03fdd3309c0998b5f3abb
+67c077dc3309c0998b5fcdea
+67bfae9e3309c0998b5ba5b8
+67c115053309c0998b613041
+67c12c8d3309c0998b61dfba
+67c138b23309c0998b623cb4
+67c138113309c0998b623656
+67c137df3309c0998b62348e
+67c135793309c0998b622459
+67c13ca03309c0998b625a40
+67c14f7c3309c0998b629f35
+67c161a93309c0998b62fefc
+67c161173309c0998b62fbd8
+67c161493309c0998b62fd55
+67c163e83309c0998b63114a
+67c16caa3309c0998b635691
+67c17ea43309c0998b63f163
+67c18ddc3309c0998b6471d2
+67c18c353309c0998b646203
+67c19e423309c0998b64d33c
+67c1c2b43309c0998b652f0b
+67bc1dbd3309c0998b4e2fe3
+67b82fbd3309c0998b46b7e1
+67b852d13309c0998b47c4cb
+67bea45c3309c0998b585a9d
+67bdbb683309c0998b55681b
+67c04c6a3309c0998b5f6f4f
+67c1fe0b3309c0998b65b6dc
+67c136e83309c0998b622ded
+6780ce843309c0998bc4f5f8
+67810df53309c0998bc6bb89
+677f31e83309c0998bbe6d80
+678224393309c0998bc898b9
+677f927d3309c0998bc0d987
+677f83673309c0998bc04e84
+678491c23309c0998bcbf02e
+678495563309c0998bcc095f
+6784b4b23309c0998bcc8914
+6784c1293309c0998bccd2dd
+6784c09b3309c0998bcccc77
+6784cc573309c0998bcd2c34
+6784cb273309c0998bcd221f
+6784d7e33309c0998bcd8a83
+6784e75f3309c0998bce07a8
+6784e3663309c0998bcdea93
+6784ebc33309c0998bce313c
+67852e333309c0998bcefc90
+67859d803309c0998bcfc956
+67859afb3309c0998bcfc65d
+6785c7bd3309c0998bd06fa5
+6785d8d03309c0998bd0e7a5
+6785eec73309c0998bd18a0a
+6786034a3309c0998bd1df4c
+677f7bc23309c0998bc00b99
+678093433309c0998bc3cce0
+6780af0a3309c0998bc454cc
+6786084a3309c0998bd1f7df
+678619163309c0998bd27977
+67861b423309c0998bd28ac5
+678610fd3309c0998bd22ff9
+6786358c3309c0998bd371ea
+6784dcea3309c0998bcdb0b8
+678662133309c0998bd45b0d
+678706f93309c0998bd5c3e2
+678720d53309c0998bd66c2c
+67873ee63309c0998bd7347c
+6787509b3309c0998bd77d71
+67875c443309c0998bd7af34
+67876c6f3309c0998bd82961
+6787693e3309c0998bd8135b
+678769723309c0998bd814a7
+677e2e623309c0998bbb39c6
+677769b53309c0998ba6d0e9
+677f66833309c0998bbf9638
+677cebb63309c0998bb66ee9
+677795ce3309c0998ba81d0b
+677658953309c0998ba2f9f2
+6787e12e3309c0998bda45dc
+67887e8b3309c0998bdc0bee
+678881043309c0998bdc1f0d
+67887ed23309c0998bdc0e25
+6788870f3309c0998bdc43be
+67887d983309c0998bdc06ea
+6788b16d3309c0998bdd0327
+6788b0b03309c0998bdcffe0
+6788cc213309c0998bdded55
+6788c94c3309c0998bddd028
+6788cc2b3309c0998bddede4
+6788d9943309c0998bde570c
+67864ee23309c0998bd420f6
+67873bb33309c0998bd72214
+67892e793309c0998bdf4b49
+6789d80d3309c0998be14f49
+6789f6023309c0998be1e004
+678a01013309c0998be216ab
+678a02cf3309c0998be220eb
+678a0ddd3309c0998be27a4a
+678a123c3309c0998be29b00
+678a2c673309c0998be3619d
+678a30113309c0998be37e8d
+678abebd3309c0998be4e8b9
+6789e2943309c0998be1988a
+6785d4173309c0998bd0c256
+678db1f83309c0998be91928
+678e001a3309c0998bea1ec0
+678e0d233309c0998bea6514
+6789f5753309c0998be1dd79
+678f0ec03309c0998bec75d2
+678f0bd83309c0998bec6965
+678f20033309c0998becd24c
+678f235a3309c0998bed0af5
+678f20ef3309c0998bece644
+678f23793309c0998bed0e97
+678f2dfe3309c0998bedadd8
+678f3b993309c0998bedf596
+678f2e543309c0998bedb1bc
+678f42c53309c0998bee1743
+678f50523309c0998bee7579
+678f4e623309c0998bee6571
+678d3ff33309c0998be899f6
+678f66d13309c0998bef6734
+678f5e0c3309c0998bef1ed2
+678f5cfd3309c0998bef15e3
+678f70363309c0998befafb6
+678f99913309c0998bf0590d
+678fbb523309c0998bf0c33c
+678fcf913309c0998bf0ee38
+6790545d3309c0998bf1f637
+67905a713309c0998bf2163a
+679077263309c0998bf2c2d4
+679097de3309c0998bf3312e
+679098cc3309c0998bf334e6
+6790a9943309c0998bf3aa32
+6790c0f23309c0998bf440b8
+6790c1f23309c0998bf445e4
+6790be333309c0998bf432a2
+6790c05e3309c0998bf43d4d
+6790c76c3309c0998bf466c9
+6790e0fb3309c0998bf4c311
+6790fb2b3309c0998bf4f3f8
+679179043309c0998bf59fe0
+679194443309c0998bf5cfd9
+679199e43309c0998bf5e8f6
+6791c10c3309c0998bf6c904
+6791d9f53309c0998bf72fa3
+6791e48b3309c0998bf74f7d
+6791ee823309c0998bf77f23
+6791e3cc3309c0998bf74cfb
+6791eb063309c0998bf76928
+6791f6db3309c0998bf7b83b
+6791f6db3309c0998bf7b83c
+6791fad83309c0998bf7d1ff
+6791fc613309c0998bf7db70
+6791ff2e3309c0998bf7ea9a
+679203ae3309c0998bf809f5
+6789f48e3309c0998be1d9a7
+678888323309c0998bdc4ba1
+678753cb3309c0998bd78a05
+6788d3403309c0998bde2bc0
+6787434f3309c0998bd74cb0
+67864c603309c0998bd4178f
+6784c1ea3309c0998bccda01
+6781dc4f3309c0998bc818ae
+6790b0363309c0998bf3d72e
+67909e203309c0998bf359f0
+6792f1d63309c0998bfad119
+6792f75e3309c0998bfaedda
+6793058b3309c0998bfb41f9
+679300833309c0998bfb2158
+679310823309c0998bfb86ac
+679346663309c0998bfc8920
+679343a73309c0998bfc7716
+679348bf3309c0998bfc962e
+679358173309c0998bfd1404
+67935aaf3309c0998bfd2e1d
+679367953309c0998bfd9aca
+6793755c3309c0998bfdf61c
+6793844a3309c0998bfe290c
+67937b863309c0998bfe0c4b
+67939c583309c0998bfe567a
+679469a03309c0998bff8309
+67958b743309c0998b0179ec
+67958b053309c0998b017826
+679590833309c0998b018e2d
+67959f193309c0998b01c353
+67959f2e3309c0998b01c413
+6795a9dc3309c0998b01f7af
+6795a9d23309c0998b01f76c
+6795b5c33309c0998b022eec
+6795df173309c0998b02b932
+6795e0ed3309c0998b02c040
+6795d81c3309c0998b029ed5
+6795d8c73309c0998b02a0bd
+6795e7913309c0998b02e14a
+6795ea833309c0998b02efb0
+6795eeb63309c0998b030617
+6795f3da3309c0998b031f76
+6795feba3309c0998b035606
+679603653309c0998b036af0
+6796e6e43309c0998b050961
+6796f09f3309c0998b053263
+67971a333309c0998b05ae5e
+678b2ce73309c0998be5a589
+678a2c353309c0998be360b0
+6789feb43309c0998be209a1
+6789f82b3309c0998be1e8c7
+67878f2d3309c0998bd96cec
+67861b663309c0998bd28be6
+6792f4433309c0998bfadd9a
+6792026f3309c0998bf80235
+679414943309c0998bfeef5b
+677fd2c83309c0998bc1f483
+6789ddda3309c0998be1767c
+6792f22d3309c0998bfad2c0
+678e2d453309c0998beb02a7
+678b31973309c0998be5b165
+678dfc243309c0998bea0c72
+67887cc33309c0998bdc031b
+6791d8a03309c0998bf72ca9
+6790f8d33309c0998bf4f02d
+6790aa4d3309c0998bf3b1e0
+678e2b0a3309c0998beafe09
+67a2cf7d3309c0998b0df95b
+67a2d0e63309c0998b0dffc4
+67a2d84f3309c0998b0e1b30
+67a424fa3309c0998b113096
+67a42a563309c0998b114596
+67a446c63309c0998b1199ca
+678a357e3309c0998be3a96f
+67a3024e3309c0998b0e768c
+679743fe3309c0998b060991
+679602c53309c0998b0368c3
+67934b6d3309c0998bfca6be
+679723863309c0998b05bff7
+6795b5263309c0998b022af6
+6795c1243309c0998b026075
+679357573309c0998bfd0b37
+67936d8f3309c0998bfdcd72
+67a564553309c0998b13e9b9
+67a55fd73309c0998b13d958
+67a5bb2e3309c0998b151558
+67a5cf123309c0998b1583e0
+67a5f64b3309c0998b16019b
+67a5f9313309c0998b160612
+67a5fdc03309c0998b160ca5
+67a6ab213309c0998b16f418
+67a6ce5a3309c0998b177ec9
+67a6ff513309c0998b1805c9
+67a766883309c0998b195c7d
+67a7d50f3309c0998b19e7dc
+67a844f73309c0998b1aa4e6
+67a84d383309c0998b1aae71
+67a9532c3309c0998b1b9cfb
+67a950c43309c0998b1b91c0
+67a957aa3309c0998b1bad94
+67a99c193309c0998b1cafdb
+67a9a39f3309c0998b1ccbe9
+67a9d1a83309c0998b1ddfcd
+67aa78e53309c0998b1edf48
+67a81b643309c0998b1a755f
+67a7df763309c0998b19f283
+67aaa63e3309c0998b1f3ade
+67aaa0db3309c0998b1f2246
+67aab0e63309c0998b1f7119
+67aaba463309c0998b1faad8
+67a95ea43309c0998b1bc94b
+67aadcef3309c0998b203f36
+67aaf99e3309c0998b209abb
+67ab08ab3309c0998b20f44b
+67ab30ea3309c0998b21e354
+67ab3a333309c0998b21f937
+67ab45383309c0998b220de8
+67abee193309c0998b22ed8d
+67ac11ab3309c0998b239873
+67ac07273309c0998b235ea7
+67ac14f83309c0998b23aa02
+67ac4a473309c0998b24628d
+67ac577f3309c0998b24a64b
+67ac54ac3309c0998b249989
+67ac52c13309c0998b249207
+67ad39263309c0998b264bad
+67ad46a73309c0998b2670d3
+67ad43e83309c0998b2665ff
+67ad4c933309c0998b268f8a
+67ad69e83309c0998b271fb7
+67ad8e763309c0998b2794bc
+67adcfee3309c0998b28f2e9
+67aeb7343309c0998b2ad36e
+67aeb9563309c0998b2adfdd
+67aec31a3309c0998b2b120d
+67aecf103309c0998b2b4571
+67aeed2a3309c0998b2baaa8
+67aefa513309c0998b2bfe10
+67aef70f3309c0998b2be99f
+67aef5af3309c0998b2be229
+67af1c553309c0998b2cea3c
+67af2e343309c0998b2d1f94
+67b0047c3309c0998b2e4517
+67b2e5543309c0998b333ad7
+67b2f2e73309c0998b33a17c
+67b2f8c83309c0998b33cf66
+67b303463309c0998b3421f3
+67b30a043309c0998b344cfa
+67b312a03309c0998b348784
+67b3297b3309c0998b34d462
+67b3204a3309c0998b34b85d
+67b328c53309c0998b34d27c
+67b0bb693309c0998b2f3346
+67b3e69a3309c0998b366d18
+67b3f2203309c0998b36b7e9
+67b3f7433309c0998b36db2b
+67b3fdbe3309c0998b37066c
+67b425f73309c0998b37bae6
+67b435e53309c0998b380d98
+67b44c793309c0998b38ace1
+67b44a923309c0998b38a1ef
+67b449e23309c0998b389d12
+67b2eb373309c0998b336478
+67b556193309c0998b3c1c1f
+67b55fed3309c0998b3c59d7
+67b55f0f3309c0998b3c5700
+67b57d1d3309c0998b3cbc59
+67b5918b3309c0998b3d5378
+67b594593309c0998b3d6c57
+67b59f193309c0998b3dbd06
+67b5a2a63309c0998b3dda3b
+67b59d763309c0998b3db051
+67b59e533309c0998b3db7b0
+67a9bf813309c0998b1d6177
+67a71edb3309c0998b18a79e
+67ab17333309c0998b2153e4
+67a404763309c0998b10c2f5
+67a5ee063309c0998b15f3f7
+67b5fa073309c0998b3ee6cd
+67b47daa3309c0998b399c0a
+67b681a93309c0998b3fd158
+67b682d23309c0998b3fd976
+67b680b33309c0998b3fcb16
+67b692b63309c0998b4042b3
+67b6a72e3309c0998b40d016
+67b6a82a3309c0998b40d51f
+67b6c4db3309c0998b414967
+67b6e6b03309c0998b420581
+67b6deb83309c0998b41ceea
+67b6f04c3309c0998b424ce0
+67b6eb173309c0998b4224e4
+67b6fc2e3309c0998b429e70
+67b7022f3309c0998b42c41c
+67b764fc3309c0998b43ba0a
+67b5ac943309c0998b3e1bf8
+67b5a8103309c0998b3dff1e
+67b5a5c03309c0998b3deff1
+67b5824d3309c0998b3cd5ee
+67b7dfcf3309c0998b44a970
+67b826b43309c0998b46771f
+67b834f63309c0998b46e15d
+67b838ef3309c0998b4702ba
+67b853683309c0998b47c889
+67b858973309c0998b47ebd0
+67b85de93309c0998b48028a
+67b8588c3309c0998b47ebbf
+67b870cf3309c0998b4837b1
+67b866b23309c0998b481fab
+67b663b13309c0998b3f82b4
+67b6e8d93309c0998b421615
+67b92d443309c0998b495ba3
+67b93ece3309c0998b497efc
+67b7d8be3309c0998b447ad8
+67baa0ed3309c0998b4b3569
+67bbd1fd3309c0998b4c9fa1
+67bbd7dd3309c0998b4cc347
+67bbee553309c0998b4d58c5
+67bc0b2e3309c0998b4dd2be
+67bc09c53309c0998b4dcec6
+67bc21003309c0998b4e4cab
+67bc2d493309c0998b4eab9c
+67bc49013309c0998b4f94d1
+67bc4c073309c0998b4fafc9
+67b812963309c0998b46212b
+67bd08b33309c0998b511bde
+67bd13673309c0998b513834
+67bd16c93309c0998b514772
+67bd2b783309c0998b51db99
+67bd3d953309c0998b52781b
+67bd7dc03309c0998b53fb94
+67bd8d273309c0998b5482da
+67bd9a823309c0998b54e88c
+67bda68e3309c0998b55278e
+67be440f3309c0998b566b18
+67bc33fa3309c0998b4ee0e3
+67be723a3309c0998b5712f0
+67be86383309c0998b57a9a3
+67be9aa53309c0998b5839b0
+67bedd973309c0998b59b96c
+67bef5443309c0998b5a59a1
+67befa6a3309c0998b5a6e0f
+67bef6f43309c0998b5a6019
+67b6f4c43309c0998b426bf4
+67b45c233309c0998b3919b9
+67b453d23309c0998b38ea0e
+67af25e13309c0998b2d0995
+67b56f753309c0998b3c8db6
+67b44c463309c0998b38abbe
+67bf9f293309c0998b5b8aee
+67bfab683309c0998b5ba03e
+67bfbdf03309c0998b5be00f
+67bfe29d3309c0998b5cdc7b
+67bfebec3309c0998b5d2035
+67c012033309c0998b5dcf36
+67c00a5c3309c0998b5da176
+67c0355a3309c0998b5eeb68
+67bed2d03309c0998b595c93
+67c0ffaa3309c0998b60be61
+67be5a183309c0998b5694e1
+67bd81293309c0998b541b8c
+67c114393309c0998b6128c1
+67c152dc3309c0998b62ab5e
+67c15fc03309c0998b62f1c1
+67c172533309c0998b6382f1
+67c1b2633309c0998b650d96
+67c1c0583309c0998b652992
+67c253093309c0998b6612ca
+67c26f633309c0998b664eab
+67c08eb03309c0998b600b7a
+67bd2e953309c0998b51f0e2
+67b83e143309c0998b4729e1
+67b832273309c0998b46cbcd
+67bbe5423309c0998b4d2092
+67bfe27e3309c0998b5cdb4c
+67c00da63309c0998b5db09a
+68651a4fd5d8e4081f7c2dc8
+68650dd8d5d8e4081f7be6e0
+686503ebd5d8e4081f7b8140
+686501f7d5d8e4081f7b6def
+686501f2d5d8e4081f7b6de3
+68651070d5d8e4081f7bfd67
+6864fb8ad5d8e4081f7b3948
+6864ff50d5d8e4081f7b57c2
+6864f8abd5d8e4081f7b2387
+6864f7b0d5d8e4081f7b1c32
+6864f97fd5d8e4081f7b2ac9
+686504b7d5d8e4081f7b8af4
+68650484d5d8e4081f7b88f4
+6864f8b6d5d8e4081f7b23df
+6864f553d5d8e4081f7b0d34
+686503bdd5d8e4081f7b7eaf
+6865078ad5d8e4081f7ba7e8
+686506ccd5d8e4081f7ba20b
+686506ccd5d8e4081f7ba231
+68650674d5d8e4081f7b9da6
+6864376fd5d8e4081f78171b
+68649284d5d8e4081f78c792
+686489dbd5d8e4081f789b28
+6864eb83d5d8e4081f7a7a52
+6864eb82d5d8e4081f7a7916
+6864eb95d5d8e4081f7a8681
+6864eb93d5d8e4081f7a859e
+6864eb94d5d8e4081f7a85fa
+6864eb8dd5d8e4081f7a815b
+6864b2f7d5d8e4081f799ad3
+6864b30cd5d8e4081f799b9a
+6864b578d5d8e4081f79b14d
+6864b191d5d8e4081f79904d
+6864b1d9d5d8e4081f7991fa
+6864b203d5d8e4081f79929a
+68653cf0d5d8e4081f7c8906
+68653d60d5d8e4081f7c8a14
+68653dd5d5d8e4081f7c8af8
+6864eb3ed5d8e4081f7a3431
+6864eb3dd5d8e4081f7a32c3
+6864de67d5d8e4081f7a1e5f
+6864cfe7d5d8e4081f7a123a
+6864d413d5d8e4081f7a18d6
+6864ebd5d5d8e4081f7ab348
+6864ebd1d5d8e4081f7ab082
+68644475d5d8e4081f78440d
+6864c6d5d5d8e4081f79f318
+6864bf97d5d8e4081f79e141
+6864bffed5d8e4081f79e2aa
+6864cb77d5d8e4081f7a001e
+6865526bd5d8e4081f7cb00e
+6864c50dd5d8e4081f79ef79
+6864ba11d5d8e4081f79ce33
+6864be46d5d8e4081f79ddf4
+6864b379d5d8e4081f79a11a
+6864aba6d5d8e4081f797086
+6864a6b1d5d8e4081f794fee
+6864a3f5d5d8e4081f793bc4
+68652c75d5d8e4081f7c66b8
+6864a6c5d5d8e4081f7950d5
+68653642d5d8e4081f7c7f7d
+6864eff2d5d8e4081f7ae6e2
+6864efd9d5d8e4081f7ae5db
+6864f074d5d8e4081f7ae9a7
+6864efa3d5d8e4081f7ae313
+6864ebc4d5d8e4081f7aa7c7
+6864ebc2d5d8e4081f7aa66e
+6864ebb3d5d8e4081f7a9bed
+6864eb9ed5d8e4081f7a8d37
+6864eba5d5d8e4081f7a9218
+6864eba4d5d8e4081f7a9104
+68649e29d5d8e4081f790fd0
+68649f45d5d8e4081f791477
+68651e81d5d8e4081f7c3cb1
+68649ee9d5d8e4081f791321
+68649ae2d5d8e4081f78f499
+6864f184d5d8e4081f7af207
+6864f178d5d8e4081f7af1a9
+68649327d5d8e4081f78c982
+686494a4d5d8e4081f78cf8c
+68649095d5d8e4081f78be60
+68648812d5d8e4081f7890db
+686486ebd5d8e4081f788b56
+68640627d5d8e4081f776578
+686413f7d5d8e4081f77c340
+6864079bd5d8e4081f7772ff
+68640891d5d8e4081f777e39
+68640908d5d8e4081f7783d8
+6864109cd5d8e4081f77b4ff
+686506c0d5d8e4081f7ba123
+68650291d5d8e4081f7b7316
+6864f92ad5d8e4081f7b27da
+686507b7d5d8e4081f7baa49
+68650393d5d8e4081f7b7d18
+68650096d5d8e4081f7b6224
+686503b3d5d8e4081f7b7e5d
+68650478d5d8e4081f7b884a
+68650888d5d8e4081f7bb474
+68650f74d5d8e4081f7bf546
+686502c5d5d8e4081f7b74fb
+6864f948d5d8e4081f7b28bc
+68650badd5d8e4081f7bd392
+68650b9cd5d8e4081f7bd374
+6864fde4d5d8e4081f7b4a48
+686505a5d5d8e4081f7b94b0
+68650530d5d8e4081f7b9029
+686509ebd5d8e4081f7bc436
+6864fd79d5d8e4081f7b468a
+68643612d5d8e4081f7812ac
+68647bfed5d8e4081f7871c0
+6864ebaad5d8e4081f7a9590
+6864ebbfd5d8e4081f7aa45b
+6864ebeed5d8e4081f7ac4fe
+6864ebe0d5d8e4081f7abba5
+6864eb85d5d8e4081f7a7b5f
+6864eb8ad5d8e4081f7a7eff
+6864eb7ed5d8e4081f7a7663
+6864eb7dd5d8e4081f7a7583
+6864eb9ed5d8e4081f7a8cf0
+6864eb66d5d8e4081f7a65b1
+6864eb71d5d8e4081f7a6cb1
+6864eb5fd5d8e4081f7a6064
+6864f33dd5d8e4081f7afe7c
+6864f391d5d8e4081f7b0158
+6864b9d2d5d8e4081f79cca4
+6864b716d5d8e4081f79bd09
+6864ae97d5d8e4081f797f82
+68653e2ad5d8e4081f7c8ba8
+6864b1c4d5d8e4081f79913e
+6864f767d5d8e4081f7b1a52
+6864ee53d5d8e4081f7ada5d
+6864ef59d5d8e4081f7ae08d
+6864eb4ed5d8e4081f7a4910
+686532ced5d8e4081f7c7697
+686531b2d5d8e4081f7c73fd
+6864a703d5d8e4081f795241
+6864a617d5d8e4081f794780
+6864a569d5d8e4081f794342
+68652d7cd5d8e4081f7c68d3
+68652d35d5d8e4081f7c683f
+686524ebd5d8e4081f7c51be
+68649e90d5d8e4081f7911e5
+68649882d5d8e4081f78e555
+68649a2fd5d8e4081f78f059
+68649900d5d8e4081f78e8a7
+6864f7efd5d8e4081f7b1e1d
+68645e5ed5d8e4081f7859d2
+686446dbd5d8e4081f7847fb
+68649539d5d8e4081f78d210
+68649327d5d8e4081f78c981
+68645436d5d8e4081f785099
+686454a6d5d8e4081f78514c
+686454c5d5d8e4081f7851ad
+68643c10d5d8e4081f782bab
+68648b3ed5d8e4081f78a570
+68648d16d5d8e4081f78b142
+68640ba8d5d8e4081f779810
+6864073fd5d8e4081f777087
+68640ab8d5d8e4081f7791d5
+68640aa8d5d8e4081f779124
+6864098fd5d8e4081f778787
+686409c3d5d8e4081f778902
+68640a1bd5d8e4081f778c63
+686511c0d5d8e4081f7c0578
+68651103d5d8e4081f7c0198
+68651339d5d8e4081f7c0bc7
+6865157fd5d8e4081f7c17cf
+686515f0d5d8e4081f7c1a35
+68650a1ad5d8e4081f7bc5b0
+6864fa71d5d8e4081f7b31b0
+6864fa34d5d8e4081f7b2fa0
+686502a6d5d8e4081f7b73be
+6865074bd5d8e4081f7ba693
+6865051fd5d8e4081f7b8f18
+686504b9d5d8e4081f7b8b61
+6864ff3ad5d8e4081f7b56b9
+6864ffa3d5d8e4081f7b59d4
+6864fd79d5d8e4081f7b4680
+6864eb6fd5d8e4081f7a6b7d
+6864eb65d5d8e4081f7a64e2
+6864eb56d5d8e4081f7a543f
+68655224d5d8e4081f7caf48
+6864cd84d5d8e4081f7a0884
+68655319d5d8e4081f7cb1e5
+6864d68dd5d8e4081f7a1a28
+686492c1d5d8e4081f78c826
+6864864bd5d8e4081f788907
+686488a5d5d8e4081f7893d6
+68648b87d5d8e4081f78a6e7
+68648bafd5d8e4081f78a795
+68648cc4d5d8e4081f78afc6
+6864945cd5d8e4081f78ceb4
+686494aed5d8e4081f78cfc7
+686495efd5d8e4081f78d560
+6864b9d2d5d8e4081f79cca6
+6864bc9ad5d8e4081f79d7cc
+6864b250d5d8e4081f7996a1
+6864b3d9d5d8e4081f79a444
+6864b5a2d5d8e4081f79b21e
+6864eb4bd5d8e4081f7a4502
+6864eb51d5d8e4081f7a4d2e
+6864eb51d5d8e4081f7a4dea
+6864a718d5d8e4081f7952ea
+6864b19cd5d8e4081f7990ab
+6864b0e8d5d8e4081f798bf1
+68653d52d5d8e4081f7c89f2
+6864b004d5d8e4081f79879f
+6864ac3cd5d8e4081f7973f2
+6864ab17d5d8e4081f796ceb
+686492ccd5d8e4081f78c8ce
+686498d7d5d8e4081f78e7ac
+68649a83d5d8e4081f78f200
+68649b5ad5d8e4081f78f9e9
+68649c30d5d8e4081f79015f
+68649bc0d5d8e4081f78fd9f
+6864a100d5d8e4081f7925df
+6864a2a7d5d8e4081f7932c7
+6864a2a3d5d8e4081f7931c7
+686530fbd5d8e4081f7c7206
+6864eb82d5d8e4081f7a78f4
+6864ebbcd5d8e4081f7aa1ff
+6864ebafd5d8e4081f7a9934
+6864ebced5d8e4081f7aaf05
+6864ee2ad5d8e4081f7ad95f
+6864ec6ad5d8e4081f7ace89
+6864ec0bd5d8e4081f7acb19
+6864f0dcd5d8e4081f7aecda
+686479ddd5d8e4081f786f7d
+6864f3a6d5d8e4081f7b01ff
+6864f1ecd5d8e4081f7af518
+6864826dd5d8e4081f787f20
+68647737d5d8e4081f786c86
+68647ee6d5d8e4081f787791
+686486e1d5d8e4081f788b31
+68645437d5d8e4081f78509c
+6864550dd5d8e4081f785216
+68644623d5d8e4081f784689
+68644229d5d8e4081f784081
+68643421d5d8e4081f780a44
+686438f3d5d8e4081f781d24
+686432e1d5d8e4081f780664
+68641a54d5d8e4081f77d807
+6864201dd5d8e4081f77ec9f
+6864132ad5d8e4081f77c0ce
+68640760d5d8e4081f777167
+686412c4d5d8e4081f77bdff
+6864089cd5d8e4081f777ee3
+68640ae2d5d8e4081f7792dc
+68640c26d5d8e4081f779c10
+68640d47d5d8e4081f77a13e
+68650955d5d8e4081f7bbe49
+68650940d5d8e4081f7bbdab
+68650893d5d8e4081f7bb520
+68650b72d5d8e4081f7bd1f7
+68650c2dd5d8e4081f7bd6c5
+68650be0d5d8e4081f7bd46e
+68650ec0d5d8e4081f7beee5
+68650f15d5d8e4081f7bf205
+6865186dd5d8e4081f7c24f4
+6865143fd5d8e4081f7c11e6
+686502a6d5d8e4081f7b73e4
+6864fd8fd5d8e4081f7b47c5
+686504dad5d8e4081f7b8ca4
+68650c47d5d8e4081f7bd8ee
+6864fd84d5d8e4081f7b4712
+6864b44dd5d8e4081f79a756
+6864b682d5d8e4081f79b94c
+6864a8a8d5d8e4081f795c11
+6864b185d5d8e4081f798f93
+6864aa5cd5d8e4081f796802
+686541c3d5d8e4081f7c9252
+68653d01d5d8e4081f7c8946
+6864aeb6d5d8e4081f798073
+686498ccd5d8e4081f78e715
+6864990bd5d8e4081f78e95c
+686499b8d5d8e4081f78ed97
+68649ce4d5d8e4081f79070b
+6864eb42d5d8e4081f7a394d
+6864eb44d5d8e4081f7a3bff
+6864eb46d5d8e4081f7a3e75
+6864eb45d5d8e4081f7a3d7a
+6864eb55d5d8e4081f7a5367
+6864eb52d5d8e4081f7a4f29
+6864eb5dd5d8e4081f7a5d45
+6864eb7ed5d8e4081f7a7601
+6864eb7dd5d8e4081f7a75cf
+6864a134d5d8e4081f792797
+6864a2a4d5d8e4081f793282
+6864a173d5d8e4081f792964
+686524f5d5d8e4081f7c51ea
+6864a1a8d5d8e4081f792acc
+6864eff2d5d8e4081f7ae6d3
+6864f021d5d8e4081f7ae792
+6864ef9fd5d8e4081f7ae306
+6864ebecd5d8e4081f7ac3bd
+6864eb8bd5d8e4081f7a7f6d
+6864eb8cd5d8e4081f7a80a8
+6864eb9cd5d8e4081f7a8b88
+6864f3a6d5d8e4081f7b01ec
+6864f5e4d5d8e4081f7b106b
+6864f6fed5d8e4081f7b177a
+6864f881d5d8e4081f7b2215
+68648bcfd5d8e4081f78a88a
+68648c01d5d8e4081f78ab14
+68648cb8d5d8e4081f78af78
+68648cedd5d8e4081f78b0ad
+686493ded5d8e4081f78cc84
+6864907ed5d8e4081f78bdb4
+686490b5d5d8e4081f78bf7f
+68643d73d5d8e4081f78352d
+68643864d5d8e4081f781acb
+68640862d5d8e4081f777a82
+68641272d5d8e4081f77bccb
+68640ea9d5d8e4081f77abdd
+68640f4dd5d8e4081f77af30
+68640f93d5d8e4081f77b033
+68640fb1d5d8e4081f77b0c5
+68640a03d5d8e4081f778b78
+6864063ed5d8e4081f77664f
+68641c1ed5d8e4081f77dd62
+68641a9bd5d8e4081f77d8f3
+6864171bd5d8e4081f77cd81
+6864b52ad5d8e4081f79ad7d
+6864b7f4d5d8e4081f79c2d5
+6864b935d5d8e4081f79c96f
+6864ba5ad5d8e4081f79cfa4
+686550d8d5d8e4081f7cad93
+6864c83bd5d8e4081f79f6d1
+6864c23bd5d8e4081f79e8dd
+6864c5b4d5d8e4081f79f08c
+6864cdeed5d8e4081f7a0aaa
+6864cd46d5d8e4081f7a0760
+686441f6d5d8e4081f783fdb
+68644248d5d8e4081f7840ee
+686493f2d5d8e4081f78ccc3
+68649463d5d8e4081f78cef7
+68649520d5d8e4081f78d185
+6865087cd5d8e4081f7bb3a2
+68650937d5d8e4081f7bbd4a
+686505dbd5d8e4081f7b966c
+686509f6d5d8e4081f7bc4cd
+68651358d5d8e4081f7c0c68
+68650a96d5d8e4081f7bc943
+686510b8d5d8e4081f7bfed6
+68651030d5d8e4081f7bfafd
+686506b4d5d8e4081f7ba039
+686502e5d5d8e4081f7b7635
+686502d0d5d8e4081f7b756d
+686513a9d5d8e4081f7c0e32
+68650b9cd5d8e4081f7bd375
+6864ebbfd5d8e4081f7aa45d
+6864eb79d5d8e4081f7a72a2
+6864eb74d5d8e4081f7a6efe
+6864eb5fd5d8e4081f7a60a5
+6864eb5cd5d8e4081f7a5c64
+6864eb55d5d8e4081f7a522d
+6864eb53d5d8e4081f7a508c
+686497e6d5d8e4081f78e205
+686497e6d5d8e4081f78e213
+6864eb8bd5d8e4081f7a7f8b
+6864ebadd5d8e4081f7a977d
+6864eba9d5d8e4081f7a94bf
+6864b5c3d5d8e4081f79b33f
+6864c21bd5d8e4081f79e81b
+6864be28d5d8e4081f79dd74
+6864b961d5d8e4081f79cadf
+6864d253d5d8e4081f7a1803
+6864d0fcd5d8e4081f7a168a
+686554ffd5d8e4081f7cb572
+6864f4e9d5d8e4081f7b0a5b
+6864f514d5d8e4081f7b0bb0
+6864f5a6d5d8e4081f7b0ebd
+6864f418d5d8e4081f7b0499
+6864ed45d5d8e4081f7ad455
+6864ebe0d5d8e4081f7abb1c
+6864c864d5d8e4081f79f79a
+68655342d5d8e4081f7cb226
+68648505d5d8e4081f788595
+68648d7fd5d8e4081f78b34b
+68648adad5d8e4081f78a11c
+6864f93ed5d8e4081f7b2831
+686530fbd5d8e4081f7c7208
+6864a661d5d8e4081f794ba1
+686531b2d5d8e4081f7c740d
+6864a4e5d5d8e4081f79414f
+68653039d5d8e4081f7c6f6e
+68652f96d5d8e4081f7c6d1e
+6864adb7d5d8e4081f797abb
+6864a961d5d8e4081f796159
+6864b1cfd5d8e4081f7991a0
+6864b081d5d8e4081f798a22
+68649b4dd5d8e4081f78f868
+68649b17d5d8e4081f78f655
+68651f39d5d8e4081f7c3f3b
+6864a01cd5d8e4081f791aa1
+6864959ed5d8e4081f78d387
+68649379d5d8e4081f78caed
+6864fb00d5d8e4081f7b3583
+6864fba4d5d8e4081f7b3a09
+6864fd2ed5d8e4081f7b4405
+6864ff45d5d8e4081f7b5741
+6864606bd5d8e4081f785c86
+6864537fd5d8e4081f784ece
+68645a9ed5d8e4081f7857cb
+686417dfd5d8e4081f77d1d9
+68641fffd5d8e4081f77ec6a
+686408b1d5d8e4081f777fe9
+68640b17d5d8e4081f779552
+6864068bd5d8e4081f7769dc
+68640820d5d8e4081f7777a8
+68642555d5d8e4081f77fae7
+68643d1ad5d8e4081f783014
+686442e1d5d8e4081f784213
+686518c2d5d8e4081f7c2706
+68648000d5d8e4081f7879f2
+686508ecd5d8e4081f7bba25
+686505c4d5d8e4081f7b95e9
+686507b7d5d8e4081f7baaa5
+6864ff3ad5d8e4081f7b56a3
+68650aa9d5d8e4081f7bcaac
+686516a8d5d8e4081f7c1cf6
+686504fbd5d8e4081f7b8e5c
+6864fe19d5d8e4081f7b4c53
+6865126dd5d8e4081f7c087b
+6865143fd5d8e4081f7c11ef
+686519d5d5d8e4081f7c2c1a
+686505cfd5d8e4081f7b9613
+6864e4dcd5d8e4081f7a21cf
+6864eb44d5d8e4081f7a3bf5
+68652388d5d8e4081f7c4d9e
+6864a074d5d8e4081f791fbd
+6864984fd5d8e4081f78e4c3
+68646bf9d5d8e4081f786220
+6864eb81d5d8e4081f7a78af
+6864eb70d5d8e4081f7a6ca0
+6864eb6cd5d8e4081f7a69b4
+6864eb65d5d8e4081f7a6483
+6864eb57d5d8e4081f7a5593
+6864eb53d5d8e4081f7a4fba
+6864eb4fd5d8e4081f7a4a8d
+6864eb4ad5d8e4081f7a44aa
+68649e0ad5d8e4081f790f1d
+6864ba07d5d8e4081f79cde2
+686552a8d5d8e4081f7cb09f
+6864c8f2d5d8e4081f79f8e3
+6864ebead5d8e4081f7ac20d
+6864ebd4d5d8e4081f7ab32a
+6864ebbcd5d8e4081f7aa259
+6864eb97d5d8e4081f7a8859
+6864eb9fd5d8e4081f7a8da0
+68647590d5d8e4081f786b8f
+6864a64ad5d8e4081f7949a1
+68653370d5d8e4081f7c785f
+6864a449d5d8e4081f793df4
+6864f4dfd5d8e4081f7b0a0f
+6864f4aad5d8e4081f7b0872
+6864f896d5d8e4081f7b22bd
+6864efd9d5d8e4081f7ae5ba
+6864ec5fd5d8e4081f7ace27
+6864ed11d5d8e4081f7ad378
+6864803dd5d8e4081f787a4e
+686448b8d5d8e4081f7849da
+68644198d5d8e4081f783ee9
+68643ecbd5d8e4081f783861
+686491d5d5d8e4081f78c4b6
+68648cc4d5d8e4081f78aff2
+68648e7ed5d8e4081f78b692
+686489fed5d8e4081f789b7d
+68648abbd5d8e4081f78a03d
+686488afd5d8e4081f7893fe
+68648739d5d8e4081f788cc9
+68645648d5d8e4081f7854ac
+68640a41d5d8e4081f778dab
+686408bbd5d8e4081f778062
+68640da4d5d8e4081f77a3c0
+68642504d5d8e4081f77fa9c
+68643c62d5d8e4081f782d78
+6864325dd5d8e4081f780591
+68643ad0d5d8e4081f78241d
+68643ad3d5d8e4081f782425
+6864b15fd5d8e4081f798dbc
+6864b179d5d8e4081f798ec8
+6864b06ad5d8e4081f7989dc
+6864af33d5d8e4081f7982be
+6864aca3d5d8e4081f797563
+6864b1dad5d8e4081f799223
+6864b318d5d8e4081f799cba
+6864b579d5d8e4081f79b178
+6864b56dd5d8e4081f79b0dc
+6864b503d5d8e4081f79ace4
+686504c5d5d8e4081f7b8bcc
+6865135ad5d8e4081f7c0c84
+6864fda4d5d8e4081f7b486b
+686509ebd5d8e4081f7bc409
+6865087cd5d8e4081f7bb3f9
+6865087cd5d8e4081f7bb3c2
+6865053ed5d8e4081f7b913e
+686506c6d5d8e4081f7ba1cb
+68654dc5d5d8e4081f7ca845
+6864cd73d5d8e4081f7a0822
+68655449d5d8e4081f7cb477
+6864dee2d5d8e4081f7a1ea5
+6864da4cd5d8e4081f7a1c18
+6864eb33d5d8e4081f7a253d
+6864eb4bd5d8e4081f7a4518
+6864eb5ad5d8e4081f7a590c
+6864eb45d5d8e4081f7a3e44
+6864eb4dd5d8e4081f7a4785
+6864eb4dd5d8e4081f7a486f
+6864eb51d5d8e4081f7a4d25
+6864eb76d5d8e4081f7a7060
+6864eb6fd5d8e4081f7a6b89
+6864eb8ad5d8e4081f7a7ee7
+6864eb5fd5d8e4081f7a5fd8
+6864aa3cd5d8e4081f7966c9
+6864b35ad5d8e4081f79a07f
+6864b399d5d8e4081f79a209
+6864b0e8d5d8e4081f798bef
+68653f60d5d8e4081f7c8d93
+686541aed5d8e4081f7c920d
+6864aff9d5d8e4081f798718
+6864b7f4d5d8e4081f79c312
+6864c4b1d5d8e4081f79ee82
+6864eba1d5d8e4081f7a8ecb
+6864ebf4d5d8e4081f7ac9ac
+6864efaed5d8e4081f7ae3dd
+6864ee5ed5d8e4081f7ada8c
+6864eb8fd5d8e4081f7a8281
+6864ebddd5d8e4081f7ab956
+6864f367d5d8e4081f7affcd
+6864f42dd5d8e4081f7b0540
+6864f5a6d5d8e4081f7b0ec0
+6864f7efd5d8e4081f7b1e64
+6864f8b6d5d8e4081f7b23ee
+68648b5cd5d8e4081f78a5f7
+68648980d5d8e4081f7898b8
+68648c12d5d8e4081f78ab87
+6864fa8fd5d8e4081f7b3234
+6864617dd5d8e4081f785e3a
+68643ee0d5d8e4081f783939
+6864fbd2d5d8e4081f7b3abe
+6864fb2cd5d8e4081f7b36a3
+686495dad5d8e4081f78d4d3
+686490cad5d8e4081f78c02d
+6864928ed5d8e4081f78c7d7
+686492c1d5d8e4081f78c880
+686490f3d5d8e4081f78c0d3
+686469d9d5d8e4081f78614b
+68642283d5d8e4081f77f557
+6864143ed5d8e4081f77c3d7
+686413a6d5d8e4081f77c203
+68640651d5d8e4081f7766d6
+6864074bd5d8e4081f7770f0
+686414b8d5d8e4081f77c4b4
+68640886d5d8e4081f777d7a
+68640891d5d8e4081f777e20
+68640886d5d8e4081f777d9d
+6864086ed5d8e4081f777b9a
+686409c3d5d8e4081f778918
+686409c3d5d8e4081f77894e
+68640afbd5d8e4081f77938f
+68641fe0d5d8e4081f77ebde
+686414f3d5d8e4081f77c505
+68641a49d5d8e4081f77d793
+686417b5d5d8e4081f77d0f9
+68643050d5d8e4081f7804a0
+68642541d5d8e4081f77fabc
+68642835d5d8e4081f77fde4
+68643ebbd5d8e4081f78376f
+68651024d5d8e4081f7bf9c4
+686508b3d5d8e4081f7bb6d0
+68650922d5d8e4081f7bbc7d
+6864a027d5d8e4081f791b1e
+6864a11fd5d8e4081f792678
+686521f1d5d8e4081f7c48d7
+6865235fd5d8e4081f7c4d70
+686499efd5d8e4081f78ee6a
+68651ffad5d8e4081f7c415e
+686497bbd5d8e4081f78e0a8
+68652a67d5d8e4081f7c60dc
+686530fbd5d8e4081f7c71ee
+68653058d5d8e4081f7c6ff6
+6864a679d5d8e4081f794d56
+6864a845d5d8e4081f795923
+6864a684d5d8e4081f794dea
+6864803dd5d8e4081f787a54
+686480fed5d8e4081f787bb1
+68644445d5d8e4081f7843e9
+686503b3d5d8e4081f7b7e84
+6865083ad5d8e4081f7bb098
+68650018d5d8e4081f7b5e56
+686500e9d5d8e4081f7b64a3
+6864fc70d5d8e4081f7b3f15
+6864ff04d5d8e4081f7b54b8
+68650916d5d8e4081f7bbbbe
+686508ebd5d8e4081f7bb9c3
+68651d4dd5d8e4081f7c37f0
+68651af3d5d8e4081f7c2fd6
+68650d03d5d8e4081f7bdee4
+6864ffa3d5d8e4081f7b5a14
+68647dadd5d8e4081f78747c
+6864f7a5d5d8e4081f7b1bfd
+6864ef04d5d8e4081f7ade4a
+6864ec2ad5d8e4081f7acbdf
+6864f5eed5d8e4081f7b10b1
+6864f51fd5d8e4081f7b0c03
+6864eb65d5d8e4081f7a64d9
+6864eb8ad5d8e4081f7a7ece
+6864eb87d5d8e4081f7a7cba
+6864ce0bd5d8e4081f7a0b16
+6864dd3ed5d8e4081f7a1dc3
+6864ca05d5d8e4081f79fb45
+68654ad7d5d8e4081f7ca361
+6864bd7ad5d8e4081f79db3e
+6864bc3cd5d8e4081f79d666
+6864eb42d5d8e4081f7a38ff
+6864eb48d5d8e4081f7a41d5
+6864b592d5d8e4081f79b1f6
+6864b5c5d5d8e4081f79b389
+6864b6ecd5d8e4081f79bac5
+6864b83cd5d8e4081f79c484
+6864b179d5d8e4081f798e5c
+6864ae64d5d8e4081f797ed4
+6864b22dd5d8e4081f79944c
+6864b3e4d5d8e4081f79a470
+6864f9b9d5d8e4081f7b2c16
+68652b30d5d8e4081f7c6378
+6864a703d5d8e4081f795239
+68653370d5d8e4081f7c7861
+68649b1dd5d8e4081f78f685
+6864994ad5d8e4081f78eb65
+686522c6d5d8e4081f7c4be2
+686520f2d5d8e4081f7c4580
+68649fead5d8e4081f7918e7
+68649cefd5d8e4081f790754
+68649e28d5d8e4081f790f59
+68649cb6d5d8e4081f79058b
+6864863fd5d8e4081f7888be
+686487fed5d8e4081f78903f
+6864880ad5d8e4081f7890b9
+68648b33d5d8e4081f78a539
+68644478d5d8e4081f78441c
+6864fab9d5d8e4081f7b336a
+6864898dd5d8e4081f789987
+68648bd0d5d8e4081f78a8d6
+6864fb71d5d8e4081f7b38a5
+68640afbd5d8e4081f77937c
+68640d1ed5d8e4081f77a05c
+68640d48d5d8e4081f77a151
+68640da4d5d8e4081f77a3c5
+6864117cd5d8e4081f77b8e3
+686406e2d5d8e4081f776df2
+68640702d5d8e4081f776f2d
+68640633d5d8e4081f7765e7
+686408ddd5d8e4081f77825e
+686408f9d5d8e4081f7783b2
+6864091cd5d8e4081f778445
+68640891d5d8e4081f777e1b
+68643d53d5d8e4081f783368
+686417abd5d8e4081f77d0de
+686417a1d5d8e4081f77d0c1
+68643015d5d8e4081f780469
+686423fcd5d8e4081f77f951
+6864559cd5d8e4081f78534a
+68650c5ad5d8e4081f7bd9a8
+6865060ed5d8e4081f7b9a72
+68651019d5d8e4081f7bf97d
+68650ea0d5d8e4081f7bed33
+68650ea0d5d8e4081f7bed4c
+68650dccd5d8e4081f7be5ca
+68650f69d5d8e4081f7bf4ff
+6864fd2ed5d8e4081f7b43f4
+68650128d5d8e4081f7b66c3
+6864feced5d8e4081f7b52b8
+68651a6ed5d8e4081f7c2dfa
+6864ffaed5d8e4081f7b5a8f
+686509cbd5d8e4081f7bc291
+68650d03d5d8e4081f7bdf27
+68642070d5d8e4081f77edbb
+68641a0cd5d8e4081f77d6b7
+686410b0d5d8e4081f77b570
+686410bdd5d8e4081f77b592
+6864113fd5d8e4081f77b791
+6864113fd5d8e4081f77b794
+6864115ed5d8e4081f77b87f
+68640e4ad5d8e4081f77a89f
+68640f37d5d8e4081f77ae91
+6864072ad5d8e4081f776fe0
+6864066ad5d8e4081f776830
+686407c4d5d8e4081f777456
+686407c0d5d8e4081f777440
+686408c5d5d8e4081f7780cd
+686408ddd5d8e4081f77824e
+68643a6dd5d8e4081f782204
+68643aa6d5d8e4081f782304
+68643f0cd5d8e4081f7839de
+6864d0aad5d8e4081f7a14fe
+6864dcc3d5d8e4081f7a1d7d
+6864cc1dd5d8e4081f7a0335
+68655453d5d8e4081f7cb489
+6864cd8fd5d8e4081f7a08a0
+6864eb37d5d8e4081f7a2b53
+6864eb37d5d8e4081f7a2b30
+6864eb3dd5d8e4081f7a328f
+6864b99ed5d8e4081f79cbc9
+6864bd66d5d8e4081f79dafe
+6864b7f4d5d8e4081f79c2e7
+6864b961d5d8e4081f79cae3
+6865508fd5d8e4081f7cad51
+6864c684d5d8e4081f79f263
+6864c0b7d5d8e4081f79e529
+68649c3ad5d8e4081f790189
+68649b9cd5d8e4081f78fcb2
+68649b5ad5d8e4081f78f9df
+68651f38d5d8e4081f7c3f20
+68652042d5d8e4081f7c426f
+68649ff1d5d8e4081f791908
+6864a027d5d8e4081f791b0f
+686521dcd5d8e4081f7c4871
+6864a0ebd5d8e4081f792573
+686528f8d5d8e4081f7c5dd9
+686527dcd5d8e4081f7c5b85
+6864eb90d5d8e4081f7a8330
+6864ed06d5d8e4081f7ad2d5
+6864ebafd5d8e4081f7a992f
+6864ebacd5d8e4081f7a96f5
+6864f106d5d8e4081f7aedbe
+6864ef98d5d8e4081f7ae2cd
+6864f3b9d5d8e4081f7b024b
+6864f5d9d5d8e4081f7b0fc3
+6864f59bd5d8e4081f7b0e85
+6864f4d8d5d8e4081f7b09e3
+6864eddbd5d8e4081f7ad817
+6864eed0d5d8e4081f7add24
+68645e5ed5d8e4081f7859d1
+68645e69d5d8e4081f785a58
+68646076d5d8e4081f785d0f
+6864f88bd5d8e4081f7b2265
+6864ebd9d5d8e4081f7ab62e
+6864ebc2d5d8e4081f7aa60b
+6864964ed5d8e4081f78d81b
+68649659d5d8e4081f78d861
+68649414d5d8e4081f78cd58
+68649510d5d8e4081f78d13e
+68646f49d5d8e4081f7864af
+6864afbdd5d8e4081f7985db
+6864b136d5d8e4081f798cea
+68654790d5d8e4081f7c9d57
+6864ad28d5d8e4081f797816
+6864accdd5d8e4081f79762d
+6864b620d5d8e4081f79b52b
+6864b4aed5d8e4081f79aabb
+6864b345d5d8e4081f799f6c
+68653878d5d8e4081f7c8296
+6865367fd5d8e4081f7c7fc2
+6865339ad5d8e4081f7c791a
+686530fbd5d8e4081f7c7220
+68653105d5d8e4081f7c7276
+6864a41fd5d8e4081f793cff
+686446a8d5d8e4081f784785
+686441ecd5d8e4081f783fb6
+686485dad5d8e4081f788778
+686486e6d5d8e4081f788b45
+686488e4d5d8e4081f789555
+6864906bd5d8e4081f78bd91
+68648fdbd5d8e4081f78bb1a
+68648385d5d8e4081f78820b
+68647b99d5d8e4081f78711e
+686484ddd5d8e4081f78856d
+686507b7d5d8e4081f7baab5
+68650d1bd5d8e4081f7be15c
+6865083bd5d8e4081f7bb0c4
+68650b71d5d8e4081f7bd1a2
+6864fdf9d5d8e4081f7b4ac4
+6864fe0ed5d8e4081f7b4b9a
+6864fe19d5d8e4081f7b4c67
+6864fe59d5d8e4081f7b4e5c
+68650796d5d8e4081f7ba918
+68650736d5d8e4081f7ba5fe
+686508b4d5d8e4081f7bb73e
+686508f7d5d8e4081f7bba91
+68650286d5d8e4081f7b72ba
+686500e9d5d8e4081f7b6459
+68651410d5d8e4081f7c1065
+68651517d5d8e4081f7c1607
+68651588d5d8e4081f7c17eb
+68650f0ad5d8e4081f7bf1c7
+68650fb9d5d8e4081f7bf6df
+6865191cd5d8e4081f7c28d1
+68651b45d5d8e4081f7c3125
+68650e7bd5d8e4081f7bebd7
+68651045d5d8e4081f7bfb7e
+6864eb39d5d8e4081f7a2d59
+6864bacbd5d8e4081f79d109
+6864bc2ad5d8e4081f79d626
+6864c183d5d8e4081f79e70d
+6864eb35d5d8e4081f7a2790
+6864db7bd5d8e4081f7a1cca
+6864c8f2d5d8e4081f79f8ae
+6864c910d5d8e4081f79f970
+6864eb73d5d8e4081f7a6e5a
+686485d0d5d8e4081f788751
+6864eb66d5d8e4081f7a6545
+6864eb5ed5d8e4081f7a5f26
+6864eb53d5d8e4081f7a505c
+6864f332d5d8e4081f7afe59
+6864f2fed5d8e4081f7afcde
+6864ebefd5d8e4081f7ac60b
+6864ebe4d5d8e4081f7abe1b
+6864a79dd5d8e4081f795601
+68653526d5d8e4081f7c7d30
+68653414d5d8e4081f7c7abc
+6864a5cfd5d8e4081f7944ef
+6865306cd5d8e4081f7c703e
+6864a63fd5d8e4081f79491c
+68653dd6d5d8e4081f7c8b1a
+6864aaa6d5d8e4081f796a50
+6864aa91d5d8e4081f796a02
+6864b4a3d5d8e4081f79aa53
+6864b5a1d5d8e4081f79b20e
+6864b6f6d5d8e4081f79bb0d
+6864b636d5d8e4081f79b658
+6864b620d5d8e4081f79b529
+6864ac8ed5d8e4081f7974a7
+68653f60d5d8e4081f7c8da3
+6864af8ad5d8e4081f798461
+6864ad66d5d8e4081f7978fc
+6864b293d5d8e4081f7998b5
+6864b239d5d8e4081f799590
+6864b356d5d8e4081f799ffb
+6864f95fd5d8e4081f7b29b5
+6864968dd5d8e4081f78da31
+68646cb8d5d8e4081f7862bc
+68645535d5d8e4081f785288
+68647c78d5d8e4081f787267
+686480fed5d8e4081f787bd3
+68648ba5d5d8e4081f78a788
+686408ddd5d8e4081f778230
+68640862d5d8e4081f777ac4
+68640892d5d8e4081f777e5f
+6864089cd5d8e4081f777e93
+68640dafd5d8e4081f77a42d
+68640db9d5d8e4081f77a453
+6864343ed5d8e4081f780ace
+68643c1ad5d8e4081f782bbb
+686438e9d5d8e4081f781d07
+686492ead5d8e4081f78c922
+68645b68d5d8e4081f785824
+68652c1bd5d8e4081f7c65ea
+686523a6d5d8e4081f7c4e1f
+68652056d5d8e4081f7c42c2
+68649cbad5d8e4081f7905a4
+68649dead5d8e4081f790e06
+68649b65d5d8e4081f78faa7
+6864fdd9d5d8e4081f7b4a28
+6864fd99d5d8e4081f7b4824
+686507c2d5d8e4081f7bab1f
+686509abd5d8e4081f7bc178
+6864fbfdd5d8e4081f7b3c12
+68650fdbd5d8e4081f7bf7e1
+68651705d5d8e4081f7c1e97
+6865150dd5d8e4081f7c1581
+68650d0fd5d8e4081f7be023
+6865031cd5d8e4081f7b787e
+6864ff10d5d8e4081f7b5593
+68650c2ed5d8e4081f7bd6d5
+6864fa1cd5d8e4081f7b2f1e
+68650dcdd5d8e4081f7be5f9
+6865129fd5d8e4081f7c093b
+6864fde4d5d8e4081f7b4a3a
+6865085bd5d8e4081f7bb265
+68650f33d5d8e4081f7bf2a6
+6864fcd8d5d8e4081f7b41dd
+686496dbd5d8e4081f78dc09
+6864eb38d5d8e4081f7a2be5
+6864eb3fd5d8e4081f7a35b1
+6864eb3fd5d8e4081f7a356b
+6864eb59d5d8e4081f7a586f
+68640b94d5d8e4081f7797ed
+68640d7bd5d8e4081f77a2b5
+68640cd6d5d8e4081f779f15
+686413a6d5d8e4081f77c1db
+68640a46d5d8e4081f778e1e
+686407b9d5d8e4081f7773f3
+68640734d5d8e4081f777020
+68640702d5d8e4081f776f20
+68641f0ad5d8e4081f77e867
+68642065d5d8e4081f77edb9
+68641f90d5d8e4081f77eaea
+68642601d5d8e4081f77fc3e
+68643d52d5d8e4081f783341
+68643d1ad5d8e4081f782fb4
+68643dfad5d8e4081f783689
+68647e36d5d8e4081f787561
+6864eba7d5d8e4081f7a9306
+6864eba1d5d8e4081f7a8ecc
+6864eb95d5d8e4081f7a868e
+6864eb9cd5d8e4081f7a8b5b
+6864eb9bd5d8e4081f7a8ab3
+6864eb94d5d8e4081f7a8608
+6864eb94d5d8e4081f7a85d8
+6864eb90d5d8e4081f7a82e1
+6864eb86d5d8e4081f7a7c62
+6864ec95d5d8e4081f7ad022
+6864ebe9d5d8e4081f7ac15d
+6864ebd3d5d8e4081f7ab20d
+6864cdd9d5d8e4081f7a09fd
+6864d0d2d5d8e4081f7a15e4
+68649f73d5d8e4081f791573
+68649a1ad5d8e4081f78efff
+68652b63d5d8e4081f7c63e8
+6864b339d5d8e4081f799e4a
+6864b23ad5d8e4081f7995ab
+6864b250d5d8e4081f79969a
+6864afefd5d8e4081f7986e3
+6864b976d5d8e4081f79cb42
+6864b7f4d5d8e4081f79c31c
+6864b70bd5d8e4081f79bc82
+6864f260d5d8e4081f7af882
+6864f27cd5d8e4081f7af90c
+6864efb9d5d8e4081f7ae468
+6864f534d5d8e4081f7b0c9a
+6864f572d5d8e4081f7b0df5
+686494b8d5d8e4081f78cfee
+68649057d5d8e4081f78bd3a
+68648f23d5d8e4081f78b8fa
+686489fed5d8e4081f789b9d
+6864660ad5d8e4081f786013
+68643ef7d5d8e4081f7839cd
+68644267d5d8e4081f784135
+6864435bd5d8e4081f7842bc
+68653106d5d8e4081f7c72cd
+6864a655d5d8e4081f794ac2
+6864a54ad5d8e4081f7942a8
+6864a6c5d5d8e4081f7950cb
+68653596d5d8e4081f7c7e5c
+6864a845d5d8e4081f795941
+68649ecad5d8e4081f791274
+68651757d5d8e4081f7c1fe9
+686510b8d5d8e4081f7bfeaf
+68650003d5d8e4081f7b5dba
+68650962d5d8e4081f7bbf0c
+68650aa8d5d8e4081f7bca3f
+68650b66d5d8e4081f7bd082
+6864fa5bd5d8e4081f7b3093
+68651a31d5d8e4081f7c2d2e
+68650f3fd5d8e4081f7bf364
+68650037d5d8e4081f7b5ef6
+6865126cd5d8e4081f7c0860
+68650c2cd5d8e4081f7bd63e
+68650c39d5d8e4081f7bd771
+686500a0d5d8e4081f7b6272
+6865008bd5d8e4081f7b61a4
+6864eb41d5d8e4081f7a37f3
+6864eb5dd5d8e4081f7a5daf
+6864c2f2d5d8e4081f79ea90
+6864de0dd5d8e4081f7a1e29
+6864e464d5d8e4081f7a218c
+6865370cd5d8e4081f7c8041
+6864b2fad5d8e4081f799b29
+6864b2f7d5d8e4081f799af1
+6864b2c3d5d8e4081f7999f9
+6865472cd5d8e4081f7c9cad
+6864b404d5d8e4081f79a56f
+6864b3dbd5d8e4081f79a44b
+6864b4a1d5d8e4081f79a989
+6864ba27d5d8e4081f79ceac
+6864bb1dd5d8e4081f79d27b
+6864bac0d5d8e4081f79d0ac
+6864bf8ad5d8e4081f79e129
+6864be8dd5d8e4081f79de9d
+68653f56d5d8e4081f7c8d69
+6864eba1d5d8e4081f7a8eca
+6864eb6dd5d8e4081f7a6ab0
+6864eb83d5d8e4081f7a7a4a
+6864606bd5d8e4081f785c5e
+68647acfd5d8e4081f78705d
+6864ec8ad5d8e4081f7acfb6
+6864ecd0d5d8e4081f7ad125
+6864ed8ed5d8e4081f7ad6ac
+6864ebd3d5d8e4081f7ab1eb
+6864ebd3d5d8e4081f7ab1df
+6864ebe0d5d8e4081f7abb1d
+6864ebc7d5d8e4081f7aa9ee
+6864ebc8d5d8e4081f7aaa4c
+6864f3ced5d8e4081f7b02d6
+6864f4ead5d8e4081f7b0a70
+6864a469d5d8e4081f793eec
+6865308bd5d8e4081f7c70b1
+6864a6bad5d8e4081f795026
+68649825d5d8e4081f78e3d6
+68649900d5d8e4081f78e897
+686444c9d5d8e4081f784446
+68644867d5d8e4081f7849a0
+6864886dd5d8e4081f789305
+68648ffad5d8e4081f78bb95
+6864876dd5d8e4081f788e48
+68649095d5d8e4081f78be4f
+686491d5d5d8e4081f78c48f
+68641513d5d8e4081f77c5dd
+68641fc1d5d8e4081f77eb8b
+68641aecd5d8e4081f77d99c
+68642331d5d8e4081f77f703
+68640801d5d8e4081f777664
+68640d7ad5d8e4081f77a28e
+68640b22d5d8e4081f7795b4
+686413e2d5d8e4081f77c291
+686413a6d5d8e4081f77c1ea
+68640e0cd5d8e4081f77a64f
+68640ebdd5d8e4081f77ac08
+68640f04d5d8e4081f77adc7
+68643cd2d5d8e4081f782f19
+68643c76d5d8e4081f782df8
+686440add5d8e4081f783c50
+686495e5d5d8e4081f78d517
+686495fad5d8e4081f78d578
+686494b8d5d8e4081f78cfe2
+68649d12d5d8e4081f790835
+68649a2fd5d8e4081f78f065
+68649ffcd5d8e4081f79198e
+686509e0d5d8e4081f7bc39e
+68650b07d5d8e4081f7bcd5b
+68650132d5d8e4081f7b670a
+68651a12d5d8e4081f7c2cca
+68651a6ed5d8e4081f7c2e00
+6865087cd5d8e4081f7bb3fa
+68650887d5d8e4081f7bb443
+68650d03d5d8e4081f7bdf01
+686503f6d5d8e4081f7b8248
+68650615d5d8e4081f7b9aba
+68650fc6d5d8e4081f7bf716
+68650f71d5d8e4081f7bf50c
+68650ea0d5d8e4081f7bed55
+68650ee0d5d8e4081f7bf05a
+686504d0d5d8e4081f7b8c40
+6864eb41d5d8e4081f7a3772
+6864eb38d5d8e4081f7a2ce0
+6864eb51d5d8e4081f7a4d24
+6864eb51d5d8e4081f7a4cc4
+6864eb52d5d8e4081f7a4e92
+6864eb82d5d8e4081f7a793b
+68648165d5d8e4081f787cbd
+686497e6d5d8e4081f78e251
+686497d0d5d8e4081f78e0ed
+6864ebdad5d8e4081f7ab6d3
+6864ebe0d5d8e4081f7abb30
+6864ebebd5d8e4081f7ac2c4
+6864eb8ed5d8e4081f7a817c
+6864eb90d5d8e4081f7a839b
+6864eb8ed5d8e4081f7a8211
+6864eba7d5d8e4081f7a93b8
+6864b7d2d5d8e4081f79c12d
+6864b7a7d5d8e4081f79bfb3
+6864b6e8d5d8e4081f79ba3c
+6864b7ffd5d8e4081f79c37c
+6864b902d5d8e4081f79c884
+6864bb6ed5d8e4081f79d313
+6864b961d5d8e4081f79cab5
+6864b5add5d8e4081f79b291
+6864cb10d5d8e4081f79febf
+686552f9d5d8e4081f7cb170
+6864c83bd5d8e4081f79f6d8
+6864cdced5d8e4081f7a09ea
+6864cf8dd5d8e4081f7a1139
+6864c55ed5d8e4081f79efec
+6864c036d5d8e4081f79e37a
+6864b344d5d8e4081f799ee7
+6864b2d1d5d8e4081f799a42
+68653d37d5d8e4081f7c89d7
+6864eb61d5d8e4081f7a6191
+6864eb72d5d8e4081f7a6d8d
+6864eb5cd5d8e4081f7a5ca9
+6865204cd5d8e4081f7c429c
+68649e7cd5d8e4081f79115e
+6864a316d5d8e4081f7934fb
+6864a149d5d8e4081f7927ce
+6864a656d5d8e4081f794acf
+68653095d5d8e4081f7c70d1
+6864a5ded5d8e4081f7945d2
+68653081d5d8e4081f7c7088
+68653385d5d8e4081f7c78d3
+6865362ed5d8e4081f7c7f39
+6864aafad5d8e4081f796c74
+6864aa7bd5d8e4081f79689c
+6864aa1dd5d8e4081f79662f
+6864efa3d5d8e4081f7ae34c
+6864f07fd5d8e4081f7aea4e
+68649900d5d8e4081f78e8a0
+68649ba1d5d8e4081f78fd03
+6864f5eed5d8e4081f7b109d
+6864f4e9d5d8e4081f7b0a50
+68649604d5d8e4081f78d607
+686470d8d5d8e4081f7867f3
+686469d0d5d8e4081f786146
+68648bcfd5d8e4081f78a895
+68648ad0d5d8e4081f78a0df
+68648a5cd5d8e4081f789dd1
+686486c7d5d8e4081f788abf
+68648e7fd5d8e4081f78b6ab
+68649198d5d8e4081f78c3e0
+686482d5d5d8e4081f78806c
+6864429ad5d8e4081f78418f
+68640856d5d8e4081f7779f8
+68640835d5d8e4081f777849
+686408d2d5d8e4081f7781da
+686409f8d5d8e4081f778b2c
+68640c59d5d8e4081f779cc6
+68640c59d5d8e4081f779cc7
+686419dad5d8e4081f77d632
+68641941d5d8e4081f77d43a
+68641fd6d5d8e4081f77ebc2
+686460a9d5d8e4081f785d52
+68650654d5d8e4081f7b9c9d
+686512b5d5d8e4081f7c09ad
+68651380d5d8e4081f7c0d14
+68650f5ed5d8e4081f7bf413
+686506a9d5d8e4081f7b9fb7
+6864fdbad5d8e4081f7b4929
+6865099ed5d8e4081f7bc0b0
+68651277d5d8e4081f7c08d9
+68650701d5d8e4081f7ba3d4
+686500e9d5d8e4081f7b64a4
+6864fd18d5d8e4081f7b433d
+6864fd0ed5d8e4081f7b4301
+6865085bd5d8e4081f7bb254
+6864ff84d5d8e4081f7b597a
+686500bfd5d8e4081f7b6377
+68650401d5d8e4081f7b827b
+6864d119d5d8e4081f7a1741
+6864cd46d5d8e4081f7a0766
+68655342d5d8e4081f7cb227
+68654c8bd5d8e4081f7ca67d
+6864beb5d5d8e4081f79df3c
+6864be83d5d8e4081f79de31
+6864bd65d5d8e4081f79dad8
+6864b846d5d8e4081f79c4b8
+6864ba06d5d8e4081f79cdae
+6864bacbd5d8e4081f79d14a
+6864bb1dd5d8e4081f79d273
+6864ac8ed5d8e4081f7974d3
+6864a90bd5d8e4081f795ead
+6864a8e2d5d8e4081f795dd7
+686534acd5d8e4081f7c7bf5
+6864a5dad5d8e4081f794584
+6864eb90d5d8e4081f7a8326
+6864eb6ad5d8e4081f7a6846
+68649733d5d8e4081f78dd46
+68649bc0d5d8e4081f78fd9b
+68652322d5d8e4081f7c4cd9
+686521dcd5d8e4081f7c486d
+6864a415d5d8e4081f793cb6
+6864a3d4d5d8e4081f793a9d
+6864f1ecd5d8e4081f7af53d
+6864f2d8d5d8e4081f7afba1
+6864f04bd5d8e4081f7ae89f
+6864ef61d5d8e4081f7ae0a5
+6864f125d5d8e4081f7aeea8
+6864eb55d5d8e4081f7a5327
+6864ebead5d8e4081f7ac283
+6864ed5bd5d8e4081f7ad56f
+6864ebbcd5d8e4081f7aa285
+6864ebcad5d8e4081f7aabc5
+6864ebc4d5d8e4081f7aa798
+6864f352d5d8e4081f7aff3a
+6864f3a5d5d8e4081f7b01e3
+6864421fd5d8e4081f784058
+6864faa4d5d8e4081f7b32b1
+68647ecfd5d8e4081f7876e0
+68647e69d5d8e4081f78758e
+68647c92d5d8e4081f787276
+68647c4fd5d8e4081f78720e
+6864904bd5d8e4081f78bca1
+68648830d5d8e4081f78916c
+68648a67d5d8e4081f789e34
+68640c13d5d8e4081f779bc6
+68640ca1d5d8e4081f779e2d
+68640b0cd5d8e4081f7794aa
+68640d51d5d8e4081f77a168
+68642569d5d8e4081f77fb03
+6864065fd5d8e4081f776816
+686406c2d5d8e4081f776cb4
+68640985d5d8e4081f77872b
+68640879d5d8e4081f777c32
+68640696d5d8e4081f776ac0
+68643b43d5d8e4081f7826ae
+686438a1d5d8e4081f781bd2
+6864378cd5d8e4081f781740
+68643db3d5d8e4081f783632
+6864c2e7d5d8e4081f79ea3d
+6864c1cad5d8e4081f79e75f
+6864c7ded5d8e4081f79f584
+6864eb45d5d8e4081f7a3e2e
+6864eb42d5d8e4081f7a3a11
+6864b4c3d5d8e4081f79ab69
+6864b4a1d5d8e4081f79a978
+6864b419d5d8e4081f79a5fa
+6864b2a4d5d8e4081f79992a
+6864b555d5d8e4081f79aec4
+6864ab36d5d8e4081f796db4
+6864ab24d5d8e4081f796d7b
+686490b5d5d8e4081f78bf6d
+686490cad5d8e4081f78c019
+686492ead5d8e4081f78c903
+6864552bd5d8e4081f785270
+686452bdd5d8e4081f784d82
+68650eb9d5d8e4081f7beeb1
+68650e17d5d8e4081f7be8cf
+68651379d5d8e4081f7c0cf7
+6865133bd5d8e4081f7c0c05
+68651c61d5d8e4081f7c348b
+68651979d5d8e4081f7c2a89
+68651979d5d8e4081f7c2a53
+686519cbd5d8e4081f7c2bca
+686519cbd5d8e4081f7c2be9
+68650b65d5d8e4081f7bd035
+68650acad5d8e4081f7bcc74
+686505fdd5d8e4081f7b991a
+686505f1d5d8e4081f7b982d
+686507d9d5d8e4081f7bac7b
+6865002cd5d8e4081f7b5ec3
+68650888d5d8e4081f7bb4bb
+68650796d5d8e4081f7ba8fd
+686501bcd5d8e4081f7b6bc2
+6864fe34d5d8e4081f7b4cdc
+68650042d5d8e4081f7b5fc0
+6864b3d9d5d8e4081f79a3d6
+6864b52cd5d8e4081f79ada0
+6864b956d5d8e4081f79ca93
+6864bc5ad5d8e4081f79d682
+6864b642d5d8e4081f79b753
+6864c8fdd5d8e4081f79f937
+6864eb4ed5d8e4081f7a48df
+6864eb4ed5d8e4081f7a490b
+6864eb4fd5d8e4081f7a4b2b
+6864eb53d5d8e4081f7a5050
+6864eb6fd5d8e4081f7a6bae
+6864eb7cd5d8e4081f7a7498
+686487cbd5d8e4081f788f83
+68648d7ed5d8e4081f78b311
+686489cbd5d8e4081f789ac4
+68648a22d5d8e4081f789c14
+6864916ed5d8e4081f78c2d8
+68649284d5d8e4081f78c7b6
+6864eb9dd5d8e4081f7a8c5e
+6864ebbcd5d8e4081f7aa286
+6864f838d5d8e4081f7b2053
+6864f641d5d8e4081f7b1254
+6864f66bd5d8e4081f7b138c
+6864f59bd5d8e4081f7b0e6f
+6864f367d5d8e4081f7affd8
+6864f529d5d8e4081f7b0c48
+6864efc4d5d8e4081f7ae4f7
+6864ebe8d5d8e4081f7ac0ce
+6864ebd9d5d8e4081f7ab6ad
+6864ebdcd5d8e4081f7ab87b
+68651f24d5d8e4081f7c3ecc
+686531b2d5d8e4081f7c73fc
+6864a455d5d8e4081f793e4f
+6864a52dd5d8e4081f794257
+6864a341d5d8e4081f79369c
+6864b140d5d8e4081f798d70
+6865428ad5d8e4081f7c93ed
+68653385d5d8e4081f7c78bf
+68653562d5d8e4081f7c7d8d
+68653577d5d8e4081f7c7df6
+6864aafad5d8e4081f796c83
+6864aab1d5d8e4081f796aa9
+68649a4ed5d8e4081f78f0ef
+68649a2fd5d8e4081f78f06e
+68649eced5d8e4081f7912c0
+68649b9dd5d8e4081f78fccd
+68649b9dd5d8e4081f78fcc3
+6865204cd5d8e4081f7c429d
+68652224d5d8e4081f7c499d
+6864a08ad5d8e4081f792122
+6864a069d5d8e4081f791ee6
+68649767d5d8e4081f78de62
+6864fd9ad5d8e4081f7b483d
+6864fd84d5d8e4081f7b4731
+6864870fd5d8e4081f788bf5
+68648763d5d8e4081f788de5
+68648bf2d5d8e4081f78aae3
+6864fd63d5d8e4081f7b4609
+686480c1d5d8e4081f787b70
+68641a9bd5d8e4081f77d8f0
+6864280dd5d8e4081f77fdc9
+6864fdf9d5d8e4081f7b4ac9
+68640aecd5d8e4081f7792f2
+68640f94d5d8e4081f77b06a
+6864072cd5d8e4081f776ffb
+686408bdd5d8e4081f778080
+68640699d5d8e4081f776ad9
+6864068fd5d8e4081f776a1f
+68640702d5d8e4081f776f38
+68643862d5d8e4081f781ac6
+686441f6d5d8e4081f783fcd
+6864438ed5d8e4081f784306
+68645fcad5d8e4081f785bc2
+68651656d5d8e4081f7c1bcd
+68650b1dd5d8e4081f7bce2a
+68650c45d5d8e4081f7bd89b
+68651019d5d8e4081f7bf903
+68650f0ad5d8e4081f7bf1c2
+68650c65d5d8e4081f7bda16
+68650e37d5d8e4081f7be9cc
+68650392d5d8e4081f7b7ccf
+6865089ed5d8e4081f7bb5ea
+686503bed5d8e4081f7b7ece
+6864b4a1d5d8e4081f79a97d
+6864b4a2d5d8e4081f79a9b4
+6864b4f8d5d8e4081f79acab
+6864b4eed5d8e4081f79ac52
+6864b50cd5d8e4081f79ad2b
+6864b616d5d8e4081f79b4a0
+6864b561d5d8e4081f79af22
+68654060d5d8e4081f7c8f8d
+6864ad7cd5d8e4081f797949
+68648bb0d5d8e4081f78a7b0
+6864883dd5d8e4081f7891a8
+68648d7ed5d8e4081f78b2f8
+686489fed5d8e4081f789b6f
+68648a47d5d8e4081f789d42
+686485dad5d8e4081f788760
+6864f572d5d8e4081f7b0de2
+6864f7efd5d8e4081f7b1e09
+6864f7cfd5d8e4081f7b1d3c
+6864f00dd5d8e4081f7ae741
+6864ed06d5d8e4081f7ad26e
+6864ec95d5d8e4081f7ad040
+6864ebf5d5d8e4081f7aca3b
+6864a360d5d8e4081f793752
+6864b643d5d8e4081f79b7aa
+6864bce0d5d8e4081f79d8f7
+6864d058d5d8e4081f7a13df
+6865532dd5d8e4081f7cb200
+6864cf80d5d8e4081f7a10e9
+68655573d5d8e4081f7cb684
+6864eb46d5d8e4081f7a3f88
+6864eb58d5d8e4081f7a56b1
+6864eb5ed5d8e4081f7a5e5a
+6864eb8dd5d8e4081f7a8101
+6865289ed5d8e4081f7c5d1d
+6864a2d8d5d8e4081f793382
+6864a153d5d8e4081f7927f7
+6864a075d5d8e4081f792001
+6864a08cd5d8e4081f7921e6
+686522d0d5d8e4081f7c4c14
+68649f5ed5d8e4081f7914f8
+6864a026d5d8e4081f791add
+68649ceed5d8e4081f790739
+68649e86d5d8e4081f7911a9
+6864709bd5d8e4081f7867aa
+6864ebbcd5d8e4081f7aa26d
+6864ebd0d5d8e4081f7ab017
+6864f8c0d5d8e4081f7b243d
+6864fb5cd5d8e4081f7b3871
+686490b5d5d8e4081f78bf66
+6864914fd5d8e4081f78c271
+68645f69d5d8e4081f785b2e
+6864fee4d5d8e4081f7b5351
+68641711d5d8e4081f77cd5b
+6864184fd5d8e4081f77d2e1
+68641cc3d5d8e4081f77e03b
+686406add5d8e4081f776bba
+68640bfed5d8e4081f779aed
+68643672d5d8e4081f781435
+68643897d5d8e4081f781bc1
+68643944d5d8e4081f781e0c
+686445bdd5d8e4081f7845be
+686481b6d5d8e4081f787d6e
+68648109d5d8e4081f787c1c
+686504d6d5d8e4081f7b8c5c
+6864f666d5d8e4081f7b131a
+68650b31d5d8e4081f7bce6a
+68650c44d5d8e4081f7bd897
+68650c2cd5d8e4081f7bd623
+68650de1d5d8e4081f7be737
+686509f6d5d8e4081f7bc4e4
+6864fb42d5d8e4081f7b37d5
+6864f955d5d8e4081f7b2969
+68650f73d5d8e4081f7bf53d
+6864fc86d5d8e4081f7b3fbe
+686503a8d5d8e4081f7b7de9
+68650443d5d8e4081f7b8635
+6864f457d5d8e4081f7b069d
+6864eb57d5d8e4081f7a5560
+6864eb77d5d8e4081f7a712a
+6864eb75d5d8e4081f7a702e
+6864eb96d5d8e4081f7a8750
+68651ff4d5d8e4081f7c4136
+68651fadd5d8e4081f7c4077
+6864a1c4d5d8e4081f792ba2
+6864a1a8d5d8e4081f792abe
+6864a134d5d8e4081f79279b
+686533b8d5d8e4081f7c799d
+6864a8aed5d8e4081f795c37
+6864eb3dd5d8e4081f7a32c8
+6864b587d5d8e4081f79b1d2
+6864b323d5d8e4081f799d40
+6864b2f7d5d8e4081f799adf
+6864b2f6d5d8e4081f799ac6
+6864b460d5d8e4081f79a807
+6864b13bd5d8e4081f798d3b
+686541b5d5d8e4081f7c9218
+6864ae04d5d8e4081f797ccf
+6864abead5d8e4081f797255
+6864d0ddd5d8e4081f7a1610
+6864ce73d5d8e4081f7a0c29
+6864bb22d5d8e4081f79d295
+6864b89ad5d8e4081f79c687
+6864b89ad5d8e4081f79c676
+6864cc98d5d8e4081f7a04ac
+68649936d5d8e4081f78eb06
+68649936d5d8e4081f78eae8
+68649d61d5d8e4081f790a4b
+68649e29d5d8e4081f790fd3
+68649f3fd5d8e4081f79145f
+68649e7cd5d8e4081f79115a
+6864a3ead5d8e4081f793b80
+6864a3dfd5d8e4081f793b3c
+6864977dd5d8e4081f78df24
+686497d1d5d8e4081f78e12e
+686497d0d5d8e4081f78e105
+68648382d5d8e4081f788205
+68647e18d5d8e4081f787516
+6864ebddd5d8e4081f7ab8e8
+6864528cd5d8e4081f784d52
+6864f316d5d8e4081f7afd8a
+68643d6bd5d8e4081f7834f9
+68643607d5d8e4081f7811f4
+68648e78d5d8e4081f78b64c
+68648ebcd5d8e4081f78b724
+686486d1d5d8e4081f788adf
+68648853d5d8e4081f7892a8
+68640d33d5d8e4081f77a0ae
+68640ab3d5d8e4081f7791cd
+68640a4bd5d8e4081f778e4a
+686407f5d5d8e4081f7775c7
+68640885d5d8e4081f777d1c
+6864112ad5d8e4081f77b74d
+68641cc3d5d8e4081f77e02a
+6864234fd5d8e4081f77f75c
+68644557d5d8e4081f78451b
+68650c4fd5d8e4081f7bd8ff
+68650c2dd5d8e4081f7bd676
+686500aad5d8e4081f7b62b0
+6864fcecd5d8e4081f7b425a
+686509c7d5d8e4081f7bc26d
+68650717d5d8e4081f7ba4d0
+6865078bd5d8e4081f7ba820
+68650425d5d8e4081f7b84ae
+686503d4d5d8e4081f7b801b
+68650505d5d8e4081f7b8e8d
+68650337d5d8e4081f7b794c
+68650151d5d8e4081f7b681b
+6865053ed5d8e4081f7b9117
+68651103d5d8e4081f7c019f
+68650f7ed5d8e4081f7bf5b7
+68649520d5d8e4081f78d186
+6864ebc3d5d8e4081f7aa73c
+6864ebc7d5d8e4081f7aa9f9
+6864eb5dd5d8e4081f7a5db0
+6864eb95d5d8e4081f7a86ed
+6864eb9ad5d8e4081f7a8a05
+6864eb9ad5d8e4081f7a89e2
+6864b784d5d8e4081f79bf06
+6864b700d5d8e4081f79bbc6
+6864c615d5d8e4081f79f195
+6864eb5cd5d8e4081f7a5c44
+6864eb43d5d8e4081f7a3a72
+6864ee68d5d8e4081f7adabf
+6864ec29d5d8e4081f7acbcd
+6864cf38d5d8e4081f7a0fb9
+6864bbd5d5d8e4081f79d4c1
+6864bcd6d5d8e4081f79d8ce
+6864bdead5d8e4081f79dcb4
+6864be3cd5d8e4081f79dddb
+6864bef2d5d8e4081f79dfdf
+6864b8a5d5d8e4081f79c731
+6864a0f5d5d8e4081f7925c1
+68652162d5d8e4081f7c471c
+6865204cd5d8e4081f7c4290
+68649dded5d8e4081f790cee
+68649886d5d8e4081f78e566
+6864f0bdd5d8e4081f7aebfe
+6864f47cd5d8e4081f7b07b9
+6864f60ed5d8e4081f7b11a8
+6864f249d5d8e4081f7af75c
+6864f301d5d8e4081f7afd0b
+6864aed5d5d8e4081f7980e0
+686541c3d5d8e4081f7c9248
+686541c3d5d8e4081f7c923f
+6864afb0d5d8e4081f798501
+6864b2c7d5d8e4081f799a1e
+6865493bd5d8e4081f7ca135
+6864a173d5d8e4081f79290f
+68652697d5d8e4081f7c57ac
+6864a6c5d5d8e4081f7950cc
+68653240d5d8e4081f7c75ab
+6864a62cd5d8e4081f79488a
+6864a503d5d8e4081f794188
+68647dc7d5d8e4081f7874c2
+68648a67d5d8e4081f789e56
+686440a2d5d8e4081f783c43
+68644166d5d8e4081f783e9d
+6864883ed5d8e4081f7891f3
+68641baed5d8e4081f77dc09
+686414d5d5d8e4081f77c4d5
+68642250d5d8e4081f77f4a5
+68640b4bd5d8e4081f77962a
+686407b9d5d8e4081f777401
+686409c3d5d8e4081f778916
+68640a6bd5d8e4081f778fb8
+68640b41d5d8e4081f779610
+68640d47d5d8e4081f77a139
+68643b9fd5d8e4081f7828f9
+68643923d5d8e4081f781d81
+686437b6d5d8e4081f78183e
+68643da6d5d8e4081f783628
+68646f68d5d8e4081f7864e5
+68646fedd5d8e4081f786625
+686469a7d5d8e4081f786137
+68650aa9d5d8e4081f7bcab8
+68650974d5d8e4081f7bbf68
+686508a8d5d8e4081f7bb631
+68650b65d5d8e4081f7bcfd4
+68650b83d5d8e4081f7bd2ba
+686501a7d5d8e4081f7b6af4
+686519ead5d8e4081f7c2c53
+686507e8d5d8e4081f7bad3d
+686502dbd5d8e4081f7b75c1
+68650530d5d8e4081f7b901b
+68650f7ed5d8e4081f7bf59d
+686510b8d5d8e4081f7bfea6
+68649332d5d8e4081f78c9eb
+6864952ad5d8e4081f78d1e0
+686495a9d5d8e4081f78d3df
+6864b70bd5d8e4081f79bc90
+6864b792d5d8e4081f79bf45
+6864b9b3d5d8e4081f79cc4d
+6864b89ad5d8e4081f79c694
+6864b649d5d8e4081f79b7f8
+6864c338d5d8e4081f79eae5
+6864bf06d5d8e4081f79e033
+6864bfa2d5d8e4081f79e194
+6864beead5d8e4081f79df92
+6864eb68d5d8e4081f7a672f
+6864eb5fd5d8e4081f7a60ab
+6864eb46d5d8e4081f7a3ec5
+6864eb3bd5d8e4081f7a30b7
+68654dedd5d8e4081f7ca870
+6864d6a8d5d8e4081f7a1a30
+6864ceefd5d8e4081f7a0e4d
+6864b3e4d5d8e4081f79a45c
+6864a9e9d5d8e4081f7964d0
+6864a8f9d5d8e4081f795e7d
+686538bfd5d8e4081f7c832b
+686535bfd5d8e4081f7c7eb5
+6865329bd5d8e4081f7c7652
+6865281ad5d8e4081f7c5bb5
+6864a321d5d8e4081f79357c
+68652ecbd5d8e4081f7c6b54
+686520f0d5d8e4081f7c454b
+68649e7bd5d8e4081f79114b
+6864eb88d5d8e4081f7a7d2c
+6864eb85d5d8e4081f7a7b65
+6864eb9ed5d8e4081f7a8cf8
+6864ebadd5d8e4081f7a97c9
+6864ebc3d5d8e4081f7aa6eb
+6864eb83d5d8e4081f7a79cc
+6864eb73d5d8e4081f7a6e90
+6864eb78d5d8e4081f7a7216
+68645356d5d8e4081f784e5f
+6864f5dad5d8e4081f7b1018
+6864f529d5d8e4081f7b0c22
+6864f97fd5d8e4081f7b2aad
+6864ebf3d5d8e4081f7ac8a4
+6864ebcad5d8e4081f7aac30
+68648e45d5d8e4081f78b623
+6864916ed5d8e4081f78c329
+68648bcfd5d8e4081f78a826
+686489acd5d8e4081f789a2b
+6864fd58d5d8e4081f7b455e
+6864833ad5d8e4081f788157
+68647e04d5d8e4081f7874fe
+68647f9bd5d8e4081f787925
+68648326d5d8e4081f7880d6
+686426fdd5d8e4081f77fd0e
+68640a31d5d8e4081f778d10
+68640a6bd5d8e4081f778f73
+68640babd5d8e4081f779880
+6864087ad5d8e4081f777cf2
+68640985d5d8e4081f778757
+6864110fd5d8e4081f77b6a3
+68643cd2d5d8e4081f782f18
+68643b4dd5d8e4081f782720
+686438b6d5d8e4081f781c79
+68648763d5d8e4081f788e11
+68648fbdd5d8e4081f78bad0
+68643eebd5d8e4081f783980
+68643f67d5d8e4081f783a62
+6864979dd5d8e4081f78e020
+68649771d5d8e4081f78de7f
+68650a49d5d8e4081f7bc73e
+6865059bd5d8e4081f7b9475
+68650eabd5d8e4081f7bedf5
+6865162cd5d8e4081f7c1ad8
+68651622d5d8e4081f7c1ac6
+686513ccd5d8e4081f7c0ee1
+686519b6d5d8e4081f7c2b44
+68651a31d5d8e4081f7c2d41
+68650d0fd5d8e4081f7be013
+686503bed5d8e4081f7b7ee7
+6865120fd5d8e4081f7c06cc
+68651277d5d8e4081f7c08a1
+68651277d5d8e4081f7c0891
+686512d3d5d8e4081f7c0a20
+68651364d5d8e4081f7c0c9f
+686507b7d5d8e4081f7baaa3
+6865081ad5d8e4081f7baf24
+68650c39d5d8e4081f7bd7cb
+686509dfd5d8e4081f7bc30b
+68650961d5d8e4081f7bbed6
+6864f178d5d8e4081f7af1a7
+6864f166d5d8e4081f7af17b
+6864f37cd5d8e4081f7b0087
+6864f25fd5d8e4081f7af872
+6864f641d5d8e4081f7b1271
+6864ebced5d8e4081f7aaecc
+6864eb93d5d8e4081f7a8525
+68655304d5d8e4081f7cb1a8
+6864eb3fd5d8e4081f7a34f7
+6864eb3ed5d8e4081f7a33bf
+6864ebefd5d8e4081f7ac60a
+6864ed84d5d8e4081f7ad632
+6864efaed5d8e4081f7ae3db
+6864eb59d5d8e4081f7a583d
+6864eb5dd5d8e4081f7a5da5
+6864eb5dd5d8e4081f7a5d47
+6864eb43d5d8e4081f7a3a3b
+6864e4bed5d8e4081f7a21be
+6864b846d5d8e4081f79c4b1
+6864b620d5d8e4081f79b4fb
+6864bb13d5d8e4081f79d222
+6864fce4d5d8e4081f7b4230
+686497d0d5d8e4081f78e111
+6864a69dd5d8e4081f794ee2
+68653139d5d8e4081f7c7346
+6864b344d5d8e4081f799f26
+6864b1c4d5d8e4081f799143
+6864b04cd5d8e4081f798904
+6864b00fd5d8e4081f7987dc
+6864b186d5d8e4081f798ffa
+686541c3d5d8e4081f7c9246
+6864abd5d5d8e4081f797183
+6864abe9d5d8e4081f797206
+6864abfed5d8e4081f7972ae
+6864a8c3d5d8e4081f795cee
+6864a974d5d8e4081f796225
+6864a9e9d5d8e4081f7964f5
+6864a737d5d8e4081f795333
+6865002cd5d8e4081f7b5eba
+6864ff2ad5d8e4081f7b55fa
+6864a08ad5d8e4081f792160
+6864a006d5d8e4081f7919ce
+68649e83d5d8e4081f79118f
+68651f52d5d8e4081f7c3f8f
+68652665d5d8e4081f7c5700
+68652a3bd5d8e4081f7c6036
+68648b71d5d8e4081f78a685
+686490cad5d8e4081f78c028
+686490b4d5d8e4081f78bf56
+68648fb2d5d8e4081f78bac1
+68649678d5d8e4081f78d960
+68647c96d5d8e4081f787285
+68648051d5d8e4081f787a78
+68641f7ad5d8e4081f77ea24
+686408a7d5d8e4081f777f89
+686408bdd5d8e4081f77809e
+68640862d5d8e4081f777ab4
+686409d3d5d8e4081f7789d4
+68640ac3d5d8e4081f779275
+68640800d5d8e4081f77764c
+68640dced5d8e4081f77a4d2
+68640ec6d5d8e4081f77ac69
+686436d5d5d8e4081f781567
+686437fed5d8e4081f7818e4
+68643864d5d8e4081f781ad3
+68643d9ed5d8e4081f78360a
+68644909d5d8e4081f7849fb
+68649791d5d8e4081f78df6a
+68648809d5d8e4081f7890a8
+686505b0d5d8e4081f7b952e
+686509f6d5d8e4081f7bc4d8
+68650901d5d8e4081f7bbae7
+6865089ed5d8e4081f7bb5c2
+68650893d5d8e4081f7bb53a
+6864f8e0d5d8e4081f7b2512
+686506d7d5d8e4081f7ba298
+68650beed5d8e4081f7bd49f
+68650caed5d8e4081f7bdc0a
+686507c8d5d8e4081f7bab64
+68651b44d5d8e4081f7c310c
+68651757d5d8e4081f7c1fec
+6864fdb9d5d8e4081f7b4914
+68645bb8d5d8e4081f785841
+68649b7bd5d8e4081f78fb60
+6864a661d5d8e4081f794b8d
+6864a661d5d8e4081f794b6d
+6864a49dd5d8e4081f79402c
+68652f8cd5d8e4081f7c6d12
+68651eced5d8e4081f7c3dbf
+68649e7bd5d8e4081f7910f3
+68649e33d5d8e4081f791004
+6864a3abd5d8e4081f7939da
+6864bf06d5d8e4081f79e02f
+6864cc98d5d8e4081f7a0500
+6864c963d5d8e4081f79fa21
+6864b3aed5d8e4081f79a2aa
+6864b8d5d5d8e4081f79c787
+6864b847d5d8e4081f79c4c2
+6864eb33d5d8e4081f7a255c
+6864eb37d5d8e4081f7a2ad9
+6864eb37d5d8e4081f7a2b1d
+6864eb52d5d8e4081f7a4e3c
+6864eb50d5d8e4081f7a4c7b
+6864eb58d5d8e4081f7a564a
+6864eb59d5d8e4081f7a5801
+686439e8d5d8e4081f782070
+686489b6d5d8e4081f789a70
+686487a2d5d8e4081f788ee6
+686487ffd5d8e4081f789071
+68648e23d5d8e4081f78b597
+6864ebebd5d8e4081f7ac345
+6864eb83d5d8e4081f7a79d1
+6864eb5bd5d8e4081f7a5abe
+6864f3efd5d8e4081f7b040b
+6864edf6d5d8e4081f7ad895
+6864eebcd5d8e4081f7adcb4
+6864f0b2d5d8e4081f7aeb9c
+6864f159d5d8e4081f7af0e2
+6864f20bd5d8e4081f7af5bb
+6864f391d5d8e4081f7b0146
+6864120ed5d8e4081f77bb5b
+6864065fd5d8e4081f7767c9
+68640b2cd5d8e4081f7795de
+68640a18d5d8e4081f778c5a
+68640aaed5d8e4081f779180
+68641cbfd5d8e4081f77e01b
+68642458d5d8e4081f77f9c3
+686483fcd5d8e4081f788339
+68649332d5d8e4081f78c9ce
+686493a3d5d8e4081f78cb91
+686501f7d5d8e4081f7b6df6
+68650ecdd5d8e4081f7befcd
+68650cecd5d8e4081f7bdd71
+68650614d5d8e4081f7b9a9e
+686509e0d5d8e4081f7bc36f
+686513d7d5d8e4081f7c0f47
+68650a9dd5d8e4081f7bc98b
+68649b9cd5d8e4081f78fcaf
+68649d62d5d8e4081f790a6c
+6864980cd5d8e4081f78e2a5
+6865337bd5d8e4081f7c78a8
+68653826d5d8e4081f7c8237
+6864a960d5d8e4081f796148
+6864a92dd5d8e4081f795fc9
+6864acecd5d8e4081f7976a8
+6864ac3cd5d8e4081f797393
+6864eb39d5d8e4081f7a2dc0
+6864eb46d5d8e4081f7a3fa7
+686490f3d5d8e4081f78c11a
+6864eb72d5d8e4081f7a6e17
+6864ebb4d5d8e4081f7a9cef
+6864ebb0d5d8e4081f7a9a39
+6864ebacd5d8e4081f7a9742
+6864ebafd5d8e4081f7a9913
+6864ebb8d5d8e4081f7a9f6d
+6864eb99d5d8e4081f7a8975
+6864ebf3d5d8e4081f7ac881
+6864ebf3d5d8e4081f7ac875
+6864ebefd5d8e4081f7ac607
+6864ebead5d8e4081f7ac2b3
+6864ebcbd5d8e4081f7aac6a
+6864eb6ad5d8e4081f7a6830
+6864eb69d5d8e4081f7a67cb
+6864eb66d5d8e4081f7a65e0
+6864eb4fd5d8e4081f7a4a98
+686547c3d5d8e4081f7c9dbf
+6864b3cdd5d8e4081f79a311
+68653e8bd5d8e4081f7c8c1a
+68653cbdd5d8e4081f7c88a3
+6864b3e4d5d8e4081f79a474
+6864b620d5d8e4081f79b502
+6864b6ffd5d8e4081f79bb5e
+6864b5b8d5d8e4081f79b303
+6864b940d5d8e4081f79c9b6
+6864c0b6d5d8e4081f79e4fe
+6864c57cd5d8e4081f79f036
+6864c684d5d8e4081f79f265
+6864ce88d5d8e4081f7a0ca9
+6864f648d5d8e4081f7b1284
+6864f6cdd5d8e4081f7b15fc
+6864f2a9d5d8e4081f7af9de
+6864f12fd5d8e4081f7aef55
+6864ee92d5d8e4081f7adbac
+6864f90ad5d8e4081f7b266b
+68640627d5d8e4081f77656c
+6864ff84d5d8e4081f7b5972
+68648bfdd5d8e4081f78aaec
+68649639d5d8e4081f78d780
+686494e2d5d8e4081f78d05d
+68648051d5d8e4081f787a7f
+686406cdd5d8e4081f776d39
+68640f8ad5d8e4081f77afe2
+68640990d5d8e4081f7787cf
+686407a0d5d8e4081f777304
+686407a5d5d8e4081f777333
+6864089cd5d8e4081f777f05
+68641745d5d8e4081f77cef8
+68642070d5d8e4081f77edbe
+68643c39d5d8e4081f782c16
+68643f71d5d8e4081f783a69
+6865265ad5d8e4081f7c56ce
+68652ea2d5d8e4081f7c6ae4
+68653011d5d8e4081f7c6efb
+68652ec0d5d8e4081f7c6b44
+686520a8d5d8e4081f7c4401
+68650da3d5d8e4081f7be489
+68651024d5d8e4081f7bf9b1
+686508b8d5d8e4081f7bb75a
+6864fcecd5d8e4081f7b4256
+6864fcc5d5d8e4081f7b416f
+6864f77cd5d8e4081f7b1b08
+686519cbd5d8e4081f7c2baf
+686518bfd5d8e4081f7c26df
+686507b7d5d8e4081f7baa68
+68650961d5d8e4081f7bbedd
+68650b65d5d8e4081f7bd054
+68650c65d5d8e4081f7bd9f1
+68650ca4d5d8e4081f7bdbef
+6864f5e4d5d8e4081f7b103c
+6864fb95d5d8e4081f7b39a0
+68651617d5d8e4081f7c1ab9
+68651790d5d8e4081f7c214e
+68651748d5d8e4081f7c1fc7
+686511a9d5d8e4081f7c051c
+6864fa86d5d8e4081f7b31fd
+68643f3fd5d8e4081f783a40
+68644704d5d8e4081f784832
+6864ad84d5d8e4081f797998
+6864eb62d5d8e4081f7a624a
+6864b94ad5d8e4081f79c9f3
+6864b246d5d8e4081f799665
+6864b179d5d8e4081f798e65
+6864b56dd5d8e4081f79b0e2
+6864b439d5d8e4081f79a6eb
+6864d0fcd5d8e4081f7a168b
+686554b8d5d8e4081f7cb510
+6864dfd0d5d8e4081f7a1f20
+6864cc47d5d8e4081f7a0429
+6864eb36d5d8e4081f7a2954
+6864eb36d5d8e4081f7a292e
+6864c108d5d8e4081f79e5ae
+6864bdf5d5d8e4081f79dce6
+6864b344d5d8e4081f799f1d
+686545fcd5d8e4081f7c9b0a
+6864aa09d5d8e4081f7965e0
+6864eb7ad5d8e4081f7a73b7
+6864eb90d5d8e4081f7a833d
+6864eba1d5d8e4081f7a8f56
+6864ebb5d5d8e4081f7a9da6
+68649fd0d5d8e4081f791790
+6864a031d5d8e4081f791b59
+6864a92dd5d8e4081f795fe2
+6864a678d5d8e4081f794cec
+6864a64ad5d8e4081f7949d6
+68652874d5d8e4081f7c5c93
+6864ebdcd5d8e4081f7ab857
+6864ebd4d5d8e4081f7ab2bc
+6864eb98d5d8e4081f7a88be
+6864eb61d5d8e4081f7a619a
+6864eb5cd5d8e4081f7a5c7a
+6864ee3fd5d8e4081f7ad9f2
+6864f200d5d8e4081f7af567
+68643ce7d5d8e4081f782f4c
+68647db3d5d8e4081f787491
+686488afd5d8e4081f7893f3
+6864937ad5d8e4081f78caf9
+68649604d5d8e4081f78d62b
+68643b8cd5d8e4081f78287f
+686437c1d5d8e4081f78184d
+686456a4d5d8e4081f785565
+68640d3dd5d8e4081f77a0e7
+68640f22d5d8e4081f77ae84
+6864082ad5d8e4081f7777d6
+686409c3d5d8e4081f778945
+68651070d5d8e4081f7bfd7c
+68650566d5d8e4081f7b92ed
+686516a8d5d8e4081f7c1cef
+68651656d5d8e4081f7c1bc9
+6864fd84d5d8e4081f7b471c
+68650dccd5d8e4081f7be5d1
+68650f15d5d8e4081f7bf213
+6864ff04d5d8e4081f7b54b5
+6864fce2d5d8e4081f7b4226
+686508ccd5d8e4081f7bb86c
+68650e02d5d8e4081f7be846
+68650d0ed5d8e4081f7bdfa3
+68650609d5d8e4081f7b9a27
+6864eb55d5d8e4081f7a5222
+6864eb6dd5d8e4081f7a6a29
+6864c727d5d8e4081f79f3d3
+6864c73cd5d8e4081f79f44f
+6864c907d5d8e4081f79f944
+68654ea4d5d8e4081f7ca9cd
+6864cff1d5d8e4081f7a127a
+6864cd84d5d8e4081f7a082f
+6864daa8d5d8e4081f7a1c55
+6864eb3ad5d8e4081f7a2ef7
+6864dce1d5d8e4081f7a1d92
+6864df97d5d8e4081f7a1f08
+6864eb41d5d8e4081f7a37c8
+6864eb3dd5d8e4081f7a3323
+6864b740d5d8e4081f79bdc3
+68653414d5d8e4081f7c7abd
+6864a3d4d5d8e4081f793ab4
+6864b239d5d8e4081f799523
+6864b48cd5d8e4081f79a8fa
+68649b64d5d8e4081f78fa1b
+68649900d5d8e4081f78e888
+68649d38d5d8e4081f7909a0
+68649d38d5d8e4081f790992
+68649df4d5d8e4081f790e3a
+68649cc4d5d8e4081f7905f8
+6864a007d5d8e4081f7919f4
+6865227fd5d8e4081f7c4b4d
+6864f4ead5d8e4081f7b0a8c
+6864eb91d5d8e4081f7a83dd
+6864eba6d5d8e4081f7a9248
+686497d1d5d8e4081f78e17d
+686497e3d5d8e4081f78e1d4
+6864ebbdd5d8e4081f7aa30f
+6864ebf4d5d8e4081f7ac98d
+6864eef0d5d8e4081f7addea
+6864ee22d5d8e4081f7ad950
+6864f0fbd5d8e4081f7aed72
+6864efaad5d8e4081f7ae376
+6864efaed5d8e4081f7ae3de
+6864efe4d5d8e4081f7ae633
+6864f2ded5d8e4081f7afbfd
+68648b03d5d8e4081f78a1e2
+68648bd1d5d8e4081f78a930
+68648cf5d5d8e4081f78b0c4
+6864892ed5d8e4081f789774
+68648165d5d8e4081f787cd7
+686495a6d5d8e4081f78d3a4
+68649198d5d8e4081f78c3dc
+6864915ad5d8e4081f78c29c
+68640ebdd5d8e4081f77ac1d
+686411a5d5d8e4081f77b95e
+68640749d5d8e4081f7770c8
+68641caed5d8e4081f77df93
+6864211ed5d8e4081f77f03c
+6864151dd5d8e4081f77c60d
+6864233bd5d8e4081f77f72d
+68642496d5d8e4081f77fa1a
+68643d06d5d8e4081f782f89
+68645389d5d8e4081f784ef9
+6864a193d5d8e4081f792a31
+6864a3b2d5d8e4081f793a06
+6864ac27d5d8e4081f7972fa
+6864ac99d5d8e4081f79752d
+6864aabbd5d8e4081f796ad6
+6864aa5cd5d8e4081f796813
+6864a5cfd5d8e4081f7944ec
+686519b6d5d8e4081f7c2b16
+6865089ed5d8e4081f7bb5bc
+68650a24d5d8e4081f7bc5d0
+68650916d5d8e4081f7bbbd1
+686501b2d5d8e4081f7b6ba2
+68650d26d5d8e4081f7be1a2
+68650c84d5d8e4081f7bdaea
+6864fa8fd5d8e4081f7b3254
+6864faeed5d8e4081f7b34ea
+68650eb5d5d8e4081f7bee55
+68650e6bd5d8e4081f7beb29
+68650e76d5d8e4081f7bebb9
+68650ecbd5d8e4081f7bef84
+6864ebb4d5d8e4081f7a9cee
+6864ebbfd5d8e4081f7aa49b
+6864ebcdd5d8e4081f7aae52
+6864ebd7d5d8e4081f7ab52a
+6864ebe5d5d8e4081f7abf35
+6864a704d5d8e4081f7952a3
+686534c0d5d8e4081f7c7c32
+6864a9e9d5d8e4081f7964ce
+68653943d5d8e4081f7c8422
+6864ab4dd5d8e4081f796e1b
+6864ef59d5d8e4081f7ae095
+6864ef44d5d8e4081f7adfea
+6864f2ded5d8e4081f7afbdc
+68654cdcd5d8e4081f7ca6ef
+6864c2c7d5d8e4081f79e9d2
+68655413d5d8e4081f7cb3e7
+6864cee5d5d8e4081f7a0e16
+6864cd66d5d8e4081f7a0814
+686552b2d5d8e4081f7cb0b6
+6864dff0d5d8e4081f7a1f37
+6864d0d2d5d8e4081f7a15dc
+6864eb77d5d8e4081f7a7191
+6864f64bd5d8e4081f7b129a
+6864eb8cd5d8e4081f7a802e
+6864eb9cd5d8e4081f7a8bde
+6864eb8ad5d8e4081f7a7eb4
+6864b4a2d5d8e4081f79a9e8
+6864b289d5d8e4081f79989f
+6864b56cd5d8e4081f79b01c
+68653cc7d5d8e4081f7c88b0
+686544c1d5d8e4081f7c983f
+686540c2d5d8e4081f7c8ff2
+6864c050d5d8e4081f79e3c8
+68652fb4d5d8e4081f7c6db7
+68652b26d5d8e4081f7c6357
+6864b77dd5d8e4081f79bec8
+6864b399d5d8e4081f79a207
+6864b238d5d8e4081f79949c
+68645389d5d8e4081f784ef4
+6864f9ecd5d8e4081f7b2dd4
+686481e9d5d8e4081f787dfc
+68648bdcd5d8e4081f78a986
+68648c30d5d8e4081f78abfb
+686490a0d5d8e4081f78bee0
+68649041d5d8e4081f78bc86
+68644769d5d8e4081f7848c1
+68645dc7d5d8e4081f785940
+68645fcad5d8e4081f785bb0
+68640a41d5d8e4081f778e00
+6864089cd5d8e4081f777ed8
+6864090ed5d8e4081f7783f0
+686409c3d5d8e4081f778954
+68640da5d5d8e4081f77a3db
+68640dd9d5d8e4081f77a504
+68640e55d5d8e4081f77a903
+68640e89d5d8e4081f77aa71
+6864123fd5d8e4081f77bc17
+68641a2ad5d8e4081f77d717
+68641513d5d8e4081f77c5f7
+68641759d5d8e4081f77cf61
+6864086ed5d8e4081f777b24
+68643ce7d5d8e4081f782f48
+68647e2cd5d8e4081f78752e
+68647e7ed5d8e4081f787624
+68647ae4d5d8e4081f787097
+6864941fd5d8e4081f78cdac
+68649379d5d8e4081f78caef
+68645b11d5d8e4081f7857e5
+686498d7d5d8e4081f78e7aa
+68652888d5d8e4081f7c5cce
+6864a2a4d5d8e4081f79325f
+6864a265d5d8e4081f79306f
+68649ecad5d8e4081f791273
+686515b2d5d8e4081f7c1907
+68650571d5d8e4081f7b934a
+6865100ed5d8e4081f7bf895
+6864fd4ed5d8e4081f7b44fd
+6864fb95d5d8e4081f7b39c2
+6864fb42d5d8e4081f7b37e5
+68650b66d5d8e4081f7bd08f
+68650957d5d8e4081f7bbe9c
+68650693d5d8e4081f7b9e9a
+68650c2dd5d8e4081f7bd69c
+68651045d5d8e4081f7bfbac
+686502fbd5d8e4081f7b76fa
+686502dad5d8e4081f7b7597
+6865037dd5d8e4081f7b7bec
+686503d4d5d8e4081f7b801a
+68650443d5d8e4081f7b860c
+6865081cd5d8e4081f7bafb0
+68650825d5d8e4081f7baffb
+686507f9d5d8e4081f7badde
+68650866d5d8e4081f7bb2b6
+686508ebd5d8e4081f7bb9c5
+68650109d5d8e4081f7b65f7
+6864eb53d5d8e4081f7a507f
+6864eb57d5d8e4081f7a5533
+6864eb5dd5d8e4081f7a5d3a
+6864eb5dd5d8e4081f7a5d2f
+6864eb50d5d8e4081f7a4c20
+6864eb48d5d8e4081f7a41b7
+6864eb47d5d8e4081f7a406a
+6864d043d5d8e4081f7a1375
+6865537ed5d8e4081f7cb298
+686552bdd5d8e4081f7cb0d5
+6864ad52d5d8e4081f79785d
+6864b30cd5d8e4081f799ba0
+6864b516d5d8e4081f79ad48
+6864b48cd5d8e4081f79a8f6
+6864bf8ad5d8e4081f79e128
+6864bcc3d5d8e4081f79d81e
+6864bffed5d8e4081f79e2fd
+68655261d5d8e4081f7cafe7
+6864c8f2d5d8e4081f79f898
+68654a05d5d8e4081f7ca272
+6864c958d5d8e4081f79f9c1
+6864b884d5d8e4081f79c59d
+6864ebaed5d8e4081f7a9856
+68649a6fd5d8e4081f78f1d0
+68649d38d5d8e4081f790972
+68649ff5d5d8e4081f79194d
+68652449d5d8e4081f7c5027
+68653af4d5d8e4081f7c8657
+686533a4d5d8e4081f7c795a
+6864a6dbd5d8e4081f79513e
+6864a3aad5d8e4081f793951
+6864a395d5d8e4081f793889
+68652a1dd5d8e4081f7c5ff1
+6864ec95d5d8e4081f7ad009
+6864ee5dd5d8e4081f7ada74
+6864f098d5d8e4081f7aeb32
+68649810d5d8e4081f78e316
+6864f313d5d8e4081f7afd59
+6864f33fd5d8e4081f7afe94
+68647129d5d8e4081f786860
+6864f7efd5d8e4081f7b1e96
+68649284d5d8e4081f78c7bf
+68648c8ed5d8e4081f78adc0
+68648d3fd5d8e4081f78b1aa
+68648ab1d5d8e4081f78a016
+68648bcfd5d8e4081f78a856
+68648bdcd5d8e4081f78a94e
+68648e23d5d8e4081f78b5af
+6864401ed5d8e4081f783b6c
+68646172d5d8e4081f785e24
+68647b99d5d8e4081f7870f5
+686478fed5d8e4081f786e5e
+68640c65d5d8e4081f779d20
+686406b8d5d8e4081f776c75
+686406f8d5d8e4081f776ec0
+68642abbd5d8e4081f780018
+68642e8cd5d8e4081f78031a
+6864ebddd5d8e4081f7ab914
+6864eb7bd5d8e4081f7a73f1
+6864eb99d5d8e4081f7a8978
+6864eb6fd5d8e4081f7a6b8a
+686442f5d5d8e4081f78421f
+6864451ad5d8e4081f7844ac
+68644271d5d8e4081f78413d
+68650c38d5d8e4081f7bd70e
+6864ff3ad5d8e4081f7b56d3
+6864ffe3d5d8e4081f7b5c34
+68651065d5d8e4081f7bfccd
+6864fc47d5d8e4081f7b3e14
+68650b83d5d8e4081f7bd2c9
+68650a9ed5d8e4081f7bc9e8
+68650ab4d5d8e4081f7bcb48
+68650898d5d8e4081f7bb591
+6864fb42d5d8e4081f7b37dd
+6864fad9d5d8e4081f7b3419
+6864fcc5d5d8e4081f7b4173
+68650153d5d8e4081f7b6844
+6864eb7bd5d8e4081f7a7480
+6864eb92d5d8e4081f7a8472
+6864eb74d5d8e4081f7a6edb
+6864eba3d5d8e4081f7a9073
+6864eb9dd5d8e4081f7a8c74
+6864ebeed5d8e4081f7ac520
+6864eb9cd5d8e4081f7a8bbd
+6864a9e9d5d8e4081f7964cd
+6864a8edd5d8e4081f795e48
+6864a9b4d5d8e4081f796368
+6864b902d5d8e4081f79c8c8
+6864b89ad5d8e4081f79c6a2
+68655224d5d8e4081f7caf4b
+68652cbcd5d8e4081f7c673a
+6864a61ed5d8e4081f7947e5
+686520fad5d8e4081f7c4590
+6864a07fd5d8e4081f7920a0
+6864a129d5d8e4081f7926e9
+68652682d5d8e4081f7c577b
+686497cfd5d8e4081f78e0d7
+68649c1bd5d8e4081f790090
+68649ccfd5d8e4081f79065e
+68649d1cd5d8e4081f790846
+68649e33d5d8e4081f791019
+6864eb3fd5d8e4081f7a350b
+6864eb3ad5d8e4081f7a2f3e
+6864d0aad5d8e4081f7a14ff
+68655353d5d8e4081f7cb230
+6864d0b4d5d8e4081f7a155c
+6864cf78d5d8e4081f7a10a3
+6864eb55d5d8e4081f7a52cd
+6864eb57d5d8e4081f7a55d9
+6864eb5ed5d8e4081f7a5f4e
+68645b1cd5d8e4081f78580c
+686496b7d5d8e4081f78db44
+6864f786d5d8e4081f7b1b64
+6864f786d5d8e4081f7b1b5a
+6864f71ed5d8e4081f7b1877
+6864ecd3d5d8e4081f7ad15f
+6864ec95d5d8e4081f7ad029
+6864f4c4d5d8e4081f7b097b
+6864f289d5d8e4081f7af971
+6864f372d5d8e4081f7b0053
+68649019d5d8e4081f78bc04
+68649187d5d8e4081f78c36d
+6864f7efd5d8e4081f7b1e9a
+68643d94d5d8e4081f783602
+68644233d5d8e4081f784093
+686443e9d5d8e4081f78436d
+686445fad5d8e4081f78462f
+686434a9d5d8e4081f780cdd
+686406acd5d8e4081f776b75
+68640ebdd5d8e4081f77ac55
+686410e3d5d8e4081f77b634
+68642250d5d8e4081f77f4a4
+68641c33d5d8e4081f77ddd2
+68641cddd5d8e4081f77e0db
+68648a36d5d8e4081f789c44
+68648aa7d5d8e4081f789fcd
+68648b26d5d8e4081f78a439
+68648b7cd5d8e4081f78a6a3
+68648bdcd5d8e4081f78a9b3
+686485dad5d8e4081f788776
+6864874ed5d8e4081f788d36
+6864b569d5d8e4081f79af93
+6864b3c2d5d8e4081f79a2df
+6864b404d5d8e4081f79a57c
+6864b3d9d5d8e4081f79a412
+6864b3e4d5d8e4081f79a494
+6864b35ad5d8e4081f79a063
+6864b2ecd5d8e4081f799a6c
+6864b265d5d8e4081f7996f7
+68643796d5d8e4081f781788
+686516a8d5d8e4081f7c1ce1
+68650eb6d5d8e4081f7bee82
+68650f00d5d8e4081f7bf170
+6865090cd5d8e4081f7bbb61
+68650796d5d8e4081f7ba920
+68651b97d5d8e4081f7c3242
+68651912d5d8e4081f7c287b
+68650249d5d8e4081f7b70de
+68651345d5d8e4081f7c0c2d
+686505cfd5d8e4081f7b9615
+6864b3eed5d8e4081f79a4e1
+6864b700d5d8e4081f79bbe6
+6864b56cd5d8e4081f79afca
+6864ac9ad5d8e4081f797537
+6864b186d5d8e4081f798fe7
+6864c455d5d8e4081f79edc5
+6864cabed5d8e4081f79fdca
+6864b7ded5d8e4081f79c1c8
+6864b899d5d8e4081f79c62c
+6864b935d5d8e4081f79c964
+6864b482d5d8e4081f79a8cc
+68647ecfd5d8e4081f7876aa
+68647f4ad5d8e4081f7878a1
+686488cfd5d8e4081f78951d
+6864ebb4d5d8e4081f7a9cb6
+6864eb63d5d8e4081f7a636b
+6864eb58d5d8e4081f7a5661
+6864eb52d5d8e4081f7a4f35
+6864e464d5d8e4081f7a218b
+6864eb72d5d8e4081f7a6d66
+6864ebadd5d8e4081f7a9778
+6864eb9bd5d8e4081f7a8b33
+6864ebdbd5d8e4081f7ab7f8
+6864ebe0d5d8e4081f7abb6b
+686497e6d5d8e4081f78e22d
+6865292ad5d8e4081f7c5e4e
+686523d8d5d8e4081f7c4e79
+6864f48bd5d8e4081f7b0806
+6864f771d5d8e4081f7b1ae2
+6864f94ad5d8e4081f7b2918
+68649327d5d8e4081f78c96f
+68649549d5d8e4081f78d237
+68649429d5d8e4081f78ce00
+68649187d5d8e4081f78c36c
+68648b52d5d8e4081f78a5cf
+68648b67d5d8e4081f78a615
+68648c3bd5d8e4081f78ac4f
+68648e78d5d8e4081f78b649
+68648dd1d5d8e4081f78b484
+686486e6d5d8e4081f788b4c
+68648504d5d8e4081f78857c
+68648efad5d8e4081f78b871
+6864fbb9d5d8e4081f7b3a5a
+686492c1d5d8e4081f78c890
+68649284d5d8e4081f78c7af
+68646519d5d8e4081f785fb5
+68643ed5d5d8e4081f7838bd
+68644412d5d8e4081f7843a2
+68644fe9d5d8e4081f784c7d
+68641b15d5d8e4081f77da7a
+68641c99d5d8e4081f77df1d
+68640e17d5d8e4081f77a6fb
+68640babd5d8e4081f779839
+686408b1d5d8e4081f777fce
+6864098fd5d8e4081f7787a1
+686407aad5d8e4081f77734a
+686412edd5d8e4081f77bf1c
+68640856d5d8e4081f7779ea
+6864129bd5d8e4081f77bda6
+68640f38d5d8e4081f77aec8
+68643c95d5d8e4081f782e2d
+68643a2fd5d8e4081f782161
+68643a44d5d8e4081f78219b
+68649fb1d5d8e4081f791690
+68649b86d5d8e4081f78fba1
+6864a449d5d8e4081f793db4
+686530fcd5d8e4081f7c7246
+6864aa3bd5d8e4081f7966ac
+68642218d5d8e4081f77f426
+6865138bd5d8e4081f7c0d52
+6865154ad5d8e4081f7c1694
+68650ce1d5d8e4081f7bdce3
+68650c84d5d8e4081f7bdacf
+68650d1bd5d8e4081f7be12d
+686505b1d5d8e4081f7b9584
+6864fbfdd5d8e4081f7b3c1f
+6864fd38d5d8e4081f7b4436
+68650b5ad5d8e4081f7bcf37
+68650aa9d5d8e4081f7bcad5
+68650aa9d5d8e4081f7bcabe
+686508b3d5d8e4081f7bb6e3
+686501c7d5d8e4081f7b6c6b
+68651277d5d8e4081f7c08ad
+686503dfd5d8e4081f7b809d
+686507b7d5d8e4081f7baa63
+68650e8ad5d8e4081f7bec23
+68650479d5d8e4081f7b8886
+6864fecfd5d8e4081f7b52d0
+6864ff05d5d8e4081f7b54d7
+686522b3d5d8e4081f7c4bc7
+686554f5d5d8e4081f7cb551
+6864eb7cd5d8e4081f7a7538
+6864eb79d5d8e4081f7a7265
+6864eb62d5d8e4081f7a62b9
+6864eb54d5d8e4081f7a50b2
+6864c83ad5d8e4081f79f6ab
+6864bbc0d5d8e4081f79d404
+686543f7d5d8e4081f7c96fe
+6864b217d5d8e4081f799318
+68649810d5d8e4081f78e2d6
+68651ff0d5d8e4081f7c412b
+6864ebb2d5d8e4081f7a9ba2
+6864ebb8d5d8e4081f7a9f51
+6864ebc0d5d8e4081f7aa4ae
+6864ebc3d5d8e4081f7aa6d3
+6864ebc5d5d8e4081f7aa81c
+6864ebacd5d8e4081f7a96bf
+6864ebacd5d8e4081f7a9705
+6864ebd0d5d8e4081f7ab040
+6864ebe7d5d8e4081f7ac027
+6864ef78d5d8e4081f7ae17e
+6864efeed5d8e4081f7ae6b9
+6864ed50d5d8e4081f7ad51e
+68653577d5d8e4081f7c7dc7
+68653b44d5d8e4081f7c868e
+6865265bd5d8e4081f7c56e3
+6864f66ad5d8e4081f7b1332
+68644113d5d8e4081f783d55
+6864f328d5d8e4081f7afe10
+6864f3ced5d8e4081f7b02b4
+6864f4abd5d8e4081f7b08be
+68648af9d5d8e4081f78a18e
+686487fdd5d8e4081f789024
+6864885dd5d8e4081f7892cd
+68648d16d5d8e4081f78b133
+68648f56d5d8e4081f78b97d
+686494a4d5d8e4081f78cf9e
+68649524d5d8e4081f78d1b5
+68646fd8d5d8e4081f7865f0
+68646e2dd5d8e4081f786382
+686438a9d5d8e4081f781c11
+68643912d5d8e4081f781d55
+686412ced5d8e4081f77be3a
+68640bd5d5d8e4081f7799f0
+68640a56d5d8e4081f778ede
+68640928d5d8e4081f7784a5
+68640afbd5d8e4081f7793f2
+68640b0cd5d8e4081f7794c2
+68641386d5d8e4081f77c1b1
+68641b52d5d8e4081f77db29
+68641e41d5d8e4081f77e610
+68641a86d5d8e4081f77d870
+6864466ad5d8e4081f7846fb
+68644477d5d8e4081f784413
+68640a17d5d8e4081f778bf3
+68650212d5d8e4081f7b6f14
+68650da3d5d8e4081f7be4a3
+68650dccd5d8e4081f7be5b6
+68650d26d5d8e4081f7be196
+686507e4d5d8e4081f7bacea
+686508ebd5d8e4081f7bb9f3
+686508ead5d8e4081f7bb982
+68650640d5d8e4081f7b9c28
+6864fa66d5d8e4081f7b311f
+686503ebd5d8e4081f7b8186
+6864fb22d5d8e4081f7b362f
+6864f9d3d5d8e4081f7b2d2a
+68650de3d5d8e4081f7be75f
+68650d59d5d8e4081f7be288
+68650ea0d5d8e4081f7bed67
+6864fd99d5d8e4081f7b47ee
+6864fb00d5d8e4081f7b357d
+68651cf1d5d8e4081f7c362f
+68651c38d5d8e4081f7c33d7
+68651b3bd5d8e4081f7c30ec
+686441aed5d8e4081f783f25
+68640856d5d8e4081f7779db
+6864a9b4d5d8e4081f79635c
+686534c0d5d8e4081f7c7c38
+6864a742d5d8e4081f7953e1
+68653409d5d8e4081f7c7a6d
+6864a8f7d5d8e4081f795e73
+6864b50cd5d8e4081f79ad27
+6864b437d5d8e4081f79a6b4
+6864b2f6d5d8e4081f799ab4
+68654b15d5d8e4081f7ca456
+68655224d5d8e4081f7caf5b
+6864c727d5d8e4081f79f3fd
+6864c553d5d8e4081f79efbf
+6864b643d5d8e4081f79b7ac
+6864bbd6d5d8e4081f79d545
+6864b89ad5d8e4081f79c67e
+6864b99fd5d8e4081f79cbe2
+6864ba11d5d8e4081f79ce40
+6864d73ed5d8e4081f7a1a76
+6864da4cd5d8e4081f7a1c17
+6864ccead5d8e4081f7a05d0
+6864cf8ad5d8e4081f7a1122
+68649fb1d5d8e4081f7916a7
+68651eddd5d8e4081f7c3e3c
+68649c1ad5d8e4081f790027
+68649ce3d5d8e4081f7906b4
+68649e3bd5d8e4081f791041
+68652391d5d8e4081f7c4dae
+6864eb5fd5d8e4081f7a600d
+6864eb89d5d8e4081f7a7e1f
+6864eb82d5d8e4081f7a7901
+6864eb46d5d8e4081f7a3eaf
+68643d5ed5d8e4081f78347c
+6864f328d5d8e4081f7afe0c
+6864f438d5d8e4081f7b05a1
+6864f8c0d5d8e4081f7b2425
+68648b17d5d8e4081f78a3a6
+6864371cd5d8e4081f781648
+68640d5bd5d8e4081f77a19c
+68640d5cd5d8e4081f77a1f6
+6864063ed5d8e4081f776650
+68640702d5d8e4081f776f37
+686407abd5d8e4081f77737f
+68640e9fd5d8e4081f77abcc
+68640babd5d8e4081f77988d
+686411bad5d8e4081f77b9a9
+6864eba4d5d8e4081f7a90e0
+6864ec8ad5d8e4081f7acfdf
+6864ef1ad5d8e4081f7adf15
+6864efc4d5d8e4081f7ae50c
+6864ebcdd5d8e4081f7aae5e
+6864ebf8d5d8e4081f7aca8f
+6864ebf1d5d8e4081f7ac75b
+68650780d5d8e4081f7ba7af
+686507e4d5d8e4081f7bacd4
+686506b4d5d8e4081f7ba03b
+686500fed5d8e4081f7b6559
+68650b72d5d8e4081f7bd1d0
+68650d03d5d8e4081f7bdeee
+68650d0fd5d8e4081f7be04d
+68650c44d5d8e4081f7bd83f
+68650c47d5d8e4081f7bd8f4
+68650d98d5d8e4081f7be414
+6865154ad5d8e4081f7c16a7
+686513d6d5d8e4081f7c0f2a
+68650f7ed5d8e4081f7bf59a
+6865070cd5d8e4081f7ba44b
+68650caed5d8e4081f7bdbf4
+6864ebead5d8e4081f7ac273
+6864eb8bd5d8e4081f7a7fc7
+6864eb5bd5d8e4081f7a5a6b
+6864f442d5d8e4081f7b0613
+6864f07fd5d8e4081f7aea4f
+6864efd9d5d8e4081f7ae5b6
+6864edd7d5d8e4081f7ad811
+6864eb3bd5d8e4081f7a302e
+6864eb38d5d8e4081f7a2c1e
+6864eb37d5d8e4081f7a2b2c
+6864eb46d5d8e4081f7a3efd
+6864eb4bd5d8e4081f7a45f2
+6864f975d5d8e4081f7b2a9b
+6864979dd5d8e4081f78e037
+6864bf80d5d8e4081f79e114
+6864bb1dd5d8e4081f79d261
+686523e2d5d8e4081f7c4ec0
+68649d37d5d8e4081f790927
+68651fd5d5d8e4081f7c40c5
+68652a01d5d8e4081f7c5fb5
+6864a255d5d8e4081f79301f
+6864a629d5d8e4081f79486c
+686534d5d5d8e4081f7c7c7d
+68653adfd5d8e4081f7c862d
+6864ab4dd5d8e4081f796e10
+6864fd8ed5d8e4081f7b4764
+6864911cd5d8e4081f78c190
+6864540ed5d8e4081f785048
+68648f61d5d8e4081f78b9d8
+686488bad5d8e4081f78949d
+686488cfd5d8e4081f789501
+68648872d5d8e4081f78931e
+6864816fd5d8e4081f787cf7
+68647ee4d5d8e4081f787736
+68648382d5d8e4081f7881d7
+686421b7d5d8e4081f77f2b2
+68643ce7d5d8e4081f782f37
+686444d3d5d8e4081f78444f
+6864087ad5d8e4081f777cb0
+6864065fd5d8e4081f7767e2
+68641b9ad5d8e4081f77dbce
+6864b615d5d8e4081f79b480
+6864b423d5d8e4081f79a639
+6864b439d5d8e4081f79a6e2
+6864ad2ad5d8e4081f797827
+6865405dd5d8e4081f7c8f76
+6864af14d5d8e4081f7981e9
+68654404d5d8e4081f7c973b
+6864c3bad5d8e4081f79ec75
+68654daed5d8e4081f7ca828
+6864c846d5d8e4081f79f739
+6864c8bfd5d8e4081f79f864
+68650b9cd5d8e4081f7bd376
+68650c2cd5d8e4081f7bd659
+68650d1ad5d8e4081f7be106
+68651244d5d8e4081f7c07cf
+686511fdd5d8e4081f7c069d
+686505a5d5d8e4081f7b9485
+686508bed5d8e4081f7bb766
+68651c8bd5d8e4081f7c34f3
+686506ccd5d8e4081f7ba20f
+686505a6d5d8e4081f7b94df
+68650961d5d8e4081f7bbedf
+6864fa45d5d8e4081f7b2fd9
+6864fbecd5d8e4081f7b3b8b
+6865015dd5d8e4081f7b6888
+68650167d5d8e4081f7b68af
+68650211d5d8e4081f7b6ee7
+6864fecfd5d8e4081f7b52f7
+686495d0d5d8e4081f78d4bc
+68643f2ad5d8e4081f783a16
+68643eedd5d8e4081f7839b2
+6864082ad5d8e4081f7777d9
+68640a17d5d8e4081f778c23
+68640721d5d8e4081f776fba
+68640e16d5d8e4081f77a6a8
+6864cbcad5d8e4081f7a01d6
+6864eb38d5d8e4081f7a2bcb
+6864b3bcd5d8e4081f79a2c9
+6864b4b9d5d8e4081f79ab43
+6864b573d5d8e4081f79b134
+68649e7bd5d8e4081f7910f7
+68649ce4d5d8e4081f79070d
+6864eb6dd5d8e4081f7a6a9c
+6864eb84d5d8e4081f7a7ad5
+6864eb56d5d8e4081f7a53ea
+6864eb59d5d8e4081f7a581e
+6864eb52d5d8e4081f7a4e66
+6864ee55d5d8e4081f7ada68
+6864eb8ed5d8e4081f7a81f5
+6864ebd2d5d8e4081f7ab12a
+68653e34d5d8e4081f7c8bb4
+6864adb1d5d8e4081f797ab1
+6864b179d5d8e4081f798eaa
+6865375dd5d8e4081f7c80f5
+6864a97fd5d8e4081f79622c
+68655294d5d8e4081f7cb04a
+68655129d5d8e4081f7cae0f
+6864b740d5d8e4081f79bdce
+6864b682d5d8e4081f79b90e
+6864b682d5d8e4081f79b906
+6864b88ed5d8e4081f79c5bc
+6864b813d5d8e4081f79c3ff
+686529edd5d8e4081f7c5f5a
+686528f8d5d8e4081f7c5dd8
+686526ccd5d8e4081f7c58d7
+686473c1d5d8e4081f786a3e
+686497cfd5d8e4081f78e0dc
+6864f4c0d5d8e4081f7b0962
+6864f652d5d8e4081f7b12c2
+68648505d5d8e4081f7885a3
+68648d8dd5d8e4081f78b38e
+68648e19d5d8e4081f78b572
+686489a1d5d8e4081f7899fd
+68648a09d5d8e4081f789bc6
+68648a3cd5d8e4081f789c72
+68644014d5d8e4081f783b65
+68645e69d5d8e4081f785a45
+6865087dd5d8e4081f7bb408
+68650ee0d5d8e4081f7bf03f
+686506a9d5d8e4081f7b9f3f
+68650d03d5d8e4081f7bdf14
+68650530d5d8e4081f7b9006
+68649576d5d8e4081f78d2dc
+686494aad5d8e4081f78cfb8
+68649332d5d8e4081f78c9cf
+6864961ad5d8e4081f78d70d
+6864eb51d5d8e4081f7a4cc6
+6864eb5bd5d8e4081f7a5a83
+686409edd5d8e4081f778a90
+68640a17d5d8e4081f778c22
+68640e02d5d8e4081f77a614
+686411ced5d8e4081f77b9ca
+68640675d5d8e4081f776900
+68643e5fd5d8e4081f7836f4
+68643c5ad5d8e4081f782d42
+6864ceead5d8e4081f7a0e40
+68654e4fd5d8e4081f7ca8e1
+686552dcd5d8e4081f7cb122
+6864cbead5d8e4081f7a027e
+686552bdd5d8e4081f7cb0d8
+6864bc31d5d8e4081f79d62f
+6864c21bd5d8e4081f79e80b
+6864bdcbd5d8e4081f79dbe4
+6864b2a4d5d8e4081f79990d
+68653ef1d5d8e4081f7c8d00
+6864af14d5d8e4081f798205
+6864aef4d5d8e4081f798145
+6864b717d5d8e4081f79bd53
+6864b70bd5d8e4081f79bc52
+6864b792d5d8e4081f79bf2a
+6864ebb8d5d8e4081f7a9f1b
+6864f7e4d5d8e4081f7b1ddd
+6864f57dd5d8e4081f7b0e25
+6864f367d5d8e4081f7b0011
+6864f2e3d5d8e4081f7afc30
+6864a2efd5d8e4081f79346a
+68652449d5d8e4081f7c503c
+686524a4d5d8e4081f7c50b3
+686526c1d5d8e4081f7c586d
+6864a9b4d5d8e4081f796361
+6864a7dbd5d8e4081f795683
+68653370d5d8e4081f7c7845
+6864a656d5d8e4081f794ae7
+6864a679d5d8e4081f794d44
+68653077d5d8e4081f7c7071
+6864a032d5d8e4081f791bbd
+6864a0a4d5d8e4081f7922cd
+68649ffcd5d8e4081f791982
+68649810d5d8e4081f78e2c6
+686490aad5d8e4081f78bf43
+68649232d5d8e4081f78c677
+6864914ad5d8e4081f78c268
+6864ff05d5d8e4081f7b54e4
+6864fd63d5d8e4081f7b45d2
+68647c45d5d8e4081f7871f5
+68648a3cd5d8e4081f789c8e
+68648a72d5d8e4081f789ebf
+68645341d5d8e4081f784e2a
+68641f7ad5d8e4081f77ea17
+686419b0d5d8e4081f77d5dc
+6864eb7ed5d8e4081f7a76bd
+6864eb3ed5d8e4081f7a3400
+6864d0d2d5d8e4081f7a15da
+6864eb38d5d8e4081f7a2b87
+68650b65d5d8e4081f7bd01c
+68651b45d5d8e4081f7c312d
+68651b07d5d8e4081f7c3011
+68651198d5d8e4081f7c048f
+6864fb95d5d8e4081f7b399d
+68650674d5d8e4081f7b9ddb
+68650660d5d8e4081f7b9d35
+68650c50d5d8e4081f7bd958
+6864fcc3d5d8e4081f7b40ef
+6864ff3ad5d8e4081f7b56be
+686510f5d5d8e4081f7c0117
+686510b8d5d8e4081f7bfec8
+68649591d5d8e4081f78d310
+686493ded5d8e4081f78cc9c
+686494a4d5d8e4081f78cf9b
+6864a3dfd5d8e4081f793b39
+686526e8d5d8e4081f7c5932
+68649fd1d5d8e4081f7917a9
+68649df4d5d8e4081f790e3e
+68643f13d5d8e4081f7839ec
+686484a9d5d8e4081f7884eb
+6864837bd5d8e4081f7881cd
+6864816fd5d8e4081f787cf2
+68647ca0d5d8e4081f78728d
+6864eb9bd5d8e4081f7a8ad0
+6864eb8cd5d8e4081f7a8095
+6864ebabd5d8e4081f7a95ed
+6864ebb8d5d8e4081f7a9fa7
+6864ebc6d5d8e4081f7aa921
+6864ebc1d5d8e4081f7aa5da
+6864b621d5d8e4081f79b57a
+6864bacbd5d8e4081f79d0f0
+6864ba1cd5d8e4081f79ce70
+6864b323d5d8e4081f799d39
+6864b375d5d8e4081f79a102
+6864b456d5d8e4081f79a7d3
+6864aed5d5d8e4081f7980d3
+6864af8ad5d8e4081f798463
+6864d04dd5d8e4081f7a13be
+68655402d5d8e4081f7cb379
+6864d271d5d8e4081f7a180e
+68655023d5d8e4081f7cac86
+6864eb36d5d8e4081f7a2964
+6864eb36d5d8e4081f7a28ee
+686497b1d5d8e4081f78e08d
+68649a83d5d8e4081f78f1ff
+6864ac8ed5d8e4081f7974d4
+68652b6dd5d8e4081f7c6400
+68653291d5d8e4081f7c764a
+6864eb58d5d8e4081f7a56a4
+6864eb76d5d8e4081f7a7079
+6864bbcbd5d8e4081f79d48c
+6864b89ad5d8e4081f79c6b0
+6864b7d2d5d8e4081f79c142
+6864c022d5d8e4081f79e368
+6864c29fd5d8e4081f79e9a8
+6864f20bd5d8e4081f7af5d4
+68648961d5d8e4081f789812
+68648c46d5d8e4081f78aca0
+68648ab1d5d8e4081f78a01a
+68648b04d5d8e4081f78a28e
+68648cc4d5d8e4081f78afe4
+6864f572d5d8e4081f7b0ddc
+6864f449d5d8e4081f7b063e
+68645418d5d8e4081f785063
+68643398d5d8e4081f7807ac
+686491d5d5d8e4081f78c4a6
+686491ced5d8e4081f78c466
+686491b9d5d8e4081f78c442
+686492c1d5d8e4081f78c872
+68640b4bd5d8e4081f77963f
+6864098ad5d8e4081f778771
+686408bdd5d8e4081f778085
+68640aaed5d8e4081f77917f
+68640da5d5d8e4081f77a3cc
+686407e2d5d8e4081f777526
+686407f5d5d8e4081f7775ec
+68640862d5d8e4081f777ad4
+6864133fd5d8e4081f77c10f
+6864178cd5d8e4081f77d06c
+68641513d5d8e4081f77c5eb
+68641e41d5d8e4081f77e611
+68641f1ed5d8e4081f77e87e
+6864fc1cd5d8e4081f7b3cd4
+6864fc29d5d8e4081f7b3d32
+686503dcd5d8e4081f7b8049
+6864fa50d5d8e4081f7b304e
+68651b30d5d8e4081f7c30a5
+686505b0d5d8e4081f7b9556
+68650a39d5d8e4081f7bc6af
+68650b4fd5d8e4081f7bceeb
+68650d59d5d8e4081f7be295
+68650c99d5d8e4081f7bdbc7
+68651128d5d8e4081f7c024b
+686506a9d5d8e4081f7b9fb4
+686508add5d8e4081f7bb6c7
+68650eb6d5d8e4081f7bee93
+68650dd8d5d8e4081f7be6a0
+68650deed5d8e4081f7be7ad
+68650d59d5d8e4081f7be283
+6864fb03d5d8e4081f7b359e
+6864b535d5d8e4081f79adbb
+6864b2f6d5d8e4081f799a70
+6864b2f7d5d8e4081f799aec
+6864ae82d5d8e4081f797f1b
+6865422fd5d8e4081f7c936f
+6864bd7ad5d8e4081f79db4b
+6864a415d5d8e4081f793c84
+686539efd5d8e4081f7c8507
+6864a7efd5d8e4081f795737
+6864a7f9d5d8e4081f7957d3
+6864aafad5d8e4081f796c7e
+68644248d5d8e4081f7840d8
+68640995d5d8e4081f778829
+68640941d5d8e4081f778598
+686410d9d5d8e4081f77b625
+68642364d5d8e4081f77f778
+686420f5d5d8e4081f77efd4
+68641639d5d8e4081f77c8db
+68641cbfd5d8e4081f77e022
+6864201dd5d8e4081f77ec98
+68641e7bd5d8e4081f77e673
+68641fffd5d8e4081f77ec4b
+686408b2d5d8e4081f778014
+6864087ad5d8e4081f777cde
+68642eb4d5d8e4081f78032b
+686455d9d5d8e4081f7853ae
+6864eb53d5d8e4081f7a508b
+6864eb4cd5d8e4081f7a4735
+6864eb4ed5d8e4081f7a49da
+6864eb38d5d8e4081f7a2cd2
+6864eb38d5d8e4081f7a2cc5
+6864eb3fd5d8e4081f7a35d9
+6864eb34d5d8e4081f7a265a
+6864eb65d5d8e4081f7a64f1
+68649350d5d8e4081f78ca8c
+6864eba2d5d8e4081f7a8f9a
+6864ebdbd5d8e4081f7ab7d7
+6864eb73d5d8e4081f7a6ecd
+6864eb77d5d8e4081f7a71a3
+6864ed5bd5d8e4081f7ad58d
+6864ec55d5d8e4081f7acdd9
+68647f04d5d8e4081f7877b6
+68648bddd5d8e4081f78a9fc
+6864870fd5d8e4081f788bbf
+68648c50d5d8e4081f78acb3
+68648c99d5d8e4081f78ae16
+686487e9d5d8e4081f788fdc
+6864f4ead5d8e4081f7b0a76
+6864f37cd5d8e4081f7b0093
+6864f0dcd5d8e4081f7aece8
+6864f164d5d8e4081f7af16d
+6864f15ad5d8e4081f7af133
+6864f7efd5d8e4081f7b1e17
+6864a1bad5d8e4081f792b97
+686527e6d5d8e4081f7c5b8a
+68649cafd5d8e4081f79055c
+686520a8d5d8e4081f7c4419
+68649f68d5d8e4081f791539
+68649d37d5d8e4081f790920
+68649db4d5d8e4081f790c17
+68649a1ad5d8e4081f78ef96
+686497d1d5d8e4081f78e16c
+68650aa8d5d8e4081f7bca25
+68650d52d5d8e4081f7be26d
+686517c2d5d8e4081f7c220e
+686518d6d5d8e4081f7c2762
+686509ebd5d8e4081f7bc447
+6865076ad5d8e4081f7ba6e2
+6865070fd5d8e4081f7ba4a7
+686510edd5d8e4081f7c00bc
+686508d5d5d8e4081f7bb8ce
+68650545d5d8e4081f7b9146
+68650f7ed5d8e4081f7bf5bd
+68650f7bd5d8e4081f7bf57e
+686510b8d5d8e4081f7bfea1
+68650392d5d8e4081f7b7cc4
+68642c25d5d8e4081f78015e
+68642147d5d8e4081f77f0e1
+68640bfcd5d8e4081f779ac4
+68640e21d5d8e4081f77a6ff
+68640fddd5d8e4081f77b249
+6864105fd5d8e4081f77b460
+686406c2d5d8e4081f776ccf
+686406d8d5d8e4081f776dc1
+68640780d5d8e4081f777245
+6864eba3d5d8e4081f7a9076
+6864ebd6d5d8e4081f7ab431
+6864ebc3d5d8e4081f7aa6f7
+6864ecdad5d8e4081f7ad1d9
+6864ec6ad5d8e4081f7ace4d
+6864ebf0d5d8e4081f7ac6e6
+6864f220d5d8e4081f7af682
+6864eb7cd5d8e4081f7a7522
+6864eb63d5d8e4081f7a6344
+6864eb5dd5d8e4081f7a5de7
+6864eb49d5d8e4081f7a4278
+6864f8cbd5d8e4081f7b247b
+6864f6f3d5d8e4081f7b171e
+6864e157d5d8e4081f7a1ff2
+6864fb37d5d8e4081f7b374b
+686499fad5d8e4081f78eecf
+686498b7d5d8e4081f78e6b8
+68649cbad5d8e4081f7905d3
+68649b59d5d8e4081f78f970
+68649aedd5d8e4081f78f500
+6864a032d5d8e4081f791bba
+6864a053d5d8e4081f791d9e
+6864b899d5d8e4081f79c607
+6864b77dd5d8e4081f79beb6
+6864b700d5d8e4081f79bc1e
+6864b73dd5d8e4081f79bdab
+6864cbfed5d8e4081f7a02f2
+68654b0ad5d8e4081f7ca3bc
+6864ffa3d5d8e4081f7b59d6
+6864a9b5d5d8e4081f7963a3
+6864ac3cd5d8e4081f79739c
+6864a560d5d8e4081f79432b
+6864a678d5d8e4081f794ce7
+6864b3d9d5d8e4081f79a43e
+6864b344d5d8e4081f799eb9
+6864b2b9d5d8e4081f7999a1
+6864b2d1d5d8e4081f799a34
+6864b636d5d8e4081f79b669
+6864b081d5d8e4081f798a12
+6864b191d5d8e4081f79902d
+68649748d5d8e4081f78dde9
+686494aed5d8e4081f78cfce
+68649520d5d8e4081f78d195
+68648a72d5d8e4081f789ec1
+68648ed1d5d8e4081f78b7ba
+68648bdcd5d8e4081f78a9ad
+6864833bd5d8e4081f78816a
+68647ee4d5d8e4081f787749
+68647db3d5d8e4081f787487
+6864a36cd5d8e4081f793812
+686523a6d5d8e4081f7c4e37
+686412a6d5d8e4081f77bdb8
+6864b961d5d8e4081f79cac8
+6864b560d5d8e4081f79af11
+6864b27ad5d8e4081f79978e
+68643d48d5d8e4081f7832d9
+68652a64d5d8e4081f7c60b1
+6864e319d5d8e4081f7a20d3
+6864f234d5d8e4081f7af6e6
+68643febd5d8e4081f783b18
+686408c7d5d8e4081f7780d4
+6864a45ed5d8e4081f793e88
+68640756d5d8e4081f777113
+68640980d5d8e4081f778706
+6864aa27d5d8e4081f796661
+68653fbed5d8e4081f7c8e72
+686406e2d5d8e4081f776dfa
+6865256fd5d8e4081f7c5392
+6865015dd5d8e4081f7b68a2
+68650d78d5d8e4081f7be33d
+68647c50d5d8e4081f78721c
+68653240d5d8e4081f7c75bc
+68649993d5d8e4081f78ecd7
+68650a9dd5d8e4081f7bc966
+68640675d5d8e4081f7768dc
+686495dbd5d8e4081f78d4ef
+6864585cd5d8e4081f7856bd
+6864f4ced5d8e4081f7b09b3
+686456a4d5d8e4081f785564
+6864eb81d5d8e4081f7a7866
+6864a69dd5d8e4081f794ee0
+6864adf9d5d8e4081f797c41
+68645783d5d8e4081f785620
+6864838cd5d8e4081f78823d
+6864f7d7d5d8e4081f7b1d5f
+68640a3bd5d8e4081f778d69
+6864eb59d5d8e4081f7a5893
+68641cc9d5d8e4081f77e06b
+6864b8f7d5d8e4081f79c854
+686442a4d5d8e4081f78419a
+686409a9d5d8e4081f7788a5
+6864b3d8d5d8e4081f79a331
+6864c49cd5d8e4081f79ee4d
+686529f4d5d8e4081f7c5f69
+68655131d5d8e4081f7cae30
+686409edd5d8e4081f778a8a
+68648b33d5d8e4081f78a532
+6864fa1cd5d8e4081f7b2ef2
+6864abe9d5d8e4081f797214
+68640885d5d8e4081f777d3e
+68651d6dd5d8e4081f7c38b6
+68650401d5d8e4081f7b8284
+6864f7efd5d8e4081f7b1e5a
+6864ed1cd5d8e4081f7ad3c2
+6864faaed5d8e4081f7b32c2
+68641aced5d8e4081f77d956
+6864c55ed5d8e4081f79eff8
+6864ebd4d5d8e4081f7ab2bd
+6864086ed5d8e4081f777b33
+6865298fd5d8e4081f7c5ed8
+6864f786d5d8e4081f7b1b6d
+6864f12fd5d8e4081f7aef32
+686513a3d5d8e4081f7c0e26
+6864ebded5d8e4081f7ab9b4
+6864eb3ed5d8e4081f7a337d
+6864f955d5d8e4081f7b2988
+68641ca4d5d8e4081f77df4f
+68653142d5d8e4081f7c735f
+68647f9bd5d8e4081f787917
+68648278d5d8e4081f787f6e
+68644722d5d8e4081f784880
+68644816d5d8e4081f784974
+68650a3fd5d8e4081f7bc6c3
+68644109d5d8e4081f783d40
+6864b7e0d5d8e4081f79c21b
+6864ebdcd5d8e4081f7ab87f
+686507b7d5d8e4081f7baa71
+68650dadd5d8e4081f7be4bf
+6864ebb6d5d8e4081f7a9db3
+6864f9d3d5d8e4081f7b2d59
+68646fe3d5d8e4081f786609
+68652e97d5d8e4081f7c6aa7
+68654f92d5d8e4081f7cab5b
+686512aad5d8e4081f7c0968
+686509f6d5d8e4081f7bc4c7
+686504dad5d8e4081f7b8c78
+68649728d5d8e4081f78dcee
+6864eb9bd5d8e4081f7a8b27
+68653077d5d8e4081f7c7063
+68652275d5d8e4081f7c4acf
+68652c62d5d8e4081f7c66a0
+68648e96d5d8e4081f78b6f8
+6864f0b3d5d8e4081f7aebad
+686408d2d5d8e4081f778194
+68651ec3d5d8e4081f7c3d7e
+686516bcd5d8e4081f7c1d1a
+68650abfd5d8e4081f7bcc09
+68641ccdd5d8e4081f77e089
+6864eb7bd5d8e4081f7a73d7
+6864f786d5d8e4081f7b1b4c
+6864fb42d5d8e4081f7b37eb

+ 62 - 0
tools/从mongo库导出数据execl/bak.py

@@ -0,0 +1,62 @@
+# 导入必要的库
+from pymongo import MongoClient
+import pandas as pd
+import pytz  # 用于处理时区
+def export_to_excel(db_name, collection_name, fields, output_file):
+    """
+    从MongoDB导出特定字段到Excel文件。
+
+    参数:
+    - db_name: 数据库名称
+    - collection_name: 集合名称
+    - fields: 要导出的字段列表(例如 ['name', 'age'])
+    - output_file: 输出的Excel文件名
+    """
+    # 连接到MongoDB
+    client = MongoClient('mongodb://172.20.45.129:27002/')
+    # client = MongoClient('mongodb://127.0.0.1:27087/', unicode_decode_error_handler="ignore",directConnection=True)  # 清洗库
+
+    db = client[db_name]
+    collection = db[collection_name]
+
+    # 构建查询和投影
+    projection = {field: 1 for field in fields}
+
+    # 查询数据
+    data = collection.find({"flag_liumiao": 1},projection).sort("_id", -1)
+
+    # 将数据转换为DataFrame
+    df = pd.DataFrame(list(data))
+
+    # 转换时间戳字段
+    time_fields = ['bidopentime', 'bidendtime']
+    for field in time_fields:
+        if field in df.columns:
+            # 1. 转换为 datetime 对象(秒级时间戳)
+            df[field] = pd.to_datetime(df[field], unit='s', errors='coerce')
+            # 2. 转换为北京时间(UTC+8)
+            beijing_tz = pytz.timezone('Asia/Shanghai')
+            df[field] = df[field].dt.tz_localize('UTC').dt.tz_convert(beijing_tz)
+            # 3. 去掉时区信息,保留纯时间(否则Excel可能显示异常)
+            df[field] = df[field].dt.tz_localize(None)
+
+    # 导出到Excel文件
+    df.to_excel(output_file, index=False)
+
+if __name__ == "__main__":
+    # 连接到 MongoDB
+
+    db_name = 'wjh'  # 替换为你的数据库名称
+    # db_name = 'jyqyfw'  # 替换为你的数据库名称
+    # collection_name = 'standard_sample_data_all_ai' # 替换为你的集合名称
+    collection_name = 'usermail_Unicom_1_2_pkg'  # 替换为你的集合名称
+    # 定义参数
+
+    fields = ['_id','site','toptype','subtype','area','city','buyer','projectname','projectcode','budget','s_winner','bidamount','label','href','jybxhref','package']  # 替换为你需要导出的字段
+    # fields = ['_id','id','site','href','jybxhref','spidercode','projectinfo']  # 替换为你需要导出的字段
+    output_file = 'output.xlsx'
+
+    # 调用函数导出数据
+    export_to_excel(db_name, collection_name, fields, output_file)
+    print(f"数据已成功导出到 {output_file}")
+

TEMPAT SAMPAH
tools/从mongo库导出数据execl/bidding_results.xlsx


+ 22 - 17
tools/从mongo库导出数据execl/mongo_to_execl.py

@@ -2,6 +2,7 @@
 from pymongo import MongoClient
 import pandas as pd
 import pytz  # 用于处理时区
+
 def export_to_excel(db_name, collection_name, fields, output_file):
     """
     从MongoDB导出特定字段到Excel文件。
@@ -13,7 +14,9 @@ def export_to_excel(db_name, collection_name, fields, output_file):
     - output_file: 输出的Excel文件名
     """
     # 连接到MongoDB
-    client = MongoClient('mongodb://172.20.45.129:27002/')
+    # client = MongoClient('mongodb://172.20.45.129:27002/')
+    client = MongoClient('mongodb://127.0.0.1:27087/', unicode_decode_error_handler="ignore",directConnection=True)  # 修改为你的连接地址
+
     # client = MongoClient('mongodb://127.0.0.1:27087/', unicode_decode_error_handler="ignore",directConnection=True)  # 清洗库
 
     db = client[db_name]
@@ -23,22 +26,22 @@ def export_to_excel(db_name, collection_name, fields, output_file):
     projection = {field: 1 for field in fields}
 
     # 查询数据
-    data = collection.find({"mark_1": 1},projection).sort("_id", -1)
+    data = collection.find({"tag": 11},projection).sort("_id", 1)
 
     # 将数据转换为DataFrame
     df = pd.DataFrame(list(data))
 
-    # 转换时间戳字段
-    time_fields = ['bidopentime', 'bidendtime']
-    for field in time_fields:
-        if field in df.columns:
-            # 1. 转换为 datetime 对象(秒级时间戳)
-            df[field] = pd.to_datetime(df[field], unit='s', errors='coerce')
-            # 2. 转换为北京时间(UTC+8)
-            beijing_tz = pytz.timezone('Asia/Shanghai')
-            df[field] = df[field].dt.tz_localize('UTC').dt.tz_convert(beijing_tz)
-            # 3. 去掉时区信息,保留纯时间(否则Excel可能显示异常)
-            df[field] = df[field].dt.tz_localize(None)
+    # # 转换时间戳字段
+    # time_fields = ['bidopentime', 'bidendtime']
+    # for field in time_fields:
+    #     if field in df.columns:
+    #         # 1. 转换为 datetime 对象(秒级时间戳)
+    #         df[field] = pd.to_datetime(df[field], unit='s', errors='coerce')
+    #         # 2. 转换为北京时间(UTC+8)
+    #         beijing_tz = pytz.timezone('Asia/Shanghai')
+    #         df[field] = df[field].dt.tz_localize('UTC').dt.tz_convert(beijing_tz)
+    #         # 3. 去掉时区信息,保留纯时间(否则Excel可能显示异常)
+    #         df[field] = df[field].dt.tz_localize(None)
 
     # 导出到Excel文件
     df.to_excel(output_file, index=False)
@@ -46,14 +49,16 @@ def export_to_excel(db_name, collection_name, fields, output_file):
 if __name__ == "__main__":
     # 连接到 MongoDB
 
-    db_name = 'wjh'  # 替换为你的数据库名称
+    db_name = 'jyqyfw'  # 替换为你的数据库名称
     # db_name = 'jyqyfw'  # 替换为你的数据库名称
     # collection_name = 'standard_sample_data_all_ai' # 替换为你的集合名称
-    collection_name = 'unicom_1_2'  # 替换为你的集合名称
+    # collection_name = 'xzh_20250714'  # 替换为你的集合名称
+    collection_name = 'xzh_20250714_1'  # 替换为你的集合名称
     # 定义参数
 
-    fields = ['_id','site','toptype','subtype','area','city','buyer','projectname','projectcode','budget','s_winner','bidamount','bidopentime','bidendtime','label','href','jybxhref','spidercode']  # 替换为你需要导出的字段
-    # fields = ['_id','id','site','href','jybxhref','spidercode','projectinfo']  # 替换为你需要导出的字段
+    # fields = ['_id','id','site','toptype','subtype','area','city','buyer','projectname','projectcode','budget','s_winner','bidamount','label','href','jybxhref','package']  # 替换为你需要导出的字段
+    # fields = ['id','site','toptype','subtype','area','city','buyer','projectname','projectcode','budget','s_winner','bidamount','label','href','jybxhref']  # 替换为你需要导出的字段
+    fields = ['id','title','projectname','href','projectcode','subtype','s_winner','bidamount','buyer']  # 替换为你需要导出的字段
     output_file = 'output.xlsx'
 
     # 调用函数导出数据

+ 85 - 0
tools/从mongo库导出数据execl/mongo_to_execl_多包.py

@@ -0,0 +1,85 @@
+# 导入必要的库
+from pymongo import MongoClient
+import pandas as pd
+import pytz  # 用于处理时区
+
+
+def export_to_excel(db_name, collection_name, fields, output_file):
+    """
+    从MongoDB导出特定字段到Excel文件。
+
+    参数:
+    - db_name: 数据库名称
+    - collection_name: 集合名称
+    - fields: 要导出的字段列表(例如 ['name', 'age'])
+    - output_file: 输出的Excel文件名
+    """
+    # 连接到MongoDB
+    client = MongoClient('mongodb://172.20.45.129:27002/')
+    # client = MongoClient('mongodb://127.0.0.1:27087/', unicode_decode_error_handler="ignore",directConnection=True)  # 清洗库
+
+    db = client[db_name]
+    collection = db[collection_name]
+
+    # 构建查询和投影
+    projection = {field: 1 for field in fields}
+
+    # 查询数据
+    data = collection.find({"flag_liumiao": 1}, projection).sort("_id", -1)
+
+    # 将数据转换为DataFrame
+    df = pd.DataFrame(list(data))
+
+    # 处理package字段,展开为多个列
+    if 'package' in df.columns:
+        # 创建一个空的DataFrame来存储展开后的package数据
+        package_df = pd.DataFrame()
+
+        # 遍历每一行的package字段
+        for idx, row in df.iterrows():
+            if isinstance(row['package'], dict):
+                # 遍历每个标包
+                for package_name, package_info in row['package'].items():
+                    # 为每个标包创建列
+                    if isinstance(package_info, dict):
+                        for field in ['winner', 'bidamount']:
+                            col_name = f"{package_name}_{field}"
+                            package_df.at[idx, col_name] = package_info.get(field)
+
+        # 将展开后的package数据合并到原DataFrame
+        df = pd.concat([df, package_df], axis=1)
+
+        # 删除原始的package列
+        df = df.drop(columns=['package'])
+
+    # 转换时间戳字段
+    time_fields = ['bidopentime', 'bidendtime']
+    for field in time_fields:
+        if field in df.columns:
+            # 1. 转换为 datetime 对象(秒级时间戳)
+            df[field] = pd.to_datetime(df[field], unit='s', errors='coerce')
+            # 2. 转换为北京时间(UTC+8)
+            beijing_tz = pytz.timezone('Asia/Shanghai')
+            df[field] = df[field].dt.tz_localize('UTC').dt.tz_convert(beijing_tz)
+            # 3. 去掉时区信息,保留纯时间(否则Excel可能显示异常)
+            df[field] = df[field].dt.tz_localize(None)
+
+    # 导出到Excel文件
+    df.to_excel(output_file, index=False)
+
+
+if __name__ == "__main__":
+    # 连接到 MongoDB
+    db_name = 'wjh'  # 替换为你的数据库名称
+    # db_name = 'jyqyfw'  # 替换为你的数据库名称
+    # collection_name = 'standard_sample_data_all_ai' # 替换为你的集合名称
+    collection_name = 'usermail_Unicom_1_2_pkg'  # 替换为你的集合名称
+    # 定义参数
+    fields = ['_id', 'site', 'toptype', 'subtype', 'area', 'city', 'buyer', 'projectname', 'projectcode', 'budget',
+              's_winner', 'bidamount', 'label', 'href', 'jybxhref', 'package']  # 替换为你需要导出的字段
+    # fields = ['_id','id','site','href','jybxhref','spidercode','projectinfo']  # 替换为你需要导出的字段
+    output_file = 'output.xlsx'
+
+    # 调用函数导出数据
+    export_to_excel(db_name, collection_name, fields, output_file)
+    print(f"数据已成功导出到 {output_file}")

TEMPAT SAMPAH
tools/从mongo库导出数据execl/output.xlsx


TEMPAT SAMPAH
tools/从mongo库导出数据execl/output_fujian.xlsx


+ 54 - 0
tools/从mongo库导出数据execl/根据mongoid导出数据.py

@@ -0,0 +1,54 @@
+from bson import ObjectId
+from pymongo import MongoClient
+import csv
+import openpyxl  # For Excel file operations
+
+def process_tagged_documents():
+    # 直接在URI中包含用户名和密码
+    username = "viewdata"
+    password = "viewdata"
+    host = "127.0.0.1"  # 例如: localhost 或 192.168.1.100
+    port = "27088"  # 默认MongoDB端口
+
+    # 构建连接URI
+    mongo_uri = f"mongodb://{username}:{password}@{host}:{port}/"
+
+
+    # 连接MongoDB
+    client2 = MongoClient(mongo_uri,unicode_decode_error_handler="ignore", directConnection=True)  #bidding库
+
+    # 定义数据库和集合
+    db2 = client2['qfw']  # 替换为实际的数据库2名称
+
+    collection2 = db2['bidding']  # 替换为实际的bidding集合名称
+    # Create a new Excel workbook and worksheet
+    workbook = openpyxl.Workbook()
+    worksheet = workbook.active
+    worksheet.title = "Bidding Data"
+    # 读取 CSV 文件中的 spidercodes
+    with open('_id.csv', mode='r', encoding='utf-8') as csv_file:
+        csv_reader = csv.reader(csv_file)
+        next(csv_reader)  # 跳过标题行
+        for row in csv_reader:
+            _id = row[0]
+            doc_id = ObjectId(_id)
+
+            # 在库2的bidding集合中查找该id
+            bidding_doc = collection2.find_one({'_id': doc_id})
+            if bidding_doc:
+                # 提取需要的字段
+                # Prepare data for Excel
+                result = [
+                    str(doc_id),  # Convert ObjectId to string
+                    bidding_doc.get('site', ''),
+                    bidding_doc.get('href', '')
+                ]
+                worksheet.append(result)
+            print(result)
+    # Save the Excel file
+    excel_filename = 'bidding_results.xlsx'
+    workbook.save(excel_filename)
+    print(f"Results saved to {excel_filename}")
+
+if __name__ == '__main__':
+    process_tagged_documents()

TEMPAT SAMPAH
tools/周报/周报表格导出/mongo_data_statistics_combined1.xlsx


+ 49 - 55
tools/数据抽样/fix_site_data_export.py

@@ -1,63 +1,57 @@
 from pymongo import MongoClient
 #从已知站点导出N条样本数据,每个站点导出M条数据
 
-def sample_data(N,M):
-    # 连接MongoDB数据库
-    db = MongoClient('192.168.3.149', 27180, unicode_decode_error_handler="ignore").data_quality
-    collection = db["bidding_20250123"]
-    # 把符合条件的站点名称存起来
-    site_list = {"中粮贸易阳光采购平台","航天电子采购平台","青海省政府采购电子卖场","金正大集团电子采购平台",
-"建华建材电子采购平台",
-"淄博市政府采购网上商城",
-"福建省宁德市政府采购网"}
-    # 初始化已标记的文档数量
+def sample_data_random(N, M):
+    client = MongoClient('172.20.45.129', 27002, unicode_decode_error_handler="ignore")
+    db = client.data_quality
+    collection = db.bidding_20250702
+
+    site_list = {
+        "应进必进阳光交易农村三资数字交易平台",
+        "东方希望数字化采购平台",
+        "首创股份电子商务平台",
+        "南充市政府采购网上商城",
+        "中国铁塔在线商务平台",
+        "公采云",
+        "甘肃省阳光招标采购平台",
+        '招采通',
+        '中国邮政电子采购与供应平台',
+        '济南公共资源交易中心'
+    }
+
     marked_count = 0
-    marked_site_count = 0
-    # 选取每个站点数据量
     for site in site_list:
         if marked_count >= N:
-            break  # 如果已经达到或超过目标数量,停止处理
-        marked_site_count = 0
-        # 聚合查询
+            break
+
+        # 检查该站点的数据量是否足够
+        site_count = collection.count_documents({"site": site})
+        if site_count == 0:
+            print(f"站点 {site} 无数据,跳过")
+            continue
+
+        # 计算实际要抽的数量(避免超过 M 或剩余需要的 N - marked_count)
+        sample_size = min(M, N - marked_count, site_count)
+
+        # 使用 $sample 随机抽取
         pipeline = [
-            {
-                '$match': {'site': site}
-            },
-            {
-                '$group': {
-                     '_id': '$site',
-                    'count': {'$sum': 1}
-                }
-            },
-            {
-                '$sort': {'count': -1}  # 根据 count 降序排序,可选
-            }
+            {"$match": {"site": site}},
+            {"$sample": {"size": sample_size}},
+            {"$project": {"_id": 1}}  # 只返回 _id,减少数据传输
         ]
-        result = collection.aggregate(pipeline)
-        for doc in result:
-            print(f"Field Value: {doc['_id']}, Count: {doc['count']}")
-            # 计算每次抽取的间隔
-            jiange = int(doc['count'] / M)
-
-            # 从每个站点等间隔地取数据
-            for i in range(M):
-                if marked_site_count >= M:
-                    break  # 再次检查是否已达到目标数量
-
-                for info in collection.find({"site": site}).sort("_id", 1).skip(i*jiange).limit(1):
-                    print(f"Updating document with _id: {info['_id']}")
-                    # 更新文档,设置标记
-                    update_result = collection.update_one({"_id": info["_id"]}, {"$set": {"flag": 3}})
-                    if update_result.modified_count == 0:
-                        print("No document updated for _id:", info["_id"])
-                    else:
-                        print("Document updated successfully for _id:", info["_id"])
-                    marked_site_count += 1
-                    marked_count += 1
-
-                    if marked_site_count >= M:
-                        break  # 再次检查是否已达到目标数量
-
-    print(f"Total marked documents: {marked_count}")
-
-sample_data(200,10)
+        sampled_docs = list(collection.aggregate(pipeline))
+
+        # 批量更新标记
+        if sampled_docs:
+            sampled_ids = [doc["_id"] for doc in sampled_docs]
+            update_result = collection.update_many(
+                {"_id": {"$in": sampled_ids}},
+                {"$set": {"flag_liumiao": 1}}
+            )
+            marked_count += update_result.modified_count
+            print(f"站点 {site}: 成功标记 {update_result.modified_count} 条数据")
+
+    print(f"总计标记 {marked_count} 条数据")
+
+
+sample_data_random(100, 10)

+ 12 - 7
tools/数据抽样/sample_data_export_new.py

@@ -1,15 +1,15 @@
 from pymongo import MongoClient
 def sample_data(N):
-    db = MongoClient('172.20.45.129', 27002, unicode_decode_error_handler="ignore").wjh
+    db = MongoClient('172.20.45.129', 27002, unicode_decode_error_handler="ignore").data_quality
     # db = MongoClient('mongodb://127.0.0.1:27087/', unicode_decode_error_handler="ignore",directConnection=True).jyqyfw  # 清洗库
 
-    coll_user = db["unicom_1_2"]
+    coll_user = db["missing_fid_attachments"]
 
-    filter_condition = {"tag_1": 1}
+    # filter_condition = {"tag_1": 1}
     # 获取所有站点及其文档数
     site_list = {}
     site_count = coll_user.aggregate([
-        {"$match": filter_condition},
+        # {"$match": filter_condition},
         {"$group": {"_id": "$site", "count": {"$sum": 1}}},
         {"$sort": {"count": -1}}
     ])
@@ -33,7 +33,12 @@ def sample_data(N):
 
         # 使用随机抽样
         pipeline = [
-            {"$match": {"site": site, **filter_condition}},
+            {"$match": {
+                    "site": site,
+                    # **filter_condition
+                    }
+             },
+            {"$match": {"site": site}},
             {"$sample": {"size": num}},
             {"$project": {"_id": 1}}
         ]
@@ -44,10 +49,10 @@ def sample_data(N):
 
         update_result = coll_user.update_many(
             {"_id": {"$in": sampled_ids}},
-            {"$set": {"mark_1": 1}}
+            {"$set": {"flag": 1}}
         )
         marked_count += update_result.modified_count
         remaining -= update_result.modified_count
 
     print(f"Total marked documents: {marked_count}")
-sample_data(500)
+sample_data(8000)

+ 53 - 0
tools/数据抽样/完全随机抽样.py

@@ -0,0 +1,53 @@
+from pymongo import MongoClient
+
+
+def completely_random_sample(N, db_name="data_quality", collection_name="bidding_20250702"):
+    """
+    完全随机抽样(3万数据量优化版)
+    - 严格无偏随机
+    - 精确控制样本量 = N
+    - 自动过滤 tag=1 或 2 的文档
+    """
+    client = MongoClient('172.20.45.129', 27002, unicode_decode_error_handler="ignore",directConnection=True)
+    db = client[db_name]
+    collection = db[collection_name]
+
+    print(f"目标: 从 {collection_name} 随机抽取 {N} 条数据")
+
+    try:
+        # 1. 检查符合条件的文档总数
+        total_eligible = collection.count_documents({ "pkg_tag" : { "$ne" : 0 }, "mark":1} )
+        # total_eligible = collection.count_documents({})
+        if total_eligible < N:
+            raise ValueError(f"错误: 仅 {total_eligible} 条数据符合条件,无法抽取 {N} 条")
+
+        # 2. 使用 $rand + $sort 随机抽样(比 $sample 更均匀)
+        pipeline = [
+            {"$match": { "pkg_tag" : { "$ne" : 0 }, "mark":1}} ,
+            {"$sample": {"size": N}},
+            {"$project": {"_id": 1}}  # 仅返回 _id
+        ]
+
+        # 3. 执行抽样并获取 _id 列表
+        sampled_ids = [doc["_id"] for doc in collection.aggregate(pipeline)]
+        if len(sampled_ids) != N:
+            raise RuntimeError(f"抽样失败: 仅获取 {len(sampled_ids)} 条数据")
+
+        # 4. 批量标记已抽样文档(可选)
+        collection.update_many(
+            {"_id": {"$in": sampled_ids}},
+            {"$set": {"mark_pkg_duobao": 1}}  # 标记已抽样
+        )
+
+        print(f"成功: 随机抽取并标记 {N} 条数据")
+        return sampled_ids  # 返回抽样结果的 _id 列表(可选)
+
+    except Exception as e:
+        print(f"错误: {str(e)}")
+        return None
+    finally:
+        client.close()
+
+
+# 示例调用
+sampled_ids = completely_random_sample(100)

TEMPAT SAMPAH
tools/数据质量监控平台/kb-数据问题统计/kb_tasks_export.xlsx


TEMPAT SAMPAH
tools/数据质量监控平台/kb-数据问题统计/kb_tasks_export_with_stats.xlsx


TEMPAT SAMPAH
tools/数据质量监控平台/kb-数据问题统计/kb_tasks_特定条件_export.xlsx


+ 25 - 0
tools/数据质量监控平台/kb-数据问题统计/kb错误原因及占比统计.py

@@ -0,0 +1,25 @@
+import pandas as pd
+
+# 读取CSV文件
+df = pd.read_csv('错误原因.csv')
+
+# 统计每个错误原因的数量
+error_stats = df['错误原因'].value_counts().reset_index()
+error_stats.columns = ['错误类别', '数量']
+
+# 计算占比
+total = error_stats['数量'].sum()
+error_stats['占比'] = (error_stats['数量'] / total * 100).round(2).astype(str) + '%'
+
+# 输出到Excel文件
+output_file = '错误原因统计.xlsx'
+with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
+    error_stats.to_excel(writer, index=False, sheet_name='错误统计')
+
+    # 调整列宽
+    worksheet = writer.sheets['错误统计']
+    worksheet.column_dimensions['A'].width = 30  # 错误类别列宽
+    worksheet.column_dimensions['B'].width = 10  # 数量列宽
+    worksheet.column_dimensions['C'].width = 10  # 占比列宽
+
+print(f"统计结果已保存到 {output_file}")

+ 1 - 1
tools/数据质量监控平台/kb-数据问题统计/task_kb.py

@@ -36,7 +36,7 @@ def test_connection():
             user="kanboard",
             password="K99b3e9qa9d",
             database="kanboard",
-            port=19988
+            port=4001
         )
         cursor_local = db_connection_local.cursor()
 

+ 137 - 0
tools/数据质量监控平台/kb-数据问题统计/task_kb_根据条件导出kb数据.py

@@ -0,0 +1,137 @@
+import pymysql
+from pymysql import MySQLError
+from datetime import datetime, timedelta
+import pandas as pd
+
+def close_connection(cursor, connection):
+    """确保数据库连接被关闭"""
+    if cursor:
+        cursor.close()
+    if connection:
+        connection.close()
+
+
+def test_connection():
+    cursor_local = None
+    db_connection_local = None
+    data_list = []  # 用于存储所有要导出的数据
+    processed_task_ids = set()  # 用于记录已处理的任务ID,避免重复
+    try:
+        print("开始连接本地数据库...")
+        db_connection_local = pymysql.connect(
+            host="127.0.0.1",
+            user="kanboard",
+            password="K99b3e9qa9d",
+            database="kanboard",
+            port=4001
+        )
+        cursor_local = db_connection_local.cursor()
+
+        print("开始连接远程数据库...")
+        db_connection_remote = pymysql.connect(
+            host="172.20.45.129",
+            user="root",
+            password="=PDT49#80Z!RVv52_z",
+            database="quality",
+            port=4000
+        )
+
+        print("开始执行查询...")
+        query = """
+        SELECT DISTINCT t.id AS task_id, 
+               t.date_creation, 
+               t.date_moved, 
+               t.external_uri, 
+               t.title,
+               t.description,          
+               t.owner_id, 
+               t.creator_id, 
+               t.column_id
+        FROM tasks t
+        JOIN task_has_tags tht ON t.id = tht.task_id
+        JOIN tags tg ON tht.tag_id = tg.id
+        WHERE t.project_id = 261
+          AND tg.project_id = 261
+          AND tg.name ='20250620'
+        """
+        cursor_local.execute(query)
+        results = cursor_local.fetchall()
+        if not results:
+            print("没有找到符合条件的数据")
+            return
+
+        print(f"查询到 {len(results)} 条数据")
+
+        # 获取 owner_name 和 creator_name
+        cursor_local.execute("SELECT id, name FROM users")
+        users = cursor_local.fetchall()
+        user_dict = {user[0]: user[1] for user in users}
+
+        # 获取当前日期
+        current_date = datetime.utcnow().strftime('%Y-%m-%d')  # 当前日期格式:YYYY-MM-DD
+
+        print("开始插入数据...")
+        for task in results:
+            task_id, date_started, date_moved, external_uri, title, description,owner_id, creator_id, column_id = task
+
+            # 检查是否已处理过该任务ID
+            if task_id in processed_task_ids:
+                continue
+            processed_task_ids.add(task_id)
+
+            # 获取任务对应的 column_id 和 task_status
+            if column_id == 1057:
+                task_status = '已创建'
+            elif column_id in [1058, 1060, 1065]:
+                task_status = '处理中'
+            elif column_id == 1064:
+                task_status = '已完成'
+            else:
+                task_status = '未定义'  # 如果 column_id 不在预设范围内
+
+            creation_date = datetime.utcfromtimestamp(date_started).strftime('%Y-%m-%d')
+            year = datetime.utcfromtimestamp(date_started).year
+            month = datetime.utcfromtimestamp(date_started).month
+            modification_date = datetime.utcfromtimestamp(date_moved).strftime('%Y-%m-%d') if date_moved else None
+
+            assignee_name = user_dict.get(owner_id, None)
+            creator_name = user_dict.get(creator_id, None)
+            work_order_link = f"https://jykb.jydev.jianyu360.com/task/{task_id}"
+
+
+            # 添加到数据列表
+            data_list.append({
+                "年份": year,
+                "月份": month,
+                "任务ID": task_id,
+                "工单链接": work_order_link,
+                "创建人": creator_name,
+                "指派人": assignee_name,
+                "标题": title,
+                "任务描述":description,
+                "任务创建时间": creation_date,
+                "任务修改时间": modification_date,
+                "kb任务状态": task_status,
+                "导出时间": current_date
+            })
+
+        # 导出到Excel
+        # 将导出操作移到循环外部(只执行一次)
+        if data_list:  # 确保有数据才导出
+            df = pd.DataFrame(data_list)
+            excel_file = "kb_tasks_特定条件_export.xlsx"
+            df.to_excel(excel_file, index=False)
+            print(f"数据已成功导出到 {excel_file}")
+
+        db_connection_remote.commit()
+        print("数据处理完成!")
+
+    except MySQLError as e:
+        print(f"发生错误: {e}")
+
+    finally:
+        close_connection(cursor_local, db_connection_local)
+
+
+if __name__ == "__main__":
+    test_connection()

+ 188 - 0
tools/数据质量监控平台/kb-数据问题统计/task_kb_每周汇报.py

@@ -0,0 +1,188 @@
+import pymysql
+from pymysql import MySQLError
+from datetime import datetime, timedelta
+import pandas as pd
+
+
+def get_last_week_monday_friday():
+    """获取上周一和上周五的 Unix 时间戳"""
+    today = datetime.utcnow()
+    last_monday = today - timedelta(days=today.weekday() + 7)  # 上周一
+    last_friday = last_monday + timedelta(days=4)  # 上周五
+
+    last_monday_timestamp = int(last_monday.replace(hour=0, minute=0, second=0).timestamp())
+    last_friday_timestamp = int(last_friday.replace(hour=23, minute=59, second=59).timestamp())
+
+    return last_monday_timestamp, last_friday_timestamp
+
+def get_current_week_monday_friday():
+    """获取本周一和本周五的 Unix 时间戳"""
+    today = datetime.utcnow()
+    current_monday = today - timedelta(days=today.weekday())  # 本周一
+    current_friday = current_monday + timedelta(days=4)      # 本周五
+
+    current_monday_timestamp = int(current_monday.replace(hour=0, minute=0, second=0).timestamp())
+    current_friday_timestamp = int(current_friday.replace(hour=23, minute=59, second=59).timestamp())
+
+    return current_monday_timestamp, current_friday_timestamp
+
+def close_connection(cursor, connection):
+    """确保数据库连接被关闭"""
+    if cursor:
+        cursor.close()
+    if connection:
+        connection.close()
+
+
+def test_connection():
+    cursor_local = None
+    db_connection_local = None
+    data_list = []  # 用于存储所有要导出的数据
+    processed_task_ids = set()  # 用于记录已处理的任务ID,避免重复
+    try:
+        print("开始连接本地数据库...")
+        db_connection_local = pymysql.connect(
+            host="127.0.0.1",
+            user="kanboard",
+            password="K99b3e9qa9d",
+            database="kanboard",
+            port=4001
+        )
+        cursor_local = db_connection_local.cursor()
+
+        print("开始连接远程数据库...")
+        db_connection_remote = pymysql.connect(
+            host="172.20.45.129",
+            user="root",
+            password="=PDT49#80Z!RVv52_z",
+            database="quality",
+            port=4000
+        )
+
+        # 计算上周一到上周五的时间范围
+        start_timestamp, end_timestamp = get_last_week_monday_friday()
+        print(
+            f"查询时间范围: {datetime.utcfromtimestamp(start_timestamp)} - {datetime.utcfromtimestamp(end_timestamp)}")
+
+        print("开始执行查询...")
+        query = """
+        SELECT DISTINCT t.id AS task_id, 
+               t.date_started, 
+               t.date_moved, 
+               t.external_uri, 
+               t.title,
+               t.description,          
+               t.owner_id, 
+               t.creator_id, 
+               t.column_id
+        FROM tasks t
+        JOIN task_has_tags tht ON t.id = tht.task_id
+        JOIN tags tg ON tht.tag_id = tg.id
+        WHERE t.project_id = 261
+          AND t.date_started >= %s
+          AND t.date_started <= %s
+          AND tg.project_id = 261
+        """
+        cursor_local.execute(query, (start_timestamp, end_timestamp))
+        results = cursor_local.fetchall()
+        if not results:
+            print("没有找到符合条件的数据")
+            return
+
+        print(f"查询到 {len(results)} 条数据")
+
+        # 获取 owner_name 和 creator_name
+        cursor_local.execute("SELECT id, name FROM users")
+        users = cursor_local.fetchall()
+        user_dict = {user[0]: user[1] for user in users}
+
+        # # 获取远程数据库中的 kb_error_dict 表的 category 列
+        # cursor_remote.execute("SELECT category FROM kb_error_dict")
+        # categories = cursor_remote.fetchall()
+        # category_list = [category[0] for category in categories]  # 获取所有 category 值
+
+        # 获取当前日期
+        current_date = datetime.utcnow().strftime('%Y-%m-%d')  # 当前日期格式:YYYY-MM-DD
+
+        print("开始插入数据...")
+        for task in results:
+            task_id, date_started, date_moved, external_uri, title, description,owner_id, creator_id, column_id = task
+
+            # 检查是否已处理过该任务ID
+            if task_id in processed_task_ids:
+                continue
+            processed_task_ids.add(task_id)
+
+            # 获取任务对应的 column_id 和 task_status
+            if column_id == 1057:
+                task_status = '已创建'
+            elif column_id in [1058, 1060, 1065]:
+                task_status = '处理中'
+            elif column_id == 1064:
+                task_status = '已完成'
+            else:
+                task_status = '未定义'  # 如果 column_id 不在预设范围内
+
+            # 获取任务对应的所有标签名称
+            cursor_local.execute(""" 
+                SELECT tg.name 
+                FROM task_has_tags tht 
+                JOIN tags tg ON tht.tag_id = tg.id 
+                WHERE tht.task_id = %s AND tg.project_id = 261 
+            """, (task_id,))
+            tags = cursor_local.fetchall()
+            tags_list = [tag[0] for tag in tags]  # 获取所有标签名称
+            # 提取所有以 "原因_" 开头的元素
+            reason_tags = [tag for tag in tags_list if tag.startswith('原因_')]
+
+            # 用逗号拼接成一个字符串
+            tags_str = ", ".join(reason_tags) if reason_tags else ""
+
+            creation_date = datetime.utcfromtimestamp(date_started).strftime('%Y-%m-%d')
+            year = datetime.utcfromtimestamp(date_started).year
+            month = datetime.utcfromtimestamp(date_started).month
+            modification_date = datetime.utcfromtimestamp(date_moved).strftime('%Y-%m-%d') if date_moved else None
+
+            assignee_name = user_dict.get(owner_id, None)
+            creator_name = user_dict.get(creator_id, None)
+            work_order_link = f"https://jykb.jydev.jianyu360.com/task/{task_id}"
+
+            # 插入数据时,增加 created_time 字段
+            if tags_str:  # 只有当标签不为空时才插入
+                # 添加到数据列表
+                data_list.append({
+                    "年份": year,
+                    "月份": month,
+                    "任务ID": task_id,
+                    "工单链接": work_order_link,
+                    "创建人": creator_name,
+                    "指派人": assignee_name,
+                    "标题": title,
+                    "任务描述":description,
+                    "任务创建时间": creation_date,
+                    "任务修改时间": modification_date,
+                    "错误原因": tags_str,
+                    "kb任务状态": task_status,
+                    "导出时间": current_date
+                })
+
+        # 导出到Excel
+        # 将导出操作移到循环外部(只执行一次)
+        if data_list:  # 确保有数据才导出
+            df = pd.DataFrame(data_list)
+            excel_file = "kb_tasks_export.xlsx"
+            df.to_excel(excel_file, index=False)
+            print(f"数据已成功导出到 {excel_file}")
+
+        db_connection_remote.commit()
+        print("数据处理完成!")
+
+    except MySQLError as e:
+        print(f"发生错误: {e}")
+
+    finally:
+        close_connection(cursor_local, db_connection_local)
+
+
+if __name__ == "__main__":
+    test_connection()

+ 195 - 0
tools/数据质量监控平台/kb-数据问题统计/错误原因.csv

@@ -0,0 +1,195 @@
+错误原因
+原因_漏采
+原因_判重错误
+原因_漏采
+原因_站点未收录
+原因_判重错误
+原因_站点未收录
+原因_城市错误
+原因_站点未收录
+原因_城市错误
+原因_判重错误
+原因_产权数据不生索引
+原因_漏采
+原因_城市错误
+原因_竞品独家数据
+原因_判重错误
+原因_漏采
+原因_数据延迟采集
+原因_数据延迟采集
+原因_数据延迟采集
+原因_漏采
+原因_竞品独家数据
+原因_站点未收录
+原因_爬虫待开发
+原因_站点未收录
+无问题_已收录
+无问题_已收录
+原因_城市错误
+原因_网站问题
+原因_无问题
+原因_网站需登录
+原因_漏采
+原因_站点未收录
+无问题_已收录
+原因_数据延迟采集
+原因_判重错误
+原因_网站问题
+原因_产权数据不生索引
+原因_中标金额错误
+原因_中标金额错误
+原因_漏采
+原因_漏采
+原因_漏采
+原因_漏采
+原因_漏采
+原因_竞品独家数据
+原因_数据延迟采集
+原因_漏采
+原因_产权数据不生索引
+原因_附件问题
+无问题_已收录
+原因_无问题
+原因_漏采
+原因_公众号
+原因_城市错误
+原因_漏采
+无问题_已收录
+原因_漏采
+原因_城市错误
+原因_城市错误
+原因_漏采
+原因_中标金额错误
+原因_漏采
+原因_中标单位错误
+无问题_已收录
+原因_分类标签错误
+原因_漏采
+原因_公众号
+原因_站点未收录
+原因_爬虫待开发
+原因_数据缺失
+原因_网站需登录
+原因_栏目缺失
+原因_漏采
+原因_漏采
+原因_漏采
+原因_预算错误
+原因_网站需登录
+原因_爬虫待开发
+原因_漏采
+原因_漏采
+原因_漏采
+原因_爬虫待开发
+原因_漏采
+原因_爬虫待开发
+原因_站点未收录
+原因_网站需登录
+原因_竞品独家数据
+原因_漏采
+原因_爬虫待开发
+原因_无问题
+原因_站点未收录
+原因_网站需登录
+原因_漏采
+原因_竞品独家数据
+原因_网站需登录
+原因_网站需登录
+原因_判重错误
+原因_爬虫待开发
+无问题_已收录
+原因_网站需登录
+原因_城市错误
+原因_漏采
+原因_栏目缺失
+无问题_已收录
+原因_预算错误
+原因_网站需登录
+原因_站点未收录
+原因_站点未收录
+原因_网站需登录
+原因_判重错误
+原因_网站变更
+原因_网站问题
+原因_网站问题
+原因_竞品独家数据
+原因_栏目缺失
+原因_城市错误
+原因_站点未收录
+原因_无问题
+无问题_已收录
+原因_站点未收录
+原因_漏采
+原因_网站需登录
+原因_漏采
+原因_网站需登录
+原因_漏采
+原因_漏采
+原因_网站需登录
+原因_公众号
+原因_爬虫待开发
+原因_漏采
+原因_网站需登录
+原因_判重错误
+原因_漏采
+原因_漏采
+原因_站点未收录
+原因_漏采
+原因_漏采
+原因_漏采
+原因_漏采
+原因_漏采
+原因_爬虫待开发
+原因_爬虫待开发
+原因_站点未收录
+原因_无问题
+原因_站点未收录
+原因_站点未收录
+原因_中标单位错误
+原因_漏采
+原因_漏采
+原因_中标单位错误
+原因_漏采
+原因_数据延迟采集
+原因_数据延迟采集
+原因_漏采
+原因_网站需登录
+原因_栏目缺失
+原因_数据延迟采集
+原因_漏采
+原因_漏采
+原因_站点未收录
+原因_网站需登录
+原因_栏目缺失
+原因_网站问题
+原因_爬虫待开发
+原因_竞品独家数据
+原因_分类标签错误
+原因_栏目缺失
+原因_网站问题
+原因_漏采
+原因_网站需登录
+原因_站点未收录
+原因_站点未收录
+原因_漏采
+原因_竞品独家数据
+无问题_已收录
+原因_数据缺失
+原因_数据缺失_爬虫待开发
+原因_网站问题
+原因_数据缺失_漏采
+原因_数据缺失_信息采集不全/有误
+原因_数据缺失_信息采集不全/有误
+原因_数据缺失
+原因_数据缺失_栏目缺失
+原因_数据缺失
+原因_中标单位错误
+原因_中标单位错误
+原因_中标金额错误
+原因_城市错误
+原因_开标时间错误
+原因_数据缺失_信息采集不全/有误
+原因_数据缺失_信息采集不全/有误
+原因_无问题
+原因_无问题
+原因_预算错误

TEMPAT SAMPAH
tools/数据质量监控平台/kb-数据问题统计/错误原因统计.xlsx


+ 2 - 2
tools/数据质量监控平台/标讯基础信息分析结果入库.py

@@ -26,8 +26,8 @@ def get_this_week_thursday():
 # query_create_time = get_this_week_thursday().strftime("%Y-%m-%d")  # ✅ 动态获取
 # query_create_time = '2025-04-02'
 now_date = (datetime.now()).strftime("%Y-%m-%d")
-yesterday_date = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
-batch_id = yesterday_date
+# yesterday_date = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
+batch_id = now_date
 
 
 # 从 MySQL 获取数据

TEMPAT SAMPAH
tools/标讯数据重复率分析/main_with_repeatids_grouped.xlsx


+ 43 - 21
tools/标讯数据重复率分析/repeat.py

@@ -5,10 +5,8 @@ from lib.mongo_tools import MongoUtil,Data_save,MongoSentence
 
 def calculate_repeat_rate(str1, str2):
     import Levenshtein
-
     # str1 = "茹河、红河河流沟道生态治理与农田整治提升项目(六盘山森林生态保护修复单元)-彭阳县茹河流域乃河水库至店洼水库生态缓冲带修复工程一期"
     # str2 = "茹河、红河河流沟道生态治理与农田整治提升项目(六盘山森林生态保护修复单元)彭阳县茹河流域乃河水库至店洼水库生态缓冲带修复工程一期"
-
     distance = Levenshtein.distance(str1, str2)
     max_length = max(len(str1), len(str2))
     if max_length != 0:
@@ -16,12 +14,19 @@ def calculate_repeat_rate(str1, str2):
         return similarity
     else:
         return 1.0
-
+#判断互为包含关系
+def is_mutually_contained(str1, str2):
+    """判断两个字符串是否互为包含关系"""
+    return str1 in str2 or str2 in str1
 # 连接到目标数据库
-db = MongoClient('192.168.3.149', 27180, unicode_decode_error_handler="ignore").data_quality
-coll_user = db["liantong"]
-data_map={}
-documents = list(coll_user.find({ "flag" : { "$ne" : "cfsj" } }).sort("_id",1))
+# db = MongoClient('192.168.3.149', 27180, unicode_decode_error_handler="ignore").data_quality
+# coll_user = db["liantong"]
+client = MongoClient('mongodb://127.0.0.1:27087/',unicode_decode_error_handler="ignore", directConnection=True)  # 修改为你的连接地址
+db = client["jyqyfw"]                       # 替换为你的数据库名
+col = db["xzh_20250714"]                    # 替换为你的集合名
+col1 = db["xzh_20250714_1"]
+
+documents = list(col.find({ "repeat" : { "$ne" : True } , "flag" : { "$exists" : False } }).sort("_id",1))
 
 for i in range(len(documents)):
     for j in range(i+1,len(documents)):
@@ -31,19 +36,36 @@ for i in range(len(documents)):
         j_projectname = documents[j].get("projectname", "")
         radio1=calculate_repeat_rate(i_title,j_title)
         radio2=calculate_repeat_rate(i_projectname,j_projectname)
+        i_projectcode=documents[i].get("projectcode", "")
+        j_projectcode = documents[j].get("projectcode", "")
+        i_buyer=documents[i].get("buyer", "")
+        j_buyer=documents[j].get("buyer", "")
+        i_s_winner = documents[i].get("s_winner", "")
+        j_s_winner = documents[j].get("s_winner", "")
+        i_bidamount = documents[i].get("bidamount", "")
+        j_bidamount = documents[j].get("bidamount", "")
+        i_toptype = documents[i].get("toptype", "")
+        j_toptype = documents[j].get("toptype", "")
+        # if (calculate_repeat_rate(i_title , j_title) >=0.98 or calculate_repeat_rate(j_projectname , j_projectname)>=0.98 ) and i_buyer==j_buyer and i_projectcode==j_projectcode and i_bidamount==j_bidamount:
+        # if (calculate_repeat_rate(i_title , j_title) >=0.98 or calculate_repeat_rate(j_projectname , j_projectname)>=0.98 ) and i_buyer==j_buyer and i_projectcode==j_projectcode :
+        # if (calculate_repeat_rate(i_title , j_title) >=0.98 or calculate_repeat_rate(j_projectname , j_projectname)>=0.98 ) and i_s_winner==j_s_winner and i_projectcode==j_projectcode and i_bidamount==j_bidamount:
+        # if (calculate_repeat_rate(i_title , j_title) >=0.98 or calculate_repeat_rate(j_projectname , j_projectname)>=0.98 ) and i_s_winner==j_s_winner and i_projectcode==j_projectcode :
+        # if (calculate_repeat_rate(i_title , j_title) >=0.98 or calculate_repeat_rate(j_projectname , j_projectname)>=0.98 ) and i_toptype in ("拟建","采购意向")  and j_toptype in ("拟建","采购意向") :
+        # if (calculate_repeat_rate(i_title , j_title) >=0.98 or calculate_repeat_rate(j_projectname , j_projectname)>=0.98 ) and i_projectcode==j_projectcode:
+        if (calculate_repeat_rate(i_title , j_title) >=0.8 or calculate_repeat_rate(j_projectname , j_projectname)>=0.8 ) and i_projectcode==j_projectcode:
+            # 更新文档i
+            col.update_one(
+                {"_id": documents[i]["_id"]},
+                {"$set": {"flag": 13}}
+            )
+            # 更新文档j
+            col.update_one(
+                {"_id": documents[j]["_id"]},
+                {"$set": {"flag": 13}}
+            )
+
+            # 更新内存中的文档状态,避免重复处理
+            documents[i]["flag"] = 13
+            documents[j]["flag"] = 13
 
-        if radio1>=0.9 or radio2>=0.9:
-            if documents[i].get("projectcode","")== documents[j].get("projectcode","") and documents[i].get("subtype","")== documents[j].get("subtype","")=='竞谈':
-                data_map.setdefault(documents[i].get("_id",""),[]).append(str(documents[j].get("_id","")))
-# and documents[i].get("subtype","")== documents[j].get("subtype","")=='采购意向'
-# and documents[i].get("subtype","")==documents[j].get("subtype","")
-# for i in range(len(documents)):
-#     for j in range(i+1,len(documents)):
-#         i_id=documents[i].get("id", "")
-#         j_id = documents[j].get("id", "")
-#         if i_id==j_id :
-#                 data_map.setdefault(documents[i].get("_id",""),[]).append(str(documents[j].get("_id","")))
-# 打印结果
-for key, value in data_map.items():
-    print(f"{key} -> {value}")
 

+ 253 - 0
tools/标讯数据重复率分析/repeat_v2.py

@@ -0,0 +1,253 @@
+from elasticsearch import Elasticsearch, helpers
+from pymongo import MongoClient
+from datetime import datetime, timedelta
+import hashlib
+import numpy as np
+from tqdm import tqdm
+from datasketch import MinHash, MinHashLSH
+import multiprocessing
+import os
+import json
+from typing import List, Dict, Any, Iterator
+
+# 配置信息
+ES_HOST = "http://127.0.0.1:19800"
+ES_INDEX = "bidding"
+es_username = "jianyuGr"
+es_password = "we3g8glKfe#"
+MONGO_URI = "mongodb://172.20.45.129:27002/"
+MONGO_DB = "data_quality"
+MONGO_COLLECTION = "duplicate_records"
+BATCH_SIZE = 1000  # 批量处理大小
+THREADS = min(8, os.cpu_count())  # 并发线程数
+LSH_THRESHOLD = 0.5  # 相似度阈值
+
+# 初始化连接
+es = Elasticsearch(ES_HOST, http_auth=(es_username, es_password),timeout=30, max_retries=3)
+mongo_client = MongoClient(MONGO_URI)
+db = mongo_client[MONGO_DB]
+dup_collection = db[MONGO_COLLECTION]
+
+
+class ESDataLoader:
+    """Elasticsearch数据加载器"""
+
+    @staticmethod
+    def generate_date_ranges(start_date: datetime, end_date: datetime) -> Iterator[tuple]:
+        """生成按天划分的时间段"""
+        delta = end_date - start_date
+        for i in range(delta.days + 1):
+            day = start_date + timedelta(days=i)
+            yield (day, day + timedelta(days=1))
+
+    @staticmethod
+    def scroll_query(date_range: tuple, fields: List[str]) -> Iterator[Dict[str, Any]]:
+        """
+        滚动查询ES数据
+        参数:
+            date_range: (start_date, end_date) 时间范围
+            fields: 需要查询的字段列表
+        返回:
+            文档生成器
+        """
+        size =BATCH_SIZE
+        query = {
+            "query": {
+                "bool": {
+                    "must": [
+                        {"range": {"publishtime": {"gte": date_range[0],
+                                                   "lt": date_range[1]}}}
+                    ]
+                }
+            },
+            "_source": fields,
+            "size": size,
+            "sort": {"_id": "asc"}
+        }
+        search_after = None
+        while True:
+            if search_after:
+                query["search_after"] = search_after
+            response = es.search(index="bidding", body=query)
+            hits = response['hits']['hits']
+            if not hits:
+                break
+            for hit in hits:
+                yield {
+                    "_id": hit["_id"],
+                    **hit["_source"],
+                    "es_index": ES_INDEX,
+                    "retrieve_time": datetime.utcnow()
+                }
+            # 获取最后一条的 sort 值作为下一页起点
+            search_after = hits[-1]["sort"]
+
+
+class DeduplicationEngine:
+    """去重引擎核心类"""
+
+    def __init__(self):
+        self.lsh = MinHashLSH(threshold=LSH_THRESHOLD, num_perm=128)
+        self.seen_hashes = set()
+
+    @staticmethod
+    def generate_doc_hash(doc: Dict[str, Any]) -> str:
+        """生成文档唯一哈希"""
+        hash_str = f"{doc.get('projectname', '')}_{doc.get('projectcode', '')}_{doc.get('buyer', '')}_{doc.get('subtype', '')}"
+        return hashlib.md5(hash_str.encode('utf-8')).hexdigest()
+
+    @staticmethod
+    def create_minhash(doc: Dict[str, Any]) -> MinHash:
+        """为文档创建MinHash"""
+        mh = MinHash(num_perm=128)
+        text = f"{doc.get('projectname', '')}_{doc.get('projectcode', '')}_{doc.get('buyer', '')}_{doc.get('toptype', '')}"
+        for word in text.split()[:100]:  # 限制词数防止过长
+            mh.update(word.encode('utf-8'))
+        return mh
+
+    def process_document(self, doc: Dict[str, Any]) -> List[str]:
+        """
+        处理单个文档,返回匹配的重复文档ID列表
+        参数:
+            doc: 文档数据
+        返回:
+            重复文档ID列表
+        """
+        required_fields = ["title", "href", "projectname", "buyer","projectcode","toptype","subtype"]
+        for field in required_fields:
+            if field not in doc:
+                return []  # 或 log.warning(f"缺失字段: {field}")
+
+        doc_hash = self.generate_doc_hash(doc)
+
+        # 精确去重检查
+        if doc_hash in self.seen_hashes:
+            return []
+
+        self.seen_hashes.add(doc_hash)
+
+        # 相似度检查
+        mh = self.create_minhash(doc)
+        duplicate_ids = self.lsh.query(mh)
+
+        # 添加到索引
+        self.lsh.insert(doc["_id"], mh)
+
+        return duplicate_ids
+
+
+class DuplicateStorage:
+    """重复数据存储管理器"""
+
+    @staticmethod
+    def create_indexes():
+        """创建MongoDB索引"""
+        dup_collection.create_index([("base_doc_id", 1)])
+        dup_collection.create_index([("duplicate_ids", 1)])
+        dup_collection.create_index([("detection_time", -1)])
+
+    @staticmethod
+    def save_duplicates(base_doc: Dict[str, Any], duplicate_ids: List[str]):
+        """
+        保存重复记录到MongoDB
+        参数:
+            base_doc: 基准文档
+            duplicate_ids: 重复文档ID列表
+        """
+        if not duplicate_ids:
+            return
+
+        record = {
+            "base_doc_id": base_doc["_id"],
+            "base_doc": {
+                "title": base_doc["title"],
+                "buyer": base_doc["buyer"],
+                "publishtime": base_doc["publishtime"],
+                "href": base_doc["href"]
+            },
+            "duplicate_ids": duplicate_ids,
+            "detection_time": datetime.utcnow(),
+            "source_index": base_doc.get("es_index", ES_INDEX),
+            "hash": DeduplicationEngine.generate_doc_hash(base_doc)
+        }
+
+        dup_collection.insert_one(record)
+
+
+def parallel_deduplicate(chunk: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
+    """
+    并行处理数据块的去重
+    参数:
+        chunk: 文档数据块
+    返回:
+        重复记录列表
+    """
+    engine = DeduplicationEngine()
+    results = []
+
+    for doc in chunk:
+        dup_ids = engine.process_document(doc)
+        if dup_ids:
+            results.append({
+                "base_doc": doc,
+                "duplicate_ids": dup_ids
+            })
+
+    return results
+
+
+def main(days: int = 2):
+    """主处理流程"""
+    # 初始化MongoDB索引
+    DuplicateStorage.create_indexes()
+
+    # 准备日期范围
+    end_date = datetime.utcnow()
+    start_date = end_date - timedelta(days=days)
+
+
+    print(f"开始处理 {start_date} 至 {end_date} 的数据...")
+    total_duplicates = 0
+
+    # 按天处理数据
+    for day_start, day_end in tqdm(ESDataLoader.generate_date_ranges(start_date, end_date),desc="处理每日数据"):
+        # 转换为时间戳(秒级)
+        day_end = int(day_end.timestamp())
+        day_start = int(day_start.timestamp())
+        # 加载数据
+        records = list(ESDataLoader.scroll_query(
+            date_range=(day_start, day_end),
+            fields=["title", "href", "publishtime", "buyer", "projectname"]
+        ))
+
+        if not records:
+            continue
+
+        # 数据分块
+        chunks = np.array_split(records, THREADS)
+
+        # 并行处理
+        with multiprocessing.Pool(THREADS) as pool:
+            results = pool.map(parallel_deduplicate, chunks)
+
+            # 保存结果
+            for batch in results:
+                for item in batch:
+                    DuplicateStorage.save_duplicates(
+                        item["base_doc"],
+                        item["duplicate_ids"]
+                    )
+                    total_duplicates += len(item["duplicate_ids"])
+
+    print(f"处理完成,共发现 {total_duplicates} 条重复记录")
+    print(f"结果已保存到MongoDB: {MONGO_DB}.{MONGO_COLLECTION}")
+
+
+if __name__ == "__main__":
+    import argparse
+
+    parser = argparse.ArgumentParser(description="ES数据去重工具")
+    parser.add_argument("--days", type=int, default=2, help="检测天数范围")
+    args = parser.parse_args()
+
+    main(days=args.days)

+ 207 - 0
tools/标讯数据重复率分析/repeat_v3.py

@@ -0,0 +1,207 @@
+from elasticsearch import Elasticsearch
+from pymongo import MongoClient
+from datetime import datetime, timedelta
+from lib.detail_url import SE3
+import multiprocessing
+
+from typing import List, Dict, Any, Iterator
+from difflib import SequenceMatcher
+from collections import defaultdict
+from sentence_transformers import SentenceTransformer,util
+import os
+
+
+os.environ['HTTP_PROXY'] = 'http://127.0.0.1:7897'
+os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:7897'
+# 配置信息
+ES_HOST = "http://127.0.0.1:19800"
+ES_INDEX = "bidding"
+es_username = "jianyuGr"
+es_password = "we3g8glKfe#"
+MONGO_URI = "mongodb://172.20.45.129:27002/"
+MONGO_DB = "data_quality"
+MONGO_COLLECTION = "duplicate_records"
+BATCH_SIZE = 1000
+THREADS = min(8, os.cpu_count())
+
+es = Elasticsearch(ES_HOST, http_auth=(es_username, es_password), timeout=30)
+mongo_client = MongoClient(MONGO_URI)
+db = mongo_client[MONGO_DB]
+collection = db[MONGO_COLLECTION]
+
+model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2") # ✅ 轻量模型
+
+
+def similarity(a: str, b: str) -> float:
+    return SequenceMatcher(None, a, b).ratio()
+
+def embedding_sim(a: str, b: str) -> float:
+    emb1 = model.encode(a, convert_to_tensor=True)
+    emb2 = model.encode(b, convert_to_tensor=True)
+    return float(util.cos_sim(emb1, emb2)[0][0])
+
+def match_stage(doc1: Dict, doc2: Dict) -> int:
+    title1 = doc1.get("title", "")
+    title2 = doc2.get("title", "")
+    projectname1 = doc1.get("projectname", "")
+    projectname2 = doc2.get("projectname", "")
+    buyer1 = doc1.get("buyer", "")
+    buyer2 = doc2.get("buyer", "")
+    code1 = doc1.get("projectcode", "")
+    code2 = doc2.get("projectcode", "")
+    subtype1 = doc1.get("subtype", "")
+    subtype2 = doc2.get("subtype", "")
+    toptype1 = doc1.get("toptype", "")
+    toptype2 = doc2.get("toptype", "")
+    win1 = doc1.get("s_winner", "")
+    win2 = doc2.get("s_winner", "")
+
+    def same(x, y): return x and y and x == y
+    def include(x, y): return x and y and (x in y or y in x)
+    sim = similarity(title1, title2)
+    emb_sim = embedding_sim(title1, title2)
+
+    if (same(title1, title2) or same(projectname1, projectname2)) and same(buyer1, buyer2) and same(code1, code2) and same(subtype1, subtype2):
+        return 1
+    if (same(title1, title2) or same(projectname1, projectname2)) and same(buyer1, buyer2) and same(code1, code2) and same(toptype1, toptype2):
+        return 2
+    if (same(title1, title2) or same(projectname1, projectname2)) and same(buyer1, buyer2) and same(code1, code2):
+        return 3
+    if same(buyer1, buyer2) and same(code1, code2) and same(subtype1, subtype2):
+        return 4
+    if (include(title1, title2) or include(projectname1, projectname2)) and same(buyer1, buyer2) and same(code1, code2):
+        return 5
+    if emb_sim >= 0.98 and same(buyer1, buyer2) and same(code1, code2):
+        return 6
+    if emb_sim >= 0.98 and same(win1, win2) and same(code1, code2):
+        return 7
+    if emb_sim >= 0.98 and code1 == code2 and (toptype1 in ["拟建", "采购意向"] or toptype2 in ["拟建", "采购意向"]):
+        return 8
+    if emb_sim >= 0.98 and same(code1, code2):
+        return 9
+    if emb_sim >= 0.9 and same(code1, code2):
+        return 10
+    if emb_sim >= 0.8 and same(code1, code2):
+        return 11
+    return 0
+
+def search_documents(start, end, max_docs=100) -> List[Dict[str, Any]]:
+    query = {
+        "query": {
+            "range": {
+                "publishtime": {
+                    "gte": start,
+                    "lt": end
+                }
+            }
+        },
+        "size": BATCH_SIZE,
+        "sort": [{"publishtime": "asc"}, {"_id": "asc"}]
+    }
+    docs = []
+    search_after = None
+    page = 0
+    while True:
+        if search_after:
+            query["search_after"] = search_after
+        res = es.search(index=ES_INDEX, body=query)
+        hits = res["hits"]["hits"]
+        print(f"第 {page + 1} 页,返回 {len(hits)} 条")
+        if not hits:
+            print("已没有更多数据,跳出循环。")
+            break
+
+        for hit in hits:
+            doc = hit["_source"]
+            doc["_id"] = hit["_id"]
+            docs.append(doc
+                        )
+            # ✅ 限制返回条数
+            if len(docs) >= max_docs:
+                print(f"已达到最大限制:{max_docs} 条,提前终止。")
+                return docs
+
+        search_after = hits[-1]["sort"]  # 正确设置 search_after
+        page += 1
+    print(f"共获取 {len(docs)} 条文档")
+    return docs
+
+
+def process_group(group_docs: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
+    results = []
+    n = len(group_docs)
+    matched = set()
+    for i in range(n):
+        d1 = group_docs[i]
+        _id1 = d1["_id"]
+        for j in range(i + 1, n):
+            d2 = group_docs[j]
+            pair = tuple(sorted((d1["_id"], d2["_id"])))
+            if pair in matched:
+                continue
+            _id2 =d2["_id"]
+            flag = match_stage(d1, d2)
+            if flag > 0:
+                matched.add(pair)
+                results.append({
+                    "base_doc_id": _id1,
+                    "base_doc_projectname":d1["projectname"],
+                    "base_doc_href": d1["href"],
+                    'base_doc_jybxhref': f"https://www.jianyu360.cn/article/entservice/{SE3.encode_string(_id1)}.html?appid",
+                    "duplicate_doc_id": _id2,
+                    "duplicate_doc_projectname": d2["projectname"],
+                    "duplicate_doc_href": d2["href"],
+                    'duplicate_doc_jybxhref': f"https://www.jianyu360.cn/article/entservice/{SE3.encode_string(_id2)}.html?appid",
+                    "flag": flag
+                })
+    return results
+
+def detect_duplicates(docs: List[Dict[str, Any]]):
+    buckets = defaultdict(list)
+    for doc in docs:
+        group_key = f"{doc.get('projectcode', '')}_{doc.get('projectname', '')}_{doc.get('buyer', '')}_{doc.get('toptype', '')}"
+        buckets[group_key].append(doc)
+
+    for k, v in buckets.items():
+        print(f"Group: {k}, Count: {len(v)}")
+        print("样例文档标题:", [doc.get("title", "") for doc in v[:3]])  # 每组最多打印前三条标题
+
+    print(f"共 {len(buckets)} 个分组")
+    all_results = []
+    for group in buckets.values():
+
+        if len(group) < 2:
+            continue  # 组内少于2条,跳过
+        # res = process_group(group)
+        # all_results.extend(res)
+
+
+    with multiprocessing.Pool(THREADS) as pool:
+        all_results = pool.map(process_group, buckets.values())
+        all_records = [r for batch in all_results for r in batch]
+        pool.close()  # 显式关闭
+        pool.join()  # 等待所有子进程结束
+
+    print(f"发现重复记录 {len(all_records)} 对")
+
+    for i in range(0, len(all_records), 1000):
+        batch = all_records[i:i + 1000]
+        collection.insert_many(batch)
+        print(f"已成功插入 {len(batch)} 条记录到 MongoDB")
+
+def main():
+    # 准备日期范围
+
+    end = datetime.utcnow()
+    start = end - timedelta(days=1)
+    day_end = int(end.timestamp())
+    day_start = int(start.timestamp())
+    print(f"处理时间段: {start} - {end}")
+    docs = search_documents(day_start, day_end,max_docs=100)
+    print(f"获取文档数:{len(docs)}")
+    detect_duplicates(docs)
+    print("去重完成")
+
+
+if __name__ == "__main__":
+    main()

+ 268 - 0
tools/标讯数据重复率分析/repeat_v4.py

@@ -0,0 +1,268 @@
+from elasticsearch import Elasticsearch
+from pymongo import MongoClient
+from datetime import  timedelta
+from lib.detail_url import SE3
+import multiprocessing
+from datetime import datetime
+from typing import List, Dict, Any
+from difflib import SequenceMatcher
+from collections import defaultdict
+from sentence_transformers import SentenceTransformer,util
+import os
+
+
+os.environ['HTTP_PROXY'] = 'http://127.0.0.1:7897'
+os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:7897'
+# 配置信息
+ES_HOST = "http://127.0.0.1:19800"
+ES_INDEX = "bidding"
+es_username = "jianyuGr"
+es_password = "we3g8glKfe#"
+MONGO_URI = "mongodb://172.20.45.129:27002/"
+MONGO_DB = "data_quality"
+MONGO_COLLECTION = "duplicate_records"
+BATCH_SIZE = 1000
+THREADS = min(8, os.cpu_count())
+
+MONGO_URI_source = "mongodb://localhost:27017"
+MONGO_DB_source = "your_db"
+MONGO_COLLECTION_source = "your_collection"
+
+es = Elasticsearch(ES_HOST, http_auth=(es_username, es_password), timeout=30)
+mongo_client = MongoClient(MONGO_URI)
+db = mongo_client[MONGO_DB]
+collection = db[MONGO_COLLECTION]
+
+mongo_client_source = MongoClient(MONGO_URI_source)
+collection_source = mongo_client[MONGO_DB_source][MONGO_COLLECTION_source]
+
+model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2") # ✅ 轻量模型
+
+
+def similarity(a: str, b: str) -> float:
+    return SequenceMatcher(None, a, b).ratio()
+
+def embedding_sim(a: str, b: str) -> float:
+    emb1 = model.encode(a, convert_to_tensor=True)
+    emb2 = model.encode(b, convert_to_tensor=True)
+    return float(util.cos_sim(emb1, emb2)[0][0])
+
+def get_max_embedding_sim(d1, d2):
+    sim_title = embedding_sim(d1.get("title", ""), d2.get("title", ""))
+    sim_projectname = embedding_sim(d1.get("projectname", ""), d2.get("projectname", ""))
+    return max(sim_title, sim_projectname)
+# 工具函数
+def same(x, y):
+    return x and y and x == y
+
+def include(x, y):
+    return x and y and (x in y or y in x)
+
+def rule_1(d1, d2):
+    return same(d1.get("href"), d2.get("href"))  \
+
+
+def rule_2(d1, d2):
+    return same(d1.get("title"), d2.get("title"))  \
+        and same(d1.get("buyer"), d2.get("buyer")) \
+        and same(d1.get("projectcode"), d2.get("projectcode")) \
+        and same(d1.get("subtype"), d2.get("subtype"))
+
+def rule_3(d1, d2):
+    return (same(d1.get("title"), d2.get("title")) or same(d1.get("projectname"), d2.get("projectname"))) \
+        and same(d1.get("buyer"), d2.get("buyer")) \
+        and same(d1.get("projectcode"), d2.get("projectcode")) \
+        and same(d1.get("toptype"), d2.get("toptype"))
+
+def rule_4(d1, d2):
+    return (same(d1.get("title"), d2.get("title")) or same(d1.get("projectname"), d2.get("projectname"))) \
+        and same(d1.get("buyer"), d2.get("buyer")) \
+        and same(d1.get("projectcode"), d2.get("projectcode"))
+
+def rule_5(d1, d2):
+    return same(d1.get("buyer"), d2.get("buyer")) \
+        and same(d1.get("projectcode"), d2.get("projectcode")) \
+        and same(d1.get("subtype"), d2.get("subtype"))
+
+def rule_6(d1, d2):
+    return (include(d1.get("title"), d2.get("title")) or include(d1.get("projectname"), d2.get("projectname"))) \
+        and same(d1.get("buyer"), d2.get("buyer")) \
+        and same(d1.get("projectcode"), d2.get("projectcode"))
+
+def rule_7(d1, d2):
+    emb_sim = get_max_embedding_sim(d1, d2)
+    return emb_sim >= 0.98 and same(d1.get("buyer"), d2.get("buyer")) and same(d1.get("projectcode"), d2.get("projectcode"))
+
+def rule_8(d1, d2):
+    emb_sim = get_max_embedding_sim(d1, d2)
+    return emb_sim >= 0.98 and same(d1.get("s_winner"), d2.get("s_winner")) and same(d1.get("projectcode"), d2.get("projectcode"))
+
+def rule_9(d1, d2):
+    emb_sim = get_max_embedding_sim(d1, d2)
+    return emb_sim >= 0.98 and same(d1.get("projectcode"), d2.get("projectcode")) and \
+           (d1.get("toptype") in ["拟建", "采购意向"] or d2.get("toptype") in ["拟建", "采购意向"])
+
+def rule_10(d1, d2):
+    emb_sim = get_max_embedding_sim(d1, d2)
+    return emb_sim >= 0.98 and same(d1.get("projectcode"), d2.get("projectcode"))
+
+def rule_11(d1, d2):
+    return d1.get("emb_sim", 0) >= 0.9 and same(d1.get("projectcode"), d2.get("projectcode"))
+
+def rule_12(d1, d2):
+    return d1.get("emb_sim", 0) >= 0.8 and same(d1.get("projectcode"), d2.get("projectcode"))
+
+rules = [
+    (1, rule_1), (2, rule_2), (3, rule_3), (4, rule_4), (5, rule_5),
+    (6, rule_6), (7, rule_7), (8, rule_8), (9, rule_9), (10, rule_10), (11, rule_11), (12, rule_12)
+]
+
+def process_group(docs: List[Dict]) -> List[Dict]:
+    n = len(docs)
+    matched_ids = set()
+    results = []
+
+    for flag, rule in rules:
+        for i in range(n):
+            d1 = docs[i]
+            _id1 = d1["_id"]
+            if _id1 in matched_ids:
+                continue
+            for j in range(i + 1, n):
+                d2 = docs[j]
+                _id2 = d2["_id"]
+                if _id2 in matched_ids:
+                    continue
+                if rule(d1, d2):
+                    results.append({
+                        "base_doc_id": _id1,
+                        "base_doc_projectname": d1["projectname"],
+                        "base_doc_href": d1["href"],
+                        'base_doc_jybxhref': f"https://www.jianyu360.cn/article/entservice/{SE3.encode_string(_id1)}.html?appid",
+                        "duplicate_doc_id": _id2,
+                        "duplicate_doc_projectname": d2["projectname"],
+                        "duplicate_doc_href": d2["href"],
+                        'duplicate_doc_jybxhref': f"https://www.jianyu360.cn/article/entservice/{SE3.encode_string(_id2)}.html?appid",
+                        "flag": flag
+                    })
+                    matched_ids.add(d1["_id"])
+                    matched_ids.add(d2["_id"])
+        print(f"第 {flag} 批完成,累计匹配 {len(matched_ids)} 条")
+
+    return results
+
+
+def search_documents(start, end, max_docs=100) -> List[Dict[str, Any]]:
+    query = {
+        "query": {
+            "range": {
+                "publishtime": {
+                    "gte": start,
+                    "lt": end
+                }
+            }
+        },
+        "size": BATCH_SIZE,
+        "sort": [{"publishtime": "asc"}, {"_id": "asc"}]
+    }
+    docs = []
+    search_after = None
+    page = 0
+    while True:
+        if search_after:
+            query["search_after"] = search_after
+        res = es.search(index=ES_INDEX, body=query)
+        hits = res["hits"]["hits"]
+        print(f"第 {page + 1} 页,返回 {len(hits)} 条")
+        if not hits:
+            print("已没有更多数据,跳出循环。")
+            break
+
+        for hit in hits:
+            doc = hit["_source"]
+            doc["_id"] = hit["_id"]
+            docs.append(doc)
+            # ✅ 限制返回条数
+            if len(docs) >= max_docs:
+                print(f"已达到最大限制:{max_docs} 条,提前终止。")
+                return docs
+
+        search_after = hits[-1]["sort"]  # 正确设置 search_after
+        page += 1
+    print(f"共获取 {len(docs)} 条文档")
+    return docs
+
+def search_documents_mongo(start, end, max_docs=1000) -> List[Dict[str, Any]]:
+    """
+    从 MongoDB 查询指定时间段内的数据
+    """
+    query = {
+        "publishtime": {
+            "$gte": start,
+            "$lt": end
+        }
+    }
+
+    cursor = collection.find(query).sort([
+        ("publishtime", 1),
+        ("_id", 1)
+    ]).limit(max_docs)
+
+    docs = []
+    for doc in cursor:
+        doc["_id"] = str(doc["_id"])  # 统一处理为字符串 ID
+        docs.append(doc)
+
+    print(f"共获取 {len(docs)} 条文档")
+    return docs
+
+
+def detect_duplicates(docs: List[Dict[str, Any]]):
+    buckets = defaultdict(list)
+    for doc in docs:
+        group_key = f"{doc.get('projectcode', '')}_{doc.get('projectname', '')}_{doc.get('buyer', '')}_{doc.get('toptype', '')}"
+        buckets[group_key].append(doc)
+
+    for k, v in buckets.items():
+        print(f"Group: {k}, Count: {len(v)}")
+        print("样例文档标题:", [doc.get("title", "") for doc in v[:3]])  # 每组最多打印前三条标题
+
+    print(f"共 {len(buckets)} 个分组")
+    all_results = []
+    for group in buckets.values():
+
+        if len(group) < 2:
+            continue  # 组内少于2条,跳过
+        # res = process_group(group)
+        # all_results.extend(res)
+
+
+    with multiprocessing.Pool(THREADS) as pool:
+        all_results = pool.map(process_group, buckets.values())
+        all_records = [r for batch in all_results for r in batch]
+        pool.close()  # 显式关闭
+        pool.join()  # 等待所有子进程结束
+
+    print(f"发现重复记录 {len(all_records)} 对")
+
+    for i in range(0, len(all_records), 1000):
+        batch = all_records[i:i + 1000]
+        collection.insert_many(batch)
+        print(f"已成功插入 {len(batch)} 条记录到 MongoDB")
+
+def main():
+    # 准备日期范围
+
+    end = datetime.utcnow()
+    start = end - timedelta(days=1)
+    day_end = int(end.timestamp())
+    day_start = int(start.timestamp())
+    print(f"处理时间段: {start} - {end}")
+    docs = search_documents(day_start, day_end,max_docs=1000)
+    print(f"获取文档数:{len(docs)}")
+    detect_duplicates(docs)
+    print("重复数据存库完成")
+
+
+if __name__ == "__main__":
+    main()

+ 75 - 0
tools/标讯数据重复率分析/repeat_v5.py

@@ -0,0 +1,75 @@
+from pymongo import MongoClient
+from bson import ObjectId
+from lib.mongo_tools import MongoUtil,Data_save,MongoSentence
+#判断标讯数据的重复率
+
+def calculate_repeat_rate(str1, str2):
+    import Levenshtein
+    # str1 = "茹河、红河河流沟道生态治理与农田整治提升项目(六盘山森林生态保护修复单元)-彭阳县茹河流域乃河水库至店洼水库生态缓冲带修复工程一期"
+    # str2 = "茹河、红河河流沟道生态治理与农田整治提升项目(六盘山森林生态保护修复单元)彭阳县茹河流域乃河水库至店洼水库生态缓冲带修复工程一期"
+    distance = Levenshtein.distance(str1, str2)
+    max_length = max(len(str1), len(str2))
+    if max_length != 0:
+        similarity = 1 - distance / max_length
+        return similarity
+    else:
+        return 1.0
+#判断互为包含关系
+def is_mutually_contained(str1, str2):
+    """判断两个字符串是否互为包含关系"""
+    return str1 in str2 or str2 in str1
+# 连接到目标数据库
+# db = MongoClient('192.168.3.149', 27180, unicode_decode_error_handler="ignore").data_quality
+# coll_user = db["liantong"]
+client = MongoClient('mongodb://127.0.0.1:27087/',unicode_decode_error_handler="ignore", directConnection=True)  # 修改为你的连接地址
+db = client["jyqyfw"]                       # 替换为你的数据库名
+col = db["xzh_20250714"]                    # 替换为你的集合名
+col1 = db["xzh_20250714_1"]
+
+documents = list(col.find({ "repeat" : { "$ne" : True } , "flag" : { "$exists" : False } , "tag" : { "$exists" : False }}).sort("_id",1))
+documents1=list(col1.find())
+for i in range(len(documents)):
+    for j in range(len(documents1)):
+        i_title=documents[i].get("title", "")
+        j_title = documents1[j].get("title", "")
+        i_projectname=documents[i].get("projectname", "")
+        j_projectname = documents1[j].get("projectname", "")
+        radio1=calculate_repeat_rate(i_title,j_title)
+        radio2=calculate_repeat_rate(i_projectname,j_projectname)
+        i_projectcode=documents[i].get("projectcode", "")
+        j_projectcode = documents1[j].get("projectcode", "")
+        i_buyer=documents[i].get("buyer", "")
+        j_buyer=documents1[j].get("buyer", "")
+        i_s_winner = documents[i].get("s_winner", "")
+        j_s_winner = documents1[j].get("s_winner", "")
+        i_bidamount = documents[i].get("bidamount", "")
+        j_bidamount = documents1[j].get("bidamount", "")
+        i_toptype = documents[i].get("toptype", "")
+        j_toptype = documents1[j].get("toptype", "")
+        # if (calculate_repeat_rate(i_title , j_title) >=0.98 or calculate_repeat_rate(j_projectname , j_projectname)>=0.98 ) and i_buyer==j_buyer and i_projectcode==j_projectcode and i_bidamount==j_bidamount:
+        # if (calculate_repeat_rate(i_title , j_title) >=0.98 or calculate_repeat_rate(j_projectname , j_projectname)>=0.98 ) and i_buyer==j_buyer and i_projectcode==j_projectcode :
+        # if (calculate_repeat_rate(i_title , j_title) >=0.98 or calculate_repeat_rate(j_projectname , j_projectname)>=0.98 ) and i_s_winner==j_s_winner and i_projectcode==j_projectcode and i_bidamount==j_bidamount:
+        # if (calculate_repeat_rate(i_title , j_title) >=0.98 or calculate_repeat_rate(j_projectname , j_projectname)>=0.98 ) and i_s_winner==j_s_winner and i_projectcode==j_projectcode :
+        # if (calculate_repeat_rate(i_title , j_title) >=0.98 or calculate_repeat_rate(j_projectname , j_projectname)>=0.98 ) and i_toptype in ("拟建","采购意向")  and j_toptype in ("拟建","采购意向") :
+        # if (calculate_repeat_rate(i_title , j_title) >=0.98 or calculate_repeat_rate(j_projectname , j_projectname)>=0.98 ) and i_projectcode==j_projectcode:
+        if (calculate_repeat_rate(i_title , j_title) >=0.8 or calculate_repeat_rate(j_projectname , j_projectname)>=0.8 ) and i_projectcode==j_projectcode:
+        # if (i_title ==j_title or i_projectname == j_projectname) and i_projectcode==j_projectcode and i_buyer==j_buyer and i_bidamount==j_bidamount:
+        # if (i_title ==j_title or i_projectname == j_projectname) and i_projectcode==j_projectcode and i_buyer==j_buyer :
+        # if  i_projectcode==j_projectcode and i_buyer==j_buyer and i_bidamount==j_bidamount:
+        # if (is_mutually_contained(i_title , j_title) or is_mutually_contained(j_projectname , j_projectname)) and i_projectcode==j_projectcode and i_buyer==j_buyer and i_bidamount==j_bidamount:
+        # if (is_mutually_contained(i_title , j_title) or is_mutually_contained(j_projectname , j_projectname)) and i_projectcode==j_projectcode and i_buyer==j_buyer :
+            # 更新文档i
+            col.update_one(
+                {"_id": documents[i]["_id"]},
+                {"$set": {"tag": 12}}
+            )
+            # 更新文档j
+            col1.update_one(
+                {"_id": documents1[j]["_id"]},
+                {"$set": {"tag": 12}}
+            )
+
+            # 更新内存中的文档状态,避免重复处理
+            documents[i]["tag"] = 12
+            documents1[j]["tag"] = 12
+

TEMPAT SAMPAH
tools/标讯数据重复率分析/repeated_with_source.xlsx


+ 300 - 6
tools/标讯数据重复率分析/test.py

@@ -1,8 +1,302 @@
-import Levenshtein
+import pymongo
+from pymongo import MongoClient
 
-str1 = "茹河、红河河流沟道生态治理与农田整治提升项目(六盘山森林生态保护修复单元)-彭阳县茹河流域乃河水库至店洼水库生态缓冲带修复工程一期"
-str2 = "茹河、红河河流沟道生态治理与农田整治提升项目(六盘山森林生态保护修复单元)彭阳县茹河流域乃河水库至店洼水库生态缓冲带修复工程一期"
+# 给定的ID列表
+given_ids =[
+    "686b2368d5d8e4081f88f0fd",
+    "686b2fa2d5d8e4081f8929ca",
+    "686b4a70d5d8e4081f89b660",
+    "686cdf8ed5d8e4081f8f18fa",
+    "6870a794d5d8e4081f9db86d",
+    "68706689d5d8e4081f9ca2da",
+    "68707995d5d8e4081f9cfc02",
+    "686c2bf2d5d8e4081f8c8c36",
+    "686b7f02d5d8e4081f8a5923",
+    "686b8d8cd5d8e4081f8aac59",
+    "686b9038d5d8e4081f8abea2",
+    "686b8f3cd5d8e4081f8ab792",
+    "686b8dd5d5d8e4081f8aae4b",
+    "686b8ff8d5d8e4081f8abbbb",
+    "686b8be1d5d8e4081f8aa000",
+    "686bed2fd5d8e4081f8bc6bb",
+    "686b9a8bd5d8e4081f8b0025",
+    "686bed2fd5d8e4081f8bc6ba",
+    "686bb2bdd5d8e4081f8b68f7",
+    "686bed2fd5d8e4081f8bc6b8",
+    "686ba629d5d8e4081f8b3dc5",
+    "68708a52d5d8e4081f9d5056",
+    "686ba731d5d8e4081f8b4113",
+    "686ba707d5d8e4081f8b3ff0",
+    "686d0b5ad5d8e4081f9035fc",
+    "686c867dd5d8e4081f8d66dd",
+    "686df806d5d8e4081f93d9df",
+    "686dee62d5d8e4081f935987",
+    "686c942cd5d8e4081f8db7fb",
+    "686cb548d5d8e4081f8e29c1",
+    "686cbac5d5d8e4081f8e3c03",
+    "686c9ac2d5d8e4081f8dd970",
+    "686cbfd2d5d8e4081f8e4b7f",
+    "686ca31fd5d8e4081f8df918",
+    "686ceeaad5d8e4081f8f95ba",
+    "686ce491d5d8e4081f8f44de",
+    "686cd840d5d8e4081f8ed9e7",
+    "686ceaf2d5d8e4081f8f7c30",
+    "686cef83d5d8e4081f8f9e66",
+    "686d07e5d5d8e4081f9027cb",
+    "686cf6edd5d8e4081f8fd336",
+    "686cfaecd5d8e4081f8fea46",
+    "686cfcb7d5d8e4081f8ff442",
+    "686cfa15d5d8e4081f8fe74f",
+    "686d047ad5d8e4081f901a23",
+    "686d0987d5d8e4081f90305c",
+    "686d1fdad5d8e4081f907818",
+    "686d26fcd5d8e4081f908b6b",
+    "686d415ed5d8e4081f90d2ba",
+    "686cd89dd5d8e4081f8edb67",
+    "686dc7f6d5d8e4081f922660",
+    "686dc258d5d8e4081f92100d",
+    "686dc1e5d5d8e4081f920d80",
+    "686de2f4d5d8e4081f92bee3",
+    "686de1e2d5d8e4081f92b534",
+    "686ecd95d5d8e4081f97be2d",
+    "686e078ad5d8e4081f947919",
+    "686e036dd5d8e4081f945bc2",
+    "686e1d1bd5d8e4081f951376",
+    "686e0840d5d8e4081f948687",
+    "686e1f57d5d8e4081f952002",
+    "686e1873d5d8e4081f94f588",
+    "686df18ed5d8e4081f93817c",
+    "686e1f8cd5d8e4081f9521b3",
+    "686e341cd5d8e4081f95a7de",
+    "686e47ffd5d8e4081f95f170",
+    "686e5f3bd5d8e4081f9679df",
+    "686e603ed5d8e4081f969cc5",
+    "686e5105d5d8e4081f96027a",
+    "686e608dd5d8e4081f96a56e",
+    "686e5e90d5d8e4081f966092",
+    "686e6c21d5d8e4081f96cac0",
+    "686e60e0d5d8e4081f96ae81",
+    "686f2c34d5d8e4081f989355",
+    "686f30b3d5d8e4081f98ad77",
+    "686f487ad5d8e4081f992d29",
+    "686f3c2dd5d8e4081f98eb39",
+    "686f6888d5d8e4081f998a55",
+    "686f6889d5d8e4081f998ad5",
+    "686febf5d5d8e4081f9bdb1f",
+    "686f7217d5d8e4081f99c2b9",
+    "686f84fad5d8e4081f9a2b4f",
+    "686f8d26d5d8e4081f9a5f0a",
+    "686f9063d5d8e4081f9a70dd",
+    "686f9d7fd5d8e4081f9ae5a9",
+    "686f6bbbd5d8e4081f999fc8",
+    "686f78fdd5d8e4081f99e830",
+    "686fb8edd5d8e4081f9b5744",
+    "686b5f02d5d8e4081f89eb37",
+    "686b4f03d5d8e4081f89c6eb",
+    "68707a30d5d8e4081f9cfeb7",
+    "686b6dd5d5d8e4081f8a0f1e",
+    "686b7f2cd5d8e4081f8a5a54",
+    "686b902ed5d8e4081f8abe54",
+    "686b8b29d5d8e4081f8a9d91",
+    "686b8f31d5d8e4081f8ab740",
+    "686b7f89d5d8e4081f8a5bff",
+    "686ba38fd5d8e4081f8b314b",
+    "686e0830d5d8e4081f948573",
+    "686f34e2d5d8e4081f98c244",
+    "686badfcd5d8e4081f8b5b1b",
+    "686cfc19d5d8e4081f8ff02c",
+    "68705a13d5d8e4081f9c83db",
+    "686bf0c7d5d8e4081f8bdbb3",
+    "686bf55bd5d8e4081f8c00e0",
+    "68706844d5d8e4081f9cab24",
+    "687072bcd5d8e4081f9cdabc",
+    "68707166d5d8e4081f9cd41d",
+    "68707cdcd5d8e4081f9d0adc",
+    "68707eafd5d8e4081f9d137e",
+    "6870a8f8d5d8e4081f9dbc07",
+    "6870b983d5d8e4081f9df38c",
+    "686f0aaad5d8e4081f97fd13",
+    "686b3a6dd5d8e4081f8962e1",
+    "686b3971d5d8e4081f895bb0",
+    "686c2bcad5d8e4081f8c8c10",
+    "686caf44d5d8e4081f8e19e3",
+    "686b524cd5d8e4081f89d03c",
+    "686b4be1d5d8e4081f89bb1e",
+    "686ccca9d5d8e4081f8e8790",
+    "686cd92ad5d8e4081f8ee2cd",
+    "686e24d7d5d8e4081f95424e",
+    "686cd96cd5d8e4081f8ee619",
+    "686d0d42d5d8e4081f904010",
+    "686cc915d5d8e4081f8e772c",
+    "686e3388d5d8e4081f95a330",
+    "686cdd72d5d8e4081f8f0588",
+    "686ce7f4d5d8e4081f8f613d",
+    "686ce640d5d8e4081f8f51df",
+    "686ce3ded5d8e4081f8f3ef9",
+    "686d55ecd5d8e4081f9155c1",
+    "686cebfed5d8e4081f8f829b",
+    "686cef3ad5d8e4081f8f9cd8",
+    "686cebd3d5d8e4081f8f80ba",
+    "686cedafd5d8e4081f8f9006",
+    "686cebc8d5d8e4081f8f8067",
+    "686cf6d3d5d8e4081f8fd187",
+    "686d0cf8d5d8e4081f903da0",
+    "686c7d3ed5d8e4081f8d36c8",
+    "686c8b22d5d8e4081f8d8428",
+    "686c8abdd5d8e4081f8d8342",
+    "686ca7dcd5d8e4081f8e0634",
+    "686c91d2d5d8e4081f8daae0",
+    "686c98abd5d8e4081f8dcdcf",
+    "686cc4add5d8e4081f8e630c",
+    "686df3aed5d8e4081f93aa40",
+    "686cc46fd5d8e4081f8e61f3",
+    "686cc432d5d8e4081f8e6189",
+    "686cc077d5d8e4081f8e4f2e",
+    "686dc58fd5d8e4081f921c6c",
+    "686dc63cd5d8e4081f921f32",
+    "686dc651d5d8e4081f921fc4",
+    "686dd0ced5d8e4081f924bb2",
+    "686ddeacd5d8e4081f928b8b",
+    "686dfd29d5d8e4081f941386",
+    "686e057dd5d8e4081f94649b",
+    "686e05f9d5d8e4081f94664a",
+    "686e015ed5d8e4081f943ff3",
+    "686e1834d5d8e4081f94f397",
+    "686e7d5cd5d8e4081f96e990",
+    "686e1ebad5d8e4081f951bd3",
+    "686e1874d5d8e4081f94f5f9",
+    "686e1501d5d8e4081f94de1a",
+    "686e2632d5d8e4081f954bf0",
+    "686e23d4d5d8e4081f953714",
+    "686e3a94d5d8e4081f95d2ae",
+    "686e3ff1d5d8e4081f95dea2",
+    "686e3427d5d8e4081f95a836",
+    "686e5a64d5d8e4081f9608e8",
+    "686e3267d5d8e4081f959681",
+    "686e6e6ed5d8e4081f96cf99",
+    "686e3822d5d8e4081f95c913",
+    "686e5c1fd5d8e4081f960fe2",
+    "686e4bb9d5d8e4081f95f9fe",
+    "686f3d5ad5d8e4081f98f029",
+    "686e5d9bd5d8e4081f963078",
+    "686e5f89d5d8e4081f9684c8",
+    "686e6081d5d8e4081f96a406",
+    "686e6263d5d8e4081f96b7be",
+    "686f8081d5d8e4081f9a1106",
+    "686f8de7d5d8e4081f9a6323",
+    "686f9242d5d8e4081f9a83c7",
+    "686f9c0cd5d8e4081f9adb8e",
+    "686f9024d5d8e4081f9a6f52",
+    "686fa059d5d8e4081f9af625",
+    "686f9f00d5d8e4081f9aee5a",
+    "686f9ab5d5d8e4081f9ad200",
+    "686fdbaed5d8e4081f9b920c",
+    "686f7bb6d5d8e4081f99f61e",
+    "686f852dd5d8e4081f9a2ce0",
+    "686f095cd5d8e4081f97fb32",
+    "686f6457d5d8e4081f997687",
+    "686f1918d5d8e4081f982f6a",
+    "686f33ddd5d8e4081f98bcc4",
+    "686f696ed5d8e4081f998f8a",
+    "686f7bd5d5d8e4081f99f6c1",
+    "68703b1ed5d8e4081f9c643e",
+    "6870624bd5d8e4081f9c92c6",
+    "68707082d5d8e4081f9ccf65",
+    "687087a2d5d8e4081f9d427c",
+    "68707f92d5d8e4081f9d16f6",
+    "687087a1d5d8e4081f9d4266",
+    "68708ce6d5d8e4081f9d5c6c",
+    "6870a64cd5d8e4081f9db464",
+    "6870b517d5d8e4081f9de26f",
+    "6870b135d5d8e4081f9dd362",
+    "6870b616d5d8e4081f9de544",
+    "6870c9f9d5d8e4081f9e5923",
+    "6870b80fd5d8e4081f9ded31",
+    "685a0503c936757aa185ddc8",
+    "6853e7f9c936757aa17116e8",
+    "6848e6775f834436f0930945",
+    "685a77b6c936757aa188ab00",
+    "68625899d5d8e4081f711ab5",
+    "686390afd5d8e4081f757cec",
+    "67d93d663309c0998bbde35e",
+    "685cbe51c936757aa1935f2a",
+    "686e2454d5d8e4081f953b7c",
+    "687095fcd5d8e4081f9d8ecd",
+    "686cbd52d5d8e4081f8e4379",
+    "686ce2f2d5d8e4081f8f354d",
+    "686e0795d5d8e4081f947a2d",
+    "686d0d02d5d8e4081f903db8",
+    "686c7650d5d8e4081f8d14cc",
+    "686c7b31d5d8e4081f8d2d1b",
+    "686b8ef4d5d8e4081f8ab63a",
+    "686b4c5cd5d8e4081f89bcac",
+    "686e602dd5d8e4081f9699f7",
+    "686e1bd3d5d8e4081f950ba7",
+    "686e1f96d5d8e4081f9521f9",
+    "686b8d50d5d8e4081f8aa94f",
+    "686cd415d5d8e4081f8eb79b",
+    "6870b10dd5d8e4081f9dd2e4",
+    "686b6603d5d8e4081f89f97a",
+    "686f6eaed5d8e4081f99b136",
+    "686d44a6d5d8e4081f90fa49",
+    "686b878ed5d8e4081f8a87fb",
+    "686b3b29d5d8e4081f8966d9",
+    "686b8907d5d8e4081f8a8fc8",
+    "686e8ac0d5d8e4081f97020f",
+    "686cdae6d5d8e4081f8ef1c6",
+    "686f958fd5d8e4081f9aa40d",
+    "686b722fd5d8e4081f8a1dcb",
+    "686cdbd9d5d8e4081f8ef923",
+    "686c899fd5d8e4081f8d7a27",
+    "686cc90bd5d8e4081f8e76e8",
+    "686de12fd5d8e4081f92ac9c",
+    "686e5fd8d5d8e4081f968fac",
+    "68703331d5d8e4081f9c5e65",
+    "687083f7d5d8e4081f9d2e4e",
+    "686b2c73d5d8e4081f891c43",
+    "6853f16bc936757aa17150b3",
+    "686e6011d5d8e4081f969787",
+    "686f5effd5d8e4081f996310",
+    "686e1339d5d8e4081f94d6aa",
+    "685b00e6c936757aa18b1c5b",
+    "6863407ed5d8e4081f73d8aa",
+    "686dd38bd5d8e4081f92589a",
+    "68626764d5d8e4081f71983f"
+]
 
-distance = Levenshtein.distance(str1, str2)
-similarity = 1 - distance / max(len(str1), len(str2))
-print(f"Similarity: {similarity}")
+# 连接MongoDB数据库
+client = MongoClient('mongodb://127.0.0.1:27087/',unicode_decode_error_handler="ignore", directConnection=True)  # 修改为你的连接地址
+db = client["jyqyfw"]                       # 替换为你的数据库名
+col = db["xzh_20250714"]                    # 替换为你的集合名
+
+
+
+def find_matching_ids(given_ids):
+    result_ids = []
+
+    # 首先检查给定的ID是否直接存在于"id"字段中
+    for given_id in given_ids:
+        # 检查是否作为主id存在
+        doc = col.find_one({"id": given_id})
+        if doc:
+            result_ids.append(doc["id"])
+            continue
+
+        # 检查是否作为history_repeat_id中的key存在
+        doc = col.find_one({f"history_repeat_id.{given_id}": {"$exists": True}})
+        if doc:
+            result_ids.append(doc["id"])
+
+    return result_ids
+
+
+# 执行查询
+matched_ids = find_matching_ids(given_ids)
+
+# 打印结果,保持原始顺序
+print("匹配到的ID(按原始顺序):")
+for matched_id in matched_ids:
+    print(matched_id)
+
+# 关闭数据库连接
+client.close()

+ 44 - 0
tools/标讯数据重复率分析/导出重复数据.py

@@ -0,0 +1,44 @@
+from pymongo import MongoClient
+import pandas as pd
+from lib.detail_url import SE3
+
+
+# MongoDB连接配置
+client = MongoClient("mongodb://localhost:27017")  # 修改为实际连接
+db = client["your_database"]                       # 替换为你的数据库名
+col = db["your_collection"]                        # 替换为你的集合名
+
+# 查询主数据(没有 flag 字段)
+main_docs = col.find({"flag": {"$exists": False}}, {"_id": 1, "duplicate_doc_ids": 1})
+
+rows = []
+
+for doc in main_docs:
+    main_id = str(doc["_id"])
+    main_href = f"https://www.jianyu360.cn/article/entservice/{SE3.encode_string(main_id)}.html?appid"
+
+    # 第一行:主数据
+    rows.append({
+        "main_id": main_id,
+        "main_jybxhref": main_href,
+        "duplicate_id": "",
+        "duplicate_jybxhref": ""
+    })
+
+    # 后续行:重复数据
+    for dup_id in doc.get("duplicate_doc_ids", []):
+        dup_id_str = str(dup_id)
+        dup_href = f"https://www.jianyu360.cn/article/entservice/{SE3.encode_string(dup_id_str)}.html?appid"
+        rows.append({
+            "main_id": "",
+            "main_jybxhref": "",
+            "duplicate_id": dup_id_str,
+            "duplicate_jybxhref": dup_href
+        })
+
+# 转为 DataFrame 并导出 Excel
+df = pd.DataFrame(rows)
+output_file = "main_and_duplicates_expanded.xlsx"
+df.to_excel(output_file, index=False)
+
+print(f"导出完成,共 {len(df)} 行数据,保存至 {output_file}")

+ 49 - 0
tools/标讯数据重复率分析/导出重复数据_v1.py

@@ -0,0 +1,49 @@
+from pymongo import MongoClient
+import pandas as pd
+from bson import ObjectId
+from lib.detail_url import SE3
+# MongoDB连接配置
+client = MongoClient('mongodb://127.0.0.1:27087/',unicode_decode_error_handler="ignore", directConnection=True)  # 修改为你的连接地址
+db = client["jyqyfw"]                       # 替换为你的数据库名
+col = db["xzh_20250714"]                    # 替换为你的集合名
+col1 = db["xzh_20250714_1"]
+
+# 需要导出的字段
+fields = ["id","title", "projectname", "href", "projectcode", "repeattext", "subtype", "s_winner", "bidamount", "buyer"]
+
+rows = []
+
+# 查询所有 repeat=true 的重复数据
+repeat_docs = col.find({"ishistory": True})
+
+for repeat_doc in repeat_docs:
+    repeat_row = {"类型": "主数据"}
+    for field in fields:
+        repeat_row[field] = repeat_doc.get(field, "")
+    rows.append(repeat_row)
+    # 构造 jyhref
+    id_value = repeat_doc.get("id", "")
+    repeat_row["jyhref"] = f"https://www.jianyu360.cn/article/entservice/{SE3.encode_string(id_value)}.html?appid" if id_value else ""
+    # 尝试查找原始数据
+    # repeatid = repeat_doc.get("repeatid")
+    for main_id_str in repeat_doc.get("history_repeat_id", {}).keys():
+        main_doc = col1.find_one({"id": main_id_str})
+        main_row = {"类型": "重复数据"}
+        if main_doc:
+            for field in fields:
+                main_row[field] = main_doc.get(field, "")
+            id_main = main_doc.get("id", "")
+            main_row["jyhref"] = f"https://www.jianyu360.cn/article/entservice/{SE3.encode_string(id_main)}.html?appid" if id_value else ""
+        else:
+            main_row = {key: "未找到" for key in ["类型"] + fields}
+            main_row["类型"] = "原始数据"
+
+        rows.append(main_row)
+
+
+# 导出为 Excel
+df = pd.DataFrame(rows)
+output_file = "repeated_with_source.xlsx"
+df.to_excel(output_file, index=False)
+
+print(f"已导出共 {len(rows)} 行数据,文件保存为 {output_file}")

+ 54 - 0
tools/标讯数据重复率分析/导出重复数据_v2.py

@@ -0,0 +1,54 @@
+from pymongo import MongoClient
+import pandas as pd
+from bson import ObjectId
+from lib.detail_url import SE3
+# MongoDB连接配置
+client = MongoClient('mongodb://127.0.0.1:27087/',unicode_decode_error_handler="ignore", directConnection=True)  # 修改为你的连接地址
+db = client["jyqyfw"]                       # 替换为你的数据库名
+col = db["xzh_20250714"]                        # 替换为你的集合名
+# 导出字段列表
+fields = ["id","title", "projectname", "href", "projectcode", "repeattext","subtype", "s_winner", "bidamount", "buyer"]
+
+rows = []
+
+# 查询主数据:repeat=False 且 repeatid_ids 不为空
+main_docs = col.find({
+    "repeat": False,
+    "repeatid_ids": {"$exists": True, "$ne": {}}
+})
+
+for main_doc in main_docs:
+    # 第一行:主数据
+    main_row = {"类型": "主数据"}
+    for field in fields:
+        main_row[field] = main_doc.get(field, "")
+    rows.append(main_row)
+    # 构造 jyhref
+    id_value = main_doc.get("id", "")
+    main_row["jyhref"] = f"https://www.jianyu360.cn/article/entservice/{SE3.encode_string(id_value)}.html?appid" if id_value else ""
+    # 查找 repeatid_ids 中的所有文档
+    for repeat_id_str in main_doc.get("repeatid_ids", {}).keys():
+        try:
+            repeat_doc = col.find_one({"id": repeat_id_str})
+        except:
+            repeat_doc = None
+
+        repeat_row = {"类型": "重复数据"}
+
+        if repeat_doc:
+            for field in fields:
+                repeat_row[field] = repeat_doc.get(field, "")
+            id_repeat = repeat_doc.get("id", "")
+            repeat_row["jyhref"] = f"https://www.jianyu360.cn/article/entservice/{SE3.encode_string(id_repeat)}.html?appid" if id_value else ""
+        else:
+            for field in fields:
+                repeat_row[field] = "未找到"
+
+        rows.append(repeat_row)
+
+# 转为 DataFrame 并导出 Excel
+df = pd.DataFrame(rows)
+output_file = "main_with_repeatids_grouped.xlsx"
+df.to_excel(output_file, index=False)
+
+print(f"导出完成,共 {len(df)} 行,保存至 {output_file}")

+ 138 - 0
tools/标讯数据附件为空数量统计/统计附件缺失数量.py

@@ -0,0 +1,138 @@
+from elasticsearch import Elasticsearch
+import time
+
+
+def count_attachments_status(es_host, es_index, es_username, es_password, batch_size=1000):
+    """
+    仅统计附件状态的脚本
+    统计分类:
+    1. 有org_url且有fid(正确情况)
+    2. 有org_url但无fid(错误情况)
+    3. 无org_url(需检查情况)
+    4. 无attachments字段
+    """
+    # 初始化ES客户端
+    es = Elasticsearch(
+        es_host,
+        http_auth=(es_username, es_password),
+        port=19800,
+        timeout=10000,
+        max_retries=3
+    )
+
+    # 初始化统计
+    stats = {
+        'total_processed': 0,
+        'org_url_with_fid': 0,  # 有org_url且有fid
+        'org_url_no_fid': 0,    # 有org_url但无fid
+        'no_org_url': 0,        # 无org_url
+        'no_attachments': 0,    # 无attachments字段
+        'errors': 0
+    }
+
+    query = {
+        "track_total_hits": True,
+        "query": {
+            "bool": {
+                "must": [{
+                    "range": {
+                        "comeintime": {
+                            "from": "1748534400",
+                            "to": "1751212800"
+                        }
+                    }
+                }]
+            }
+        }
+    }
+
+    try:
+        # 初始查询
+        resp = es.search(
+            index=es_index,
+            scroll='5m',
+            size=batch_size,
+            body=query
+        )
+        scroll_id = resp['_scroll_id']
+        total_docs = resp['hits']['total']['value']
+
+        print(f"开始处理 {total_docs} 条文档...")
+
+        while True:
+            hits = resp['hits']['hits']
+            if not hits:
+                break
+
+            for hit in hits:
+                stats['total_processed'] += 1
+                doc = hit.get('_source', {})
+                attachments = doc.get('projectinfo', {}).get('attachments')
+
+                # 分类统计逻辑
+                if attachments is None:
+                    stats['no_attachments'] += 1
+                elif not attachments:
+                    stats['no_attachments'] += 1
+                else:
+                    first_att = next(iter(attachments.values()))
+                    has_org_url = 'org_url' in first_att
+                    has_fid = 'fid' in first_att
+
+                    if has_org_url:
+                        if has_fid:
+                            stats['org_url_with_fid'] += 1
+                        else:
+                            stats['org_url_no_fid'] += 1
+                    else:
+                        stats['no_org_url'] += 1
+
+            # 进度报告
+            if stats['total_processed'] % 1000 == 0:
+                print_progress(stats, total_docs)
+
+            # 获取下一批
+            resp = es.scroll(scroll_id=scroll_id, scroll='5m')
+            scroll_id = resp['_scroll_id']
+
+    except Exception as e:
+        print(f"处理失败: {str(e)}")
+        stats['errors'] += 1
+    finally:
+        print_final_report(stats, total_docs)
+
+
+def print_progress(stats, total):
+    """打印处理进度"""
+    progress = stats['total_processed'] / total * 100
+    print(f"\n进度: {progress:.1f}%")
+    print(f"已处理: {stats['total_processed']}/{total}")
+    print(f"正确附件(有org_url和fid): {stats['org_url_with_fid']}")
+    print(f"错误附件(有org_url无fid): {stats['org_url_no_fid']}")
+    print(f"无org_url: {stats['no_org_url']}")
+    print(f"无attachments: {stats['no_attachments']}")
+
+
+def print_final_report(stats, total):
+    """打印最终统计"""
+    print("\n" + "=" * 50)
+    print("附件状态统计结果".center(50))
+    print("=" * 50)
+    print(f"总文档数: {total}")
+    print(f"已处理文档: {stats['total_processed']}")
+    print(f"正确附件(有org_url和fid): {stats['org_url_with_fid']} ({(stats['org_url_with_fid']/stats['total_processed'])*100:.1f}%)")
+    print(f"错误附件(有org_url无fid): {stats['org_url_no_fid']} ({(stats['org_url_no_fid']/stats['total_processed'])*100:.1f}%)")
+    print(f"无org_url需检查: {stats['no_org_url']} ({(stats['no_org_url']/stats['total_processed'])*100:.1f}%)")
+    print(f"无attachments: {stats['no_attachments']} ({(stats['no_attachments']/stats['total_processed'])*100:.1f}%)")
+    print(f"错误数量: {stats['errors']}")
+    print("=" * 50)
+
+
+if __name__ == "__main__":
+    count_attachments_status(
+        es_host="http://127.0.0.1:19800",
+        es_index="bidding",
+        es_username="jianyuGr",
+        es_password="we3g8glKfe#",
+        batch_size=1000
+    )

+ 203 - 0
tools/标讯数据附件为空数量统计/附件缺失率第二版.py

@@ -0,0 +1,203 @@
+from pymongo import MongoClient
+from elasticsearch import Elasticsearch,helpers
+from tqdm import tqdm
+import time
+from datetime import datetime
+from lib.detail_url import SE3
+
+# 配置常量
+BATCH_SIZE = 10000
+ES_SCROLL_TIME = '5m'
+MONGO_BATCH_SIZE = 1000
+
+
+# 初始化连接
+def init_connections():
+    # ES 连接配置
+    es_host = "http://127.0.0.1:19800"
+    es_username = "jianyuGr"
+    es_password = "we3g8glKfe#"
+
+    # 初始化 Elasticsearch 客户端
+    es = Elasticsearch(es_host, http_auth=(es_username, es_password), retry_on_timeout=True)  # 使用基本认证
+    # MongoDB连接
+    mongo_client_bid =  MongoClient(f'mongodb://{"viewdata"}:{"viewdata"}@{"127.0.0.1:27088"}/', unicode_decode_error_handler="ignore",directConnection=True)["qfw"]
+    mongo_client = MongoClient('mongodb://172.20.45.129:27002/', unicode_decode_error_handler="ignore")
+
+    return es, mongo_client_bid,mongo_client
+
+
+def get_es_query():
+    """构建正确的ES查询"""
+    return {
+        "track_total_hits": True,
+        "query": {
+            "bool": {
+                "must": [
+                    {
+                        "range": {
+                            "publishtime": {
+                                "gte": 1748534400,
+                                "lte": 1751212800
+                            }
+                        }
+                    },
+                    {
+                        "bool": {
+                            "should": [
+                                {
+                                    "multi_match": {
+                                        "query": "附件",
+                                        "type": "phrase",
+                                        "fields": ["detail"]
+                                    }
+                                },
+                                {
+                                    "multi_match": {
+                                        "query": "详情请访问原网页!",
+                                        "type": "phrase",
+                                        "fields": ["detail"]
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                ]
+            }
+        },
+        "highlight": {
+            "pre_tags": [""],
+            "post_tags": [""],
+            "fields": {
+                "detail": {
+                    "fragment_size": 115,
+                    "number_of_fragments": 1
+                }
+            }
+        },
+        "sort": [
+            {"dataweight": "desc"},
+            {"publishtime": "desc"}
+        ],
+        "size": 1000,
+        "_source": False
+    }
+
+es_query = {
+    "query": {
+        "bool": {
+            "filter": [
+                {
+                    "term": {
+                        "_id": "68627259d5d8e4081f71d6f0"
+                    }
+                }
+            ]
+        }
+    },
+    "size": 1  # 每次返回的数据量
+}
+def query_es_data_batch(es_client):
+    """分批从ES获取数据"""
+    print("开始从ES获取数据...")
+    es_ids = []
+    start_time = time.time()
+    response = es_client.search(index="bidding", body=es_query)
+    hits = response['hits']['hits']
+    try:
+        for hit in hits:
+            es_ids.append(hit['_id'])
+            if len(es_ids) % BATCH_SIZE == 0:
+                yield es_ids
+                es_ids = []
+
+        if es_ids:
+            yield es_ids
+
+        print(f"ES数据获取完成,耗时: {time.time() - start_time:.2f}秒")
+    except Exception as e:
+        print(f"ES查询出错: {str(e)}")
+        raise
+
+
+def process_mongo_batch(bidding_collection, es_ids):
+    """处理一批MongoDB数据"""
+    results = []
+
+    try:
+        cursor = bidding_collection.find(
+            {"_id": {"$in": es_ids}}
+        )
+
+        for doc in cursor:
+            attachments = doc.get('projectinfo', {}).get('attachments', {})
+
+            for key, att in attachments.items():
+                if isinstance(att, dict) and att.get('org_url') and not att.get('fid'):
+                    _id = doc['_id']
+                    href = SE3.encode_string(_id)
+                    jybxhref = f"https://www.jianyu360.cn/article/entservice/{href}.html?appid"
+                    results.append({
+                        "_id": doc['_id'],
+                        "href":doc['href'],
+                        "site": doc['site'],
+                        "spidercode": doc['spidercode'],
+                        "jybxhref":jybxhref,
+                        "attachment_key": key,
+                        "attachment_data": att,
+                        "created_at": datetime.now(),
+                        "source": "es_and_mongo_sync"
+                    })
+    except Exception as e:
+        print(f"MongoDB查询出错: {str(e)}")
+        raise
+
+    return results
+
+
+def main():
+    es,mongo_client_bid, mongo_client = init_connections()
+    bidding_collection = mongo_client_bid.qfw['bidding']
+    new_collection = mongo_client.data_quality['missing_fid_attachments']
+
+    total_processed = 0
+    total_found = 0
+
+    try:
+        with tqdm(desc="处理进度", unit="batch") as pbar:
+            for batch_es_ids in query_es_data_batch(es):
+                batch_results = process_mongo_batch(bidding_collection, batch_es_ids)
+
+                if batch_results:
+                    try:
+                        new_collection.insert_many(batch_results, ordered=False)
+                        total_found += len(batch_results)
+                    except Exception as e:
+                        print(f"批量插入出错: {str(e)}")
+                        # 可以改为单条插入尝试
+                        for doc in batch_results:
+                            try:
+                                new_collection.insert_one(doc)
+                                total_found += 1
+                            except:
+                                continue
+
+                total_processed += len(batch_es_ids)
+                pbar.update(1)
+                pbar.set_postfix({
+                    '已处理': total_processed,
+                    '发现': total_found
+                })
+
+        print(f"\n处理完成! 共处理 {total_processed} 条记录,发现 {total_found} 条符合条件的附件")
+    except KeyboardInterrupt:
+        print("\n用户中断执行,已处理数据将被保存")
+    except Exception as e:
+        print(f"\n程序执行出错: {str(e)}")
+    finally:
+        # 可以在这里添加资源清理代码
+        pass
+
+
+if __name__ == "__main__":
+    main()

+ 321 - 0
tools/标讯数据附件为空数量统计/附件缺失率第二版_新.py

@@ -0,0 +1,321 @@
+from elasticsearch import Elasticsearch
+from pymongo import MongoClient, UpdateOne
+from pymongo.errors import BulkWriteError
+from lib.detail_url import SE3
+import time
+
+
+def process_es_to_mongo(es_host, es_index, es_username, es_password,mongo_uri, mongo_db, mongo_collection, batch_size=1000):
+    """
+    优化后的数据迁移脚本,主要改进:
+    1. 更清晰的统计分类
+    2. 更健壮的批量处理
+    3. 更完善的错误处理
+    """
+
+    # 初始化客户端
+    es = Elasticsearch(
+        es_host,
+        http_auth=(es_username, es_password),
+        port=19800,
+        timeout=10000,
+        max_retries=3
+    )
+
+    mongo_client = MongoClient(mongo_uri, unicode_decode_error_handler = "ignore")
+    db = mongo_client[mongo_db]
+    collection = db[mongo_collection]
+
+    # 初始化统计
+    stats = {
+        'total_processed': 0,
+        'org_url_no_fid': 0,  # org_url有值且fid为空(错误情况)
+        'org_url_with_fid': 0,  # org_url有值且fid有值(正确情况)
+        'no_attachments': 0,  # 没有attachments的文档(保存)
+        'no_org_url': 0,  # org_url为空(需要检查的情况)
+        'saved_docs': 0,  # 实际保存的文档数
+        'errors': 0
+    }
+
+    # 保持原有的ES查询
+    # query = {
+    #     "track_total_hits": True,
+    #     "query": {
+    #         "bool": {
+    #             "must": [{
+    #                 "range": {
+    #                     "publishtime": {
+    #                         "gte": 1748534400,
+    #                         "lte": 1751212800
+    #                     }
+    #                 }
+    #             },
+    #                 {
+    #                     "bool": {
+    #                         "should": [{
+    #                             "multi_match": {
+    #                                 "query": "详情请下载附件",
+    #                                 "type": "phrase",
+    #                                 "fields": [
+    #                                     "detail"
+    #                                 ]
+    #                             }
+    #                         },
+    #                             {
+    #                                 "multi_match": {
+    #                                     "query": "详见附件",
+    #                                     "type": "phrase",
+    #                                     "fields": [
+    #                                         "detail"
+    #                                     ]
+    #                                 }
+    #                             },
+    #                             {
+    #                                 "multi_match": {
+    #                                     "query": "xlsx",
+    #                                     "type": "phrase",
+    #                                     "fields": [
+    #                                         "detail"
+    #                                     ]
+    #                                 }
+    #                             },
+    #                             {
+    #                                 "multi_match": {
+    #                                     "query": "xls",
+    #                                     "type": "phrase",
+    #                                     "fields": [
+    #                                         "detail"
+    #                                     ]
+    #                                 }
+    #                             },
+    #                             {
+    #                                 "multi_match": {
+    #                                     "query": "pdf",
+    #                                     "type": "phrase",
+    #                                     "fields": [
+    #                                         "detail"
+    #                                     ]
+    #                                 }
+    #                             },
+    #                             {
+    #                                 "multi_match": {
+    #                                     "query": "合同附件",
+    #                                     "type": "phrase",
+    #                                     "fields": [
+    #                                         "detail"
+    #                                     ]
+    #                                 }
+    #                             },
+    #                             {
+    #                                 "multi_match": {
+    #                                     "query": "公示附件",
+    #                                     "type": "phrase",
+    #                                     "fields": [
+    #                                         "detail"
+    #                                     ]
+    #                                 }
+    #                             },
+    #                             {
+    #                                 "multi_match": {
+    #                                     "query": "明细附件",
+    #                                     "type": "phrase",
+    #                                     "fields": [
+    #                                         "detail"
+    #                                     ]
+    #                                 }
+    #                             },
+    #                             {
+    #                                 "multi_match": {
+    #                                     "query": "见附件",
+    #                                     "type": "phrase",
+    #                                     "fields": [
+    #                                         "detail"
+    #                                     ]
+    #                                 }
+    #                             },
+    #                             {
+    #                                 "multi_match": {
+    #                                     "query": "详情请访问原网页!",
+    #                                     "type": "phrase",
+    #                                     "fields": [
+    #                                         "detail"
+    #                                     ]
+    #                                 }
+    #                             }
+    #                         ]
+    #                     }
+    #                 }
+    #             ],
+    #             "must_not": []
+    #         }
+    #     },
+    #     "highlight": {
+    #         "pre_tags": [
+    #             ""
+    #         ],
+    #         "post_tags": [
+    #             ""
+    #         ],
+    #         "fields": {
+    #             "detail": {
+    #                 "fragment_size": 115,
+    #                 "number_of_fragments": 1
+    #             }
+    #         }
+    #     },
+    #     "sort": [{
+    #         "dataweight": "desc"
+    #     },
+    #         {
+    #             "publishtime": "desc"
+    #         }
+    #     ],
+    #     "from": 0
+    # }
+    query = {"track_total_hits": True,
+                "query": {"bool": {"must": [{"range": {"comeintime": {"from": "1748534400", "to": "1751212800"}}}]}}}
+
+    try:
+        # 初始查询
+        resp = es.search(
+            index=es_index,
+            scroll='5m',
+            size=batch_size,
+            body=query
+        )
+        scroll_id = resp['_scroll_id']
+        total_docs = resp['hits']['total']['value']
+
+        bulk_ops = []
+        print(f"开始处理 {total_docs} 条文档...")
+
+        while True:
+            hits = resp['hits']['hits']
+            if not hits:
+                break
+
+            for hit in hits:
+                stats['total_processed'] += 1
+                doc = hit.get('_source', {})
+                attachments = doc.get('projectinfo', {}).get('attachments', {})
+
+                should_save = True
+                if attachments is None:
+                    stats['no_attachments'] += 1
+                elif not attachments:
+                    stats['no_attachments'] += 1
+                else:
+                    first_att = next(iter(attachments.values()))
+
+                    # org_url = first_att.get('org_url')
+                    # fid = first_att.get('fid')
+                    # 关键判断逻辑
+                    has_org_url = 'org_url' in first_att
+                    has_fid = 'fid' in first_att
+                    # 分类统计
+                    if has_org_url:
+                        if has_fid:
+                            stats['org_url_with_fid'] += 1
+                            should_save = False
+                        else:
+                            stats['org_url_no_fid'] += 1
+                            should_save = False
+                    else:
+                        stats['no_org_url'] += 1
+
+                    # 保存逻辑
+                if should_save:
+                    # 准备MongoDB文档
+                    _id = hit['_id']
+                    mongo_doc = {
+                        '_id': _id,
+                        'attachments':attachments,
+                        'site': doc['site'],
+                        'spidercode': doc['spidercode'],
+                        'href': doc.get('href', ''),
+                        'jybxhref': f"https://www.jianyu360.cn/article/entservice/{SE3.encode_string(_id)}.html?appid",
+                        'processed_at': time.time()
+                    }
+
+                    bulk_ops.append(UpdateOne(
+                        {'_id': _id},
+                        {'$set': mongo_doc},
+                        upsert=True
+                    ))
+
+                # 批量执行
+                if len(bulk_ops) >= batch_size:
+                    execute_bulk(collection, bulk_ops, stats)
+                    bulk_ops = []
+
+            # 进度报告
+            if stats['total_processed'] % 100 == 0:
+                print_progress(stats, total_docs)
+
+            # 获取下一批
+            resp = es.scroll(scroll_id=scroll_id, scroll='5m')
+            scroll_id = resp['_scroll_id']
+
+        # 最后一批
+        if bulk_ops:
+            execute_bulk(collection, bulk_ops, stats)
+
+    except Exception as e:
+        print(f"处理失败: {str(e)}")
+        stats['errors'] += 1
+    finally:
+        mongo_client.close()
+        print_final_report(stats, total_docs)
+
+
+def execute_bulk(collection, operations, stats):
+    print(f"\n进入execute_bulk,待处理操作数: {len(operations)}")  # 先确认函数被调用
+    """执行批量操作"""
+    try:
+        result = collection.bulk_write(operations)
+        stats['saved_docs'] += (result.upserted_count + result.modified_count)
+        print(f"已处理批次: 插入{result.upserted_count} 更新{result.modified_count}")
+    except BulkWriteError as bwe:
+        stats['errors'] += len(bwe.details['writeErrors'])
+        print(f"部分失败: {len(bwe.details['writeErrors'])}条错误")
+
+
+def print_progress(stats, total):
+    """打印处理进度"""
+    progress = stats['total_processed'] / total * 100
+    print(f"\n进度: {progress:.1f}%")
+    print(f"已处理: {stats['total_processed']}/{total}")
+    print(f"正确附件(有org_url和fid): {stats['org_url_with_fid']}")
+    print(f"错误附件(有org_url无fid): {stats['org_url_no_fid']}")
+    print(f"没有附件: {stats['no_attachments']}")
+    print(f"待检查附件(无org_url): {stats['no_org_url']}")
+    print(f"已保存文档: {stats['saved_docs']}")
+
+
+def print_final_report(stats, total):
+    """打印最终统计"""
+    print("\n" + "=" * 50)
+    print("处理结果统计".center(50))
+    print("=" * 50)
+    print(f"总文档数: {total}")
+    print(f"已处理文档: {stats['total_processed']}")
+    print(f"正确附件(有org_url和fid): {stats['org_url_with_fid']}")
+    print(f"错误附件(有org_url无fid): {stats['org_url_no_fid']}")
+    print(f"没有附件: {stats['no_attachments']}")
+    print(f"待检查附件(无org_url): {stats['no_org_url']}")
+    print(f"实际保存文档: {stats['saved_docs']}")
+    print(f"错误数量: {stats['errors']}")
+    print("=" * 50)
+
+
+if __name__ == "__main__":
+    process_es_to_mongo(
+        es_host="http://127.0.0.1:19800",
+        es_index="bidding",
+        es_username="jianyuGr",
+        es_password="we3g8glKfe#",
+        mongo_uri="mongodb://172.20.45.129:27002",
+        mongo_db="data_quality",
+        mongo_collection="missing_fid_attachments",
+        batch_size=1000
+    )

+ 289 - 0
tools/标讯数据附件为空数量统计/附件缺失率第二版_新_bak.py

@@ -0,0 +1,289 @@
+from elasticsearch import Elasticsearch
+from pymongo import MongoClient
+from pymongo.errors import BulkWriteError
+from lib.detail_url import SE3
+
+
+def process_es_to_mongo(es_host, es_index, es_username, es_password,mongo_uri, mongo_db, mongo_collection, batch_size=1000):
+    """
+    从Elasticsearch中筛选数据,并将符合条件的数据插入到MongoDB中
+
+    :param es_host: Elasticsearch连接地址
+    :param es_index: Elasticsearch索引名
+    :param mongo_uri: MongoDB连接URI
+    :param mongo_db: MongoDB数据库名
+    :param mongo_collection: MongoDB集合名
+    :param batch_size: 每批处理的数据量
+    """
+
+    # 初始化Elasticsearch客户端(带认证)
+    es = Elasticsearch(
+        es_host,
+        http_auth=(es_username, es_password),
+        port=19800,  # 根据实际情况调整
+        timeout=10000  # 设置超时时间
+    )
+    # 初始化统计计数器
+    stats = {
+        'total_processed': 0,
+        'org_url_no_fid': 0,  # org_url有值且fid为空(错误情况)
+        'org_url_with_fid': 0,  # org_url有值且fid有值(正确情况)
+        'no_org_url': 0,  # org_url为空(需要检查的情况)
+        'saved_docs': 0,  # 实际保存的文档数
+        'errors': 0
+    }
+    # 初始化MongoDB客户端
+    mongo_client = MongoClient(mongo_uri)
+    db = mongo_client[mongo_db]
+    collection = db[mongo_collection]
+
+    # 构建Elasticsearch查询 - 查询attachments存在且不为空的数据
+    query = {
+            "track_total_hits": True,
+            "query": {
+                "bool": {
+                    "must": [{
+                            "range": {
+                                "publishtime": {
+                                    "gte": 1748534400,
+                                    "lte": 1751212800
+                                }
+                            }
+                        },
+                        {
+                            "bool": {
+                                "should": [{
+                                        "multi_match": {
+                                            "query": "详情请下载附件",
+                                            "type": "phrase",
+                                            "fields": [
+                                                "detail"
+                                            ]
+                                        }
+                                    },
+                                    {
+                                        "multi_match": {
+                                            "query": "详见附件",
+                                            "type": "phrase",
+                                            "fields": [
+                                                "detail"
+                                            ]
+                                        }
+                                    },
+                                    {
+                                        "multi_match": {
+                                            "query": "xlsx",
+                                            "type": "phrase",
+                                            "fields": [
+                                                "detail"
+                                            ]
+                                        }
+                                    },
+                                    {
+                                        "multi_match": {
+                                            "query": "xls",
+                                            "type": "phrase",
+                                            "fields": [
+                                                "detail"
+                                            ]
+                                        }
+                                    },
+                                    {
+                                        "multi_match": {
+                                            "query": "pdf",
+                                            "type": "phrase",
+                                            "fields": [
+                                                "detail"
+                                            ]
+                                        }
+                                    },
+                                    {
+                                        "multi_match": {
+                                            "query": "合同附件",
+                                            "type": "phrase",
+                                            "fields": [
+                                                "detail"
+                                            ]
+                                        }
+                                    },
+                                    {
+                                        "multi_match": {
+                                            "query": "公示附件",
+                                            "type": "phrase",
+                                            "fields": [
+                                                "detail"
+                                            ]
+                                        }
+                                    },
+                                    {
+                                        "multi_match": {
+                                            "query": "明细附件",
+                                            "type": "phrase",
+                                            "fields": [
+                                                "detail"
+                                            ]
+                                        }
+                                    },
+                                    {
+                                        "multi_match": {
+                                            "query": "见附件",
+                                            "type": "phrase",
+                                            "fields": [
+                                                "detail"
+                                            ]
+                                        }
+                                    },
+                                    {
+                                        "multi_match": {
+                                            "query": "详情请访问原网页!",
+                                            "type": "phrase",
+                                            "fields": [
+                                                "detail"
+                                            ]
+                                        }
+                                    }
+                                ]
+                            }
+                        }
+                    ],
+                    "must_not": []
+                }
+            },
+            "highlight": {
+                "pre_tags": [
+                    ""
+                ],
+                "post_tags": [
+                    ""
+                ],
+                "fields": {
+                    "detail": {
+                        "fragment_size": 115,
+                        "number_of_fragments": 1
+                    }
+                }
+            },
+            "sort": [{
+                    "dataweight": "desc"
+                },
+                {
+                    "publishtime": "desc"
+                }
+            ],
+            "from": 0
+        }
+
+    # 使用scroll API进行批量查询
+    resp = es.search(
+        index=es_index,
+        scroll='2m',  # 保持scroll上下文2分钟
+        size=batch_size,
+        body=query
+    )
+
+    scroll_id = resp['_scroll_id']
+    total_docs = resp['hits']['total']['value']
+    print(f"开始处理 {total_docs} 条文档...")
+
+    processed = 0
+    batch_count = 0
+    bulk_operations = []
+
+    while True:
+        # 处理当前批次的数据
+        hits = resp['hits']['hits']
+        if not hits:
+            break
+
+        for hit in hits:
+            processed += 1
+            doc= hit.get('_source', {})
+            attachments = doc.get('projectinfo', {}).get('attachments', {})
+
+            if not attachments:
+                continue
+
+            valid_attachments = {}
+            first_att = next(iter(attachments.values()))
+            org_url = first_att.get('org_url')
+            fid = first_att.get('fid')
+
+            # 分类统计
+            if org_url:
+                if fid:
+                    stats['org_url_with_fid'] += 1
+                    continue  # 正确情况,不保存
+                else:
+                    stats['org_url_no_fid'] += 1
+                    continue  # 错误情况,不保存
+            else:
+                stats['no_org_url'] += 1
+            # 只有这种情况才保存
+            # 准备要插入MongoDB的数据
+            _id = hit['_id']
+            href = SE3.encode_string(_id)
+            jybxhref = f"https://www.jianyu360.cn/article/entservice/{href}.html?appid"
+            mongo_doc = {
+                '_id': _id,
+                'fid': fid or '',
+                'org_url': org_url or '',
+                'site' :doc['site'],
+                'spidercode':doc['spidercode'],
+                'href': doc.get('href','' ),
+                'jybxhref' : jybxhref
+            }
+
+            bulk_operations.append(mongo_doc)
+            batch_count += 1
+
+            # 批量插入达到batch_size时执行
+            if batch_count >= batch_size:
+                try:
+                    collection.insert_many(bulk_operations,ordered=False)
+                    print(f"已批量插入 {batch_count} 条数据到MongoDB")
+                except BulkWriteError as bwe:
+                    print(f"批量插入时部分失败: {bwe.details}")
+
+                bulk_operations = []
+                batch_count = 0
+
+        # 获取下一批数据
+        resp = es.scroll(scroll_id=scroll_id, scroll='2m')
+        scroll_id = resp['_scroll_id']
+
+        print(f"已处理 {processed}/{total_docs} 条数据")
+
+    # 插入最后一批可能不足batch_size的数据
+    if bulk_operations:
+        try:
+            collection.insert_many(bulk_operations)
+            print(f"最后批量插入 {batch_count} 条数据到MongoDB")
+        except BulkWriteError as bwe:
+            print(f"最后批量插入时部分失败: {bwe.details}")
+
+    print(f"处理完成!总共处理了 {processed} 条数据")
+    print(f"被排除的附件数(org_url有值且fid为空): {stats['org_url_num']}")
+    print(f"被排除的附件数(org_url有值且fid不为空): {stats['org_url_fid_num']}")
+    print(f"保存的有效附件数: {stats['saved_attachments']}")
+
+
+# 使用示例
+if __name__ == "__main__":
+    ES_HOST = "http://127.0.0.1:19800" # Elasticsearch地址
+    ES_INDEX = "bidding"  # Elasticsearch索引名
+    ES_USERNAME = "jianyuGr"  # ES用户名
+    ES_PASSWORD = "we3g8glKfe#"  # ES密码
+    MONGO_URI = "mongodb://172.20.45.129:27002"  # MongoDB地址
+    MONGO_DB = "data_quality"  # MongoDB数据库名
+    MONGO_COLLECTION = "fid_attachments"  # MongoDB集合名
+
+    process_es_to_mongo(
+        es_host=ES_HOST,
+        es_index=ES_INDEX,
+        es_username=ES_USERNAME,
+        es_password=ES_PASSWORD,
+        mongo_uri=MONGO_URI,
+        mongo_db=MONGO_DB,
+        mongo_collection=MONGO_COLLECTION,
+        batch_size=1000
+    )

TEMPAT SAMPAH
tools/爬虫数据质量二期/spider_anomalies_2025-07-03.xlsx


+ 311 - 0
tools/爬虫数据质量二期/spider_quality.py

@@ -0,0 +1,311 @@
+import pandas as pd
+from pymongo import MongoClient
+from datetime import datetime, timedelta
+import smtplib
+from email.mime.multipart import MIMEMultipart
+from email.mime.text import MIMEText
+from email.mime.application import MIMEApplication
+import pymysql
+from collections import defaultdict
+
+
+# MySQL 配置信息
+MYSQL_CONFIG = {
+    "host": "172.20.45.129",
+    "user": "root",
+    "password": "=PDT49#80Z!RVv52_z",
+    "database": "quality",
+    "port": 4000
+}
+
+# 建立 MySQL 连接get_mysql_connection
+def get_mysql_connection():
+    return pymysql.connect(
+        host=MYSQL_CONFIG["host"],
+        user=MYSQL_CONFIG["user"],
+        password=MYSQL_CONFIG["password"],
+        database=MYSQL_CONFIG["database"],
+        port=MYSQL_CONFIG["port"]
+    )
+# ✅ MongoDB 连接配置
+MongodbConfig = {
+    "ip_port": "172.20.45.129:27002",
+    "db": "data_quality",
+    "col": "spider_analysis"
+}
+# ✅ 邮件配置信息
+EMAIL_CONFIG = {
+    "smtp_server": "smtp.163.com",  # SMTP 服务器
+    "smtp_port": 465,                   # 端口
+    "sender_email": "liumm_6064@163.com",  # 发件人邮箱
+    "sender_password": "TPVBPYSETVHWTIDH",       # 发件人邮箱密码
+    # "recipient_emails": ["liumiaomiao@topnet.net.cn", "lizhikun@topnet.net.cn","yanpeizhu@topnet.net.cn","zhangjinkun@topnet.net.cn"],  # 收件人列表
+    "recipient_emails": ["liumiaomiao@topnet.net.cn"],  # 收件人列表
+    "email_subject": "爬虫数据异常报告",
+    "email_body": "您好,请查收昨日的爬虫数据异常报告,详情见附件。"
+}
+# 连接 MongoDB
+client = MongoClient(MongodbConfig["ip_port"])
+db = client[MongodbConfig["db"]]
+collection = db[MongodbConfig["col"]]
+
+# ✅ 需要检查的字段
+fields_to_check = [
+    "bidtype_count", "projectname_count", "budget_count", "buyer_count",
+    "s_winner_count", "projectcode_count", "bidamount_count", "area_count",
+    "city_count", "agency_count", "subtype_count", "toptype_count", "projectinfo_count"
+]
+def generate_and_send_report():
+    """ 生成异常数据表格并发送邮件 """
+    # ✅ 计算时间段
+    now_date = (datetime.now()).strftime("%Y-%m-%d")
+    yesterday_date = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
+    # 计算上一周周一到周五的时间段
+    last_week_start = (datetime.now() - timedelta(days=datetime.now().weekday() + 14)).strftime("%Y-%m-%d")
+    last_week_end = (datetime.now() - timedelta(days=datetime.now().weekday() + 10)).strftime("%Y-%m-%d")
+    print(f"计算上一周周一到周五的时间段:{last_week_start} -- {last_week_end} ")
+
+    # ✅ 计算近三天(排除周六、周日)
+    recent_days = []
+    date_cursor = datetime.now() - timedelta(days=1)  # 从昨天开始往前推
+
+    while len(recent_days) < 3:
+        if date_cursor.weekday() < 5:  # 0-4 表示周一到周五
+            recent_days.append(date_cursor.strftime("%Y-%m-%d"))
+        date_cursor -= timedelta(days=1)
+
+    recent_days.sort()  # **正序排列(从旧到新)**
+
+    # # ✅ 获取近三天的开始和结束日期
+    # recent_three_days_start = recent_days[0]
+    # recent_three_days_end = recent_days[-1]
+
+    print(f"近两天(排除周六周日):{recent_days}")
+
+    # target_spidercode = "a_gdsggzyjypt_gycq_jggg"  # 你要调试的爬虫代码
+    # ✅ 1. 查询上一周周一到周五的数据
+    last_week_data = list(collection.find({
+        "datefarmat": {"$gte": last_week_start, "$lte": last_week_end},
+        # "spidercode": target_spidercode  # 仅查询特定爬虫
+    }))
+    # ✅ 2. 查询近三天的数据
+    last_three_data = list(collection.find({
+        # "datefarmat": {"$gte": recent_three_days_start, "$lte": recent_three_days_end},
+        # "spidercode": target_spidercode,  # 仅查询特定爬虫
+        "datefarmat": {"$in": recent_days},
+    }))
+    # 转换为 DataFrame 处理
+    last_week_df = pd.DataFrame(last_week_data)
+    last_three_df = pd.DataFrame(last_three_data)
+    # # ✅ 2. 查询昨天的数据
+    # yesterday_data = list(collection.find({
+    #     "datefarmat": yesterday_date,
+        # "spidercode": target_spidercode  # 仅查询特定爬虫
+    # }))
+    #
+    # # 转换为 DataFrame 处理
+    # yesterday_df = pd.DataFrame(yesterday_data)
+
+    # ✅ 3. 检查上一周是否每天都有数据 且 每天字段值不为 0
+    anomalies = []  # 存储异常数据
+    if not last_week_df.empty:
+        # 统计上周 `spidercode` 和 `bidtype` 的所有数据
+        grouped_data = last_week_df.groupby(["spidercode", "bidtype", "datefarmat","site_important"])[fields_to_check].sum().reset_index()
+        # groupedthree_data = last_three_df.groupby(["spidercode", "bidtype", "datefarmat","site_important"])[fields_to_check].sum().reset_index()
+        # grouped_data = grouped_data[grouped_data["spidercode"] == target_spidercode]
+
+        # A. 数量问题检查
+        # 1. 分析上周数据有效性
+        spider_info = {}
+        for (spidercode, bidtype), group in grouped_data.groupby(["spidercode", "bidtype"]):
+            if len(group) == 5:  # 确保有5天完整数据
+                if spidercode not in spider_info:
+                    spider_info[spidercode] = {
+                        "site_important": group["site_important"].iloc[0],
+                        # "valid_fields": {},
+                        "bidtype_fields": {},  # 存储各bidtype的有效字段
+                        "all_bidtypes": set()
+                    }
+                spider_info[spidercode]["all_bidtypes"].add(bidtype)
+                valid_fields = [field for field in fields_to_check if (group[field] != 0).all()]
+                spider_info[spidercode]["bidtype_fields"][bidtype] = valid_fields
+
+        # 2. 检查近三天异常
+        for spidercode, info in spider_info.items():
+            print(f"\n检查爬虫 {spidercode} 的异常...")
+
+            # A. 数量问题检查
+            problematic_bidtypes = []
+            for bidtype in info["all_bidtypes"]:
+                # 检查该bidtype近三天是否有数据
+                has_data = not last_three_df[
+                    (last_three_df["spidercode"] == spidercode) &
+                    (last_three_df["bidtype"] == bidtype)
+                    ].empty
+
+                if not has_data:
+                    problematic_bidtypes.append(bidtype)
+                    print(f"{bidtype} 类型: 近三天无数据")
+
+            # 生成数量问题报告
+            if problematic_bidtypes:
+                if len(problematic_bidtypes) == len(info["all_bidtypes"]):
+                    content = f"{yesterday_date} 日,发现该爬虫所有类型已连续三天无数据,请关注!"
+                else:
+                    bidtypes_str = ",".join(problematic_bidtypes)
+                    content = f"{yesterday_date} 日,发现{bidtypes_str}类型已连续三天无数据,请关注!"
+
+                anomalies.append({
+                    "日期": now_date,
+                    "爬虫代码": spidercode,
+                    "是否重点网站": info["site_important"],
+                    "问题类型": "数量问题",
+                    "问题内容": content
+                })
+
+            # B. 质量问题检查(优化合并逻辑)
+            # 先按字段分组收集问题
+            field_problems = {}  # {field: [bidtypes]}
+            # 先获取该爬虫涉及的所有bidtype(无论是否有有效字段)
+            all_bidtypes = set(last_week_df[last_week_df["spidercode"] == spidercode]["bidtype"].unique())
+
+            # 收集所有有问题的字段和对应的bidtypes
+            for bidtype in all_bidtypes:
+                # 获取该bidtype上周有效的字段(如果没有则为空列表)
+                valid_fields = info["bidtype_fields"].get(bidtype, [])
+                # 检查近三天该字段是否全为0
+                threeday_data = last_three_df[
+                    (last_three_df["spidercode"] == spidercode) &
+                    (last_three_df["bidtype"] == bidtype)]
+
+                for field in valid_fields:
+                    if field in threeday_data.columns:
+                        if not threeday_data.empty and (threeday_data[field] == 0).all():
+                            if field not in field_problems:
+                                field_problems[field] = []
+                            if bidtype not in field_problems[field]:
+                                field_problems[field].append(bidtype)
+            # 生成合并后的质量问题报告
+            problem_messages = []
+            for field, bidtypes in field_problems.items():
+                # 计算该字段在上周有效的bidtype总数
+                total_valid_for_field = sum(
+                    1 for bt in all_bidtypes
+                    if bt in info["bidtype_fields"] and field in info["bidtype_fields"][bt]
+                )
+
+                if len(all_bidtypes) == total_valid_for_field:
+                    problem_messages.append(f"所有类型的 {field} 字段")
+                else:
+                    bidtypes_str = ",".join(bidtypes)
+                    problem_messages.append(f"{bidtypes_str}类型的 {field} 字段")
+            # 如果有质量问题,合并为一条记录
+            if problem_messages:
+                problems_str = ",".join(problem_messages)
+                content = f"{yesterday_date} 日,发现{problems_str}连续三天为0,请关注!"
+
+                anomalies.append({
+                    "日期": now_date,
+                    "爬虫代码": spidercode,
+                    "是否重点网站": info["site_important"],
+                    "问题类型": "质量问题",
+                    "问题内容": content
+                })
+            else:
+                # 当没有有效字段时的处理逻辑
+                print(f"  警告:爬虫 {spidercode} 没有有效的字段数据(上周检查未通过或所有字段无效)")
+    else:
+        print("⚠️ 上周数据为空,未找到有效数据!")
+
+    # ✅ 5. 输出异常并导出 Excel
+    if anomalies:
+        anomalies_df = pd.DataFrame(anomalies)
+
+        # 导出 Excel 文件
+        output_filename = f"spider_anomalies_{yesterday_date}.xlsx"
+        anomalies_df.to_excel(output_filename, index=False)
+        print(f"⚠️ 异常数据已导出:{output_filename}")
+
+        # 保存异常数据到 MySQL
+        save_anomalies_to_mysql(anomalies)
+
+        send_email_with_attachment(output_filename)
+    else:
+        print("✅ 没有发现异常数据。")
+
+def save_anomalies_to_mysql(anomalies):
+    """ 将异常数据存入 MySQL 数据库 """
+    if not anomalies:
+        return
+
+    # 获取 MySQL 连接
+    connection = get_mysql_connection()
+    cursor = connection.cursor()
+
+    # 插入异常数据的 SQL 语句
+    insert_sql = """
+    INSERT INTO spider_issues (date, spider_code, is_key_site, issue_type, issue_content)
+    VALUES (%s, %s, %s, %s, %s)
+    """
+
+    # 插入数据
+    for anomaly in anomalies:
+        date = anomaly["日期"]
+        spider_code = anomaly["爬虫代码"]
+        is_key_site = anomaly["是否重点网站"]
+        issue_type = anomaly["问题类型"]
+        issue_content = anomaly["问题内容"]
+
+        # 执行插入操作
+        cursor.execute(insert_sql, (date, spider_code, is_key_site, issue_type, issue_content))
+
+    # 提交事务并关闭连接
+    connection.commit()
+    cursor.close()
+    connection.close()
+
+    print(f"📥 {len(anomalies)} 条异常数据已存入 MySQL 数据库!")
+
+
+def send_email_with_attachment(file_path):
+    """ 发送带附件的邮件 """
+    try:
+        # 创建邮件对象
+        msg = MIMEMultipart()
+        msg["From"] = EMAIL_CONFIG["sender_email"]
+        msg["To"] = ", ".join(EMAIL_CONFIG["recipient_emails"])
+        msg["Subject"] = EMAIL_CONFIG["email_subject"]
+
+        # 邮件正文
+        msg.attach(MIMEText(EMAIL_CONFIG["email_body"], "plain"))
+
+        # 添加附件
+        with open(file_path, "rb") as attachment:
+            part = MIMEApplication(attachment.read(), Name=file_path)
+            part["Content-Disposition"] = f'attachment; filename="{file_path}"'
+            msg.attach(part)
+
+        # 连接 SMTP 服务器并发送邮件
+        server = smtplib.SMTP_SSL(EMAIL_CONFIG["smtp_server"], EMAIL_CONFIG["smtp_port"])
+        # server.starttls()
+        server.login(EMAIL_CONFIG["sender_email"], EMAIL_CONFIG["sender_password"])
+        server.sendmail(
+            EMAIL_CONFIG["sender_email"],
+            EMAIL_CONFIG["recipient_emails"],
+            msg.as_string(),
+        )
+        server.quit()
+        print("📧 邮件发送成功!")
+
+    except Exception as e:
+        print(f"❌ 发送邮件失败,错误信息:{e}")
+
+# # ✅ 7. 定时任务:每天 7 点执行
+# schedule.every().day.at("10:00").do(generate_and_send_report)
+#
+# # ⏰ 持续运行
+# print("⏰ 任务已启动,将在每天 10:00 自动执行...")
+# while True:
+#     schedule.run_pending()
+#     time.sleep(60)
+generate_and_send_report()

+ 29 - 0
tools/生成三级页地址/生成三级页地址.py

@@ -0,0 +1,29 @@
+import base64
+
+
+
+class SimpleEncrypt:
+    def __init__(self, key):
+        self.key = key
+
+    def do_encode(self, bs):
+        tmp = bytearray(self.key.encode())
+        i = 0
+        while i < len(bs):
+            for j in range(len(tmp)):
+                if i >= len(bs):
+                    break
+                bs[i] = bs[i] ^ tmp[j]
+                i += 1
+
+    def encode_string(self, s):
+        data = bytearray(s.encode())
+        self.do_encode(data)
+        return base64.b64encode(data).decode()
+
+    def decode_string(self, s):
+        data = bytearray(base64.b64decode(s))
+        self.do_encode(data)
+        return data.decode()
+
+SE3 = SimpleEncrypt(key="entservice")

TEMPAT SAMPAH
tools/高质量站点第二版/.~spidercode_stats.xlsx